diff --git a/.eslintrc.json b/.eslintrc.json index 5801b76f9..1e6be2d1b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,7 +6,8 @@ "files": ["*.ts"], "parserOptions": { "project": ["tsconfig.json"], - "createDefaultProgram": true + "createDefaultProgram": true, + "sourceType": "module" }, "extends": [ "plugin:@angular-eslint/recommended", @@ -50,6 +51,10 @@ "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/explicit-module-boundary-types": "off", "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-empty-object-type": "off", + "@typescript-eslint/no-unsafe-function-type": "off", + "@typescript-eslint/no-unsafe-enum-comparison": "off", + "@typescript-eslint/no-base-to-string": "off", "@angular-eslint/component-selector": [ "error", { diff --git a/.lighthouse/jenkins-x/pullrequest.yaml b/.lighthouse/jenkins-x/pullrequest.yaml index 7e640461b..9df7667ac 100644 --- a/.lighthouse/jenkins-x/pullrequest.yaml +++ b/.lighthouse/jenkins-x/pullrequest.yaml @@ -269,28 +269,28 @@ spec: command: - /bin/sh - -c - image: dockeronce.azurecr.io/cloudbees/nodejs:sonf-v18.13.0 + image: dockeronce.azurecr.io/cloudbees/nodejs:sonf-v20.14.0 name: install-packages - args: - npm run prettier command: - /bin/sh - -c - image: dockeronce.azurecr.io/cloudbees/nodejs:sonf-v18.13.0 + image: dockeronce.azurecr.io/cloudbees/nodejs:sonf-v20.14.0 name: check-prettier - args: - npm run lint command: - /bin/sh - -c - image: dockeronce.azurecr.io/cloudbees/nodejs:sonf-v18.13.0 + image: dockeronce.azurecr.io/cloudbees/nodejs:sonf-v20.14.0 name: check-lint - args: - export NODE_ENV="test" && npm run test command: - /bin/sh - -c - image: dockeronce.azurecr.io/oncehub/nodejs:angular-v20.14.0 + image: dockeronce.azurecr.io/oncehub/nodejs:angular-v20.17.0 name: unit-tests - args: - echo "Pushing image $DOCKER_REGISTRY/$REPO_NAME:$(cat VERSION)-PR-${PULL_NUMBER}..." && cp /tekton/creds-secrets/tekton-container-registry-auth/.dockerconfigjson /kaniko/.docker/config.json diff --git a/.lighthouse/jenkins-x/release.yaml b/.lighthouse/jenkins-x/release.yaml index 4ba784667..03b641181 100644 --- a/.lighthouse/jenkins-x/release.yaml +++ b/.lighthouse/jenkins-x/release.yaml @@ -270,7 +270,7 @@ spec: command: - /bin/sh - -c - image: dockeronce.azurecr.io/oncehub/nodejs:angular-v18.16.0 + image: dockeronce.azurecr.io/oncehub/nodejs:angular-v20.14.0 name: package-build-publish resources: {} volumes: diff --git a/.storybook/main.js b/.storybook/main.js index c1b074c83..ee5c58d6a 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -1,6 +1,6 @@ module.exports = { stories: [ - '../ui/src/stories/**/*.stories.mdx', + '../ui/src/stories/**/*.mdx', '../ui/src/stories/**/*.stories.@(js|jsx|ts|tsx)', ], addons: ['@storybook/addon-essentials', '@storybook/addon-mdx-gfm'], @@ -8,7 +8,5 @@ module.exports = { name: '@storybook/angular', options: {}, }, - docs: { - autodocs: true, - }, + docs: {}, }; diff --git a/.storybook/preview.js b/.storybook/preview.js index b704af106..19ee26efc 100644 --- a/.storybook/preview.js +++ b/.storybook/preview.js @@ -13,3 +13,4 @@ export const parameters = { }, docs: { inlineStories: true }, }; +// export const tags = ['autodocs']; diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fdf10a7a..44fd30462 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [8.0.33] - 2024-09-20 + +- [ONCEHUB-87445](https://scheduleonce.atlassian.net/browse/ONCEHUB-87445) fix: Adding Single and multi select with single action option in storybook. + +## [8.0.32] - 2024-09-20 + +- [ONCEHUB-87445](https://scheduleonce.atlassian.net/browse/ONCEHUB-87445) fix: Update storybook in once-ui to version 8.x. + ## [8.0.30] - 2024-09-05 - [ONCEHUB-83076](https://scheduleonce.atlassian.net/issues/ONCEHUB-87251) fix: Vulnerability in package webpack. diff --git a/Dockerfile b/Dockerfile index f8ab46b0b..7e3325b1b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM dockeronce.azurecr.io/node:20.14.0-alpine3.20 AS build +FROM dockeronce.azurecr.io/node:20.17.0-alpine3.20 AS build WORKDIR /app/website COPY . /app/website RUN chown root:root . diff --git a/documentation.json b/documentation.json index f7c3c61e4..93cfe821d 100644 --- a/documentation.json +++ b/documentation.json @@ -78,15 +78,15 @@ "interfaces": [ { "name": "_OuiInkBarPositioner", - "id": "interface-_OuiInkBarPositioner-50fe2f1bca65db33aac094b14b277a02924ff4199f4bfe029de4c7e70c55f0d0b3d8f03cc04d8961159c28f0d20d52a85a2edbaf9f6b9506a466792860b45ccf", + "id": "interface-_OuiInkBarPositioner-135c8ccdab508fcf19b684306b7b52fe3cacc460ac2081644d8b0d211b3fb9a93c581e6b1e98ed9fdc3965312903a402f79f7ef73e228a1ef8f3bd236d89976f", "file": "ui/src/components/tabs/ink-bar.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport {\r\n ElementRef,\r\n InjectionToken,\r\n OnDestroy,\r\n OnInit,\r\n QueryList,\r\n} from '@angular/core';\r\nimport { isDevMode } from '@angular/core';\r\n\r\n/**\r\n * Item inside a tab header relative to which the ink bar can be aligned.\r\n * @docs-private\r\n */\r\nexport interface MatInkBarItem extends OnInit, OnDestroy {\r\n elementRef: ElementRef;\r\n activateInkBar(previousIndicatorClientRect?: ClientRect): void;\r\n deactivateInkBar(): void;\r\n fitInkBarToContent: boolean;\r\n}\r\n\r\n/** Class that is applied when a tab indicator is active. */\r\nconst ACTIVE_CLASS = 'mdc-tab-indicator--active';\r\n\r\n/** Class that is applied when the tab indicator should not transition. */\r\nconst NO_TRANSITION_CLASS = 'mdc-tab-indicator--no-transition';\r\n\r\n/**\r\n * Abstraction around the MDC tab indicator that acts as the tab header's ink bar.\r\n * @docs-private\r\n */\r\nexport class OuiInkBar {\r\n /** Item to which the ink bar is aligned currently. */\r\n private _currentItem: MatInkBarItem | undefined;\r\n\r\n constructor(private _items: QueryList) {}\r\n\r\n /** Hides the ink bar. */\r\n hide() {\r\n this._items.forEach((item) => item.deactivateInkBar());\r\n }\r\n\r\n /** Aligns the ink bar to a DOM node. */\r\n alignToElement(element: HTMLElement) {\r\n const correspondingItem = this._items.find(\r\n (item) => item.elementRef.nativeElement === element\r\n );\r\n const currentItem = this._currentItem;\r\n\r\n if (correspondingItem === currentItem) {\r\n return;\r\n }\r\n\r\n currentItem?.deactivateInkBar();\r\n\r\n if (correspondingItem) {\r\n const clientRect =\r\n currentItem?.elementRef.nativeElement.getBoundingClientRect?.();\r\n\r\n // The ink bar won't animate unless we give it the `ClientRect` of the previous item.\r\n correspondingItem.activateInkBar(clientRect);\r\n this._currentItem = correspondingItem;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Mixin that can be used to apply the `MatInkBarItem` behavior to a class.\r\n * Base on MDC's `MDCSlidingTabIndicatorFoundation`:\r\n * https://github.com/material-components/material-components-web/blob/c0a11ef0d000a098fd0c372be8f12d6a99302855/packages/mdc-tab-indicator/sliding-foundation.ts\r\n * @docs-private\r\n */\r\nexport function mixinInkBarItem<\r\n T extends new (...args: any[]) => { elementRef: ElementRef }\r\n>(base: T): T & (new (...args: any[]) => MatInkBarItem) {\r\n return class extends base {\r\n constructor(...args: any[]) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n super(...args);\r\n }\r\n\r\n private _inkBarElement: HTMLElement | null;\r\n private _inkBarContentElement: HTMLElement | null;\r\n private _fitToContent = false;\r\n\r\n /** Whether the ink bar should fit to the entire tab or just its content. */\r\n get fitInkBarToContent(): boolean {\r\n return this._fitToContent;\r\n }\r\n set fitInkBarToContent(v: BooleanInput) {\r\n const newValue = coerceBooleanProperty(v);\r\n\r\n if (this._fitToContent !== newValue) {\r\n this._fitToContent = newValue;\r\n\r\n if (this._inkBarElement) {\r\n this._appendInkBarElement();\r\n }\r\n }\r\n }\r\n\r\n /** Aligns the ink bar to the current item. */\r\n activateInkBar(previousIndicatorClientRect?: ClientRect) {\r\n const element = this.elementRef.nativeElement;\r\n\r\n // Early exit if no indicator is present to handle cases where an indicator\r\n // may be activated without a prior indicator state\r\n if (\r\n !previousIndicatorClientRect ||\r\n !element.getBoundingClientRect ||\r\n !this._inkBarContentElement\r\n ) {\r\n element.classList.add(ACTIVE_CLASS);\r\n return;\r\n }\r\n\r\n // This animation uses the FLIP approach. You can read more about it at the link below:\r\n // https://aerotwist.com/blog/flip-your-animations/\r\n\r\n // Calculate the dimensions based on the dimensions of the previous indicator\r\n const currentClientRect = element.getBoundingClientRect();\r\n const widthDelta =\r\n previousIndicatorClientRect.width / currentClientRect.width;\r\n const xPosition =\r\n previousIndicatorClientRect.left - currentClientRect.left;\r\n element.classList.add(NO_TRANSITION_CLASS);\r\n this._inkBarContentElement.style.setProperty(\r\n 'transform',\r\n `translateX(${xPosition}px) scaleX(${widthDelta})`\r\n );\r\n\r\n // Force repaint before updating classes and transform to ensure the transform properly takes effect\r\n element.getBoundingClientRect();\r\n\r\n element.classList.remove(NO_TRANSITION_CLASS);\r\n element.classList.add(ACTIVE_CLASS);\r\n this._inkBarContentElement.style.setProperty('transform', '');\r\n }\r\n\r\n /** Removes the ink bar from the current item. */\r\n deactivateInkBar() {\r\n this.elementRef.nativeElement.classList.remove(ACTIVE_CLASS);\r\n }\r\n\r\n /** Initializes the foundation. */\r\n ngOnInit() {\r\n this._createInkBarElement();\r\n }\r\n\r\n /** Destroys the foundation. */\r\n ngOnDestroy() {\r\n this._inkBarElement?.remove();\r\n this._inkBarElement = this._inkBarContentElement = null!;\r\n }\r\n\r\n /** Creates and appends the ink bar element. */\r\n private _createInkBarElement() {\r\n const documentNode =\r\n this.elementRef.nativeElement.ownerDocument || document;\r\n this._inkBarElement = documentNode.createElement('span');\r\n this._inkBarContentElement = documentNode.createElement('span');\r\n\r\n this._inkBarElement.className = 'mdc-tab-indicator';\r\n this._inkBarContentElement.className =\r\n 'mdc-tab-indicator__content mdc-tab-indicator__content--underline';\r\n\r\n this._inkBarElement.appendChild(this._inkBarContentElement);\r\n this._appendInkBarElement();\r\n }\r\n\r\n /**\r\n * Appends the ink bar to the tab host element or content, depending on whether\r\n * the ink bar should fit to content.\r\n */\r\n private _appendInkBarElement() {\r\n if (\r\n !this._inkBarElement &&\r\n (typeof isDevMode === 'undefined' || isDevMode)\r\n ) {\r\n throw Error(\r\n 'Ink bar element has not been created and cannot be appended'\r\n );\r\n }\r\n\r\n const parentElement = this._fitToContent\r\n ? this.elementRef.nativeElement.querySelector('.mdc-tab__content')\r\n : this.elementRef.nativeElement;\r\n\r\n if (!parentElement && (typeof isDevMode === 'undefined' || isDevMode)) {\r\n throw Error('Missing element to host the ink bar');\r\n }\r\n\r\n parentElement!.appendChild(this._inkBarElement!);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Interface for a OuiInkBar positioner method, defining the positioning and width of the ink\r\n * bar in a set of tabs.\r\n */\r\nexport interface _OuiInkBarPositioner {\r\n (element: HTMLElement): { left: string; width: string };\r\n}\r\n\r\n/**\r\n * The default positioner function for the OuiInkBar.\r\n * @docs-private\r\n */\r\nexport function _OUI_INK_BAR_POSITIONER_FACTORY(): _OuiInkBarPositioner {\r\n const method = (element: HTMLElement) => ({\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n left: element ? (element.offsetLeft || 0) + 'px' : '0',\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n width: element ? (element.offsetWidth || 0) + 'px' : '0',\r\n });\r\n\r\n return method;\r\n}\r\n\r\n/** Injection token for the OuiInkBar's Positioner. */\r\nexport const _OUI_INK_BAR_POSITIONER = new InjectionToken<_OuiInkBarPositioner>(\r\n 'MatInkBarPositioner',\r\n {\r\n providedIn: 'root',\r\n factory: _OUI_INK_BAR_POSITIONER_FACTORY,\r\n }\r\n);\r\n", + "sourceCode": "import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n ElementRef,\n InjectionToken,\n OnDestroy,\n OnInit,\n QueryList,\n} from '@angular/core';\nimport { isDevMode } from '@angular/core';\n\n/**\n * Item inside a tab header relative to which the ink bar can be aligned.\n * @docs-private\n */\nexport interface MatInkBarItem extends OnInit, OnDestroy {\n elementRef: ElementRef;\n activateInkBar(previousIndicatorClientRect?: ClientRect): void;\n deactivateInkBar(): void;\n fitInkBarToContent: boolean;\n}\n\n/** Class that is applied when a tab indicator is active. */\nconst ACTIVE_CLASS = 'mdc-tab-indicator--active';\n\n/** Class that is applied when the tab indicator should not transition. */\nconst NO_TRANSITION_CLASS = 'mdc-tab-indicator--no-transition';\n\n/**\n * Abstraction around the MDC tab indicator that acts as the tab header's ink bar.\n * @docs-private\n */\nexport class OuiInkBar {\n /** Item to which the ink bar is aligned currently. */\n private _currentItem: MatInkBarItem | undefined;\n\n constructor(private _items: QueryList) {}\n\n /** Hides the ink bar. */\n hide() {\n this._items.forEach((item) => item.deactivateInkBar());\n }\n\n /** Aligns the ink bar to a DOM node. */\n alignToElement(element: HTMLElement) {\n const correspondingItem = this._items.find(\n (item) => item.elementRef.nativeElement === element\n );\n const currentItem = this._currentItem;\n\n if (correspondingItem === currentItem) {\n return;\n }\n\n currentItem?.deactivateInkBar();\n\n if (correspondingItem) {\n const clientRect =\n currentItem?.elementRef.nativeElement.getBoundingClientRect?.();\n\n // The ink bar won't animate unless we give it the `ClientRect` of the previous item.\n correspondingItem.activateInkBar(clientRect);\n this._currentItem = correspondingItem;\n }\n }\n}\n\n/**\n * Mixin that can be used to apply the `MatInkBarItem` behavior to a class.\n * Base on MDC's `MDCSlidingTabIndicatorFoundation`:\n * https://github.com/material-components/material-components-web/blob/c0a11ef0d000a098fd0c372be8f12d6a99302855/packages/mdc-tab-indicator/sliding-foundation.ts\n * @docs-private\n */\nexport function mixinInkBarItem<\n T extends new (...args: any[]) => { elementRef: ElementRef }\n>(base: T): T & (new (...args: any[]) => MatInkBarItem) {\n return class extends base {\n constructor(...args: any[]) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n super(...args);\n }\n\n private _inkBarElement: HTMLElement | null;\n private _inkBarContentElement: HTMLElement | null;\n private _fitToContent = false;\n\n /** Whether the ink bar should fit to the entire tab or just its content. */\n get fitInkBarToContent(): boolean {\n return this._fitToContent;\n }\n set fitInkBarToContent(v: BooleanInput) {\n const newValue = coerceBooleanProperty(v);\n\n if (this._fitToContent !== newValue) {\n this._fitToContent = newValue;\n\n if (this._inkBarElement) {\n this._appendInkBarElement();\n }\n }\n }\n\n /** Aligns the ink bar to the current item. */\n activateInkBar(previousIndicatorClientRect?: ClientRect) {\n const element = this.elementRef.nativeElement;\n\n // Early exit if no indicator is present to handle cases where an indicator\n // may be activated without a prior indicator state\n if (\n !previousIndicatorClientRect ||\n !element.getBoundingClientRect ||\n !this._inkBarContentElement\n ) {\n element.classList.add(ACTIVE_CLASS);\n return;\n }\n\n // This animation uses the FLIP approach. You can read more about it at the link below:\n // https://aerotwist.com/blog/flip-your-animations/\n\n // Calculate the dimensions based on the dimensions of the previous indicator\n const currentClientRect = element.getBoundingClientRect();\n const widthDelta =\n previousIndicatorClientRect.width / currentClientRect.width;\n const xPosition =\n previousIndicatorClientRect.left - currentClientRect.left;\n element.classList.add(NO_TRANSITION_CLASS);\n this._inkBarContentElement.style.setProperty(\n 'transform',\n `translateX(${xPosition}px) scaleX(${widthDelta})`\n );\n\n // Force repaint before updating classes and transform to ensure the transform properly takes effect\n element.getBoundingClientRect();\n\n element.classList.remove(NO_TRANSITION_CLASS);\n element.classList.add(ACTIVE_CLASS);\n this._inkBarContentElement.style.setProperty('transform', '');\n }\n\n /** Removes the ink bar from the current item. */\n deactivateInkBar() {\n this.elementRef.nativeElement.classList.remove(ACTIVE_CLASS);\n }\n\n /** Initializes the foundation. */\n ngOnInit() {\n this._createInkBarElement();\n }\n\n /** Destroys the foundation. */\n ngOnDestroy() {\n this._inkBarElement?.remove();\n this._inkBarElement = this._inkBarContentElement = null!;\n }\n\n /** Creates and appends the ink bar element. */\n private _createInkBarElement() {\n const documentNode =\n this.elementRef.nativeElement.ownerDocument || document;\n this._inkBarElement = documentNode.createElement('span');\n this._inkBarContentElement = documentNode.createElement('span');\n\n this._inkBarElement.className = 'mdc-tab-indicator';\n this._inkBarContentElement.className =\n 'mdc-tab-indicator__content mdc-tab-indicator__content--underline';\n\n this._inkBarElement.appendChild(this._inkBarContentElement);\n this._appendInkBarElement();\n }\n\n /**\n * Appends the ink bar to the tab host element or content, depending on whether\n * the ink bar should fit to content.\n */\n private _appendInkBarElement() {\n if (\n !this._inkBarElement &&\n (typeof isDevMode === 'undefined' || isDevMode)\n ) {\n throw Error(\n 'Ink bar element has not been created and cannot be appended'\n );\n }\n\n const parentElement = this._fitToContent\n ? this.elementRef.nativeElement.querySelector('.mdc-tab__content')\n : this.elementRef.nativeElement;\n\n if (!parentElement && (typeof isDevMode === 'undefined' || isDevMode)) {\n throw Error('Missing element to host the ink bar');\n }\n\n parentElement!.appendChild(this._inkBarElement!);\n }\n };\n}\n\n/**\n * Interface for a OuiInkBar positioner method, defining the positioning and width of the ink\n * bar in a set of tabs.\n */\nexport interface _OuiInkBarPositioner {\n (element: HTMLElement): { left: string; width: string };\n}\n\n/**\n * The default positioner function for the OuiInkBar.\n * @docs-private\n */\nexport function _OUI_INK_BAR_POSITIONER_FACTORY(): _OuiInkBarPositioner {\n const method = (element: HTMLElement) => ({\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n left: element ? (element.offsetLeft || 0) + 'px' : '0',\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n width: element ? (element.offsetWidth || 0) + 'px' : '0',\n });\n\n return method;\n}\n\n/** Injection token for the OuiInkBar's Positioner. */\nexport const _OUI_INK_BAR_POSITIONER = new InjectionToken<_OuiInkBarPositioner>(\n 'MatInkBarPositioner',\n {\n providedIn: 'root',\n factory: _OUI_INK_BAR_POSITIONER_FACTORY,\n }\n);\n", "properties": [ { - "id": "call-declaration-50fe2f1bca65db33aac094b14b277a02924ff4199f4bfe029de4c7e70c55f0d0b3d8f03cc04d8961159c28f0d20d52a85a2edbaf9f6b9506a466792860b45ccf", + "id": "call-declaration-135c8ccdab508fcf19b684306b7b52fe3cacc460ac2081644d8b0d211b3fb9a93c581e6b1e98ed9fdc3965312903a402f79f7ef73e228a1ef8f3bd236d89976f", "args": [ { "name": "element", @@ -195,12 +195,12 @@ }, { "name": "CanDisableRipple", - "id": "interface-CanDisableRipple-4575677a5dcc30231c9f3c6f7e2854d9f2bed7be7afffb3454364604455730a63f3881b4e45660ecb4dedf4f516c0848b7bf3a3e6da229868ea8266a54940502", + "id": "interface-CanDisableRipple-09c7af012755e2cbe32c19e029d36088c90b250a4a667073130015ffd19d8d3b13350c592c41d4d81cc528545a59eb2df34767f91c164fde8100e98da5e860f0", "file": "ui/src/components/core/common-behaviors/disable-ripple.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { AbstractConstructor, Constructor } from './constructor';\r\n\r\n/** @docs-private */\r\nexport interface CanDisableRipple {\r\n /** Whether ripples are disabled. */\r\n disableRipple: boolean;\r\n}\r\n\r\ntype CanDisableRippleCtor = Constructor &\r\n AbstractConstructor;\r\n\r\n/** Mixin to augment a directive with a `disableRipple` property. */\r\nexport function mixinDisableRipple>(\r\n base: T\r\n): CanDisableRippleCtor & T;\r\nexport function mixinDisableRipple>(\r\n base: T\r\n): CanDisableRippleCtor & T {\r\n return class extends base {\r\n private _disableRipple = false;\r\n\r\n /** Whether the ripple effect is disabled or not. */\r\n get disableRipple(): boolean {\r\n return this._disableRipple;\r\n }\r\n set disableRipple(value: any) {\r\n this._disableRipple = coerceBooleanProperty(value);\r\n }\r\n\r\n constructor(...args: any[]) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n super(...args);\r\n }\r\n };\r\n}\r\n", + "sourceCode": "import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { AbstractConstructor, Constructor } from './constructor';\n\n/** @docs-private */\nexport interface CanDisableRipple {\n /** Whether ripples are disabled. */\n disableRipple: boolean;\n}\n\ntype CanDisableRippleCtor = Constructor &\n AbstractConstructor;\n\n/** Mixin to augment a directive with a `disableRipple` property. */\nexport function mixinDisableRipple>(\n base: T\n): CanDisableRippleCtor & T;\nexport function mixinDisableRipple>(\n base: T\n): CanDisableRippleCtor & T {\n return class extends base {\n private _disableRipple = false;\n\n /** Whether the ripple effect is disabled or not. */\n get disableRipple(): boolean {\n return this._disableRipple;\n }\n set disableRipple(value: any) {\n this._disableRipple = coerceBooleanProperty(value);\n }\n\n constructor(...args: any[]) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n super(...args);\n }\n };\n}\n", "properties": [ { "name": "disableRipple", @@ -385,12 +385,12 @@ }, { "name": "GranularSanityChecks", - "id": "interface-GranularSanityChecks-ef22db41367b2c08b13c523be66ebd594c90c986a94f6990f23d6414cbbfc4a9e9dfe943acf905441d9051e0e19202026192cb30f79f93da1f2c6830ab030985", + "id": "interface-GranularSanityChecks-faf3c2d5fa6ebca28372c7cb5b8112d9d13108d2e2811f5e27b343cdad3e494640760104bebf9faa35deae7c62ab89021cce2b1ce16b785f1cd5bd3271ba0044", "file": "ui/src/components/core/common-behaviors/common-module.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { HighContrastModeDetector } from '@angular/cdk/a11y';\r\nimport { BidiModule } from '@angular/cdk/bidi';\r\nimport {\r\n inject,\r\n Inject,\r\n InjectionToken,\r\n NgModule,\r\n Optional,\r\n} from '@angular/core';\r\nimport { VERSION as CDK_VERSION } from '@angular/cdk';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Platform, _isTestEnvironment } from '@angular/cdk/platform';\r\nimport { VERSION } from '../version';\r\nimport { isDevMode } from '@angular/core';\r\n\r\n/** @docs-private */\r\nexport function MATERIAL_SANITY_CHECKS_FACTORY(): SanityChecks {\r\n return true;\r\n}\r\n\r\n/** Injection token that configures whether the Material sanity checks are enabled. */\r\nexport const MATERIAL_SANITY_CHECKS = new InjectionToken(\r\n 'mat-sanity-checks',\r\n {\r\n providedIn: 'root',\r\n factory: MATERIAL_SANITY_CHECKS_FACTORY,\r\n }\r\n);\r\n\r\n/**\r\n * Possible sanity checks that can be enabled. If set to\r\n * true/false, all checks will be enabled/disabled.\r\n */\r\nexport type SanityChecks = boolean | GranularSanityChecks;\r\n\r\n/** Object that can be used to configure the sanity checks granularly. */\r\nexport interface GranularSanityChecks {\r\n doctype: boolean;\r\n theme: boolean;\r\n version: boolean;\r\n}\r\n\r\n/**\r\n * Module that captures anything that should be loaded and/or run for *all* Angular Material\r\n * components. This includes Bidi, etc.\r\n *\r\n * This module should be imported to each top-level component module (e.g., OuiTabsModule).\r\n */\r\n@NgModule({\r\n imports: [BidiModule],\r\n exports: [BidiModule],\r\n})\r\nexport class OuiCommonModule {\r\n /** Whether we've done the global sanity checks (e.g. a theme is loaded, there is a doctype). */\r\n private _hasDoneGlobalChecks = false;\r\n\r\n constructor(\r\n highContrastModeDetector: HighContrastModeDetector,\r\n @Optional()\r\n @Inject(MATERIAL_SANITY_CHECKS)\r\n private _sanityChecks: SanityChecks,\r\n @Inject(DOCUMENT) private _document: Document\r\n ) {\r\n // While A11yModule also does this, we repeat it here to avoid importing A11yModule\r\n // in OuiCommonModule.\r\n highContrastModeDetector._applyBodyHighContrastModeCssClasses();\r\n\r\n if (!this._hasDoneGlobalChecks) {\r\n this._hasDoneGlobalChecks = true;\r\n\r\n if (typeof isDevMode === 'undefined' || isDevMode) {\r\n // Inject in here so the reference to `Platform` can be removed in production mode.\r\n const platform = inject(Platform, { optional: true });\r\n\r\n if (this._checkIsEnabled('doctype')) {\r\n _checkDoctypeIsDefined(this._document);\r\n }\r\n\r\n if (this._checkIsEnabled('theme')) {\r\n _checkThemeIsPresent(this._document, !!platform?.isBrowser);\r\n }\r\n\r\n if (this._checkIsEnabled('version')) {\r\n _checkCdkVersionMatch();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Gets whether a specific sanity check is enabled. */\r\n private _checkIsEnabled(name: keyof GranularSanityChecks): boolean {\r\n if (_isTestEnvironment()) {\r\n return false;\r\n }\r\n\r\n if (typeof this._sanityChecks === 'boolean') {\r\n return this._sanityChecks;\r\n }\r\n\r\n return !!this._sanityChecks[name];\r\n }\r\n}\r\n\r\n/** Checks that the page has a doctype. */\r\nfunction _checkDoctypeIsDefined(doc: Document): void {\r\n if (!doc.doctype) {\r\n console.warn(\r\n 'Current document does not have a doctype. This may cause ' +\r\n 'some Angular Material components not to behave as expected.'\r\n );\r\n }\r\n}\r\n\r\n/** Checks that a theme has been included. */\r\nfunction _checkThemeIsPresent(doc: Document, isBrowser: boolean): void {\r\n // We need to assert that the `body` is defined, because these checks run very early\r\n // and the `body` won't be defined if the consumer put their scripts in the `head`.\r\n if (!doc.body || !isBrowser) {\r\n return;\r\n }\r\n\r\n const testElement = doc.createElement('div');\r\n testElement.classList.add('mat-theme-loaded-marker');\r\n doc.body.appendChild(testElement);\r\n\r\n const computedStyle = getComputedStyle(testElement);\r\n\r\n // In some situations the computed style of the test element can be null. For example in\r\n // Firefox, the computed style is null if an application is running inside of a hidden iframe.\r\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=548397\r\n if (computedStyle && computedStyle.display !== 'none') {\r\n console.warn(\r\n 'Could not find Angular Material core theme. Most Material ' +\r\n 'components may not work as expected. For more info refer ' +\r\n 'to the theming guide: https://material.angular.io/guide/theming'\r\n );\r\n }\r\n\r\n testElement.remove();\r\n}\r\n\r\n/** Checks whether the Material version matches the CDK version. */\r\nfunction _checkCdkVersionMatch(): void {\r\n if (VERSION.full !== CDK_VERSION.full) {\r\n console.warn(\r\n 'The Angular Material version (' +\r\n VERSION.full +\r\n ') does not match ' +\r\n 'the Angular CDK version (' +\r\n CDK_VERSION.full +\r\n ').\\n' +\r\n 'Please ensure the versions of these two packages exactly match.'\r\n );\r\n }\r\n}\r\n", + "sourceCode": "import { HighContrastModeDetector } from '@angular/cdk/a11y';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport {\n inject,\n Inject,\n InjectionToken,\n NgModule,\n Optional,\n} from '@angular/core';\nimport { VERSION as CDK_VERSION } from '@angular/cdk';\nimport { DOCUMENT } from '@angular/common';\nimport { Platform, _isTestEnvironment } from '@angular/cdk/platform';\nimport { VERSION } from '../version';\nimport { isDevMode } from '@angular/core';\n\n/** @docs-private */\nexport function MATERIAL_SANITY_CHECKS_FACTORY(): SanityChecks {\n return true;\n}\n\n/** Injection token that configures whether the Material sanity checks are enabled. */\nexport const MATERIAL_SANITY_CHECKS = new InjectionToken(\n 'mat-sanity-checks',\n {\n providedIn: 'root',\n factory: MATERIAL_SANITY_CHECKS_FACTORY,\n }\n);\n\n/**\n * Possible sanity checks that can be enabled. If set to\n * true/false, all checks will be enabled/disabled.\n */\nexport type SanityChecks = boolean | GranularSanityChecks;\n\n/** Object that can be used to configure the sanity checks granularly. */\nexport interface GranularSanityChecks {\n doctype: boolean;\n theme: boolean;\n version: boolean;\n}\n\n/**\n * Module that captures anything that should be loaded and/or run for *all* Angular Material\n * components. This includes Bidi, etc.\n *\n * This module should be imported to each top-level component module (e.g., OuiTabsModule).\n */\n@NgModule({\n imports: [BidiModule],\n exports: [BidiModule],\n})\nexport class OuiCommonModule {\n /** Whether we've done the global sanity checks (e.g. a theme is loaded, there is a doctype). */\n private _hasDoneGlobalChecks = false;\n\n constructor(\n highContrastModeDetector: HighContrastModeDetector,\n @Optional()\n @Inject(MATERIAL_SANITY_CHECKS)\n private _sanityChecks: SanityChecks,\n @Inject(DOCUMENT) private _document: Document\n ) {\n // While A11yModule also does this, we repeat it here to avoid importing A11yModule\n // in OuiCommonModule.\n highContrastModeDetector._applyBodyHighContrastModeCssClasses();\n\n if (!this._hasDoneGlobalChecks) {\n this._hasDoneGlobalChecks = true;\n\n if (typeof isDevMode === 'undefined' || isDevMode) {\n // Inject in here so the reference to `Platform` can be removed in production mode.\n const platform = inject(Platform, { optional: true });\n\n if (this._checkIsEnabled('doctype')) {\n _checkDoctypeIsDefined(this._document);\n }\n\n if (this._checkIsEnabled('theme')) {\n _checkThemeIsPresent(this._document, !!platform?.isBrowser);\n }\n\n if (this._checkIsEnabled('version')) {\n _checkCdkVersionMatch();\n }\n }\n }\n }\n\n /** Gets whether a specific sanity check is enabled. */\n private _checkIsEnabled(name: keyof GranularSanityChecks): boolean {\n if (_isTestEnvironment()) {\n return false;\n }\n\n if (typeof this._sanityChecks === 'boolean') {\n return this._sanityChecks;\n }\n\n return !!this._sanityChecks[name];\n }\n}\n\n/** Checks that the page has a doctype. */\nfunction _checkDoctypeIsDefined(doc: Document): void {\n if (!doc.doctype) {\n console.warn(\n 'Current document does not have a doctype. This may cause ' +\n 'some Angular Material components not to behave as expected.'\n );\n }\n}\n\n/** Checks that a theme has been included. */\nfunction _checkThemeIsPresent(doc: Document, isBrowser: boolean): void {\n // We need to assert that the `body` is defined, because these checks run very early\n // and the `body` won't be defined if the consumer put their scripts in the `head`.\n if (!doc.body || !isBrowser) {\n return;\n }\n\n const testElement = doc.createElement('div');\n testElement.classList.add('mat-theme-loaded-marker');\n doc.body.appendChild(testElement);\n\n const computedStyle = getComputedStyle(testElement);\n\n // In some situations the computed style of the test element can be null. For example in\n // Firefox, the computed style is null if an application is running inside of a hidden iframe.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n if (computedStyle && computedStyle.display !== 'none') {\n console.warn(\n 'Could not find Angular Material core theme. Most Material ' +\n 'components may not work as expected. For more info refer ' +\n 'to the theming guide: https://material.angular.io/guide/theming'\n );\n }\n\n testElement.remove();\n}\n\n/** Checks whether the Material version matches the CDK version. */\nfunction _checkCdkVersionMatch(): void {\n if (VERSION.full !== CDK_VERSION.full) {\n console.warn(\n 'The Angular Material version (' +\n VERSION.full +\n ') does not match ' +\n 'the Angular CDK version (' +\n CDK_VERSION.full +\n ').\\n' +\n 'Please ensure the versions of these two packages exactly match.'\n );\n }\n}\n", "properties": [ { "name": "doctype", @@ -613,12 +613,12 @@ }, { "name": "MatInkBarItem", - "id": "interface-MatInkBarItem-50fe2f1bca65db33aac094b14b277a02924ff4199f4bfe029de4c7e70c55f0d0b3d8f03cc04d8961159c28f0d20d52a85a2edbaf9f6b9506a466792860b45ccf", + "id": "interface-MatInkBarItem-135c8ccdab508fcf19b684306b7b52fe3cacc460ac2081644d8b0d211b3fb9a93c581e6b1e98ed9fdc3965312903a402f79f7ef73e228a1ef8f3bd236d89976f", "file": "ui/src/components/tabs/ink-bar.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport {\r\n ElementRef,\r\n InjectionToken,\r\n OnDestroy,\r\n OnInit,\r\n QueryList,\r\n} from '@angular/core';\r\nimport { isDevMode } from '@angular/core';\r\n\r\n/**\r\n * Item inside a tab header relative to which the ink bar can be aligned.\r\n * @docs-private\r\n */\r\nexport interface MatInkBarItem extends OnInit, OnDestroy {\r\n elementRef: ElementRef;\r\n activateInkBar(previousIndicatorClientRect?: ClientRect): void;\r\n deactivateInkBar(): void;\r\n fitInkBarToContent: boolean;\r\n}\r\n\r\n/** Class that is applied when a tab indicator is active. */\r\nconst ACTIVE_CLASS = 'mdc-tab-indicator--active';\r\n\r\n/** Class that is applied when the tab indicator should not transition. */\r\nconst NO_TRANSITION_CLASS = 'mdc-tab-indicator--no-transition';\r\n\r\n/**\r\n * Abstraction around the MDC tab indicator that acts as the tab header's ink bar.\r\n * @docs-private\r\n */\r\nexport class OuiInkBar {\r\n /** Item to which the ink bar is aligned currently. */\r\n private _currentItem: MatInkBarItem | undefined;\r\n\r\n constructor(private _items: QueryList) {}\r\n\r\n /** Hides the ink bar. */\r\n hide() {\r\n this._items.forEach((item) => item.deactivateInkBar());\r\n }\r\n\r\n /** Aligns the ink bar to a DOM node. */\r\n alignToElement(element: HTMLElement) {\r\n const correspondingItem = this._items.find(\r\n (item) => item.elementRef.nativeElement === element\r\n );\r\n const currentItem = this._currentItem;\r\n\r\n if (correspondingItem === currentItem) {\r\n return;\r\n }\r\n\r\n currentItem?.deactivateInkBar();\r\n\r\n if (correspondingItem) {\r\n const clientRect =\r\n currentItem?.elementRef.nativeElement.getBoundingClientRect?.();\r\n\r\n // The ink bar won't animate unless we give it the `ClientRect` of the previous item.\r\n correspondingItem.activateInkBar(clientRect);\r\n this._currentItem = correspondingItem;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Mixin that can be used to apply the `MatInkBarItem` behavior to a class.\r\n * Base on MDC's `MDCSlidingTabIndicatorFoundation`:\r\n * https://github.com/material-components/material-components-web/blob/c0a11ef0d000a098fd0c372be8f12d6a99302855/packages/mdc-tab-indicator/sliding-foundation.ts\r\n * @docs-private\r\n */\r\nexport function mixinInkBarItem<\r\n T extends new (...args: any[]) => { elementRef: ElementRef }\r\n>(base: T): T & (new (...args: any[]) => MatInkBarItem) {\r\n return class extends base {\r\n constructor(...args: any[]) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n super(...args);\r\n }\r\n\r\n private _inkBarElement: HTMLElement | null;\r\n private _inkBarContentElement: HTMLElement | null;\r\n private _fitToContent = false;\r\n\r\n /** Whether the ink bar should fit to the entire tab or just its content. */\r\n get fitInkBarToContent(): boolean {\r\n return this._fitToContent;\r\n }\r\n set fitInkBarToContent(v: BooleanInput) {\r\n const newValue = coerceBooleanProperty(v);\r\n\r\n if (this._fitToContent !== newValue) {\r\n this._fitToContent = newValue;\r\n\r\n if (this._inkBarElement) {\r\n this._appendInkBarElement();\r\n }\r\n }\r\n }\r\n\r\n /** Aligns the ink bar to the current item. */\r\n activateInkBar(previousIndicatorClientRect?: ClientRect) {\r\n const element = this.elementRef.nativeElement;\r\n\r\n // Early exit if no indicator is present to handle cases where an indicator\r\n // may be activated without a prior indicator state\r\n if (\r\n !previousIndicatorClientRect ||\r\n !element.getBoundingClientRect ||\r\n !this._inkBarContentElement\r\n ) {\r\n element.classList.add(ACTIVE_CLASS);\r\n return;\r\n }\r\n\r\n // This animation uses the FLIP approach. You can read more about it at the link below:\r\n // https://aerotwist.com/blog/flip-your-animations/\r\n\r\n // Calculate the dimensions based on the dimensions of the previous indicator\r\n const currentClientRect = element.getBoundingClientRect();\r\n const widthDelta =\r\n previousIndicatorClientRect.width / currentClientRect.width;\r\n const xPosition =\r\n previousIndicatorClientRect.left - currentClientRect.left;\r\n element.classList.add(NO_TRANSITION_CLASS);\r\n this._inkBarContentElement.style.setProperty(\r\n 'transform',\r\n `translateX(${xPosition}px) scaleX(${widthDelta})`\r\n );\r\n\r\n // Force repaint before updating classes and transform to ensure the transform properly takes effect\r\n element.getBoundingClientRect();\r\n\r\n element.classList.remove(NO_TRANSITION_CLASS);\r\n element.classList.add(ACTIVE_CLASS);\r\n this._inkBarContentElement.style.setProperty('transform', '');\r\n }\r\n\r\n /** Removes the ink bar from the current item. */\r\n deactivateInkBar() {\r\n this.elementRef.nativeElement.classList.remove(ACTIVE_CLASS);\r\n }\r\n\r\n /** Initializes the foundation. */\r\n ngOnInit() {\r\n this._createInkBarElement();\r\n }\r\n\r\n /** Destroys the foundation. */\r\n ngOnDestroy() {\r\n this._inkBarElement?.remove();\r\n this._inkBarElement = this._inkBarContentElement = null!;\r\n }\r\n\r\n /** Creates and appends the ink bar element. */\r\n private _createInkBarElement() {\r\n const documentNode =\r\n this.elementRef.nativeElement.ownerDocument || document;\r\n this._inkBarElement = documentNode.createElement('span');\r\n this._inkBarContentElement = documentNode.createElement('span');\r\n\r\n this._inkBarElement.className = 'mdc-tab-indicator';\r\n this._inkBarContentElement.className =\r\n 'mdc-tab-indicator__content mdc-tab-indicator__content--underline';\r\n\r\n this._inkBarElement.appendChild(this._inkBarContentElement);\r\n this._appendInkBarElement();\r\n }\r\n\r\n /**\r\n * Appends the ink bar to the tab host element or content, depending on whether\r\n * the ink bar should fit to content.\r\n */\r\n private _appendInkBarElement() {\r\n if (\r\n !this._inkBarElement &&\r\n (typeof isDevMode === 'undefined' || isDevMode)\r\n ) {\r\n throw Error(\r\n 'Ink bar element has not been created and cannot be appended'\r\n );\r\n }\r\n\r\n const parentElement = this._fitToContent\r\n ? this.elementRef.nativeElement.querySelector('.mdc-tab__content')\r\n : this.elementRef.nativeElement;\r\n\r\n if (!parentElement && (typeof isDevMode === 'undefined' || isDevMode)) {\r\n throw Error('Missing element to host the ink bar');\r\n }\r\n\r\n parentElement!.appendChild(this._inkBarElement!);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Interface for a OuiInkBar positioner method, defining the positioning and width of the ink\r\n * bar in a set of tabs.\r\n */\r\nexport interface _OuiInkBarPositioner {\r\n (element: HTMLElement): { left: string; width: string };\r\n}\r\n\r\n/**\r\n * The default positioner function for the OuiInkBar.\r\n * @docs-private\r\n */\r\nexport function _OUI_INK_BAR_POSITIONER_FACTORY(): _OuiInkBarPositioner {\r\n const method = (element: HTMLElement) => ({\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n left: element ? (element.offsetLeft || 0) + 'px' : '0',\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n width: element ? (element.offsetWidth || 0) + 'px' : '0',\r\n });\r\n\r\n return method;\r\n}\r\n\r\n/** Injection token for the OuiInkBar's Positioner. */\r\nexport const _OUI_INK_BAR_POSITIONER = new InjectionToken<_OuiInkBarPositioner>(\r\n 'MatInkBarPositioner',\r\n {\r\n providedIn: 'root',\r\n factory: _OUI_INK_BAR_POSITIONER_FACTORY,\r\n }\r\n);\r\n", + "sourceCode": "import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n ElementRef,\n InjectionToken,\n OnDestroy,\n OnInit,\n QueryList,\n} from '@angular/core';\nimport { isDevMode } from '@angular/core';\n\n/**\n * Item inside a tab header relative to which the ink bar can be aligned.\n * @docs-private\n */\nexport interface MatInkBarItem extends OnInit, OnDestroy {\n elementRef: ElementRef;\n activateInkBar(previousIndicatorClientRect?: ClientRect): void;\n deactivateInkBar(): void;\n fitInkBarToContent: boolean;\n}\n\n/** Class that is applied when a tab indicator is active. */\nconst ACTIVE_CLASS = 'mdc-tab-indicator--active';\n\n/** Class that is applied when the tab indicator should not transition. */\nconst NO_TRANSITION_CLASS = 'mdc-tab-indicator--no-transition';\n\n/**\n * Abstraction around the MDC tab indicator that acts as the tab header's ink bar.\n * @docs-private\n */\nexport class OuiInkBar {\n /** Item to which the ink bar is aligned currently. */\n private _currentItem: MatInkBarItem | undefined;\n\n constructor(private _items: QueryList) {}\n\n /** Hides the ink bar. */\n hide() {\n this._items.forEach((item) => item.deactivateInkBar());\n }\n\n /** Aligns the ink bar to a DOM node. */\n alignToElement(element: HTMLElement) {\n const correspondingItem = this._items.find(\n (item) => item.elementRef.nativeElement === element\n );\n const currentItem = this._currentItem;\n\n if (correspondingItem === currentItem) {\n return;\n }\n\n currentItem?.deactivateInkBar();\n\n if (correspondingItem) {\n const clientRect =\n currentItem?.elementRef.nativeElement.getBoundingClientRect?.();\n\n // The ink bar won't animate unless we give it the `ClientRect` of the previous item.\n correspondingItem.activateInkBar(clientRect);\n this._currentItem = correspondingItem;\n }\n }\n}\n\n/**\n * Mixin that can be used to apply the `MatInkBarItem` behavior to a class.\n * Base on MDC's `MDCSlidingTabIndicatorFoundation`:\n * https://github.com/material-components/material-components-web/blob/c0a11ef0d000a098fd0c372be8f12d6a99302855/packages/mdc-tab-indicator/sliding-foundation.ts\n * @docs-private\n */\nexport function mixinInkBarItem<\n T extends new (...args: any[]) => { elementRef: ElementRef }\n>(base: T): T & (new (...args: any[]) => MatInkBarItem) {\n return class extends base {\n constructor(...args: any[]) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n super(...args);\n }\n\n private _inkBarElement: HTMLElement | null;\n private _inkBarContentElement: HTMLElement | null;\n private _fitToContent = false;\n\n /** Whether the ink bar should fit to the entire tab or just its content. */\n get fitInkBarToContent(): boolean {\n return this._fitToContent;\n }\n set fitInkBarToContent(v: BooleanInput) {\n const newValue = coerceBooleanProperty(v);\n\n if (this._fitToContent !== newValue) {\n this._fitToContent = newValue;\n\n if (this._inkBarElement) {\n this._appendInkBarElement();\n }\n }\n }\n\n /** Aligns the ink bar to the current item. */\n activateInkBar(previousIndicatorClientRect?: ClientRect) {\n const element = this.elementRef.nativeElement;\n\n // Early exit if no indicator is present to handle cases where an indicator\n // may be activated without a prior indicator state\n if (\n !previousIndicatorClientRect ||\n !element.getBoundingClientRect ||\n !this._inkBarContentElement\n ) {\n element.classList.add(ACTIVE_CLASS);\n return;\n }\n\n // This animation uses the FLIP approach. You can read more about it at the link below:\n // https://aerotwist.com/blog/flip-your-animations/\n\n // Calculate the dimensions based on the dimensions of the previous indicator\n const currentClientRect = element.getBoundingClientRect();\n const widthDelta =\n previousIndicatorClientRect.width / currentClientRect.width;\n const xPosition =\n previousIndicatorClientRect.left - currentClientRect.left;\n element.classList.add(NO_TRANSITION_CLASS);\n this._inkBarContentElement.style.setProperty(\n 'transform',\n `translateX(${xPosition}px) scaleX(${widthDelta})`\n );\n\n // Force repaint before updating classes and transform to ensure the transform properly takes effect\n element.getBoundingClientRect();\n\n element.classList.remove(NO_TRANSITION_CLASS);\n element.classList.add(ACTIVE_CLASS);\n this._inkBarContentElement.style.setProperty('transform', '');\n }\n\n /** Removes the ink bar from the current item. */\n deactivateInkBar() {\n this.elementRef.nativeElement.classList.remove(ACTIVE_CLASS);\n }\n\n /** Initializes the foundation. */\n ngOnInit() {\n this._createInkBarElement();\n }\n\n /** Destroys the foundation. */\n ngOnDestroy() {\n this._inkBarElement?.remove();\n this._inkBarElement = this._inkBarContentElement = null!;\n }\n\n /** Creates and appends the ink bar element. */\n private _createInkBarElement() {\n const documentNode =\n this.elementRef.nativeElement.ownerDocument || document;\n this._inkBarElement = documentNode.createElement('span');\n this._inkBarContentElement = documentNode.createElement('span');\n\n this._inkBarElement.className = 'mdc-tab-indicator';\n this._inkBarContentElement.className =\n 'mdc-tab-indicator__content mdc-tab-indicator__content--underline';\n\n this._inkBarElement.appendChild(this._inkBarContentElement);\n this._appendInkBarElement();\n }\n\n /**\n * Appends the ink bar to the tab host element or content, depending on whether\n * the ink bar should fit to content.\n */\n private _appendInkBarElement() {\n if (\n !this._inkBarElement &&\n (typeof isDevMode === 'undefined' || isDevMode)\n ) {\n throw Error(\n 'Ink bar element has not been created and cannot be appended'\n );\n }\n\n const parentElement = this._fitToContent\n ? this.elementRef.nativeElement.querySelector('.mdc-tab__content')\n : this.elementRef.nativeElement;\n\n if (!parentElement && (typeof isDevMode === 'undefined' || isDevMode)) {\n throw Error('Missing element to host the ink bar');\n }\n\n parentElement!.appendChild(this._inkBarElement!);\n }\n };\n}\n\n/**\n * Interface for a OuiInkBar positioner method, defining the positioning and width of the ink\n * bar in a set of tabs.\n */\nexport interface _OuiInkBarPositioner {\n (element: HTMLElement): { left: string; width: string };\n}\n\n/**\n * The default positioner function for the OuiInkBar.\n * @docs-private\n */\nexport function _OUI_INK_BAR_POSITIONER_FACTORY(): _OuiInkBarPositioner {\n const method = (element: HTMLElement) => ({\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n left: element ? (element.offsetLeft || 0) + 'px' : '0',\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n width: element ? (element.offsetWidth || 0) + 'px' : '0',\n });\n\n return method;\n}\n\n/** Injection token for the OuiInkBar's Positioner. */\nexport const _OUI_INK_BAR_POSITIONER = new InjectionToken<_OuiInkBarPositioner>(\n 'MatInkBarPositioner',\n {\n providedIn: 'root',\n factory: _OUI_INK_BAR_POSITIONER_FACTORY,\n }\n);\n", "properties": [ { "name": "elementRef", @@ -692,12 +692,12 @@ }, { "name": "NewCSSStyleDeclaration", - "id": "interface-NewCSSStyleDeclaration-ffb93a0366a6db45703111c4fe658119cf87b8d44e269ec2926a30e8ecd94bebfb4adcfd399aeca78af8a2424610392ab8cece9c0abb63c2a560ad78706daebd", + "id": "interface-NewCSSStyleDeclaration-e9697def10890f47a95cf9f3bc5b2f98679be923c51d88410413d049b9f0d1aa747f42f5904aa817dc83a1c560c44b1ca4996f4759598c8e0196872f3ec3df70", "file": "ui/src/components/tooltip/tooltip.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { AnimationEvent } from '@angular/animations';\nimport { AriaDescriber, FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n BreakpointObserver,\n Breakpoints,\n BreakpointState,\n} from '@angular/cdk/layout';\nimport {\n FlexibleConnectedPositionStrategy,\n HorizontalConnectionPos,\n OriginConnectionPosition,\n Overlay,\n OverlayConnectionPosition,\n OverlayRef,\n VerticalConnectionPos,\n ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport { ScrollDispatcher } from '@angular/cdk/scrolling';\nimport { Platform } from '@angular/cdk/platform';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { take, takeUntil } from 'rxjs/operators';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Directive,\n ElementRef,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { Subject, Observable } from 'rxjs';\nimport { ouiTooltipAnimations } from './tooltip-animations';\nimport { CanDisable } from '../core';\n\nexport type TooltipPosition = 'left' | 'right' | 'above' | 'below';\n\n/** Time in ms to throttle repositioning after scroll events. */\nexport const SCROLL_THROTTLE_MS = 20;\n\n/** CSS class that will be attached to the overlay panel. */\nexport const TOOLTIP_PANEL_CLASS = 'oui-tooltip-panel';\n\n/**\n * Creates an error to be thrown if the user supplied an invalid tooltip position.\n *\n * @docs-private\n */\nexport function getOuiTooltipInvalidPositionError(position: string) {\n return Error(`Tooltip position \"${position}\" is invalid.`);\n}\n\n/** Injection token that determines the scroll handling while a tooltip is visible. */\nexport const OUI_TOOLTIP_SCROLL_STRATEGY = new InjectionToken<\n () => ScrollStrategy\n>('oui-tooltip-scroll-strategy');\n\n/** @docs-private */\nexport function OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY(\n overlay: Overlay\n): () => ScrollStrategy {\n return () =>\n overlay.scrollStrategies.reposition({ scrollThrottle: SCROLL_THROTTLE_MS });\n}\n\n/** @docs-private */\nexport const OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\n};\n\n/** Default `ouiTooltip` options that can be overridden. */\nexport interface OuiTooltipDefaultOptions {\n showDelay: number;\n hideDelay: number;\n touchendHideDelay: number;\n}\n\nexport interface NewCSSStyleDeclaration extends CSSStyleDeclaration {\n msUserSelect: string;\n}\n\n/** Injection token to be used to override the default options for `ouiTooltip`. */\nexport const OUI_TOOLTIP_DEFAULT_OPTIONS =\n new InjectionToken('oui-tooltip-default-options', {\n providedIn: 'root',\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY(): OuiTooltipDefaultOptions {\n return {\n showDelay: 0,\n hideDelay: 0,\n touchendHideDelay: 1500,\n };\n}\n\nexport type TooltipVisibility = 'initial' | 'visible' | 'hidden';\n\n/**\n * Internal component that wraps the tooltip's content.\n *\n * @docs-private\n */\n@Component({\n selector: 'oui-tooltip-component',\n templateUrl: 'tooltip.html',\n styleUrls: ['tooltip.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [ouiTooltipAnimations.tooltipState],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n // Forces the element to have a layout in IE and Edge. This fixes issues where the element\n // won't be rendered if the animations are disabled or there is no web animations polyfill.\n '[style.zoom]': '_visibility === \"visible\" ? 1 : null',\n '(body:click)': 'this._handleBodyInteraction()',\n 'aria-hidden': 'true',\n },\n})\nexport class TooltipComponent {\n /** Message to display in the tooltip */\n message: string;\n /** Classes to be added to the tooltip. Supports the same syntax as `ngClass`. */\n tooltipClass: string | string[] | Set | { [key: string]: any };\n\n /** The timeout ID of any current timer set to show the tooltip */\n _showTimeoutId: number | null;\n\n /** The timeout ID of any current timer set to hide the tooltip */\n _hideTimeoutId: number | null;\n\n /** Property watched by the animation framework to show or hide the tooltip */\n _visibility: TooltipVisibility = 'initial';\n\n /** Whether interactions on the page should close the tooltip */\n private _closeOnInteraction = false;\n\n /** Subject for notifying that the tooltip has been hidden from the view */\n private readonly _onHide: Subject = new Subject();\n\n /** Stream that emits whether the user has a handset-sized display. */\n _isHandset: Observable = this._breakpointObserver.observe(\n Breakpoints.Handset\n );\n\n constructor(\n private _changeDetectorRef: ChangeDetectorRef,\n private _breakpointObserver: BreakpointObserver\n ) {}\n\n /**\n * Shows the tooltip with an animation originating from the provided origin\n *\n * @param delay Amount of milliseconds to the delay showing the tooltip.\n */\n show(): void {\n // Cancel the delayed hide if it is scheduled\n if (this._hideTimeoutId) {\n clearTimeout(this._hideTimeoutId);\n this._hideTimeoutId = null;\n }\n\n // Body interactions should cancel the tooltip if there is a delay in showing.\n this._closeOnInteraction = true;\n setTimeout(() => {\n this._visibility = 'visible';\n this._showTimeoutId = null;\n\n // Mark for check so if any parent component has set the\n // ChangeDetectionStrategy to OnPush it will be checked anyways\n this._markForCheck();\n }, 0);\n }\n\n /**\n * Begins the animation to hide the tooltip after the provided delay in ms.\n *\n * @param delay Amount of milliseconds to delay showing the tooltip.\n */\n hide(): void {\n // Cancel the delayed show if it is scheduled\n if (this._showTimeoutId) {\n clearTimeout(this._showTimeoutId);\n this._showTimeoutId = null;\n }\n setTimeout(() => {\n this._visibility = 'hidden';\n this._hideTimeoutId = null;\n // Mark for check so if any parent component has set the\n // ChangeDetectionStrategy to OnPush it will be checked anyways\n this._markForCheck();\n }, 0);\n }\n\n /** Returns an observable that notifies when the tooltip has been hidden from view. */\n afterHidden(): Observable {\n return this._onHide.asObservable();\n }\n\n /** Whether the tooltip is being displayed. */\n isVisible(): boolean {\n return this._visibility === 'visible';\n }\n\n _animationStart() {\n this._closeOnInteraction = false;\n }\n\n _animationDone(event: AnimationEvent): void {\n const toState = event.toState as TooltipVisibility;\n\n if (toState === 'hidden' && !this.isVisible()) {\n this._onHide.next();\n }\n\n if (toState === 'visible' || toState === 'hidden') {\n this._closeOnInteraction = true;\n }\n }\n\n /**\n * Interactions on the HTML body should close the tooltip immediately\n */\n _handleBodyInteraction(): void {\n if (this._closeOnInteraction) {\n this.hide();\n }\n }\n\n /**\n * Marks that the tooltip needs to be checked in the next change detection run.\n * Mainly used for rendering the initial text before positioning a tooltip, which\n * can be problematic in components with OnPush change detection.\n */\n _markForCheck(): void {\n this._changeDetectorRef.markForCheck();\n }\n}\n\n/**\n * Directive that attaches a tooltip to the host element. Animates the showing and\n * hiding of a tooltip provided position (defaults to below the element).\n */\n@Directive({\n selector: '[ouiTooltip]',\n exportAs: 'ouiTooltip',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '(longpress)': 'show()',\n '(keydown)': '_handleKeydown($event)',\n '(touchend)': '_handleTouchend()',\n '[attr.tabindex]': 'disabled ? -1 : 0',\n '[attr.aria-hidden]': 'false',\n },\n})\nexport class OuiTooltip implements OnDestroy, CanDisable {\n _overlayRef: OverlayRef | null;\n _tooltipInstance: TooltipComponent | null;\n\n private _portal: ComponentPortal;\n private _position: TooltipPosition = 'below';\n private _disabled = false;\n private _tooltipClass:\n | string\n | string[]\n | Set\n | { [key: string]: any };\n private _scrollStrategy: () => ScrollStrategy;\n\n /** Allows the user to define the position of the tooltip relative to the parent element */\n @Input('ouiTooltipPosition')\n get position(): TooltipPosition {\n return this._position;\n }\n set position(value: TooltipPosition) {\n if (value !== this._position) {\n this._position = value;\n if (this._overlayRef) {\n this._updatePosition();\n\n if (this._tooltipInstance) {\n this._tooltipInstance!.show();\n }\n\n this._overlayRef.updatePosition();\n }\n }\n }\n\n /** Disables the display of the tooltip. */\n @Input('ouiTooltipDisabled')\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n\n // If tooltip is disabled, hide immediately.\n if (this._disabled) {\n this.hide();\n }\n }\n\n private _message = '';\n\n /** The message to be displayed in the tooltip */\n @Input('ouiTooltip')\n get message() {\n return this._message;\n }\n set message(value: string) {\n this._ariaDescriber.removeDescription(\n this._elementRef.nativeElement,\n this._message\n );\n\n // If the message is not a string (e.g. number), convert it to a string and trim it.\n this._message = value != null ? `${value}`.trim() : '';\n\n if (!this._message && this._isTooltipVisible()) {\n this.hide();\n } else {\n this._updateTooltipMessage();\n this._ariaDescriber.describe(\n this._elementRef.nativeElement,\n this.message\n );\n }\n }\n\n /** Classes to be passed to the tooltip. Supports the same syntax as `ngClass`. */\n @Input('ouiTooltipClass')\n get tooltipClass() {\n return this._tooltipClass;\n }\n set tooltipClass(\n value: string | string[] | Set | { [key: string]: any }\n ) {\n this._tooltipClass = value;\n if (this._tooltipInstance) {\n this._tooltipInstance._markForCheck();\n this._setTooltipClass(this._tooltipClass);\n }\n }\n\n private _manualListeners = new Map<\n string,\n EventListenerOrEventListenerObject\n >();\n\n /** Emits when the component is destroyed. */\n private readonly _destroyed = new Subject();\n\n constructor(\n private _overlay: Overlay,\n private _elementRef: ElementRef,\n private _scrollDispatcher: ScrollDispatcher,\n private _viewContainerRef: ViewContainerRef,\n private _ngZone: NgZone,\n platform: Platform,\n private _ariaDescriber: AriaDescriber,\n private _focusMonitor: FocusMonitor,\n @Inject(OUI_TOOLTIP_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _dir: Directionality\n ) {\n this._scrollStrategy = scrollStrategy;\n const element: HTMLElement = _elementRef.nativeElement;\n const elementStyle = element.style as NewCSSStyleDeclaration & {\n webkitUserDrag: string;\n };\n const hasGestures = typeof window === 'undefined' || (window as any).Hammer;\n\n // The mouse events shouldn't be bound on mobile devices, because they can prevent the\n // first tap from firing its click event or can cause the tooltip to open for clicks.\n if (!platform.IOS && !platform.ANDROID) {\n this._manualListeners\n .set('mouseenter', () => this.show())\n .set('mouseleave', () => this.hide());\n } else if (!hasGestures) {\n // there's no way for the user to trigger the tooltip on a touch device.\n this._manualListeners.set('touchstart', () => this.show());\n }\n\n this._manualListeners.forEach((listener, event) =>\n element.addEventListener(event, listener)\n );\n\n if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n elementStyle.webkitUserSelect =\n elementStyle.userSelect =\n elementStyle.msUserSelect =\n '';\n }\n\n // Hammer applies `-webkit-user-drag: none` on all elements by default,\n // which breaks the native drag&drop. If the consumer explicitly made\n // the element draggable, clear the `-webkit-user-drag`.\n if (element.draggable && elementStyle.webkitUserDrag === 'none') {\n elementStyle.webkitUserDrag = '';\n }\n\n _focusMonitor\n .monitor(_elementRef)\n .pipe(takeUntil(this._destroyed))\n .subscribe((origin) => {\n // Note that the focus monitor runs outside the Angular zone.\n if (!origin) {\n _ngZone.run(() => this.hide());\n } else if (origin === 'keyboard') {\n _ngZone.run(() => this.show());\n }\n });\n }\n\n /**\n * Dispose the tooltip when destroyed.\n */\n ngOnDestroy() {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._tooltipInstance = null;\n }\n\n // Clean up the event listeners set in the constructor\n this._manualListeners.forEach((listener, event) => {\n this._elementRef.nativeElement.removeEventListener(event, listener);\n });\n this._manualListeners.clear();\n\n this._destroyed.next();\n this._destroyed.complete();\n\n this._ariaDescriber.removeDescription(\n this._elementRef.nativeElement,\n this.message\n );\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n /** Shows the tooltip after the delay in ms, defaults to tooltip-delay-show or 0ms if no input */\n show(): void {\n if (\n this.disabled ||\n !this.message ||\n (this._isTooltipVisible() &&\n !this._tooltipInstance!._showTimeoutId &&\n !this._tooltipInstance!._hideTimeoutId)\n ) {\n return;\n }\n\n const overlayRef = this._createOverlay();\n\n this._detach();\n this._portal =\n this._portal ||\n new ComponentPortal(TooltipComponent, this._viewContainerRef);\n this._tooltipInstance = overlayRef.attach(this._portal).instance;\n this._tooltipInstance\n .afterHidden()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._detach());\n this._setTooltipClass(this._tooltipClass);\n this._updateTooltipMessage();\n this._tooltipInstance!.show();\n }\n\n /** Hides the tooltip after the delay in ms, defaults to tooltip-delay-hide or 0ms if no input */\n hide(): void {\n if (this._tooltipInstance) {\n this._tooltipInstance.hide();\n }\n }\n\n /** Shows/hides the tooltip */\n toggle(): void {\n this._isTooltipVisible() ? this.hide() : this.show();\n }\n\n /** Returns true if the tooltip is currently visible to the user */\n _isTooltipVisible(): boolean {\n return !!this._tooltipInstance && this._tooltipInstance.isVisible();\n }\n\n /** Handles the keydown events on the host element. */\n _handleKeydown(e: KeyboardEvent) {\n if (this._isTooltipVisible() && e.key === 'Escape') {\n e.stopPropagation();\n this.hide();\n }\n }\n\n /** Handles the touchend events on the host element. */\n _handleTouchend() {\n this.hide();\n }\n\n /** Create the overlay config and position strategy */\n private _createOverlay(): OverlayRef {\n if (this._overlayRef) {\n return this._overlayRef;\n }\n\n // Create connected position strategy that listens for scroll events to reposition.\n const strategy = this._overlay\n .position()\n .flexibleConnectedTo(this._elementRef)\n .withTransformOriginOn('.oui-tooltip')\n .withFlexibleDimensions(false)\n .withViewportMargin(8);\n\n const scrollableAncestors =\n this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);\n\n strategy.withScrollableContainers(scrollableAncestors);\n\n strategy.positionChanges\n .pipe(takeUntil(this._destroyed))\n .subscribe((change) => {\n if (this._tooltipInstance) {\n if (\n change.scrollableViewProperties.isOverlayClipped &&\n this._tooltipInstance.isVisible()\n ) {\n // After position changes occur and the overlay is clipped by\n // a parent scrollable then close the tooltip.\n this._ngZone.run(() => this.hide());\n }\n }\n });\n\n this._overlayRef = this._overlay.create({\n direction: this._dir,\n positionStrategy: strategy,\n panelClass: TOOLTIP_PANEL_CLASS,\n scrollStrategy: this._scrollStrategy(),\n });\n\n this._updatePosition();\n\n this._overlayRef\n .detachments()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._detach());\n\n return this._overlayRef;\n }\n\n /** Detaches the currently-attached tooltip. */\n private _detach() {\n if (this._overlayRef && this._overlayRef.hasAttached()) {\n this._overlayRef.detach();\n }\n\n this._tooltipInstance = null;\n }\n\n /** Updates the position of the current tooltip. */\n private _updatePosition() {\n const position = this._overlayRef!.getConfig()\n .positionStrategy as FlexibleConnectedPositionStrategy;\n const origin = this._getOrigin();\n const overlay = this._getOverlayPosition();\n\n position.withPositions([\n { ...origin.main, ...overlay.main },\n { ...origin.fallback, ...overlay.fallback },\n ]);\n }\n\n /**\n * Returns the origin position and a fallback position based on the user's position preference.\n * The fallback position is the inverse of the origin (e.g. `'below' -> 'above'`).\n */\n _getOrigin(): {\n main: OriginConnectionPosition;\n fallback: OriginConnectionPosition;\n } {\n const isLtr = !this._dir || this._dir.value === 'ltr';\n const position = this.position;\n let originPosition: OriginConnectionPosition;\n\n if (position === 'above' || position === 'below') {\n originPosition = {\n originX: 'center',\n originY: position === 'above' ? 'top' : 'bottom',\n };\n } else if (\n (position === 'left' && isLtr) ||\n (position === 'right' && !isLtr)\n ) {\n originPosition = { originX: 'start', originY: 'center' };\n } else if (\n (position === 'right' && isLtr) ||\n (position === 'left' && !isLtr)\n ) {\n originPosition = { originX: 'end', originY: 'center' };\n } else {\n throw getOuiTooltipInvalidPositionError(position);\n }\n\n const { x, y } = this._invertPosition(\n originPosition.originX,\n originPosition.originY\n );\n\n return {\n main: originPosition,\n fallback: { originX: x, originY: y },\n };\n }\n\n /** Returns the overlay position and a fallback position based on the user's preference */\n _getOverlayPosition(): {\n main: OverlayConnectionPosition;\n fallback: OverlayConnectionPosition;\n } {\n const isLtr = !this._dir || this._dir.value === 'ltr';\n const position = this.position;\n let overlayPosition: OverlayConnectionPosition;\n\n if (position === 'above') {\n overlayPosition = { overlayX: 'center', overlayY: 'bottom' };\n } else if (position === 'below') {\n overlayPosition = { overlayX: 'center', overlayY: 'top' };\n } else if (\n (position === 'left' && isLtr) ||\n (position === 'right' && !isLtr)\n ) {\n overlayPosition = { overlayX: 'end', overlayY: 'center' };\n } else if (\n (position === 'right' && isLtr) ||\n (position === 'left' && !isLtr)\n ) {\n overlayPosition = { overlayX: 'start', overlayY: 'center' };\n } else {\n throw getOuiTooltipInvalidPositionError(position);\n }\n\n const { x, y } = this._invertPosition(\n overlayPosition.overlayX,\n overlayPosition.overlayY\n );\n\n return {\n main: overlayPosition,\n fallback: { overlayX: x, overlayY: y },\n };\n }\n\n /** Updates the tooltip message and repositions the overlay according to the new message length */\n private _updateTooltipMessage() {\n // Must wait for the message to be painted to the tooltip so that the overlay can properly\n // calculate the correct positioning based on the size of the text.\n if (this._tooltipInstance) {\n this._tooltipInstance.message = this.message;\n this._tooltipInstance._markForCheck();\n\n this._ngZone.onMicrotaskEmpty\n .asObservable()\n .pipe(take(1), takeUntil(this._destroyed))\n .subscribe(() => {\n if (this._tooltipInstance) {\n this._overlayRef!.updatePosition();\n }\n });\n }\n }\n\n /** Updates the tooltip class */\n private _setTooltipClass(\n tooltipClass: string | string[] | Set | { [key: string]: any }\n ) {\n if (this._tooltipInstance) {\n this._tooltipInstance.tooltipClass = tooltipClass;\n this._tooltipInstance._markForCheck();\n }\n }\n\n /** Inverts an overlay position. */\n private _invertPosition(\n x: HorizontalConnectionPos,\n y: VerticalConnectionPos\n ) {\n if (this.position === 'above' || this.position === 'below') {\n if (y === 'top') {\n y = 'bottom';\n } else if (y === 'bottom') {\n y = 'top';\n }\n } else {\n if (x === 'end') {\n x = 'start';\n } else if (x === 'start') {\n x = 'end';\n }\n }\n\n return { x, y };\n }\n}\n", + "sourceCode": "import { AnimationEvent } from '@angular/animations';\r\nimport { AriaDescriber, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport {\r\n BreakpointObserver,\r\n Breakpoints,\r\n BreakpointState,\r\n} from '@angular/cdk/layout';\r\nimport {\r\n FlexibleConnectedPositionStrategy,\r\n HorizontalConnectionPos,\r\n OriginConnectionPosition,\r\n Overlay,\r\n OverlayConnectionPosition,\r\n OverlayRef,\r\n VerticalConnectionPos,\r\n ScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { ScrollDispatcher } from '@angular/cdk/scrolling';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { take, takeUntil } from 'rxjs/operators';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Directive,\r\n ElementRef,\r\n Inject,\r\n InjectionToken,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Optional,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ouiTooltipAnimations } from './tooltip-animations';\r\nimport { CanDisable } from '../core';\r\n\r\nexport type TooltipPosition = 'left' | 'right' | 'above' | 'below';\r\n\r\n/** Time in ms to throttle repositioning after scroll events. */\r\nexport const SCROLL_THROTTLE_MS = 20;\r\n\r\n/** CSS class that will be attached to the overlay panel. */\r\nexport const TOOLTIP_PANEL_CLASS = 'oui-tooltip-panel';\r\n\r\n/**\r\n * Creates an error to be thrown if the user supplied an invalid tooltip position.\r\n *\r\n * @docs-private\r\n */\r\nexport function getOuiTooltipInvalidPositionError(position: string) {\r\n return Error(`Tooltip position \"${position}\" is invalid.`);\r\n}\r\n\r\n/** Injection token that determines the scroll handling while a tooltip is visible. */\r\nexport const OUI_TOOLTIP_SCROLL_STRATEGY = new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-tooltip-scroll-strategy');\r\n\r\n/** @docs-private */\r\nexport function OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY(\r\n overlay: Overlay\r\n): () => ScrollStrategy {\r\n return () =>\r\n overlay.scrollStrategies.reposition({ scrollThrottle: SCROLL_THROTTLE_MS });\r\n}\r\n\r\n/** @docs-private */\r\nexport const OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER = {\r\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\r\n};\r\n\r\n/** Default `ouiTooltip` options that can be overridden. */\r\nexport interface OuiTooltipDefaultOptions {\r\n showDelay: number;\r\n hideDelay: number;\r\n touchendHideDelay: number;\r\n}\r\n\r\nexport interface NewCSSStyleDeclaration extends CSSStyleDeclaration {\r\n msUserSelect: string;\r\n}\r\n\r\n/** Injection token to be used to override the default options for `ouiTooltip`. */\r\nexport const OUI_TOOLTIP_DEFAULT_OPTIONS =\r\n new InjectionToken('oui-tooltip-default-options', {\r\n providedIn: 'root',\r\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\r\n });\r\n\r\n/** @docs-private */\r\nexport function OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY(): OuiTooltipDefaultOptions {\r\n return {\r\n showDelay: 0,\r\n hideDelay: 0,\r\n touchendHideDelay: 1500,\r\n };\r\n}\r\n\r\nexport type TooltipVisibility = 'initial' | 'visible' | 'hidden';\r\n\r\n/**\r\n * Internal component that wraps the tooltip's content.\r\n *\r\n * @docs-private\r\n */\r\n@Component({\r\n selector: 'oui-tooltip-component',\r\n templateUrl: 'tooltip.html',\r\n styleUrls: ['tooltip.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [ouiTooltipAnimations.tooltipState],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n // Forces the element to have a layout in IE and Edge. This fixes issues where the element\r\n // won't be rendered if the animations are disabled or there is no web animations polyfill.\r\n '[style.zoom]': '_visibility === \"visible\" ? 1 : null',\r\n '(body:click)': 'this._handleBodyInteraction()',\r\n 'aria-hidden': 'true',\r\n },\r\n})\r\nexport class TooltipComponent {\r\n /** Message to display in the tooltip */\r\n message: string;\r\n /** Classes to be added to the tooltip. Supports the same syntax as `ngClass`. */\r\n tooltipClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** The timeout ID of any current timer set to show the tooltip */\r\n _showTimeoutId: number | null;\r\n\r\n /** The timeout ID of any current timer set to hide the tooltip */\r\n _hideTimeoutId: number | null;\r\n\r\n /** Property watched by the animation framework to show or hide the tooltip */\r\n _visibility: TooltipVisibility = 'initial';\r\n\r\n /** Whether interactions on the page should close the tooltip */\r\n private _closeOnInteraction = false;\r\n\r\n /** Subject for notifying that the tooltip has been hidden from the view */\r\n private readonly _onHide: Subject = new Subject();\r\n\r\n /** Stream that emits whether the user has a handset-sized display. */\r\n _isHandset: Observable = this._breakpointObserver.observe(\r\n Breakpoints.Handset\r\n );\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _breakpointObserver: BreakpointObserver\r\n ) {}\r\n\r\n /**\r\n * Shows the tooltip with an animation originating from the provided origin\r\n *\r\n * @param delay Amount of milliseconds to the delay showing the tooltip.\r\n */\r\n show(): void {\r\n // Cancel the delayed hide if it is scheduled\r\n if (this._hideTimeoutId) {\r\n clearTimeout(this._hideTimeoutId);\r\n this._hideTimeoutId = null;\r\n }\r\n\r\n // Body interactions should cancel the tooltip if there is a delay in showing.\r\n this._closeOnInteraction = true;\r\n setTimeout(() => {\r\n this._visibility = 'visible';\r\n this._showTimeoutId = null;\r\n\r\n // Mark for check so if any parent component has set the\r\n // ChangeDetectionStrategy to OnPush it will be checked anyways\r\n this._markForCheck();\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Begins the animation to hide the tooltip after the provided delay in ms.\r\n *\r\n * @param delay Amount of milliseconds to delay showing the tooltip.\r\n */\r\n hide(): void {\r\n // Cancel the delayed show if it is scheduled\r\n if (this._showTimeoutId) {\r\n clearTimeout(this._showTimeoutId);\r\n this._showTimeoutId = null;\r\n }\r\n setTimeout(() => {\r\n this._visibility = 'hidden';\r\n this._hideTimeoutId = null;\r\n // Mark for check so if any parent component has set the\r\n // ChangeDetectionStrategy to OnPush it will be checked anyways\r\n this._markForCheck();\r\n }, 0);\r\n }\r\n\r\n /** Returns an observable that notifies when the tooltip has been hidden from view. */\r\n afterHidden(): Observable {\r\n return this._onHide.asObservable();\r\n }\r\n\r\n /** Whether the tooltip is being displayed. */\r\n isVisible(): boolean {\r\n return this._visibility === 'visible';\r\n }\r\n\r\n _animationStart() {\r\n this._closeOnInteraction = false;\r\n }\r\n\r\n _animationDone(event: AnimationEvent): void {\r\n const toState = event.toState as TooltipVisibility;\r\n\r\n if (toState === 'hidden' && !this.isVisible()) {\r\n this._onHide.next();\r\n }\r\n\r\n if (toState === 'visible' || toState === 'hidden') {\r\n this._closeOnInteraction = true;\r\n }\r\n }\r\n\r\n /**\r\n * Interactions on the HTML body should close the tooltip immediately\r\n */\r\n _handleBodyInteraction(): void {\r\n if (this._closeOnInteraction) {\r\n this.hide();\r\n }\r\n }\r\n\r\n /**\r\n * Marks that the tooltip needs to be checked in the next change detection run.\r\n * Mainly used for rendering the initial text before positioning a tooltip, which\r\n * can be problematic in components with OnPush change detection.\r\n */\r\n _markForCheck(): void {\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n}\r\n\r\n/**\r\n * Directive that attaches a tooltip to the host element. Animates the showing and\r\n * hiding of a tooltip provided position (defaults to below the element).\r\n */\r\n@Directive({\r\n selector: '[ouiTooltip]',\r\n exportAs: 'ouiTooltip',\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '(longpress)': 'show()',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(touchend)': '_handleTouchend()',\r\n '[attr.tabindex]': 'disabled ? -1 : 0',\r\n '[attr.aria-hidden]': 'false',\r\n },\r\n})\r\nexport class OuiTooltip implements OnDestroy, CanDisable {\r\n _overlayRef: OverlayRef | null;\r\n _tooltipInstance: TooltipComponent | null;\r\n\r\n private _portal: ComponentPortal;\r\n private _position: TooltipPosition = 'below';\r\n private _disabled = false;\r\n private _tooltipClass:\r\n | string\r\n | string[]\r\n | Set\r\n | { [key: string]: any };\r\n private _scrollStrategy: () => ScrollStrategy;\r\n\r\n /** Allows the user to define the position of the tooltip relative to the parent element */\r\n @Input('ouiTooltipPosition')\r\n get position(): TooltipPosition {\r\n return this._position;\r\n }\r\n set position(value: TooltipPosition) {\r\n if (value !== this._position) {\r\n this._position = value;\r\n if (this._overlayRef) {\r\n this._updatePosition();\r\n\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance!.show();\r\n }\r\n\r\n this._overlayRef.updatePosition();\r\n }\r\n }\r\n }\r\n\r\n /** Disables the display of the tooltip. */\r\n @Input('ouiTooltipDisabled')\r\n get disabled(): boolean {\r\n return this._disabled;\r\n }\r\n set disabled(value) {\r\n this._disabled = coerceBooleanProperty(value);\r\n\r\n // If tooltip is disabled, hide immediately.\r\n if (this._disabled) {\r\n this.hide();\r\n }\r\n }\r\n\r\n private _message = '';\r\n\r\n /** The message to be displayed in the tooltip */\r\n @Input('ouiTooltip')\r\n get message() {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._ariaDescriber.removeDescription(\r\n this._elementRef.nativeElement,\r\n this._message\r\n );\r\n\r\n // If the message is not a string (e.g. number), convert it to a string and trim it.\r\n this._message = value != null ? `${value}`.trim() : '';\r\n\r\n if (!this._message && this._isTooltipVisible()) {\r\n this.hide();\r\n } else {\r\n this._updateTooltipMessage();\r\n this._ariaDescriber.describe(\r\n this._elementRef.nativeElement,\r\n this.message\r\n );\r\n }\r\n }\r\n\r\n /** Classes to be passed to the tooltip. Supports the same syntax as `ngClass`. */\r\n @Input('ouiTooltipClass')\r\n get tooltipClass() {\r\n return this._tooltipClass;\r\n }\r\n set tooltipClass(\r\n value: string | string[] | Set | { [key: string]: any }\r\n ) {\r\n this._tooltipClass = value;\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance._markForCheck();\r\n this._setTooltipClass(this._tooltipClass);\r\n }\r\n }\r\n\r\n private _manualListeners = new Map<\r\n string,\r\n EventListenerOrEventListenerObject\r\n >();\r\n\r\n /** Emits when the component is destroyed. */\r\n private readonly _destroyed = new Subject();\r\n\r\n constructor(\r\n private _overlay: Overlay,\r\n private _elementRef: ElementRef,\r\n private _scrollDispatcher: ScrollDispatcher,\r\n private _viewContainerRef: ViewContainerRef,\r\n private _ngZone: NgZone,\r\n platform: Platform,\r\n private _ariaDescriber: AriaDescriber,\r\n private _focusMonitor: FocusMonitor,\r\n @Inject(OUI_TOOLTIP_SCROLL_STRATEGY) scrollStrategy: any,\r\n @Optional() private _dir: Directionality\r\n ) {\r\n this._scrollStrategy = scrollStrategy;\r\n const element: HTMLElement = _elementRef.nativeElement;\r\n const elementStyle = element.style as NewCSSStyleDeclaration & {\r\n webkitUserDrag: string;\r\n };\r\n const hasGestures = typeof window === 'undefined' || (window as any).Hammer;\r\n\r\n // The mouse events shouldn't be bound on mobile devices, because they can prevent the\r\n // first tap from firing its click event or can cause the tooltip to open for clicks.\r\n if (!platform.IOS && !platform.ANDROID) {\r\n this._manualListeners\r\n .set('mouseenter', () => this.show())\r\n .set('mouseleave', () => this.hide());\r\n } else if (!hasGestures) {\r\n // there's no way for the user to trigger the tooltip on a touch device.\r\n this._manualListeners.set('touchstart', () => this.show());\r\n }\r\n\r\n this._manualListeners.forEach((listener, event) =>\r\n element.addEventListener(event, listener)\r\n );\r\n\r\n if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\r\n elementStyle.webkitUserSelect =\r\n elementStyle.userSelect =\r\n elementStyle.msUserSelect =\r\n '';\r\n }\r\n\r\n // Hammer applies `-webkit-user-drag: none` on all elements by default,\r\n // which breaks the native drag&drop. If the consumer explicitly made\r\n // the element draggable, clear the `-webkit-user-drag`.\r\n if (element.draggable && elementStyle.webkitUserDrag === 'none') {\r\n elementStyle.webkitUserDrag = '';\r\n }\r\n\r\n _focusMonitor\r\n .monitor(_elementRef)\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe((origin) => {\r\n // Note that the focus monitor runs outside the Angular zone.\r\n if (!origin) {\r\n _ngZone.run(() => this.hide());\r\n } else if (origin === 'keyboard') {\r\n _ngZone.run(() => this.show());\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Dispose the tooltip when destroyed.\r\n */\r\n ngOnDestroy() {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._tooltipInstance = null;\r\n }\r\n\r\n // Clean up the event listeners set in the constructor\r\n this._manualListeners.forEach((listener, event) => {\r\n this._elementRef.nativeElement.removeEventListener(event, listener);\r\n });\r\n this._manualListeners.clear();\r\n\r\n this._destroyed.next();\r\n this._destroyed.complete();\r\n\r\n this._ariaDescriber.removeDescription(\r\n this._elementRef.nativeElement,\r\n this.message\r\n );\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n }\r\n\r\n /** Shows the tooltip after the delay in ms, defaults to tooltip-delay-show or 0ms if no input */\r\n show(): void {\r\n if (\r\n this.disabled ||\r\n !this.message ||\r\n (this._isTooltipVisible() &&\r\n !this._tooltipInstance!._showTimeoutId &&\r\n !this._tooltipInstance!._hideTimeoutId)\r\n ) {\r\n return;\r\n }\r\n\r\n const overlayRef = this._createOverlay();\r\n\r\n this._detach();\r\n this._portal =\r\n this._portal ||\r\n new ComponentPortal(TooltipComponent, this._viewContainerRef);\r\n this._tooltipInstance = overlayRef.attach(this._portal).instance;\r\n this._tooltipInstance\r\n .afterHidden()\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => this._detach());\r\n this._setTooltipClass(this._tooltipClass);\r\n this._updateTooltipMessage();\r\n this._tooltipInstance!.show();\r\n }\r\n\r\n /** Hides the tooltip after the delay in ms, defaults to tooltip-delay-hide or 0ms if no input */\r\n hide(): void {\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.hide();\r\n } else {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n }\r\n }\r\n\r\n /** Shows/hides the tooltip */\r\n toggle(): void {\r\n if (this._isTooltipVisible()) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n /** Returns true if the tooltip is currently visible to the user */\r\n _isTooltipVisible(): boolean {\r\n return !!this._tooltipInstance && this._tooltipInstance.isVisible();\r\n }\r\n\r\n /** Handles the keydown events on the host element. */\r\n _handleKeydown(e: KeyboardEvent) {\r\n if (this._isTooltipVisible() && e.key === 'Escape') {\r\n e.stopPropagation();\r\n this.hide();\r\n }\r\n }\r\n\r\n /** Handles the touchend events on the host element. */\r\n _handleTouchend() {\r\n this.hide();\r\n }\r\n\r\n /** Create the overlay config and position strategy */\r\n private _createOverlay(): OverlayRef {\r\n if (this._overlayRef) {\r\n return this._overlayRef;\r\n }\r\n\r\n // Create connected position strategy that listens for scroll events to reposition.\r\n const strategy = this._overlay\r\n .position()\r\n .flexibleConnectedTo(this._elementRef)\r\n .withTransformOriginOn('.oui-tooltip')\r\n .withFlexibleDimensions(false)\r\n .withViewportMargin(8);\r\n\r\n const scrollableAncestors =\r\n this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);\r\n\r\n strategy.withScrollableContainers(scrollableAncestors);\r\n\r\n strategy.positionChanges\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe((change) => {\r\n if (this._tooltipInstance) {\r\n if (\r\n change.scrollableViewProperties.isOverlayClipped &&\r\n this._tooltipInstance.isVisible()\r\n ) {\r\n // After position changes occur and the overlay is clipped by\r\n // a parent scrollable then close the tooltip.\r\n this._ngZone.run(() => this.hide());\r\n }\r\n }\r\n });\r\n\r\n this._overlayRef = this._overlay.create({\r\n direction: this._dir,\r\n positionStrategy: strategy,\r\n panelClass: TOOLTIP_PANEL_CLASS,\r\n scrollStrategy: this._scrollStrategy(),\r\n });\r\n\r\n this._updatePosition();\r\n\r\n this._overlayRef\r\n .detachments()\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => this._detach());\r\n\r\n return this._overlayRef;\r\n }\r\n\r\n /** Detaches the currently-attached tooltip. */\r\n private _detach() {\r\n if (this._overlayRef && this._overlayRef.hasAttached()) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n\r\n this._tooltipInstance = null;\r\n }\r\n\r\n /** Updates the position of the current tooltip. */\r\n private _updatePosition() {\r\n const position = this._overlayRef!.getConfig()\r\n .positionStrategy as FlexibleConnectedPositionStrategy;\r\n const origin = this._getOrigin();\r\n const overlay = this._getOverlayPosition();\r\n\r\n position.withPositions([\r\n { ...origin.main, ...overlay.main },\r\n { ...origin.fallback, ...overlay.fallback },\r\n ]);\r\n }\r\n\r\n /**\r\n * Returns the origin position and a fallback position based on the user's position preference.\r\n * The fallback position is the inverse of the origin (e.g. `'below' -> 'above'`).\r\n */\r\n _getOrigin(): {\r\n main: OriginConnectionPosition;\r\n fallback: OriginConnectionPosition;\r\n } {\r\n const isLtr = !this._dir || this._dir.value === 'ltr';\r\n const position = this.position;\r\n let originPosition: OriginConnectionPosition;\r\n\r\n if (position === 'above' || position === 'below') {\r\n originPosition = {\r\n originX: 'center',\r\n originY: position === 'above' ? 'top' : 'bottom',\r\n };\r\n } else if (\r\n (position === 'left' && isLtr) ||\r\n (position === 'right' && !isLtr)\r\n ) {\r\n originPosition = { originX: 'start', originY: 'center' };\r\n } else if (\r\n (position === 'right' && isLtr) ||\r\n (position === 'left' && !isLtr)\r\n ) {\r\n originPosition = { originX: 'end', originY: 'center' };\r\n } else {\r\n throw getOuiTooltipInvalidPositionError(position);\r\n }\r\n\r\n const { x, y } = this._invertPosition(\r\n originPosition.originX,\r\n originPosition.originY\r\n );\r\n\r\n return {\r\n main: originPosition,\r\n fallback: { originX: x, originY: y },\r\n };\r\n }\r\n\r\n /** Returns the overlay position and a fallback position based on the user's preference */\r\n _getOverlayPosition(): {\r\n main: OverlayConnectionPosition;\r\n fallback: OverlayConnectionPosition;\r\n } {\r\n const isLtr = !this._dir || this._dir.value === 'ltr';\r\n const position = this.position;\r\n let overlayPosition: OverlayConnectionPosition;\r\n\r\n if (position === 'above') {\r\n overlayPosition = { overlayX: 'center', overlayY: 'bottom' };\r\n } else if (position === 'below') {\r\n overlayPosition = { overlayX: 'center', overlayY: 'top' };\r\n } else if (\r\n (position === 'left' && isLtr) ||\r\n (position === 'right' && !isLtr)\r\n ) {\r\n overlayPosition = { overlayX: 'end', overlayY: 'center' };\r\n } else if (\r\n (position === 'right' && isLtr) ||\r\n (position === 'left' && !isLtr)\r\n ) {\r\n overlayPosition = { overlayX: 'start', overlayY: 'center' };\r\n } else {\r\n throw getOuiTooltipInvalidPositionError(position);\r\n }\r\n\r\n const { x, y } = this._invertPosition(\r\n overlayPosition.overlayX,\r\n overlayPosition.overlayY\r\n );\r\n\r\n return {\r\n main: overlayPosition,\r\n fallback: { overlayX: x, overlayY: y },\r\n };\r\n }\r\n\r\n /** Updates the tooltip message and repositions the overlay according to the new message length */\r\n private _updateTooltipMessage() {\r\n // Must wait for the message to be painted to the tooltip so that the overlay can properly\r\n // calculate the correct positioning based on the size of the text.\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.message = this.message;\r\n this._tooltipInstance._markForCheck();\r\n\r\n this._ngZone.onMicrotaskEmpty\r\n .asObservable()\r\n .pipe(take(1), takeUntil(this._destroyed))\r\n .subscribe(() => {\r\n if (this._tooltipInstance) {\r\n this._overlayRef!.updatePosition();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Updates the tooltip class */\r\n private _setTooltipClass(\r\n tooltipClass: string | string[] | Set | { [key: string]: any }\r\n ) {\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.tooltipClass = tooltipClass;\r\n this._tooltipInstance._markForCheck();\r\n }\r\n }\r\n\r\n /** Inverts an overlay position. */\r\n private _invertPosition(\r\n x: HorizontalConnectionPos,\r\n y: VerticalConnectionPos\r\n ) {\r\n if (this.position === 'above' || this.position === 'below') {\r\n if (y === 'top') {\r\n y = 'bottom';\r\n } else if (y === 'bottom') {\r\n y = 'top';\r\n }\r\n } else {\r\n if (x === 'end') {\r\n x = 'start';\r\n } else if (x === 'start') {\r\n x = 'end';\r\n }\r\n }\r\n\r\n return { x, y };\r\n }\r\n}\r\n", "properties": [ { "name": "msUserSelect", @@ -1007,12 +1007,12 @@ }, { "name": "OuiOptionParentComponent", - "id": "interface-OuiOptionParentComponent-436221d2917bb329efe9ec76f95eb377b81359f9380f577db0c0ce2da5a0904b6eee34d58bbfe6f9af17f79a4a5c6deb5879f211cbb416ef7a77f3b11b3bc534", + "id": "interface-OuiOptionParentComponent-6803c2b34ba11ee66c956668869be7746da442626cda9f8b384b5071dcad58a7685f856cc2e7cb60f03aba43a3989b6e24b0ec44dbf21413ada07dbfb2fa712a", "file": "ui/src/components/core/option/option.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\nimport {\n AfterViewChecked,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewEncapsulation,\n NgZone,\n} from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { OuiOptgroup } from './optgroup';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/**\n * Option IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nlet _uniqueIdCounter = 0;\n\n/** Event object emitted by OuiOption when selected or deselected. */\nexport class OuiOptionSelectionChange {\n constructor(\n /** Reference to the option that emitted the event. */\n public source: OuiOption,\n /** Whether the change in the option's value was a result of a user action. */\n public isUserInput = false\n ) {}\n}\n\n/**\n * Describes a parent component that manages a list of options.\n * Contains properties that the options can inherit.\n *\n * @docs-private\n */\nexport interface OuiOptionParentComponent {\n multiple?: boolean;\n}\n\n/**\n * Injection token used to provide the parent component to options.\n */\nexport const OUI_OPTION_PARENT_COMPONENT =\n new InjectionToken('OUI_OPTION_PARENT_COMPONENT');\n\n/**\n * Single option inside of a `` element.\n */\n@Component({\n selector: 'oui-option',\n exportAs: 'ouiOption',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n role: 'option',\n '[attr.tabindex]': '_getTabIndex()',\n '[class.oui-selected]': 'selected',\n '[class.oui-option-multiple]': 'multiple',\n '[class.oui-active]': 'active',\n '[id]': 'id',\n '[attr.aria-selected]': 'selected.toString()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[class.oui-option-disabled]': 'disabled',\n '(click)': '_selectViaInteraction()',\n '(keydown)': '_handleKeydown($event)',\n class: 'oui-option',\n },\n styleUrls: ['option.scss'],\n templateUrl: 'option.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiOption implements AfterViewChecked, OnDestroy {\n private _selected = false;\n private _active = false;\n private _disabled = false;\n private _mostRecentViewValue = '';\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n /** Whether the wrapping component is in multiple selection mode. */\n get multiple() {\n return this._parent && this._parent.multiple;\n }\n\n /** Whether or not the option is currently selected. */\n get selected(): boolean {\n return this._selected;\n }\n\n /** The form value of the option. */\n @Input()\n value: any;\n\n /** The unique ID of the option. */\n @Input()\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n id = `oui-option-${_uniqueIdCounter++}`;\n\n /** Whether the option is disabled. */\n @Input()\n get disabled() {\n return (this.group && this.group.disabled) || this._disabled;\n }\n set disabled(value: any) {\n this._disabled = coerceBooleanProperty(value);\n }\n\n /** Event emitted when the option is selected or deselected. */\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onSelectionChange = new EventEmitter();\n\n /** Emits when the state of the option changes and any parents have to be notified. */\n readonly _stateChanges = new Subject();\n\n constructor(\n private _element: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Optional()\n @Inject(OUI_OPTION_PARENT_COMPONENT)\n private _parent: OuiOptionParentComponent,\n @Optional() readonly group: OuiOptgroup\n ) {\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n\n /**\n * Whether or not the option is currently active and ready to be selected.\n * An active option displays styles as if it is focused, but the\n * focus is actually retained somewhere else. This comes in handy\n * for components like autocomplete where focus must remain on the input.\n */\n get active(): boolean {\n return this._active;\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValue(): string {\n return (this._getHostElement().textContent || '').trim();\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValueForSelect(): string {\n return this._getHostElement().querySelector('.oui-option-text').innerHTML;\n }\n\n /** Selects the option. */\n select(): void {\n if (!this._selected) {\n this._selected = true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Deselects the option. */\n deselect(): void {\n if (this._selected) {\n this._selected = false;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Sets focus onto this option. */\n focus(): void {\n const element = this._getHostElement();\n\n if (typeof element.focus === 'function') {\n element.focus();\n }\n }\n\n /**\n * This method sets display styles on the option to make it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setActiveStyles(): void {\n if (!this._active) {\n this._active = true;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * This method removes display styles on the option that made it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setInactiveStyles(): void {\n if (this._active) {\n this._active = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /** Gets the label to be used when determining whether the option should be focused. */\n getLabel(): string {\n return this.viewValue;\n }\n\n /** Ensures the option is selected when activated from the keyboard. */\n _handleKeydown(event: KeyboardEvent): void {\n if (event.keyCode === ENTER || event.keyCode === SPACE) {\n this._selectViaInteraction();\n\n // Prevent the page from scrolling down and form submits.\n event.preventDefault();\n }\n }\n\n /**\n * `Selects the option while indicating the selection came from the user. Used to\n * determine if the select's view -> model callback should be invoked.`\n */\n _selectViaInteraction(): void {\n if (!this.disabled) {\n this._selected = this.multiple ? !this._selected : true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent(true);\n }\n }\n\n /** Returns the correct tabindex for the option depending on disabled state. */\n _getTabIndex(): string {\n return this.disabled ? '-1' : '0';\n }\n\n /** Gets the host DOM element. */\n _getHostElement(): HTMLElement {\n return this._element.nativeElement;\n }\n\n ngAfterViewChecked() {\n // Since parent components could be using the option's label to display the selected values\n // (e.g. `oui-select`) and they don't have a way of knowing if the option's label has changed\n // we have to check for changes in the DOM ourselves and dispatch an event. These checks are\n // relatively cheap, however we still limit them only to selected options in order to avoid\n // hitting the DOM too often.\n if (this._selected) {\n const viewValue = this.viewValue;\n\n if (viewValue !== this._mostRecentViewValue) {\n this._mostRecentViewValue = viewValue;\n this._stateChanges.next();\n }\n }\n }\n\n ngOnDestroy() {\n this._stateChanges.complete();\n this._monitorSubscription.unsubscribe();\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n\n /** Emits the selection change event. */\n private _emitSelectionChangeEvent(isUserInput = false): void {\n this.onSelectionChange.emit(\n new OuiOptionSelectionChange(this, isUserInput)\n );\n }\n}\n\n/**\n * Counts the amount of option group labels that precede the specified option.\n *\n * @param optionIndex Index of the option at which to start counting.\n * @param options Flat list of all of the options.\n * @param optionGroups Flat list of all of the option groups.\n * @docs-private\n */\nexport function _countGroupLabelsBeforeOption(\n optionIndex: number,\n options: QueryList,\n optionGroups: QueryList\n): number {\n if (optionGroups.length) {\n const optionsArray = options.toArray();\n const groups = optionGroups.toArray();\n let groupCounter = 0;\n\n for (let i = 0; i <= optionIndex; i++) {\n if (\n optionsArray[i].group &&\n optionsArray[i].group === groups[groupCounter]\n ) {\n groupCounter++;\n }\n }\n\n return groupCounter;\n }\n\n return 0;\n}\n\n/**\n * Determines the position to which to scroll a panel in order for an option to be into view.\n *\n * @param optionIndex Index of the option to be scrolled into the view.\n * @param optionHeight Height of the options.\n * @param currentScrollPosition Current scroll position of the panel.\n * @param panelHeight Height of the panel.\n * @docs-private\n */\nexport function _getOptionScrollPosition(\n optionIndex: number,\n optionHeight: number,\n currentScrollPosition: number,\n panelHeight: number\n): number {\n const optionOffset = optionIndex * optionHeight;\n\n if (optionOffset < currentScrollPosition) {\n return optionOffset;\n }\n\n if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {\n return Math.max(0, optionOffset - panelHeight + optionHeight);\n }\n\n return currentScrollPosition;\n}\n", + "sourceCode": "import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\nimport {\n AfterViewChecked,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewEncapsulation,\n NgZone,\n} from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { OuiOptgroup } from './optgroup';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/**\n * Option IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nlet _uniqueIdCounter = 0;\n\n/** Event object emitted by OuiOption when selected or deselected. */\nexport class OuiOptionSelectionChange {\n constructor(\n /** Reference to the option that emitted the event. */\n public source: OuiOption,\n /** Whether the change in the option's value was a result of a user action. */\n public isUserInput = false\n ) {}\n}\n\n/**\n * Describes a parent component that manages a list of options.\n * Contains properties that the options can inherit.\n *\n * @docs-private\n */\nexport interface OuiOptionParentComponent {\n multiple?: boolean;\n}\n\n/**\n * Injection token used to provide the parent component to options.\n */\nexport const OUI_OPTION_PARENT_COMPONENT =\n new InjectionToken('OUI_OPTION_PARENT_COMPONENT');\n\n/**\n * Single option inside of a `` element.\n */\n@Component({\n selector: 'oui-option',\n exportAs: 'ouiOption',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n role: 'option',\n '[attr.tabindex]': '_getTabIndex()',\n '[class.oui-selected]': 'selected',\n '[class.oui-option-multiple]': 'multiple',\n '[class.oui-active]': 'active',\n '[id]': 'id',\n '[attr.aria-selected]': 'selected.toString()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[class.oui-option-disabled]': 'disabled',\n '(click)': '_selectViaInteraction()',\n '(keydown)': '_handleKeydown($event)',\n class: 'oui-option',\n },\n styleUrls: ['option.scss'],\n templateUrl: 'option.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiOption implements AfterViewChecked, OnDestroy {\n private _selected = false;\n private _active = false;\n private _disabled = false;\n private _mostRecentViewValue = '';\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n /** Whether the wrapping component is in multiple selection mode. */\n get multiple() {\n return this._parent && this._parent.multiple;\n }\n\n /** Whether or not the option is currently selected. */\n get selected(): boolean {\n return this._selected;\n }\n\n /** The form value of the option. */\n @Input()\n value: any;\n\n /** The unique ID of the option. */\n @Input()\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n id = `oui-option-${_uniqueIdCounter++}`;\n\n /** Whether the option is disabled. */\n @Input()\n get disabled() {\n return (this.group && this.group.disabled) || this._disabled;\n }\n set disabled(value: any) {\n this._disabled = coerceBooleanProperty(value);\n }\n\n /** Event emitted when the option is selected or deselected. */\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onSelectionChange = new EventEmitter();\n\n /** Emits when the state of the option changes and any parents have to be notified. */\n readonly _stateChanges = new Subject();\n\n constructor(\n private _element: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Optional()\n @Inject(OUI_OPTION_PARENT_COMPONENT)\n private _parent: OuiOptionParentComponent,\n @Optional() readonly group: OuiOptgroup\n ) {\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n\n /**\n * Whether or not the option is currently active and ready to be selected.\n * An active option displays styles as if it is focused, but the\n * focus is actually retained somewhere else. This comes in handy\n * for components like autocomplete where focus must remain on the input.\n */\n get active(): boolean {\n return this._active;\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValue(): string {\n return (this._getHostElement().textContent || '').trim();\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValueForSelect(): string {\n return this._getHostElement().querySelector('.oui-option-text').innerHTML;\n }\n\n /** Selects the option. */\n select(): void {\n if (!this._selected) {\n this._selected = true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Deselects the option. */\n deselect(): void {\n if (this._selected) {\n this._selected = false;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Sets focus onto this option. */\n focus(): void {\n const element = this._getHostElement();\n\n if (typeof element.focus === 'function') {\n element.focus();\n }\n }\n\n /**\n * This method sets display styles on the option to make it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setActiveStyles(): void {\n if (!this._active) {\n this._active = true;\n setTimeout((_) => {\n const focusedElement = document.querySelector(\n '.oui-active'\n ) as HTMLElement;\n const multiSelect = document.querySelector(\n '.oui-option-pseudo-checkbox'\n ) as HTMLElement;\n const ouiSearch = document.querySelector('.oui-select-search-input');\n if (focusedElement && !multiSelect && !ouiSearch) {\n focusedElement?.focus();\n }\n });\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * This method removes display styles on the option that made it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setInactiveStyles(): void {\n if (this._active) {\n this._active = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /** Gets the label to be used when determining whether the option should be focused. */\n getLabel(): string {\n return this.viewValue;\n }\n\n /** Ensures the option is selected when activated from the keyboard. */\n _handleKeydown(event: KeyboardEvent): void {\n if (event.keyCode === ENTER || event.keyCode === SPACE) {\n this._selectViaInteraction();\n\n // Prevent the page from scrolling down and form submits.\n event.preventDefault();\n }\n }\n\n /**\n * `Selects the option while indicating the selection came from the user. Used to\n * determine if the select's view -> model callback should be invoked.`\n */\n _selectViaInteraction(): void {\n if (!this.disabled) {\n this._selected = this.multiple ? !this._selected : true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent(true);\n }\n }\n\n /** Returns the correct tabindex for the option depending on disabled state. */\n _getTabIndex(): string {\n return this.disabled ? '-1' : '0';\n }\n\n /** Gets the host DOM element. */\n _getHostElement(): HTMLElement {\n return this._element.nativeElement;\n }\n\n ngAfterViewChecked() {\n // Since parent components could be using the option's label to display the selected values\n // (e.g. `oui-select`) and they don't have a way of knowing if the option's label has changed\n // we have to check for changes in the DOM ourselves and dispatch an event. These checks are\n // relatively cheap, however we still limit them only to selected options in order to avoid\n // hitting the DOM too often.\n if (this._selected) {\n const viewValue = this.viewValue;\n\n if (viewValue !== this._mostRecentViewValue) {\n this._mostRecentViewValue = viewValue;\n this._stateChanges.next();\n }\n }\n }\n\n ngOnDestroy() {\n this._stateChanges.complete();\n this._monitorSubscription.unsubscribe();\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n\n /** Emits the selection change event. */\n private _emitSelectionChangeEvent(isUserInput = false): void {\n this.onSelectionChange.emit(\n new OuiOptionSelectionChange(this, isUserInput)\n );\n }\n}\n\n/**\n * Counts the amount of option group labels that precede the specified option.\n *\n * @param optionIndex Index of the option at which to start counting.\n * @param options Flat list of all of the options.\n * @param optionGroups Flat list of all of the option groups.\n * @docs-private\n */\nexport function _countGroupLabelsBeforeOption(\n optionIndex: number,\n options: QueryList,\n optionGroups: QueryList\n): number {\n if (optionGroups.length) {\n const optionsArray = options.toArray();\n const groups = optionGroups.toArray();\n let groupCounter = 0;\n\n for (let i = 0; i <= optionIndex; i++) {\n if (\n optionsArray[i].group &&\n optionsArray[i].group === groups[groupCounter]\n ) {\n groupCounter++;\n }\n }\n\n return groupCounter;\n }\n\n return 0;\n}\n\n/**\n * Determines the position to which to scroll a panel in order for an option to be into view.\n *\n * @param optionIndex Index of the option to be scrolled into the view.\n * @param optionHeight Height of the options.\n * @param currentScrollPosition Current scroll position of the panel.\n * @param panelHeight Height of the panel.\n * @docs-private\n */\nexport function _getOptionScrollPosition(\n optionIndex: number,\n optionHeight: number,\n currentScrollPosition: number,\n panelHeight: number,\n selectedOptionOffset?: number\n): number {\n const optionOffset = selectedOptionOffset || optionIndex * optionHeight;\n\n if (optionOffset < currentScrollPosition) {\n return optionOffset;\n }\n\n if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {\n return Math.max(0, optionOffset - panelHeight + optionHeight);\n }\n\n return currentScrollPosition;\n}\n", "properties": [ { "name": "multiple", @@ -1033,12 +1033,12 @@ }, { "name": "OuiPanelDefaultOptions", - "id": "interface-OuiPanelDefaultOptions-065bb74cd1fa7f57341de83af5abd480b4a05e128e287e5f54c73e268d54b3b383070ce1cfa253877356eca1debdca5c7fc6658f6f2f2690c8fd1b55a9d5486e", + "id": "interface-OuiPanelDefaultOptions-319dcf3ca1c2c7cf6cd7e3d4bba379c4aa2e94e41aa061d20bff089c80142fbba6de25bd8c82eef015fcc7021d8182a8115d4fe629b75df19d3067ec60a18de4", "file": "ui/src/components/panel/panel.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import {\n ChangeDetectionStrategy,\n ViewEncapsulation,\n Component,\n InjectionToken,\n Inject,\n Input,\n ViewChild,\n TemplateRef,\n OnInit,\n ContentChild,\n Output,\n EventEmitter,\n Attribute,\n NgZone,\n ElementRef,\n OnDestroy,\n} from '@angular/core';\nimport { PanelPositionX, PanelPositionY } from './panel-positions';\nimport {\n throwOuiPanelInvalidPositionX,\n throwOuiPanelInvalidPositionY,\n} from './panel-errors';\nimport { OuiPanelOverlay } from './panel-overlay';\nimport { OuiPanelContent } from './panel-content';\nimport { Subject, Observable, Subscription } from 'rxjs';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Default `oui-panel` options that can be overridden. */\nexport interface OuiPanelDefaultOptions {\n /** The x-axis position of the menu. */\n xPosition: PanelPositionX;\n\n /** The y-axis position of the menu. */\n yPosition: PanelPositionY;\n}\n\n/** Injection token to be used to override the default options for `oui-menu`. */\nexport const OUI_PANEL_DEFAULT_OPTIONS =\n new InjectionToken('oui-panel-default-options', {\n providedIn: 'root',\n factory: OUI_PANEL_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function OUI_PANEL_DEFAULT_OPTIONS_FACTORY(): OuiPanelDefaultOptions {\n return {\n xPosition: 'after',\n yPosition: 'below',\n };\n}\n\n@Component({\n selector: 'oui-panel',\n templateUrl: 'panel.html',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanel',\n})\nexport class OuiPanel implements OnInit, OuiPanelOverlay {\n private _xPosition: PanelPositionX = this._defaultOptions.xPosition;\n private _yPosition: PanelPositionY = this._defaultOptions.yPosition;\n private readonly _mouseLeave: Subject = new Subject();\n public mouseLeave: Observable;\n private readonly _mouseEnter: Subject = new Subject();\n public mouseEnter: Observable;\n public escapeEvent: Subject = new Subject();\n\n @Input() width?: number;\n\n /** Config object to be passed into the menu's ngClass */\n _classList: { [key: string]: boolean } = {};\n\n @ViewChild(TemplateRef)\n templateRef: TemplateRef;\n\n /**\n * Panel content that will be rendered lazily.\n *\n * @docs-private\n */\n @ContentChild(OuiPanelContent)\n lazyContent: OuiPanelContent;\n\n /** Event emitted when the menu is closed. */\n @Output()\n readonly closed: EventEmitter = new EventEmitter();\n\n /** Position of the menu in the X axis. */\n @Input()\n get xPosition(): PanelPositionX {\n return this._xPosition;\n }\n set xPosition(value: PanelPositionX) {\n if (value !== 'before' && value !== 'after') {\n throwOuiPanelInvalidPositionX();\n }\n this._xPosition = value;\n this.setPositionClasses();\n }\n\n /** Position of the menu in the Y axis. */\n @Input()\n get yPosition(): PanelPositionY {\n return this._yPosition;\n }\n set yPosition(value: PanelPositionY) {\n if (value !== 'above' && value !== 'below') {\n throwOuiPanelInvalidPositionY();\n }\n this._yPosition = value;\n this.setPositionClasses();\n }\n constructor(\n @Inject(OUI_PANEL_DEFAULT_OPTIONS)\n private _defaultOptions: OuiPanelDefaultOptions\n ) {\n this.mouseLeave = this._mouseLeave.asObservable();\n this.mouseEnter = this._mouseEnter.asObservable();\n }\n\n ngOnInit() {\n this.setPositionClasses();\n }\n\n /**\n * Adds classes to the panel-overlay based on its position. Can be used by\n * consumers to add specific styling based on the position.\n *\n * @param posX Position of the panel along the x axis.\n * @param posY Position of the panel along the y axis.\n * @docs-private\n */\n setPositionClasses(\n posX: PanelPositionX = this.xPosition,\n posY: PanelPositionY = this.yPosition\n ) {\n const classes = this._classList;\n classes['oui-panel-before'] = posX === 'before';\n classes['oui-panel-after'] = posX === 'after';\n classes['oui-panel-above'] = posY === 'above';\n classes['oui-panel-below'] = posY === 'below';\n }\n\n public _handleMouseLeave(event: MouseEvent) {\n this._mouseLeave.next(event);\n }\n\n public _handleMouseEnter(event: MouseEvent) {\n this._mouseEnter.next(event);\n }\n\n public _handleCloseIcon() {\n this.escapeEvent.next();\n }\n}\n\n@Component({\n selector: 'oui-panel-icon',\n template:\n '',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanelIcon',\n})\nexport class OuiPanelIcon implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n tabIndex: any;\n constructor(\n private _elementRef: ElementRef,\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Attribute('tabindex') tabIndex: string\n ) {\n this.tabIndex = parseInt(tabIndex, 10) || 0;\n this._monitorSubscription = this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n\n this.ouiIconRegistry.addSvgIconLiteral(\n `panel-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.PANEL_ICON)\n );\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon_8X8`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON_8X8)\n );\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef.nativeElement);\n this._monitorSubscription.unsubscribe();\n }\n}\n", + "sourceCode": "import {\n ChangeDetectionStrategy,\n ViewEncapsulation,\n Component,\n InjectionToken,\n Inject,\n Input,\n ViewChild,\n TemplateRef,\n OnInit,\n ContentChild,\n Output,\n EventEmitter,\n Attribute,\n NgZone,\n ElementRef,\n OnDestroy,\n} from '@angular/core';\nimport { PanelPositionX, PanelPositionY } from './panel-positions';\nimport {\n throwOuiPanelInvalidPositionX,\n throwOuiPanelInvalidPositionY,\n} from './panel-errors';\nimport { OuiPanelOverlay } from './panel-overlay';\nimport { OuiPanelContent } from './panel-content';\nimport { Subject, Observable, Subscription } from 'rxjs';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Default `oui-panel` options that can be overridden. */\nexport interface OuiPanelDefaultOptions {\n /** The x-axis position of the menu. */\n xPosition: PanelPositionX;\n\n /** The y-axis position of the menu. */\n yPosition: PanelPositionY;\n}\n\n/** Injection token to be used to override the default options for `oui-menu`. */\nexport const OUI_PANEL_DEFAULT_OPTIONS =\n new InjectionToken('oui-panel-default-options', {\n providedIn: 'root',\n factory: OUI_PANEL_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function OUI_PANEL_DEFAULT_OPTIONS_FACTORY(): OuiPanelDefaultOptions {\n return {\n xPosition: 'after',\n yPosition: 'below',\n };\n}\n\n@Component({\n selector: 'oui-panel',\n templateUrl: 'panel.html',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanel',\n})\nexport class OuiPanel implements OnInit, OuiPanelOverlay {\n private _xPosition: PanelPositionX = this._defaultOptions.xPosition;\n private _yPosition: PanelPositionY = this._defaultOptions.yPosition;\n private readonly _mouseLeave: Subject = new Subject();\n public mouseLeave: Observable;\n private readonly _mouseEnter: Subject = new Subject();\n public mouseEnter: Observable;\n public escapeEvent: Subject = new Subject();\n\n @Input() width?: number;\n\n /** Config object to be passed into the menu's ngClass */\n _classList: { [key: string]: boolean } = {};\n\n @ViewChild(TemplateRef)\n templateRef: TemplateRef;\n\n /**\n * Panel content that will be rendered lazily.\n *\n * @docs-private\n */\n @ContentChild(OuiPanelContent)\n lazyContent: OuiPanelContent;\n\n /** Event emitted when the menu is closed. */\n @Output()\n readonly closed: EventEmitter = new EventEmitter();\n\n /** Position of the menu in the X axis. */\n @Input()\n get xPosition(): PanelPositionX {\n return this._xPosition;\n }\n set xPosition(value: PanelPositionX) {\n if (value !== 'before' && value !== 'after') {\n throwOuiPanelInvalidPositionX();\n }\n this._xPosition = value;\n this.setPositionClasses();\n }\n\n /** Position of the menu in the Y axis. */\n @Input()\n get yPosition(): PanelPositionY {\n return this._yPosition;\n }\n set yPosition(value: PanelPositionY) {\n if (value !== 'above' && value !== 'below') {\n throwOuiPanelInvalidPositionY();\n }\n this._yPosition = value;\n this.setPositionClasses();\n }\n constructor(\n @Inject(OUI_PANEL_DEFAULT_OPTIONS)\n private _defaultOptions: OuiPanelDefaultOptions\n ) {\n this.mouseLeave = this._mouseLeave.asObservable();\n this.mouseEnter = this._mouseEnter.asObservable();\n }\n\n ngOnInit() {\n this.setPositionClasses();\n }\n\n /**\n * Adds classes to the panel-overlay based on its position. Can be used by\n * consumers to add specific styling based on the position.\n *\n * @param posX Position of the panel along the x axis.\n * @param posY Position of the panel along the y axis.\n * @docs-private\n */\n setPositionClasses(\n posX: PanelPositionX = this.xPosition,\n posY: PanelPositionY = this.yPosition\n ) {\n const classes = this._classList;\n classes['oui-panel-before'] = posX === 'before';\n classes['oui-panel-after'] = posX === 'after';\n classes['oui-panel-above'] = posY === 'above';\n classes['oui-panel-below'] = posY === 'below';\n }\n\n public _handleMouseLeave(event: MouseEvent) {\n this._mouseLeave.next(event);\n }\n\n public _handleMouseEnter(event: MouseEvent) {\n this._mouseEnter.next(event);\n }\n\n public _handleCloseIcon() {\n this.escapeEvent.next();\n }\n}\n\n@Component({\n selector: 'oui-panel-icon',\n template:\n '',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanelIcon',\n})\nexport class OuiPanelIcon implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n tabIndex: any;\n constructor(\n private _elementRef: ElementRef,\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Attribute('tabindex') tabIndex: string\n ) {\n this._elementRef.nativeElement.setAttribute('tabindex', '0');\n this.tabIndex = parseInt(tabIndex, 10) || 0;\n this._monitorSubscription = this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n\n this.ouiIconRegistry.addSvgIconLiteral(\n `panel-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.PANEL_ICON)\n );\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon_8X8`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON_8X8)\n );\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef.nativeElement);\n this._monitorSubscription.unsubscribe();\n }\n}\n", "properties": [ { "name": "xPosition", @@ -1241,12 +1241,12 @@ }, { "name": "OuiTabGroupBaseHeader", - "id": "interface-OuiTabGroupBaseHeader-589c514ba2f48297f4aa02fd4ced821bdcbc822779026ff6c817d949a12f81fcb79562a1d57b8975a29ae4b3cacdebafe77cf4a4035a5d582aa823ca4fafe395", + "id": "interface-OuiTabGroupBaseHeader-5bd712f791fcc0aa86c1f30b4ab9a43fe36ad1157ee38633b43b2e446555c539737ee10ef0e2a6280f11add0546aaaf896f547e6f902967170c5e7a0d762b311", "file": "ui/src/components/tabs/tab-group.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import {\r\n AfterContentChecked,\r\n AfterContentInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChildren,\r\n ElementRef,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Optional,\r\n Output,\r\n QueryList,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\r\nimport { OUI_TAB_GROUP, OuiTab } from './tab';\r\nimport { OuiTabHeader } from './tab-header';\r\nimport {\r\n BooleanInput,\r\n coerceBooleanProperty,\r\n coerceNumberProperty,\r\n NumberInput,\r\n} from '@angular/cdk/coercion';\r\nimport {\r\n CanColor,\r\n CanDisableRipple,\r\n mixinColor,\r\n mixinDisableRipple,\r\n ThemePalette,\r\n} from '../core';\r\nimport { merge, Subscription } from 'rxjs';\r\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from './tab-config';\r\nimport { startWith } from 'rxjs/operators';\r\nimport { FocusOrigin } from '@angular/cdk/a11y';\r\n\r\n/** Used to generate unique ID's for each tab component */\r\nlet nextId = 0;\r\n\r\n// Boilerplate for applying mixins to ouiTabGroup.\r\n/** @docs-private */\r\nconst _OuiTabGroupMixinBase = mixinColor(\r\n mixinDisableRipple(\r\n class {\r\n constructor(public _elementRef: ElementRef) {}\r\n }\r\n ),\r\n 'primary'\r\n);\r\n\r\n/** @docs-private */\r\nexport interface OuiTabGroupBaseHeader {\r\n _alignInkBarToSelectedTab(): void;\r\n updatePagination(): void;\r\n focusIndex: number;\r\n}\r\n\r\n/** Possible positions for the tab header. */\r\nexport type OuiTabHeaderPosition = 'above' | 'below';\r\n\r\n/**\r\n * Material design tab-group component. Supports basic tab pairs (label + content) and includes\r\n * animated ink-bar, keyboard navigation, and screen reader.\r\n * See: https://material.io/design/components/tabs.html\r\n */\r\n@Component({\r\n selector: 'oui-tab-group',\r\n exportAs: 'ouiTabGroup',\r\n templateUrl: 'tab-group.html',\r\n styleUrls: ['tab-group.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n // tslint:disable-next-line:validate-decorators\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n // eslint-disable-next-line\r\n inputs: ['color', 'disableRipple'],\r\n providers: [\r\n {\r\n provide: OUI_TAB_GROUP,\r\n useExisting: ouiTabGroup,\r\n },\r\n ],\r\n // eslint-disable-next-line\r\n host: {\r\n ngSkipHydration: '',\r\n class: 'oui-mdc-tab-group oui-tab',\r\n '[class.oui-mdc-tab-group-dynamic-height]': 'dynamicHeight',\r\n '[class.oui-mdc-tab-group-inverted-header]': 'headerPosition === \"below\"',\r\n '[class.oui-mdc-tab-group-stretch-tabs]': 'stretchTabs',\r\n '[style.--oui-tab-animation-duration]': 'animationDuration',\r\n },\r\n})\r\nexport class ouiTabGroup\r\n extends _OuiTabGroupMixinBase\r\n implements\r\n AfterContentInit,\r\n AfterContentChecked,\r\n OnDestroy,\r\n CanColor,\r\n CanDisableRipple\r\n{\r\n /**\r\n * All tabs inside the tab group. This includes tabs that belong to groups that are nested\r\n * inside the current one. We filter out only the tabs that belong to this group in `_tabs`.\r\n */\r\n @ContentChildren(OuiTab, { descendants: true }) _allTabs: QueryList;\r\n @ViewChild('tabBodyWrapper') _tabBodyWrapper: ElementRef;\r\n @ViewChild('tabHeader') _tabHeader: OuiTabHeader;\r\n\r\n /** All of the tabs that belong to the group. */\r\n _tabs: QueryList = new QueryList();\r\n\r\n /** The tab index that should be selected after the content has been checked. */\r\n private _indexToSelect: number | null = 0;\r\n\r\n /** Index of the tab that was focused last. */\r\n private _lastFocusedTabIndex: number | null = null;\r\n\r\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\r\n private _tabBodyWrapperHeight = 0;\r\n\r\n /** Subscription to tabs being added/removed. */\r\n private _tabsSubscription = Subscription.EMPTY;\r\n\r\n /** Subscription to changes in the tab labels. */\r\n private _tabLabelSubscription = Subscription.EMPTY;\r\n\r\n /** Whether the ink bar should fit its width to the size of the tab label content. */\r\n @Input()\r\n get fitInkBarToContent(): boolean {\r\n return this._fitInkBarToContent;\r\n }\r\n set fitInkBarToContent(v: BooleanInput) {\r\n this._fitInkBarToContent = coerceBooleanProperty(v);\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n private _fitInkBarToContent = false;\r\n\r\n /** Whether tabs should be stretched to fill the header. */\r\n @Input('oui-stretch-tabs')\r\n get stretchTabs(): boolean {\r\n return this._stretchTabs;\r\n }\r\n set stretchTabs(v: BooleanInput) {\r\n this._stretchTabs = coerceBooleanProperty(v);\r\n }\r\n private _stretchTabs = true;\r\n\r\n /** Whether the tab group should grow to the size of the active tab. */\r\n @Input()\r\n get dynamicHeight(): boolean {\r\n return this._dynamicHeight;\r\n }\r\n\r\n set dynamicHeight(value: BooleanInput) {\r\n this._dynamicHeight = coerceBooleanProperty(value);\r\n }\r\n\r\n private _dynamicHeight = false;\r\n\r\n /** The index of the active tab. */\r\n @Input()\r\n get selectedIndex(): number | null {\r\n return this._selectedIndex;\r\n }\r\n\r\n set selectedIndex(value: NumberInput) {\r\n this._indexToSelect = coerceNumberProperty(value, null);\r\n }\r\n\r\n private _selectedIndex: number | null = null;\r\n\r\n /** Position of the tab header. */\r\n @Input() headerPosition: OuiTabHeaderPosition = 'above';\r\n\r\n /** Duration for the tab animation. Will be normalized to milliseconds if no units are set. */\r\n @Input()\r\n get animationDuration(): string {\r\n return this._animationDuration;\r\n }\r\n\r\n set animationDuration(value: NumberInput) {\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n ? value + 'ms'\r\n : (value as string);\r\n }\r\n\r\n private _animationDuration: string;\r\n\r\n /**\r\n * `tabindex` to be set on the inner element that wraps the tab content. Can be used for improved\r\n * accessibility when the tab does not have focusable elements or if it has scrollable content.\r\n * The `tabindex` will be removed automatically for inactive tabs.\r\n * Read more at https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-2/tabs.html\r\n */\r\n @Input()\r\n get contentTabIndex(): number | null {\r\n return this._contentTabIndex;\r\n }\r\n\r\n set contentTabIndex(value: NumberInput) {\r\n this._contentTabIndex = coerceNumberProperty(value, null);\r\n }\r\n\r\n private _contentTabIndex: number | null;\r\n\r\n /**\r\n * Whether pagination should be disabled. This can be used to avoid unnecessary\r\n * layout recalculations if it's known that pagination won't be required.\r\n */\r\n @Input()\r\n get disablePagination(): boolean {\r\n return this._disablePagination;\r\n }\r\n\r\n set disablePagination(value: BooleanInput) {\r\n this._disablePagination = coerceBooleanProperty(value);\r\n }\r\n\r\n private _disablePagination = false;\r\n\r\n /**\r\n * By default tabs remove their content from the DOM while it's off-screen.\r\n * Setting this to `true` will keep it in the DOM which will prevent elements\r\n * like iframes and videos from reloading next time it comes back into the view.\r\n */\r\n @Input()\r\n get preserveContent(): boolean {\r\n return this._preserveContent;\r\n }\r\n\r\n set preserveContent(value: BooleanInput) {\r\n this._preserveContent = coerceBooleanProperty(value);\r\n }\r\n\r\n private _preserveContent = false;\r\n\r\n /** Background color of the tab group. */\r\n @Input()\r\n get backgroundColor(): ThemePalette {\r\n return this._backgroundColor;\r\n }\r\n\r\n set backgroundColor(value: ThemePalette) {\r\n const classList: DOMTokenList = this._elementRef.nativeElement.classList;\r\n\r\n classList.remove(\r\n 'oui-tabs-with-background',\r\n `oui-background-${this.backgroundColor}`\r\n );\r\n\r\n if (value) {\r\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\r\n }\r\n\r\n this._backgroundColor = value;\r\n }\r\n\r\n private _backgroundColor: ThemePalette;\r\n\r\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\r\n @Output() readonly selectedIndexChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when focus has changed within a tab group. */\r\n @Output() readonly focusChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the body animation has completed */\r\n @Output() readonly animationDone: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the tab selection has changed. */\r\n @Output() readonly selectedTabChange: EventEmitter =\r\n new EventEmitter(true);\r\n\r\n private _groupId: number;\r\n getHTMLText: any;\r\n updatedTabHTML: any;\r\n\r\n constructor(\r\n elementRef: ElementRef,\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n @Inject(OUI_TABS_CONFIG) @Optional() defaultConfig?: OuiTabsConfig,\r\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string\r\n ) {\r\n super(elementRef);\r\n this._groupId = nextId++;\r\n this.animationDuration =\r\n defaultConfig && defaultConfig.animationDuration\r\n ? defaultConfig.animationDuration\r\n : '500ms';\r\n this.disablePagination =\r\n defaultConfig && defaultConfig.disablePagination != null\r\n ? defaultConfig.disablePagination\r\n : false;\r\n this.dynamicHeight =\r\n defaultConfig && defaultConfig.dynamicHeight != null\r\n ? defaultConfig.dynamicHeight\r\n : false;\r\n this.contentTabIndex = defaultConfig?.contentTabIndex ?? null;\r\n this.preserveContent = !!defaultConfig?.preserveContent;\r\n this.fitInkBarToContent =\r\n defaultConfig && defaultConfig.fitInkBarToContent != null\r\n ? defaultConfig.fitInkBarToContent\r\n : false;\r\n this.stretchTabs =\r\n defaultConfig && defaultConfig.stretchTabs != null\r\n ? defaultConfig.stretchTabs\r\n : true;\r\n }\r\n\r\n /**\r\n * After the content is checked, this component knows what tabs have been defined\r\n * and what the selected index should be. This is where we can know exactly what position\r\n * each tab should be in according to the new selected index, and additionally we know how\r\n * a new selected tab should transition in (from the left or right).\r\n */\r\n ngAfterContentChecked() {\r\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\r\n // the amount of tabs changes before the actual change detection runs.\r\n const indexToSelect = (this._indexToSelect = this._clampTabIndex(\r\n this._indexToSelect\r\n ));\r\n\r\n // If there is a change in selected index, emit a change event. Should not trigger if\r\n // the selected index has not yet been initialized.\r\n if (this._selectedIndex != indexToSelect) {\r\n const isFirstRun = this._selectedIndex == null;\r\n\r\n if (!isFirstRun) {\r\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\r\n // Preserve the height so page doesn't scroll up during tab change.\r\n // Fixes https://stackblitz.com/edit/mat-tabs-scroll-page-top-on-tab-change\r\n const wrapper = this._tabBodyWrapper.nativeElement;\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n wrapper.style.minHeight = wrapper.clientHeight + 'px';\r\n }\r\n\r\n // Changing these values after change detection has run\r\n // since the checked content may contain references to them.\r\n Promise.resolve().then(() => {\r\n this._tabs.forEach(\r\n (tab, index) => (tab.isActive = index === indexToSelect)\r\n );\r\n\r\n if (!isFirstRun) {\r\n this.selectedIndexChange.emit(indexToSelect);\r\n // Clear the min-height, this was needed during tab change to avoid\r\n // unnecessary scrolling.\r\n this._tabBodyWrapper.nativeElement.style.minHeight = '';\r\n }\r\n });\r\n }\r\n\r\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\r\n this._tabs.forEach((tab: OuiTab, index: number) => {\r\n tab.position = index - indexToSelect;\r\n\r\n // If there is already a selected tab, then set up an origin for the next selected tab\r\n // if it doesn't have one already.\r\n if (this._selectedIndex != null && tab.position == 0 && !tab.origin) {\r\n tab.origin = indexToSelect - this._selectedIndex;\r\n }\r\n });\r\n\r\n if (this._selectedIndex !== indexToSelect) {\r\n this._selectedIndex = indexToSelect;\r\n this._lastFocusedTabIndex = null;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._subscribeToAllTabChanges();\r\n this._subscribeToTabLabels();\r\n // Subscribe to changes in the amount of tabs, in order to be\r\n // able to re-render the content as new tabs are added or removed.\r\n this._tabsSubscription = this._tabs.changes.subscribe(() => {\r\n const indexToSelect = this._clampTabIndex(this._indexToSelect);\r\n\r\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\r\n // explicit change that selects a different tab.\r\n if (indexToSelect === this._selectedIndex) {\r\n const tabs = this._tabs.toArray();\r\n let selectedTab: OuiTab | undefined;\r\n\r\n for (let i = 0; i < tabs.length; i++) {\r\n if (tabs[i].isActive) {\r\n // Assign both to the `_indexToSelect` and `_selectedIndex` so we don't fire a changed\r\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\r\n // adding a tab within the `selectedIndexChange` event.\r\n this._indexToSelect = this._selectedIndex = i;\r\n this._lastFocusedTabIndex = null;\r\n selectedTab = tabs[i];\r\n break;\r\n }\r\n }\r\n\r\n // If we haven't found an active tab and a tab exists at the selected index, it means\r\n // that the active tab was swapped out. Since this won't be picked up by the rendering\r\n // loop in `ngAfterContentChecked`, we need to sync it up manually.\r\n if (!selectedTab && tabs[indexToSelect]) {\r\n Promise.resolve().then(() => {\r\n tabs[indexToSelect].isActive = true;\r\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\r\n });\r\n }\r\n }\r\n\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n /** Listens to changes in all of the tabs. */\r\n private _subscribeToAllTabChanges() {\r\n // Since we use a query with `descendants: true` to pick up the tabs, we may end up catching\r\n // some that are inside of nested tab groups. We filter them out manually by checking that\r\n // the closest group to the tab is the current one.\r\n this.getHTMLText = this._allTabs['_results'][0].givenText;\r\n this.updatedTabHTML = this.getHTMLText;\r\n this._allTabs.changes\r\n .pipe(startWith(this._allTabs))\r\n .subscribe((tabs: QueryList) => {\r\n this._tabs.reset(\r\n tabs.filter((tab) => {\r\n return tab._closestTabGroup === this || !tab._closestTabGroup;\r\n })\r\n );\r\n this._tabs.notifyOnChanges();\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this._tabs.destroy();\r\n this._tabsSubscription.unsubscribe();\r\n this._tabLabelSubscription.unsubscribe();\r\n }\r\n\r\n /** Re-aligns the ink bar to the selected tab element. */\r\n realignInkBar() {\r\n if (this._tabHeader) {\r\n this._tabHeader._alignInkBarToSelectedTab();\r\n }\r\n }\r\n\r\n /**\r\n * Recalculates the tab group's pagination dimensions.\r\n *\r\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\r\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\r\n * page.\r\n */\r\n updatePagination() {\r\n if (this._tabHeader) {\r\n this._tabHeader.updatePagination();\r\n }\r\n }\r\n\r\n /**\r\n * Sets focus to a particular tab.\r\n * @param index Index of the tab to be focused.\r\n */\r\n focusTab(index: number) {\r\n const header = this._tabHeader;\r\n\r\n if (header) {\r\n header.focusIndex = index;\r\n }\r\n }\r\n\r\n _focusChanged(index: number) {\r\n this._lastFocusedTabIndex = index;\r\n this.focusChange.emit(this._createChangeEvent(index));\r\n }\r\n\r\n private _createChangeEvent(index: number): OuiTabChangeEvent {\r\n const event = new OuiTabChangeEvent();\r\n event.index = index;\r\n if (this._tabs && this._tabs.length) {\r\n event.tab = this._tabs.toArray()[index];\r\n this.updatedTabHTML = event.tab.givenText;\r\n }\r\n return event;\r\n }\r\n\r\n _handleEnter() {\r\n this.getHTMLText = this.updatedTabHTML;\r\n }\r\n\r\n /**\r\n * Subscribes to changes in the tab labels. This is needed, because the @Input for the label is\r\n * on the OuiTab component, whereas the data binding is inside the ouiTabGroup. In order for the\r\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\r\n * manually.\r\n */\r\n private _subscribeToTabLabels() {\r\n if (this._tabLabelSubscription) {\r\n this._tabLabelSubscription.unsubscribe();\r\n }\r\n\r\n this._tabLabelSubscription = merge(\r\n ...this._tabs.map((tab) => tab._stateChanges)\r\n ).subscribe(() => this._changeDetectorRef.markForCheck());\r\n }\r\n\r\n /** Clamps the given index to the bounds of 0 and the tabs length. */\r\n private _clampTabIndex(index: number | null): number {\r\n // Note the `|| 0`, which ensures that values like NaN can't get through\r\n // and which would otherwise throw the component into an infinite loop\r\n // (since Math.max(NaN, 0) === NaN).\r\n return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));\r\n }\r\n\r\n /** Returns a unique id for each tab label element */\r\n _getTabLabelId(i: number): string {\r\n return `oui-tab-label-${this._groupId}-${i}`;\r\n }\r\n\r\n /** Returns a unique id for each tab content element */\r\n _getTabContentId(i: number): string {\r\n return `oui-tab-content-${this._groupId}-${i}`;\r\n }\r\n\r\n /**\r\n * Sets the height of the body wrapper to the height of the activating tab if dynamic\r\n * height property is true.\r\n */\r\n _setTabBodyWrapperHeight(tabHeight: number): void {\r\n if (!this._dynamicHeight || !this._tabBodyWrapperHeight) {\r\n return;\r\n }\r\n\r\n const wrapper: HTMLElement = this._tabBodyWrapper.nativeElement;\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n wrapper.style.height = this._tabBodyWrapperHeight + 'px';\r\n\r\n // This conditional forces the browser to paint the height so that\r\n // the animation to the new height can have an origin.\r\n if (this._tabBodyWrapper.nativeElement.offsetHeight) {\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n wrapper.style.height = tabHeight + 'px';\r\n }\r\n }\r\n\r\n /** Removes the height of the tab body wrapper. */\r\n _removeTabBodyWrapperHeight(): void {\r\n const wrapper = this._tabBodyWrapper.nativeElement;\r\n this._tabBodyWrapperHeight = wrapper.clientHeight;\r\n wrapper.style.height = '';\r\n this.animationDone.emit();\r\n }\r\n\r\n /** Handle click events, setting new selected index if appropriate. */\r\n _handleClick(tab: OuiTab, tabHeader: OuiTabGroupBaseHeader, index: number) {\r\n tabHeader.focusIndex = index;\r\n this.getHTMLText = this.updatedTabHTML;\r\n\r\n if (!tab.disabled) {\r\n this.selectedIndex = index;\r\n }\r\n }\r\n\r\n /** Retrieves the tabindex for the tab. */\r\n _getTabIndex(index: number): number {\r\n const targetIndex = this._lastFocusedTabIndex ?? this.selectedIndex;\r\n return index === targetIndex ? 0 : -1;\r\n }\r\n\r\n /** Callback for when the focused state of a tab has changed. */\r\n _tabFocusChanged(focusOrigin: FocusOrigin, index: number) {\r\n // Mouse/touch focus happens during the `mousedown`/`touchstart` phase which\r\n // can cause the tab to be moved out from under the pointer, interrupting the\r\n // click sequence (see #21898). We don't need to scroll the tab into view for\r\n // such cases anyway, because it will be done when the tab becomes selected.\r\n if (focusOrigin && focusOrigin !== 'mouse' && focusOrigin !== 'touch') {\r\n this._tabHeader.focusIndex = index;\r\n }\r\n }\r\n}\r\n\r\n/** A simple change event emitted on focus or selection changes. */\r\nexport class OuiTabChangeEvent {\r\n /** Index of the currently-selected tab. */\r\n index: number;\r\n /** Reference to the currently-selected tab. */\r\n tab: OuiTab;\r\n event: Event;\r\n}\r\n", + "sourceCode": "import {\n AfterContentChecked,\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { OUI_TAB_GROUP, OuiTab } from './tab';\nimport { OuiTabHeader } from './tab-header';\nimport {\n BooleanInput,\n coerceBooleanProperty,\n coerceNumberProperty,\n NumberInput,\n} from '@angular/cdk/coercion';\nimport {\n CanColor,\n CanDisableRipple,\n mixinColor,\n mixinDisableRipple,\n ThemePalette,\n} from '../core';\nimport { merge, Subscription } from 'rxjs';\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from './tab-config';\nimport { startWith } from 'rxjs/operators';\nimport { FocusOrigin } from '@angular/cdk/a11y';\n\n/** Used to generate unique ID's for each tab component */\nlet nextId = 0;\n\n// Boilerplate for applying mixins to ouiTabGroup.\n/** @docs-private */\nconst _OuiTabGroupMixinBase = mixinColor(\n mixinDisableRipple(\n class {\n constructor(public _elementRef: ElementRef) {}\n }\n ),\n 'primary'\n);\n\n/** @docs-private */\nexport interface OuiTabGroupBaseHeader {\n _alignInkBarToSelectedTab(): void;\n updatePagination(): void;\n focusIndex: number;\n}\n\n/** Possible positions for the tab header. */\nexport type OuiTabHeaderPosition = 'above' | 'below';\n\n/**\n * Material design tab-group component. Supports basic tab pairs (label + content) and includes\n * animated ink-bar, keyboard navigation, and screen reader.\n * See: https://material.io/design/components/tabs.html\n */\n@Component({\n selector: 'oui-tab-group',\n exportAs: 'ouiTabGroup',\n templateUrl: 'tab-group.html',\n styleUrls: ['tab-group.scss'],\n encapsulation: ViewEncapsulation.None,\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n // eslint-disable-next-line\n inputs: ['color', 'disableRipple'],\n providers: [\n {\n provide: OUI_TAB_GROUP,\n useExisting: ouiTabGroup,\n },\n ],\n // eslint-disable-next-line\n host: {\n ngSkipHydration: '',\n class: 'oui-mdc-tab-group oui-tab',\n '[class.oui-mdc-tab-group-dynamic-height]': 'dynamicHeight',\n '[class.oui-mdc-tab-group-inverted-header]': 'headerPosition === \"below\"',\n '[class.oui-mdc-tab-group-stretch-tabs]': 'stretchTabs',\n '[style.--oui-tab-animation-duration]': 'animationDuration',\n },\n})\nexport class ouiTabGroup\n extends _OuiTabGroupMixinBase\n implements\n AfterContentInit,\n AfterContentChecked,\n OnDestroy,\n CanColor,\n CanDisableRipple\n{\n /**\n * All tabs inside the tab group. This includes tabs that belong to groups that are nested\n * inside the current one. We filter out only the tabs that belong to this group in `_tabs`.\n */\n @ContentChildren(OuiTab, { descendants: true }) _allTabs: QueryList;\n @ViewChild('tabBodyWrapper') _tabBodyWrapper: ElementRef;\n @ViewChild('tabHeader') _tabHeader: OuiTabHeader;\n\n /** All of the tabs that belong to the group. */\n _tabs: QueryList = new QueryList();\n\n /** The tab index that should be selected after the content has been checked. */\n private _indexToSelect: number | null = 0;\n\n /** Index of the tab that was focused last. */\n private _lastFocusedTabIndex: number | null = null;\n\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\n private _tabBodyWrapperHeight = 0;\n\n /** Subscription to tabs being added/removed. */\n private _tabsSubscription = Subscription.EMPTY;\n\n /** Subscription to changes in the tab labels. */\n private _tabLabelSubscription = Subscription.EMPTY;\n\n /** Whether the ink bar should fit its width to the size of the tab label content. */\n @Input()\n get fitInkBarToContent(): boolean {\n return this._fitInkBarToContent;\n }\n set fitInkBarToContent(v: BooleanInput) {\n this._fitInkBarToContent = coerceBooleanProperty(v);\n this._changeDetectorRef.markForCheck();\n }\n private _fitInkBarToContent = false;\n\n /** Whether tabs should be stretched to fill the header. */\n @Input('oui-stretch-tabs')\n get stretchTabs(): boolean {\n return this._stretchTabs;\n }\n set stretchTabs(v: BooleanInput) {\n this._stretchTabs = coerceBooleanProperty(v);\n }\n private _stretchTabs = true;\n\n /** Whether the tab group should grow to the size of the active tab. */\n @Input()\n get dynamicHeight(): boolean {\n return this._dynamicHeight;\n }\n\n set dynamicHeight(value: BooleanInput) {\n this._dynamicHeight = coerceBooleanProperty(value);\n }\n\n private _dynamicHeight = false;\n\n /** The index of the active tab. */\n @Input()\n get selectedIndex(): number | null {\n return this._selectedIndex;\n }\n\n set selectedIndex(value: NumberInput) {\n this._indexToSelect = coerceNumberProperty(value, null);\n }\n\n private _selectedIndex: number | null = null;\n\n /** Position of the tab header. */\n @Input() headerPosition: OuiTabHeaderPosition = 'above';\n\n /** Duration for the tab animation. Will be normalized to milliseconds if no units are set. */\n @Input()\n get animationDuration(): string {\n return this._animationDuration;\n }\n\n set animationDuration(value: NumberInput) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n ? value + 'ms'\n : (value as string);\n }\n\n private _animationDuration: string;\n\n /**\n * `tabindex` to be set on the inner element that wraps the tab content. Can be used for improved\n * accessibility when the tab does not have focusable elements or if it has scrollable content.\n * The `tabindex` will be removed automatically for inactive tabs.\n * Read more at https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-2/tabs.html\n */\n @Input()\n get contentTabIndex(): number | null {\n return this._contentTabIndex;\n }\n\n set contentTabIndex(value: NumberInput) {\n this._contentTabIndex = coerceNumberProperty(value, null);\n }\n\n private _contentTabIndex: number | null;\n\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n */\n @Input()\n get disablePagination(): boolean {\n return this._disablePagination;\n }\n\n set disablePagination(value: BooleanInput) {\n this._disablePagination = coerceBooleanProperty(value);\n }\n\n private _disablePagination = false;\n\n /**\n * By default tabs remove their content from the DOM while it's off-screen.\n * Setting this to `true` will keep it in the DOM which will prevent elements\n * like iframes and videos from reloading next time it comes back into the view.\n */\n @Input()\n get preserveContent(): boolean {\n return this._preserveContent;\n }\n\n set preserveContent(value: BooleanInput) {\n this._preserveContent = coerceBooleanProperty(value);\n }\n\n private _preserveContent = false;\n\n /** Background color of the tab group. */\n @Input()\n get backgroundColor(): ThemePalette {\n return this._backgroundColor;\n }\n\n set backgroundColor(value: ThemePalette) {\n const classList: DOMTokenList = this._elementRef.nativeElement.classList;\n\n classList.remove(\n 'oui-tabs-with-background',\n `oui-background-${this.backgroundColor}`\n );\n\n if (value) {\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n\n private _backgroundColor: ThemePalette;\n\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\n @Output() readonly selectedIndexChange: EventEmitter =\n new EventEmitter();\n\n /** Event emitted when focus has changed within a tab group. */\n @Output() readonly focusChange: EventEmitter =\n new EventEmitter();\n\n /** Event emitted when the body animation has completed */\n @Output() readonly animationDone: EventEmitter =\n new EventEmitter();\n\n /** Event emitted when the tab selection has changed. */\n @Output() readonly selectedTabChange: EventEmitter =\n new EventEmitter(true);\n\n private _groupId: number;\n getHTMLText: any;\n updatedTabHTML: any;\n\n constructor(\n elementRef: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n @Inject(OUI_TABS_CONFIG) @Optional() defaultConfig?: OuiTabsConfig,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string\n ) {\n super(elementRef);\n this._groupId = nextId++;\n this.animationDuration =\n defaultConfig && defaultConfig.animationDuration\n ? defaultConfig.animationDuration\n : '500ms';\n this.disablePagination =\n defaultConfig && defaultConfig.disablePagination != null\n ? defaultConfig.disablePagination\n : false;\n this.dynamicHeight =\n defaultConfig && defaultConfig.dynamicHeight != null\n ? defaultConfig.dynamicHeight\n : false;\n this.contentTabIndex = defaultConfig?.contentTabIndex ?? null;\n this.preserveContent = !!defaultConfig?.preserveContent;\n this.fitInkBarToContent =\n defaultConfig && defaultConfig.fitInkBarToContent != null\n ? defaultConfig.fitInkBarToContent\n : false;\n this.stretchTabs =\n defaultConfig && defaultConfig.stretchTabs != null\n ? defaultConfig.stretchTabs\n : false;\n }\n\n /**\n * After the content is checked, this component knows what tabs have been defined\n * and what the selected index should be. This is where we can know exactly what position\n * each tab should be in according to the new selected index, and additionally we know how\n * a new selected tab should transition in (from the left or right).\n */\n ngAfterContentChecked() {\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\n // the amount of tabs changes before the actual change detection runs.\n const indexToSelect = (this._indexToSelect = this._clampTabIndex(\n this._indexToSelect\n ));\n\n // If there is a change in selected index, emit a change event. Should not trigger if\n // the selected index has not yet been initialized.\n if (this._selectedIndex != indexToSelect) {\n const isFirstRun = this._selectedIndex == null;\n\n if (!isFirstRun) {\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\n // Preserve the height so page doesn't scroll up during tab change.\n // Fixes https://stackblitz.com/edit/mat-tabs-scroll-page-top-on-tab-change\n const wrapper = this._tabBodyWrapper.nativeElement;\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n wrapper.style.minHeight = wrapper.clientHeight + 'px';\n }\n\n // Changing these values after change detection has run\n // since the checked content may contain references to them.\n Promise.resolve().then(() => {\n this._tabs.forEach(\n (tab, index) => (tab.isActive = index === indexToSelect)\n );\n\n if (!isFirstRun) {\n this.selectedIndexChange.emit(indexToSelect);\n // Clear the min-height, this was needed during tab change to avoid\n // unnecessary scrolling.\n this._tabBodyWrapper.nativeElement.style.minHeight = '';\n }\n });\n }\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\n this._tabs.forEach((tab: OuiTab, index: number) => {\n tab.position = index - indexToSelect;\n\n // If there is already a selected tab, then set up an origin for the next selected tab\n // if it doesn't have one already.\n if (this._selectedIndex != null && tab.position == 0 && !tab.origin) {\n tab.origin = indexToSelect - this._selectedIndex;\n }\n });\n\n if (this._selectedIndex !== indexToSelect) {\n this._selectedIndex = indexToSelect;\n this._lastFocusedTabIndex = null;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n ngAfterContentInit() {\n setTimeout(() => {\n this._subscribeToAllTabChanges();\n this._subscribeToTabLabels();\n });\n // Subscribe to changes in the amount of tabs, in order to be\n // able to re-render the content as new tabs are added or removed.\n this._tabsSubscription = this._tabs.changes.subscribe(() => {\n const indexToSelect = this._clampTabIndex(this._indexToSelect);\n\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\n // explicit change that selects a different tab.\n if (indexToSelect === this._selectedIndex) {\n const tabs = this._tabs.toArray();\n let selectedTab: OuiTab | undefined;\n\n for (let i = 0; i < tabs.length; i++) {\n if (tabs[i].isActive) {\n // Assign both to the `_indexToSelect` and `_selectedIndex` so we don't fire a changed\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\n // adding a tab within the `selectedIndexChange` event.\n this._indexToSelect = this._selectedIndex = i;\n this._lastFocusedTabIndex = null;\n selectedTab = tabs[i];\n break;\n }\n }\n\n // If we haven't found an active tab and a tab exists at the selected index, it means\n // that the active tab was swapped out. Since this won't be picked up by the rendering\n // loop in `ngAfterContentChecked`, we need to sync it up manually.\n if (!selectedTab && tabs[indexToSelect]) {\n Promise.resolve().then(() => {\n tabs[indexToSelect].isActive = true;\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\n });\n }\n }\n\n this._changeDetectorRef.markForCheck();\n });\n }\n\n /** Listens to changes in all of the tabs. */\n private _subscribeToAllTabChanges() {\n // Since we use a query with `descendants: true` to pick up the tabs, we may end up catching\n // some that are inside of nested tab groups. We filter them out manually by checking that\n // the closest group to the tab is the current one.\n this.getHTMLText = this._allTabs['_results'][0].contentWithin;\n this.updatedTabHTML = this.getHTMLText;\n this._allTabs.changes\n .pipe(startWith(this._allTabs))\n .subscribe((tabs: QueryList) => {\n this._tabs.reset(\n tabs.filter((tab) => {\n return tab._closestTabGroup === this || !tab._closestTabGroup;\n })\n );\n this._tabs.notifyOnChanges();\n });\n }\n\n ngOnDestroy() {\n this._tabs.destroy();\n this._tabsSubscription.unsubscribe();\n this._tabLabelSubscription.unsubscribe();\n }\n\n /** Re-aligns the ink bar to the selected tab element. */\n realignInkBar() {\n if (this._tabHeader) {\n this._tabHeader._alignInkBarToSelectedTab();\n }\n }\n\n /**\n * Recalculates the tab group's pagination dimensions.\n *\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\n * page.\n */\n updatePagination() {\n if (this._tabHeader) {\n this._tabHeader.updatePagination();\n }\n }\n\n /**\n * Sets focus to a particular tab.\n * @param index Index of the tab to be focused.\n */\n focusTab(index: number) {\n const header = this._tabHeader;\n\n if (header) {\n header.focusIndex = index;\n }\n }\n\n _focusChanged(index: number) {\n this._lastFocusedTabIndex = index;\n this.focusChange.emit(this._createChangeEvent(index));\n }\n\n private _createChangeEvent(index: number): OuiTabChangeEvent {\n const event = new OuiTabChangeEvent();\n event.index = index;\n if (this._tabs && this._tabs.length) {\n event.tab = this._tabs.toArray()[index];\n this.updatedTabHTML = event.tab.contentWithin;\n }\n return event;\n }\n\n _handleEnter() {\n this.getHTMLText = this.updatedTabHTML;\n }\n\n /**\n * Subscribes to changes in the tab labels. This is needed, because the @Input for the label is\n * on the OuiTab component, whereas the data binding is inside the ouiTabGroup. In order for the\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\n * manually.\n */\n private _subscribeToTabLabels() {\n if (this._tabLabelSubscription) {\n this._tabLabelSubscription.unsubscribe();\n }\n\n this._tabLabelSubscription = merge(\n ...this._tabs.map((tab) => tab._stateChanges)\n ).subscribe(() => this._changeDetectorRef.markForCheck());\n }\n\n /** Clamps the given index to the bounds of 0 and the tabs length. */\n private _clampTabIndex(index: number | null): number {\n // Note the `|| 0`, which ensures that values like NaN can't get through\n // and which would otherwise throw the component into an infinite loop\n // (since Math.max(NaN, 0) === NaN).\n return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));\n }\n\n /** Returns a unique id for each tab label element */\n _getTabLabelId(i: number): string {\n return `oui-tab-label-${this._groupId}-${i}`;\n }\n\n /** Returns a unique id for each tab content element */\n _getTabContentId(i: number): string {\n return `oui-tab-content-${this._groupId}-${i}`;\n }\n\n /**\n * Sets the height of the body wrapper to the height of the activating tab if dynamic\n * height property is true.\n */\n _setTabBodyWrapperHeight(tabHeight: number): void {\n if (!this._dynamicHeight || !this._tabBodyWrapperHeight) {\n return;\n }\n\n const wrapper: HTMLElement = this._tabBodyWrapper.nativeElement;\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n wrapper.style.height = this._tabBodyWrapperHeight + 'px';\n\n // This conditional forces the browser to paint the height so that\n // the animation to the new height can have an origin.\n if (this._tabBodyWrapper.nativeElement.offsetHeight) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n wrapper.style.height = tabHeight + 'px';\n }\n }\n\n /** Removes the height of the tab body wrapper. */\n _removeTabBodyWrapperHeight(): void {\n const wrapper = this._tabBodyWrapper.nativeElement;\n this._tabBodyWrapperHeight = wrapper.clientHeight;\n wrapper.style.height = '';\n this.animationDone.emit();\n }\n\n /** Handle click events, setting new selected index if appropriate. */\n _handleClick(tab: OuiTab, tabHeader: OuiTabGroupBaseHeader, index: number) {\n tabHeader.focusIndex = index;\n this.getHTMLText = this.updatedTabHTML;\n\n if (!tab.disabled) {\n this.selectedIndex = index;\n }\n }\n\n /** Retrieves the tabindex for the tab. */\n _getTabIndex(index: number): number {\n const targetIndex = this._lastFocusedTabIndex ?? this.selectedIndex;\n return index === targetIndex ? 0 : -1;\n }\n\n /** Callback for when the focused state of a tab has changed. */\n _tabFocusChanged(focusOrigin: FocusOrigin, index: number) {\n // Mouse/touch focus happens during the `mousedown`/`touchstart` phase which\n // can cause the tab to be moved out from under the pointer, interrupting the\n // click sequence (see #21898). We don't need to scroll the tab into view for\n // such cases anyway, because it will be done when the tab becomes selected.\n if (focusOrigin && focusOrigin !== 'mouse' && focusOrigin !== 'touch') {\n this._tabHeader.focusIndex = index;\n }\n }\n}\n\n/** A simple change event emitted on focus or selection changes. */\nexport class OuiTabChangeEvent {\n /** Index of the currently-selected tab. */\n index: number;\n /** Reference to the currently-selected tab. */\n tab: OuiTab;\n event: Event;\n}\n", "properties": [ { "name": "focusIndex", @@ -1286,12 +1286,12 @@ }, { "name": "OuiTabsConfig", - "id": "interface-OuiTabsConfig-f642516cfe541099ce468c723e7253bf64ae27ad564c1b234bd2bb912f828f7048176d06b12025c737f694ec052fb389bc5eec150cbaa37e4adec41af6b167a9", + "id": "interface-OuiTabsConfig-f604a8c3593a063b6569f66f20b2b3176e2f23afae566c345f7e8f3ca2728c3fe1c28789c99d7098ef6117c43342b8894b83f884792b093087089b4827a6d873", "file": "ui/src/components/tabs/tab-config.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { InjectionToken } from '@angular/core';\r\n\r\n/** Object that can be used to configure the default options for the tabs module. */\r\nexport interface OuiTabsConfig {\r\n /** Duration for the tab animation. Must be a valid CSS value (e.g. 600ms). */\r\n animationDuration?: string;\r\n\r\n /**\r\n * Whether pagination should be disabled. This can be used to avoid unnecessary\r\n * layout recalculations if it's known that pagination won't be required.\r\n */\r\n disablePagination?: boolean;\r\n\r\n /**\r\n * Whether the ink bar should fit its width to the size of the tab label content.\r\n * This only applies to the MDC-based tabs.\r\n */\r\n fitInkBarToContent?: boolean;\r\n\r\n /** Whether the tab group should grow to the size of the active tab. */\r\n dynamicHeight?: boolean;\r\n\r\n /** `tabindex` to be set on the inner element that wraps the tab content. */\r\n contentTabIndex?: number;\r\n\r\n /**\r\n * By default tabs remove their content from the DOM while it's off-screen.\r\n * Setting this to `true` will keep it in the DOM which will prevent elements\r\n * like iframes and videos from reloading next time it comes back into the view.\r\n */\r\n preserveContent?: boolean;\r\n\r\n /** Whether tabs should be stretched to fill the header. */\r\n stretchTabs?: boolean;\r\n}\r\n\r\n/** Injection token that can be used to provide the default options the tabs module. */\r\nexport const OUI_TABS_CONFIG = new InjectionToken(\r\n 'OUI_TABS_CONFIG'\r\n);\r\n", + "sourceCode": "import { InjectionToken } from '@angular/core';\n\n/** Object that can be used to configure the default options for the tabs module. */\nexport interface OuiTabsConfig {\n /** Duration for the tab animation. Must be a valid CSS value (e.g. 600ms). */\n animationDuration?: string;\n\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n */\n disablePagination?: boolean;\n\n /**\n * Whether the ink bar should fit its width to the size of the tab label content.\n * This only applies to the MDC-based tabs.\n */\n fitInkBarToContent?: boolean;\n\n /** Whether the tab group should grow to the size of the active tab. */\n dynamicHeight?: boolean;\n\n /** `tabindex` to be set on the inner element that wraps the tab content. */\n contentTabIndex?: number;\n\n /**\n * By default tabs remove their content from the DOM while it's off-screen.\n * Setting this to `true` will keep it in the DOM which will prevent elements\n * like iframes and videos from reloading next time it comes back into the view.\n */\n preserveContent?: boolean;\n\n /** Whether tabs should be stretched to fill the header. */\n stretchTabs?: boolean;\n}\n\n/** Injection token that can be used to provide the default options the tabs module. */\nexport const OUI_TABS_CONFIG = new InjectionToken(\n 'OUI_TABS_CONFIG'\n);\n", "properties": [ { "name": "animationDuration", @@ -1373,12 +1373,12 @@ }, { "name": "OuiTooltipDefaultOptions", - "id": "interface-OuiTooltipDefaultOptions-ffb93a0366a6db45703111c4fe658119cf87b8d44e269ec2926a30e8ecd94bebfb4adcfd399aeca78af8a2424610392ab8cece9c0abb63c2a560ad78706daebd", + "id": "interface-OuiTooltipDefaultOptions-e9697def10890f47a95cf9f3bc5b2f98679be923c51d88410413d049b9f0d1aa747f42f5904aa817dc83a1c560c44b1ca4996f4759598c8e0196872f3ec3df70", "file": "ui/src/components/tooltip/tooltip.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { AnimationEvent } from '@angular/animations';\nimport { AriaDescriber, FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n BreakpointObserver,\n Breakpoints,\n BreakpointState,\n} from '@angular/cdk/layout';\nimport {\n FlexibleConnectedPositionStrategy,\n HorizontalConnectionPos,\n OriginConnectionPosition,\n Overlay,\n OverlayConnectionPosition,\n OverlayRef,\n VerticalConnectionPos,\n ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport { ScrollDispatcher } from '@angular/cdk/scrolling';\nimport { Platform } from '@angular/cdk/platform';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { take, takeUntil } from 'rxjs/operators';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Directive,\n ElementRef,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { Subject, Observable } from 'rxjs';\nimport { ouiTooltipAnimations } from './tooltip-animations';\nimport { CanDisable } from '../core';\n\nexport type TooltipPosition = 'left' | 'right' | 'above' | 'below';\n\n/** Time in ms to throttle repositioning after scroll events. */\nexport const SCROLL_THROTTLE_MS = 20;\n\n/** CSS class that will be attached to the overlay panel. */\nexport const TOOLTIP_PANEL_CLASS = 'oui-tooltip-panel';\n\n/**\n * Creates an error to be thrown if the user supplied an invalid tooltip position.\n *\n * @docs-private\n */\nexport function getOuiTooltipInvalidPositionError(position: string) {\n return Error(`Tooltip position \"${position}\" is invalid.`);\n}\n\n/** Injection token that determines the scroll handling while a tooltip is visible. */\nexport const OUI_TOOLTIP_SCROLL_STRATEGY = new InjectionToken<\n () => ScrollStrategy\n>('oui-tooltip-scroll-strategy');\n\n/** @docs-private */\nexport function OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY(\n overlay: Overlay\n): () => ScrollStrategy {\n return () =>\n overlay.scrollStrategies.reposition({ scrollThrottle: SCROLL_THROTTLE_MS });\n}\n\n/** @docs-private */\nexport const OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\n};\n\n/** Default `ouiTooltip` options that can be overridden. */\nexport interface OuiTooltipDefaultOptions {\n showDelay: number;\n hideDelay: number;\n touchendHideDelay: number;\n}\n\nexport interface NewCSSStyleDeclaration extends CSSStyleDeclaration {\n msUserSelect: string;\n}\n\n/** Injection token to be used to override the default options for `ouiTooltip`. */\nexport const OUI_TOOLTIP_DEFAULT_OPTIONS =\n new InjectionToken('oui-tooltip-default-options', {\n providedIn: 'root',\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY(): OuiTooltipDefaultOptions {\n return {\n showDelay: 0,\n hideDelay: 0,\n touchendHideDelay: 1500,\n };\n}\n\nexport type TooltipVisibility = 'initial' | 'visible' | 'hidden';\n\n/**\n * Internal component that wraps the tooltip's content.\n *\n * @docs-private\n */\n@Component({\n selector: 'oui-tooltip-component',\n templateUrl: 'tooltip.html',\n styleUrls: ['tooltip.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [ouiTooltipAnimations.tooltipState],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n // Forces the element to have a layout in IE and Edge. This fixes issues where the element\n // won't be rendered if the animations are disabled or there is no web animations polyfill.\n '[style.zoom]': '_visibility === \"visible\" ? 1 : null',\n '(body:click)': 'this._handleBodyInteraction()',\n 'aria-hidden': 'true',\n },\n})\nexport class TooltipComponent {\n /** Message to display in the tooltip */\n message: string;\n /** Classes to be added to the tooltip. Supports the same syntax as `ngClass`. */\n tooltipClass: string | string[] | Set | { [key: string]: any };\n\n /** The timeout ID of any current timer set to show the tooltip */\n _showTimeoutId: number | null;\n\n /** The timeout ID of any current timer set to hide the tooltip */\n _hideTimeoutId: number | null;\n\n /** Property watched by the animation framework to show or hide the tooltip */\n _visibility: TooltipVisibility = 'initial';\n\n /** Whether interactions on the page should close the tooltip */\n private _closeOnInteraction = false;\n\n /** Subject for notifying that the tooltip has been hidden from the view */\n private readonly _onHide: Subject = new Subject();\n\n /** Stream that emits whether the user has a handset-sized display. */\n _isHandset: Observable = this._breakpointObserver.observe(\n Breakpoints.Handset\n );\n\n constructor(\n private _changeDetectorRef: ChangeDetectorRef,\n private _breakpointObserver: BreakpointObserver\n ) {}\n\n /**\n * Shows the tooltip with an animation originating from the provided origin\n *\n * @param delay Amount of milliseconds to the delay showing the tooltip.\n */\n show(): void {\n // Cancel the delayed hide if it is scheduled\n if (this._hideTimeoutId) {\n clearTimeout(this._hideTimeoutId);\n this._hideTimeoutId = null;\n }\n\n // Body interactions should cancel the tooltip if there is a delay in showing.\n this._closeOnInteraction = true;\n setTimeout(() => {\n this._visibility = 'visible';\n this._showTimeoutId = null;\n\n // Mark for check so if any parent component has set the\n // ChangeDetectionStrategy to OnPush it will be checked anyways\n this._markForCheck();\n }, 0);\n }\n\n /**\n * Begins the animation to hide the tooltip after the provided delay in ms.\n *\n * @param delay Amount of milliseconds to delay showing the tooltip.\n */\n hide(): void {\n // Cancel the delayed show if it is scheduled\n if (this._showTimeoutId) {\n clearTimeout(this._showTimeoutId);\n this._showTimeoutId = null;\n }\n setTimeout(() => {\n this._visibility = 'hidden';\n this._hideTimeoutId = null;\n // Mark for check so if any parent component has set the\n // ChangeDetectionStrategy to OnPush it will be checked anyways\n this._markForCheck();\n }, 0);\n }\n\n /** Returns an observable that notifies when the tooltip has been hidden from view. */\n afterHidden(): Observable {\n return this._onHide.asObservable();\n }\n\n /** Whether the tooltip is being displayed. */\n isVisible(): boolean {\n return this._visibility === 'visible';\n }\n\n _animationStart() {\n this._closeOnInteraction = false;\n }\n\n _animationDone(event: AnimationEvent): void {\n const toState = event.toState as TooltipVisibility;\n\n if (toState === 'hidden' && !this.isVisible()) {\n this._onHide.next();\n }\n\n if (toState === 'visible' || toState === 'hidden') {\n this._closeOnInteraction = true;\n }\n }\n\n /**\n * Interactions on the HTML body should close the tooltip immediately\n */\n _handleBodyInteraction(): void {\n if (this._closeOnInteraction) {\n this.hide();\n }\n }\n\n /**\n * Marks that the tooltip needs to be checked in the next change detection run.\n * Mainly used for rendering the initial text before positioning a tooltip, which\n * can be problematic in components with OnPush change detection.\n */\n _markForCheck(): void {\n this._changeDetectorRef.markForCheck();\n }\n}\n\n/**\n * Directive that attaches a tooltip to the host element. Animates the showing and\n * hiding of a tooltip provided position (defaults to below the element).\n */\n@Directive({\n selector: '[ouiTooltip]',\n exportAs: 'ouiTooltip',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '(longpress)': 'show()',\n '(keydown)': '_handleKeydown($event)',\n '(touchend)': '_handleTouchend()',\n '[attr.tabindex]': 'disabled ? -1 : 0',\n '[attr.aria-hidden]': 'false',\n },\n})\nexport class OuiTooltip implements OnDestroy, CanDisable {\n _overlayRef: OverlayRef | null;\n _tooltipInstance: TooltipComponent | null;\n\n private _portal: ComponentPortal;\n private _position: TooltipPosition = 'below';\n private _disabled = false;\n private _tooltipClass:\n | string\n | string[]\n | Set\n | { [key: string]: any };\n private _scrollStrategy: () => ScrollStrategy;\n\n /** Allows the user to define the position of the tooltip relative to the parent element */\n @Input('ouiTooltipPosition')\n get position(): TooltipPosition {\n return this._position;\n }\n set position(value: TooltipPosition) {\n if (value !== this._position) {\n this._position = value;\n if (this._overlayRef) {\n this._updatePosition();\n\n if (this._tooltipInstance) {\n this._tooltipInstance!.show();\n }\n\n this._overlayRef.updatePosition();\n }\n }\n }\n\n /** Disables the display of the tooltip. */\n @Input('ouiTooltipDisabled')\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n\n // If tooltip is disabled, hide immediately.\n if (this._disabled) {\n this.hide();\n }\n }\n\n private _message = '';\n\n /** The message to be displayed in the tooltip */\n @Input('ouiTooltip')\n get message() {\n return this._message;\n }\n set message(value: string) {\n this._ariaDescriber.removeDescription(\n this._elementRef.nativeElement,\n this._message\n );\n\n // If the message is not a string (e.g. number), convert it to a string and trim it.\n this._message = value != null ? `${value}`.trim() : '';\n\n if (!this._message && this._isTooltipVisible()) {\n this.hide();\n } else {\n this._updateTooltipMessage();\n this._ariaDescriber.describe(\n this._elementRef.nativeElement,\n this.message\n );\n }\n }\n\n /** Classes to be passed to the tooltip. Supports the same syntax as `ngClass`. */\n @Input('ouiTooltipClass')\n get tooltipClass() {\n return this._tooltipClass;\n }\n set tooltipClass(\n value: string | string[] | Set | { [key: string]: any }\n ) {\n this._tooltipClass = value;\n if (this._tooltipInstance) {\n this._tooltipInstance._markForCheck();\n this._setTooltipClass(this._tooltipClass);\n }\n }\n\n private _manualListeners = new Map<\n string,\n EventListenerOrEventListenerObject\n >();\n\n /** Emits when the component is destroyed. */\n private readonly _destroyed = new Subject();\n\n constructor(\n private _overlay: Overlay,\n private _elementRef: ElementRef,\n private _scrollDispatcher: ScrollDispatcher,\n private _viewContainerRef: ViewContainerRef,\n private _ngZone: NgZone,\n platform: Platform,\n private _ariaDescriber: AriaDescriber,\n private _focusMonitor: FocusMonitor,\n @Inject(OUI_TOOLTIP_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _dir: Directionality\n ) {\n this._scrollStrategy = scrollStrategy;\n const element: HTMLElement = _elementRef.nativeElement;\n const elementStyle = element.style as NewCSSStyleDeclaration & {\n webkitUserDrag: string;\n };\n const hasGestures = typeof window === 'undefined' || (window as any).Hammer;\n\n // The mouse events shouldn't be bound on mobile devices, because they can prevent the\n // first tap from firing its click event or can cause the tooltip to open for clicks.\n if (!platform.IOS && !platform.ANDROID) {\n this._manualListeners\n .set('mouseenter', () => this.show())\n .set('mouseleave', () => this.hide());\n } else if (!hasGestures) {\n // there's no way for the user to trigger the tooltip on a touch device.\n this._manualListeners.set('touchstart', () => this.show());\n }\n\n this._manualListeners.forEach((listener, event) =>\n element.addEventListener(event, listener)\n );\n\n if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n elementStyle.webkitUserSelect =\n elementStyle.userSelect =\n elementStyle.msUserSelect =\n '';\n }\n\n // Hammer applies `-webkit-user-drag: none` on all elements by default,\n // which breaks the native drag&drop. If the consumer explicitly made\n // the element draggable, clear the `-webkit-user-drag`.\n if (element.draggable && elementStyle.webkitUserDrag === 'none') {\n elementStyle.webkitUserDrag = '';\n }\n\n _focusMonitor\n .monitor(_elementRef)\n .pipe(takeUntil(this._destroyed))\n .subscribe((origin) => {\n // Note that the focus monitor runs outside the Angular zone.\n if (!origin) {\n _ngZone.run(() => this.hide());\n } else if (origin === 'keyboard') {\n _ngZone.run(() => this.show());\n }\n });\n }\n\n /**\n * Dispose the tooltip when destroyed.\n */\n ngOnDestroy() {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._tooltipInstance = null;\n }\n\n // Clean up the event listeners set in the constructor\n this._manualListeners.forEach((listener, event) => {\n this._elementRef.nativeElement.removeEventListener(event, listener);\n });\n this._manualListeners.clear();\n\n this._destroyed.next();\n this._destroyed.complete();\n\n this._ariaDescriber.removeDescription(\n this._elementRef.nativeElement,\n this.message\n );\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n /** Shows the tooltip after the delay in ms, defaults to tooltip-delay-show or 0ms if no input */\n show(): void {\n if (\n this.disabled ||\n !this.message ||\n (this._isTooltipVisible() &&\n !this._tooltipInstance!._showTimeoutId &&\n !this._tooltipInstance!._hideTimeoutId)\n ) {\n return;\n }\n\n const overlayRef = this._createOverlay();\n\n this._detach();\n this._portal =\n this._portal ||\n new ComponentPortal(TooltipComponent, this._viewContainerRef);\n this._tooltipInstance = overlayRef.attach(this._portal).instance;\n this._tooltipInstance\n .afterHidden()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._detach());\n this._setTooltipClass(this._tooltipClass);\n this._updateTooltipMessage();\n this._tooltipInstance!.show();\n }\n\n /** Hides the tooltip after the delay in ms, defaults to tooltip-delay-hide or 0ms if no input */\n hide(): void {\n if (this._tooltipInstance) {\n this._tooltipInstance.hide();\n }\n }\n\n /** Shows/hides the tooltip */\n toggle(): void {\n this._isTooltipVisible() ? this.hide() : this.show();\n }\n\n /** Returns true if the tooltip is currently visible to the user */\n _isTooltipVisible(): boolean {\n return !!this._tooltipInstance && this._tooltipInstance.isVisible();\n }\n\n /** Handles the keydown events on the host element. */\n _handleKeydown(e: KeyboardEvent) {\n if (this._isTooltipVisible() && e.key === 'Escape') {\n e.stopPropagation();\n this.hide();\n }\n }\n\n /** Handles the touchend events on the host element. */\n _handleTouchend() {\n this.hide();\n }\n\n /** Create the overlay config and position strategy */\n private _createOverlay(): OverlayRef {\n if (this._overlayRef) {\n return this._overlayRef;\n }\n\n // Create connected position strategy that listens for scroll events to reposition.\n const strategy = this._overlay\n .position()\n .flexibleConnectedTo(this._elementRef)\n .withTransformOriginOn('.oui-tooltip')\n .withFlexibleDimensions(false)\n .withViewportMargin(8);\n\n const scrollableAncestors =\n this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);\n\n strategy.withScrollableContainers(scrollableAncestors);\n\n strategy.positionChanges\n .pipe(takeUntil(this._destroyed))\n .subscribe((change) => {\n if (this._tooltipInstance) {\n if (\n change.scrollableViewProperties.isOverlayClipped &&\n this._tooltipInstance.isVisible()\n ) {\n // After position changes occur and the overlay is clipped by\n // a parent scrollable then close the tooltip.\n this._ngZone.run(() => this.hide());\n }\n }\n });\n\n this._overlayRef = this._overlay.create({\n direction: this._dir,\n positionStrategy: strategy,\n panelClass: TOOLTIP_PANEL_CLASS,\n scrollStrategy: this._scrollStrategy(),\n });\n\n this._updatePosition();\n\n this._overlayRef\n .detachments()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._detach());\n\n return this._overlayRef;\n }\n\n /** Detaches the currently-attached tooltip. */\n private _detach() {\n if (this._overlayRef && this._overlayRef.hasAttached()) {\n this._overlayRef.detach();\n }\n\n this._tooltipInstance = null;\n }\n\n /** Updates the position of the current tooltip. */\n private _updatePosition() {\n const position = this._overlayRef!.getConfig()\n .positionStrategy as FlexibleConnectedPositionStrategy;\n const origin = this._getOrigin();\n const overlay = this._getOverlayPosition();\n\n position.withPositions([\n { ...origin.main, ...overlay.main },\n { ...origin.fallback, ...overlay.fallback },\n ]);\n }\n\n /**\n * Returns the origin position and a fallback position based on the user's position preference.\n * The fallback position is the inverse of the origin (e.g. `'below' -> 'above'`).\n */\n _getOrigin(): {\n main: OriginConnectionPosition;\n fallback: OriginConnectionPosition;\n } {\n const isLtr = !this._dir || this._dir.value === 'ltr';\n const position = this.position;\n let originPosition: OriginConnectionPosition;\n\n if (position === 'above' || position === 'below') {\n originPosition = {\n originX: 'center',\n originY: position === 'above' ? 'top' : 'bottom',\n };\n } else if (\n (position === 'left' && isLtr) ||\n (position === 'right' && !isLtr)\n ) {\n originPosition = { originX: 'start', originY: 'center' };\n } else if (\n (position === 'right' && isLtr) ||\n (position === 'left' && !isLtr)\n ) {\n originPosition = { originX: 'end', originY: 'center' };\n } else {\n throw getOuiTooltipInvalidPositionError(position);\n }\n\n const { x, y } = this._invertPosition(\n originPosition.originX,\n originPosition.originY\n );\n\n return {\n main: originPosition,\n fallback: { originX: x, originY: y },\n };\n }\n\n /** Returns the overlay position and a fallback position based on the user's preference */\n _getOverlayPosition(): {\n main: OverlayConnectionPosition;\n fallback: OverlayConnectionPosition;\n } {\n const isLtr = !this._dir || this._dir.value === 'ltr';\n const position = this.position;\n let overlayPosition: OverlayConnectionPosition;\n\n if (position === 'above') {\n overlayPosition = { overlayX: 'center', overlayY: 'bottom' };\n } else if (position === 'below') {\n overlayPosition = { overlayX: 'center', overlayY: 'top' };\n } else if (\n (position === 'left' && isLtr) ||\n (position === 'right' && !isLtr)\n ) {\n overlayPosition = { overlayX: 'end', overlayY: 'center' };\n } else if (\n (position === 'right' && isLtr) ||\n (position === 'left' && !isLtr)\n ) {\n overlayPosition = { overlayX: 'start', overlayY: 'center' };\n } else {\n throw getOuiTooltipInvalidPositionError(position);\n }\n\n const { x, y } = this._invertPosition(\n overlayPosition.overlayX,\n overlayPosition.overlayY\n );\n\n return {\n main: overlayPosition,\n fallback: { overlayX: x, overlayY: y },\n };\n }\n\n /** Updates the tooltip message and repositions the overlay according to the new message length */\n private _updateTooltipMessage() {\n // Must wait for the message to be painted to the tooltip so that the overlay can properly\n // calculate the correct positioning based on the size of the text.\n if (this._tooltipInstance) {\n this._tooltipInstance.message = this.message;\n this._tooltipInstance._markForCheck();\n\n this._ngZone.onMicrotaskEmpty\n .asObservable()\n .pipe(take(1), takeUntil(this._destroyed))\n .subscribe(() => {\n if (this._tooltipInstance) {\n this._overlayRef!.updatePosition();\n }\n });\n }\n }\n\n /** Updates the tooltip class */\n private _setTooltipClass(\n tooltipClass: string | string[] | Set | { [key: string]: any }\n ) {\n if (this._tooltipInstance) {\n this._tooltipInstance.tooltipClass = tooltipClass;\n this._tooltipInstance._markForCheck();\n }\n }\n\n /** Inverts an overlay position. */\n private _invertPosition(\n x: HorizontalConnectionPos,\n y: VerticalConnectionPos\n ) {\n if (this.position === 'above' || this.position === 'below') {\n if (y === 'top') {\n y = 'bottom';\n } else if (y === 'bottom') {\n y = 'top';\n }\n } else {\n if (x === 'end') {\n x = 'start';\n } else if (x === 'start') {\n x = 'end';\n }\n }\n\n return { x, y };\n }\n}\n", + "sourceCode": "import { AnimationEvent } from '@angular/animations';\r\nimport { AriaDescriber, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport {\r\n BreakpointObserver,\r\n Breakpoints,\r\n BreakpointState,\r\n} from '@angular/cdk/layout';\r\nimport {\r\n FlexibleConnectedPositionStrategy,\r\n HorizontalConnectionPos,\r\n OriginConnectionPosition,\r\n Overlay,\r\n OverlayConnectionPosition,\r\n OverlayRef,\r\n VerticalConnectionPos,\r\n ScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { ScrollDispatcher } from '@angular/cdk/scrolling';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { take, takeUntil } from 'rxjs/operators';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Directive,\r\n ElementRef,\r\n Inject,\r\n InjectionToken,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Optional,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ouiTooltipAnimations } from './tooltip-animations';\r\nimport { CanDisable } from '../core';\r\n\r\nexport type TooltipPosition = 'left' | 'right' | 'above' | 'below';\r\n\r\n/** Time in ms to throttle repositioning after scroll events. */\r\nexport const SCROLL_THROTTLE_MS = 20;\r\n\r\n/** CSS class that will be attached to the overlay panel. */\r\nexport const TOOLTIP_PANEL_CLASS = 'oui-tooltip-panel';\r\n\r\n/**\r\n * Creates an error to be thrown if the user supplied an invalid tooltip position.\r\n *\r\n * @docs-private\r\n */\r\nexport function getOuiTooltipInvalidPositionError(position: string) {\r\n return Error(`Tooltip position \"${position}\" is invalid.`);\r\n}\r\n\r\n/** Injection token that determines the scroll handling while a tooltip is visible. */\r\nexport const OUI_TOOLTIP_SCROLL_STRATEGY = new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-tooltip-scroll-strategy');\r\n\r\n/** @docs-private */\r\nexport function OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY(\r\n overlay: Overlay\r\n): () => ScrollStrategy {\r\n return () =>\r\n overlay.scrollStrategies.reposition({ scrollThrottle: SCROLL_THROTTLE_MS });\r\n}\r\n\r\n/** @docs-private */\r\nexport const OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER = {\r\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\r\n};\r\n\r\n/** Default `ouiTooltip` options that can be overridden. */\r\nexport interface OuiTooltipDefaultOptions {\r\n showDelay: number;\r\n hideDelay: number;\r\n touchendHideDelay: number;\r\n}\r\n\r\nexport interface NewCSSStyleDeclaration extends CSSStyleDeclaration {\r\n msUserSelect: string;\r\n}\r\n\r\n/** Injection token to be used to override the default options for `ouiTooltip`. */\r\nexport const OUI_TOOLTIP_DEFAULT_OPTIONS =\r\n new InjectionToken('oui-tooltip-default-options', {\r\n providedIn: 'root',\r\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\r\n });\r\n\r\n/** @docs-private */\r\nexport function OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY(): OuiTooltipDefaultOptions {\r\n return {\r\n showDelay: 0,\r\n hideDelay: 0,\r\n touchendHideDelay: 1500,\r\n };\r\n}\r\n\r\nexport type TooltipVisibility = 'initial' | 'visible' | 'hidden';\r\n\r\n/**\r\n * Internal component that wraps the tooltip's content.\r\n *\r\n * @docs-private\r\n */\r\n@Component({\r\n selector: 'oui-tooltip-component',\r\n templateUrl: 'tooltip.html',\r\n styleUrls: ['tooltip.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [ouiTooltipAnimations.tooltipState],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n // Forces the element to have a layout in IE and Edge. This fixes issues where the element\r\n // won't be rendered if the animations are disabled or there is no web animations polyfill.\r\n '[style.zoom]': '_visibility === \"visible\" ? 1 : null',\r\n '(body:click)': 'this._handleBodyInteraction()',\r\n 'aria-hidden': 'true',\r\n },\r\n})\r\nexport class TooltipComponent {\r\n /** Message to display in the tooltip */\r\n message: string;\r\n /** Classes to be added to the tooltip. Supports the same syntax as `ngClass`. */\r\n tooltipClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** The timeout ID of any current timer set to show the tooltip */\r\n _showTimeoutId: number | null;\r\n\r\n /** The timeout ID of any current timer set to hide the tooltip */\r\n _hideTimeoutId: number | null;\r\n\r\n /** Property watched by the animation framework to show or hide the tooltip */\r\n _visibility: TooltipVisibility = 'initial';\r\n\r\n /** Whether interactions on the page should close the tooltip */\r\n private _closeOnInteraction = false;\r\n\r\n /** Subject for notifying that the tooltip has been hidden from the view */\r\n private readonly _onHide: Subject = new Subject();\r\n\r\n /** Stream that emits whether the user has a handset-sized display. */\r\n _isHandset: Observable = this._breakpointObserver.observe(\r\n Breakpoints.Handset\r\n );\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _breakpointObserver: BreakpointObserver\r\n ) {}\r\n\r\n /**\r\n * Shows the tooltip with an animation originating from the provided origin\r\n *\r\n * @param delay Amount of milliseconds to the delay showing the tooltip.\r\n */\r\n show(): void {\r\n // Cancel the delayed hide if it is scheduled\r\n if (this._hideTimeoutId) {\r\n clearTimeout(this._hideTimeoutId);\r\n this._hideTimeoutId = null;\r\n }\r\n\r\n // Body interactions should cancel the tooltip if there is a delay in showing.\r\n this._closeOnInteraction = true;\r\n setTimeout(() => {\r\n this._visibility = 'visible';\r\n this._showTimeoutId = null;\r\n\r\n // Mark for check so if any parent component has set the\r\n // ChangeDetectionStrategy to OnPush it will be checked anyways\r\n this._markForCheck();\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Begins the animation to hide the tooltip after the provided delay in ms.\r\n *\r\n * @param delay Amount of milliseconds to delay showing the tooltip.\r\n */\r\n hide(): void {\r\n // Cancel the delayed show if it is scheduled\r\n if (this._showTimeoutId) {\r\n clearTimeout(this._showTimeoutId);\r\n this._showTimeoutId = null;\r\n }\r\n setTimeout(() => {\r\n this._visibility = 'hidden';\r\n this._hideTimeoutId = null;\r\n // Mark for check so if any parent component has set the\r\n // ChangeDetectionStrategy to OnPush it will be checked anyways\r\n this._markForCheck();\r\n }, 0);\r\n }\r\n\r\n /** Returns an observable that notifies when the tooltip has been hidden from view. */\r\n afterHidden(): Observable {\r\n return this._onHide.asObservable();\r\n }\r\n\r\n /** Whether the tooltip is being displayed. */\r\n isVisible(): boolean {\r\n return this._visibility === 'visible';\r\n }\r\n\r\n _animationStart() {\r\n this._closeOnInteraction = false;\r\n }\r\n\r\n _animationDone(event: AnimationEvent): void {\r\n const toState = event.toState as TooltipVisibility;\r\n\r\n if (toState === 'hidden' && !this.isVisible()) {\r\n this._onHide.next();\r\n }\r\n\r\n if (toState === 'visible' || toState === 'hidden') {\r\n this._closeOnInteraction = true;\r\n }\r\n }\r\n\r\n /**\r\n * Interactions on the HTML body should close the tooltip immediately\r\n */\r\n _handleBodyInteraction(): void {\r\n if (this._closeOnInteraction) {\r\n this.hide();\r\n }\r\n }\r\n\r\n /**\r\n * Marks that the tooltip needs to be checked in the next change detection run.\r\n * Mainly used for rendering the initial text before positioning a tooltip, which\r\n * can be problematic in components with OnPush change detection.\r\n */\r\n _markForCheck(): void {\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n}\r\n\r\n/**\r\n * Directive that attaches a tooltip to the host element. Animates the showing and\r\n * hiding of a tooltip provided position (defaults to below the element).\r\n */\r\n@Directive({\r\n selector: '[ouiTooltip]',\r\n exportAs: 'ouiTooltip',\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '(longpress)': 'show()',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(touchend)': '_handleTouchend()',\r\n '[attr.tabindex]': 'disabled ? -1 : 0',\r\n '[attr.aria-hidden]': 'false',\r\n },\r\n})\r\nexport class OuiTooltip implements OnDestroy, CanDisable {\r\n _overlayRef: OverlayRef | null;\r\n _tooltipInstance: TooltipComponent | null;\r\n\r\n private _portal: ComponentPortal;\r\n private _position: TooltipPosition = 'below';\r\n private _disabled = false;\r\n private _tooltipClass:\r\n | string\r\n | string[]\r\n | Set\r\n | { [key: string]: any };\r\n private _scrollStrategy: () => ScrollStrategy;\r\n\r\n /** Allows the user to define the position of the tooltip relative to the parent element */\r\n @Input('ouiTooltipPosition')\r\n get position(): TooltipPosition {\r\n return this._position;\r\n }\r\n set position(value: TooltipPosition) {\r\n if (value !== this._position) {\r\n this._position = value;\r\n if (this._overlayRef) {\r\n this._updatePosition();\r\n\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance!.show();\r\n }\r\n\r\n this._overlayRef.updatePosition();\r\n }\r\n }\r\n }\r\n\r\n /** Disables the display of the tooltip. */\r\n @Input('ouiTooltipDisabled')\r\n get disabled(): boolean {\r\n return this._disabled;\r\n }\r\n set disabled(value) {\r\n this._disabled = coerceBooleanProperty(value);\r\n\r\n // If tooltip is disabled, hide immediately.\r\n if (this._disabled) {\r\n this.hide();\r\n }\r\n }\r\n\r\n private _message = '';\r\n\r\n /** The message to be displayed in the tooltip */\r\n @Input('ouiTooltip')\r\n get message() {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._ariaDescriber.removeDescription(\r\n this._elementRef.nativeElement,\r\n this._message\r\n );\r\n\r\n // If the message is not a string (e.g. number), convert it to a string and trim it.\r\n this._message = value != null ? `${value}`.trim() : '';\r\n\r\n if (!this._message && this._isTooltipVisible()) {\r\n this.hide();\r\n } else {\r\n this._updateTooltipMessage();\r\n this._ariaDescriber.describe(\r\n this._elementRef.nativeElement,\r\n this.message\r\n );\r\n }\r\n }\r\n\r\n /** Classes to be passed to the tooltip. Supports the same syntax as `ngClass`. */\r\n @Input('ouiTooltipClass')\r\n get tooltipClass() {\r\n return this._tooltipClass;\r\n }\r\n set tooltipClass(\r\n value: string | string[] | Set | { [key: string]: any }\r\n ) {\r\n this._tooltipClass = value;\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance._markForCheck();\r\n this._setTooltipClass(this._tooltipClass);\r\n }\r\n }\r\n\r\n private _manualListeners = new Map<\r\n string,\r\n EventListenerOrEventListenerObject\r\n >();\r\n\r\n /** Emits when the component is destroyed. */\r\n private readonly _destroyed = new Subject();\r\n\r\n constructor(\r\n private _overlay: Overlay,\r\n private _elementRef: ElementRef,\r\n private _scrollDispatcher: ScrollDispatcher,\r\n private _viewContainerRef: ViewContainerRef,\r\n private _ngZone: NgZone,\r\n platform: Platform,\r\n private _ariaDescriber: AriaDescriber,\r\n private _focusMonitor: FocusMonitor,\r\n @Inject(OUI_TOOLTIP_SCROLL_STRATEGY) scrollStrategy: any,\r\n @Optional() private _dir: Directionality\r\n ) {\r\n this._scrollStrategy = scrollStrategy;\r\n const element: HTMLElement = _elementRef.nativeElement;\r\n const elementStyle = element.style as NewCSSStyleDeclaration & {\r\n webkitUserDrag: string;\r\n };\r\n const hasGestures = typeof window === 'undefined' || (window as any).Hammer;\r\n\r\n // The mouse events shouldn't be bound on mobile devices, because they can prevent the\r\n // first tap from firing its click event or can cause the tooltip to open for clicks.\r\n if (!platform.IOS && !platform.ANDROID) {\r\n this._manualListeners\r\n .set('mouseenter', () => this.show())\r\n .set('mouseleave', () => this.hide());\r\n } else if (!hasGestures) {\r\n // there's no way for the user to trigger the tooltip on a touch device.\r\n this._manualListeners.set('touchstart', () => this.show());\r\n }\r\n\r\n this._manualListeners.forEach((listener, event) =>\r\n element.addEventListener(event, listener)\r\n );\r\n\r\n if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\r\n elementStyle.webkitUserSelect =\r\n elementStyle.userSelect =\r\n elementStyle.msUserSelect =\r\n '';\r\n }\r\n\r\n // Hammer applies `-webkit-user-drag: none` on all elements by default,\r\n // which breaks the native drag&drop. If the consumer explicitly made\r\n // the element draggable, clear the `-webkit-user-drag`.\r\n if (element.draggable && elementStyle.webkitUserDrag === 'none') {\r\n elementStyle.webkitUserDrag = '';\r\n }\r\n\r\n _focusMonitor\r\n .monitor(_elementRef)\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe((origin) => {\r\n // Note that the focus monitor runs outside the Angular zone.\r\n if (!origin) {\r\n _ngZone.run(() => this.hide());\r\n } else if (origin === 'keyboard') {\r\n _ngZone.run(() => this.show());\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Dispose the tooltip when destroyed.\r\n */\r\n ngOnDestroy() {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._tooltipInstance = null;\r\n }\r\n\r\n // Clean up the event listeners set in the constructor\r\n this._manualListeners.forEach((listener, event) => {\r\n this._elementRef.nativeElement.removeEventListener(event, listener);\r\n });\r\n this._manualListeners.clear();\r\n\r\n this._destroyed.next();\r\n this._destroyed.complete();\r\n\r\n this._ariaDescriber.removeDescription(\r\n this._elementRef.nativeElement,\r\n this.message\r\n );\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n }\r\n\r\n /** Shows the tooltip after the delay in ms, defaults to tooltip-delay-show or 0ms if no input */\r\n show(): void {\r\n if (\r\n this.disabled ||\r\n !this.message ||\r\n (this._isTooltipVisible() &&\r\n !this._tooltipInstance!._showTimeoutId &&\r\n !this._tooltipInstance!._hideTimeoutId)\r\n ) {\r\n return;\r\n }\r\n\r\n const overlayRef = this._createOverlay();\r\n\r\n this._detach();\r\n this._portal =\r\n this._portal ||\r\n new ComponentPortal(TooltipComponent, this._viewContainerRef);\r\n this._tooltipInstance = overlayRef.attach(this._portal).instance;\r\n this._tooltipInstance\r\n .afterHidden()\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => this._detach());\r\n this._setTooltipClass(this._tooltipClass);\r\n this._updateTooltipMessage();\r\n this._tooltipInstance!.show();\r\n }\r\n\r\n /** Hides the tooltip after the delay in ms, defaults to tooltip-delay-hide or 0ms if no input */\r\n hide(): void {\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.hide();\r\n } else {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n }\r\n }\r\n\r\n /** Shows/hides the tooltip */\r\n toggle(): void {\r\n if (this._isTooltipVisible()) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n /** Returns true if the tooltip is currently visible to the user */\r\n _isTooltipVisible(): boolean {\r\n return !!this._tooltipInstance && this._tooltipInstance.isVisible();\r\n }\r\n\r\n /** Handles the keydown events on the host element. */\r\n _handleKeydown(e: KeyboardEvent) {\r\n if (this._isTooltipVisible() && e.key === 'Escape') {\r\n e.stopPropagation();\r\n this.hide();\r\n }\r\n }\r\n\r\n /** Handles the touchend events on the host element. */\r\n _handleTouchend() {\r\n this.hide();\r\n }\r\n\r\n /** Create the overlay config and position strategy */\r\n private _createOverlay(): OverlayRef {\r\n if (this._overlayRef) {\r\n return this._overlayRef;\r\n }\r\n\r\n // Create connected position strategy that listens for scroll events to reposition.\r\n const strategy = this._overlay\r\n .position()\r\n .flexibleConnectedTo(this._elementRef)\r\n .withTransformOriginOn('.oui-tooltip')\r\n .withFlexibleDimensions(false)\r\n .withViewportMargin(8);\r\n\r\n const scrollableAncestors =\r\n this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);\r\n\r\n strategy.withScrollableContainers(scrollableAncestors);\r\n\r\n strategy.positionChanges\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe((change) => {\r\n if (this._tooltipInstance) {\r\n if (\r\n change.scrollableViewProperties.isOverlayClipped &&\r\n this._tooltipInstance.isVisible()\r\n ) {\r\n // After position changes occur and the overlay is clipped by\r\n // a parent scrollable then close the tooltip.\r\n this._ngZone.run(() => this.hide());\r\n }\r\n }\r\n });\r\n\r\n this._overlayRef = this._overlay.create({\r\n direction: this._dir,\r\n positionStrategy: strategy,\r\n panelClass: TOOLTIP_PANEL_CLASS,\r\n scrollStrategy: this._scrollStrategy(),\r\n });\r\n\r\n this._updatePosition();\r\n\r\n this._overlayRef\r\n .detachments()\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => this._detach());\r\n\r\n return this._overlayRef;\r\n }\r\n\r\n /** Detaches the currently-attached tooltip. */\r\n private _detach() {\r\n if (this._overlayRef && this._overlayRef.hasAttached()) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n\r\n this._tooltipInstance = null;\r\n }\r\n\r\n /** Updates the position of the current tooltip. */\r\n private _updatePosition() {\r\n const position = this._overlayRef!.getConfig()\r\n .positionStrategy as FlexibleConnectedPositionStrategy;\r\n const origin = this._getOrigin();\r\n const overlay = this._getOverlayPosition();\r\n\r\n position.withPositions([\r\n { ...origin.main, ...overlay.main },\r\n { ...origin.fallback, ...overlay.fallback },\r\n ]);\r\n }\r\n\r\n /**\r\n * Returns the origin position and a fallback position based on the user's position preference.\r\n * The fallback position is the inverse of the origin (e.g. `'below' -> 'above'`).\r\n */\r\n _getOrigin(): {\r\n main: OriginConnectionPosition;\r\n fallback: OriginConnectionPosition;\r\n } {\r\n const isLtr = !this._dir || this._dir.value === 'ltr';\r\n const position = this.position;\r\n let originPosition: OriginConnectionPosition;\r\n\r\n if (position === 'above' || position === 'below') {\r\n originPosition = {\r\n originX: 'center',\r\n originY: position === 'above' ? 'top' : 'bottom',\r\n };\r\n } else if (\r\n (position === 'left' && isLtr) ||\r\n (position === 'right' && !isLtr)\r\n ) {\r\n originPosition = { originX: 'start', originY: 'center' };\r\n } else if (\r\n (position === 'right' && isLtr) ||\r\n (position === 'left' && !isLtr)\r\n ) {\r\n originPosition = { originX: 'end', originY: 'center' };\r\n } else {\r\n throw getOuiTooltipInvalidPositionError(position);\r\n }\r\n\r\n const { x, y } = this._invertPosition(\r\n originPosition.originX,\r\n originPosition.originY\r\n );\r\n\r\n return {\r\n main: originPosition,\r\n fallback: { originX: x, originY: y },\r\n };\r\n }\r\n\r\n /** Returns the overlay position and a fallback position based on the user's preference */\r\n _getOverlayPosition(): {\r\n main: OverlayConnectionPosition;\r\n fallback: OverlayConnectionPosition;\r\n } {\r\n const isLtr = !this._dir || this._dir.value === 'ltr';\r\n const position = this.position;\r\n let overlayPosition: OverlayConnectionPosition;\r\n\r\n if (position === 'above') {\r\n overlayPosition = { overlayX: 'center', overlayY: 'bottom' };\r\n } else if (position === 'below') {\r\n overlayPosition = { overlayX: 'center', overlayY: 'top' };\r\n } else if (\r\n (position === 'left' && isLtr) ||\r\n (position === 'right' && !isLtr)\r\n ) {\r\n overlayPosition = { overlayX: 'end', overlayY: 'center' };\r\n } else if (\r\n (position === 'right' && isLtr) ||\r\n (position === 'left' && !isLtr)\r\n ) {\r\n overlayPosition = { overlayX: 'start', overlayY: 'center' };\r\n } else {\r\n throw getOuiTooltipInvalidPositionError(position);\r\n }\r\n\r\n const { x, y } = this._invertPosition(\r\n overlayPosition.overlayX,\r\n overlayPosition.overlayY\r\n );\r\n\r\n return {\r\n main: overlayPosition,\r\n fallback: { overlayX: x, overlayY: y },\r\n };\r\n }\r\n\r\n /** Updates the tooltip message and repositions the overlay according to the new message length */\r\n private _updateTooltipMessage() {\r\n // Must wait for the message to be painted to the tooltip so that the overlay can properly\r\n // calculate the correct positioning based on the size of the text.\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.message = this.message;\r\n this._tooltipInstance._markForCheck();\r\n\r\n this._ngZone.onMicrotaskEmpty\r\n .asObservable()\r\n .pipe(take(1), takeUntil(this._destroyed))\r\n .subscribe(() => {\r\n if (this._tooltipInstance) {\r\n this._overlayRef!.updatePosition();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Updates the tooltip class */\r\n private _setTooltipClass(\r\n tooltipClass: string | string[] | Set | { [key: string]: any }\r\n ) {\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.tooltipClass = tooltipClass;\r\n this._tooltipInstance._markForCheck();\r\n }\r\n }\r\n\r\n /** Inverts an overlay position. */\r\n private _invertPosition(\r\n x: HorizontalConnectionPos,\r\n y: VerticalConnectionPos\r\n ) {\r\n if (this.position === 'above' || this.position === 'below') {\r\n if (y === 'top') {\r\n y = 'bottom';\r\n } else if (y === 'bottom') {\r\n y = 'top';\r\n }\r\n } else {\r\n if (x === 'end') {\r\n x = 'start';\r\n } else if (x === 'start') {\r\n x = 'end';\r\n }\r\n }\r\n\r\n return { x, y };\r\n }\r\n}\r\n", "properties": [ { "name": "hideDelay", @@ -1454,12 +1454,12 @@ }, { "name": "StateGroup", - "id": "interface-StateGroup-a7c3a42dc260f97f48099129f3271decd60a827448988b8e399989f849989a0745c120e669504c278a5df2bf0c7aa7d074d5b69fefc6e004ad3a5a3600023dd0", + "id": "interface-StateGroup-a5f1cba4d87fcf80e6dfa5d1185b7a53c25a8276f42c8458d2a0e687a3deb2627f29bff33a42424b99f802fa475d5b605dfddab12b23b6a76a9925d2e49321a6", "file": "ui/src/stories/autocomplete/autocomplete.component.ts", "deprecated": false, "deprecationMessage": "", "type": "interface", - "sourceCode": "import { Input, Component, OnInit } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n UntypedFormControl,\r\n UntypedFormBuilder,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport { startWith, map } from 'rxjs/operators';\r\n\r\nexport interface StateGroup {\r\n letter: string;\r\n names: string[];\r\n}\r\nexport const _filter = (opt: string[], value: string): string[] => {\r\n const filterValue = value.toLowerCase();\r\n\r\n return opt.filter((item) => item.toLowerCase().indexOf(filterValue) === 0);\r\n};\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ option }}\r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteStorybook implements OnInit {\r\n filteredOptions: Observable;\r\n myControl = new UntypedFormControl();\r\n @Input() options: any[];\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.myControl.disable();\r\n } else {\r\n this.myControl.enable();\r\n }\r\n }\r\n ngOnInit() {\r\n this.filteredOptions = this.myControl.valueChanges.pipe(\r\n startWith(''),\r\n map((value) => (typeof value === 'string' ? value : value)),\r\n map((option) => (option ? this._filter(option) : this.options.slice()))\r\n );\r\n }\r\n private _filter(option): string[] {\r\n const filterValue = option.toLowerCase();\r\n\r\n return this.options.filter(\r\n // eslint-disable-next-line no-shadow\r\n (option) => option.toLowerCase().indexOf(filterValue) === 0\r\n );\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-group-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ name }}\r\n \r\n \r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteGroupStorybook implements OnInit {\r\n @Input() stateGroups: StateGroup[];\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.stateForm.get('stateGroup')!.disable();\r\n } else {\r\n this.stateForm.get('stateGroup')!.enable();\r\n }\r\n }\r\n stateForm: UntypedFormGroup = this.fb.group({\r\n stateGroup: '',\r\n });\r\n stateGroupOptions: Observable;\r\n\r\n constructor(private fb: UntypedFormBuilder) {}\r\n ngOnInit() {\r\n this.stateGroupOptions = this.stateForm\r\n .get('stateGroup')!\r\n .valueChanges.pipe(\r\n startWith(''),\r\n map((value: string) => this._filterGroup(value))\r\n );\r\n }\r\n\r\n private _filterGroup(value: string): StateGroup[] {\r\n if (value) {\r\n return this.stateGroups\r\n .map((group) => ({\r\n letter: group.letter,\r\n names: _filter(group.names, value),\r\n }))\r\n .filter((group) => group.names.length > 0);\r\n }\r\n\r\n return this.stateGroups;\r\n }\r\n}\r\n", + "sourceCode": "import { Input, Component, OnInit } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n UntypedFormControl,\r\n UntypedFormBuilder,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport { startWith, map } from 'rxjs/operators';\r\n\r\nexport interface StateGroup {\r\n letter: string;\r\n names: string[];\r\n}\r\nexport const _filter = (opt: string[], value: string): string[] => {\r\n const filterValue = value.toLowerCase();\r\n\r\n return opt.filter((item) => item.toLowerCase().indexOf(filterValue) === 0);\r\n};\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ option }}\r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteStorybook implements OnInit {\r\n filteredOptions: Observable;\r\n myControl = new UntypedFormControl();\r\n @Input() options: any[];\r\n @Input() appearance: string;\r\n @Input() autoActiveFirstOption: boolean;\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.myControl.disable();\r\n } else {\r\n this.myControl.enable();\r\n }\r\n }\r\n ngOnInit() {\r\n this.filteredOptions = this.myControl.valueChanges.pipe(\r\n startWith(''),\r\n map((value) => (typeof value === 'string' ? value : value)),\r\n map((option) => (option ? this._filter(option) : this.options.slice()))\r\n );\r\n }\r\n private _filter(option): string[] {\r\n const filterValue = option.toLowerCase();\r\n\r\n return this.options.filter(\r\n // eslint-disable-next-line no-shadow\r\n (option) => option.toLowerCase().indexOf(filterValue) === 0\r\n );\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-group-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ name }}\r\n \r\n \r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteGroupStorybook implements OnInit {\r\n @Input() stateGroups: StateGroup[];\r\n @Input() appearance: string;\r\n @Input() autoActiveFirstOption: boolean;\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.stateForm.get('stateGroup')!.disable();\r\n } else {\r\n this.stateForm.get('stateGroup')!.enable();\r\n }\r\n }\r\n stateForm: UntypedFormGroup = this.fb.group({\r\n stateGroup: '',\r\n });\r\n stateGroupOptions: Observable;\r\n\r\n constructor(private fb: UntypedFormBuilder) {}\r\n ngOnInit() {\r\n this.stateGroupOptions = this.stateForm\r\n .get('stateGroup')!\r\n .valueChanges.pipe(\r\n startWith(''),\r\n map((value: string) => this._filterGroup(value))\r\n );\r\n }\r\n\r\n private _filterGroup(value: string): StateGroup[] {\r\n if (value) {\r\n return this.stateGroups\r\n .map((group) => ({\r\n letter: group.letter,\r\n names: _filter(group.names, value),\r\n }))\r\n .filter((group) => group.names.length > 0);\r\n }\r\n\r\n return this.stateGroups;\r\n }\r\n}\r\n", "properties": [ { "name": "letter", @@ -3761,7 +3761,7 @@ }, { "name": "NativeDateAdapter", - "id": "injectable-NativeDateAdapter-d4631fddb12b1178a9c716866ca8d746eba9894bd8ecb4f106b09487a0de7cbea90ed806e203bf9231358a3162387eb01e3bd5edad77c0c9587c121c57f913f1", + "id": "injectable-NativeDateAdapter-f7c5aacb6e22a04632c6e647d4135ced4d276f1a30194fe3bfc5c3f4e186f5259ba5a37a9a4110599a578fcaff29535e960a881541459e7d206dc7f2cc4ef078", "file": "ui/src/components/datepicker/native-date-adapter.ts", "properties": [ { @@ -3847,8 +3847,8 @@ "jsdoctags": [ { "name": { - "pos": 9091, - "end": 9092, + "pos": 9407, + "end": 9408, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -3859,8 +3859,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 9085, - "end": 9090, + "pos": 9401, + "end": 9406, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -3871,8 +3871,8 @@ }, { "tagName": { - "pos": 9118, - "end": 9125, + "pos": 9435, + "end": 9442, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -3976,8 +3976,8 @@ "jsdoctags": [ { "name": { - "pos": 10100, - "end": 10103, + "pos": 10442, + "end": 10445, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -3988,8 +3988,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 10094, - "end": 10099, + "pos": 10436, + "end": 10441, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -4000,8 +4000,8 @@ }, { "name": { - "pos": 10237, - "end": 10241, + "pos": 10581, + "end": 10585, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -4012,8 +4012,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 10231, - "end": 10236, + "pos": 10575, + "end": 10580, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -4024,8 +4024,8 @@ }, { "tagName": { - "pos": 10322, - "end": 10329, + "pos": 10667, + "end": 10674, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -4060,8 +4060,8 @@ "jsdoctags": [ { "name": { - "pos": 9460, - "end": 9463, + "pos": 9788, + "end": 9791, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -4072,8 +4072,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 9454, - "end": 9459, + "pos": 9782, + "end": 9787, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -4084,8 +4084,8 @@ }, { "tagName": { - "pos": 9517, - "end": 9524, + "pos": 9846, + "end": 9853, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -4370,7 +4370,7 @@ }, { "name": "displayFormat", - "type": "Object", + "type": "object", "deprecated": false, "deprecationMessage": "" } @@ -4393,7 +4393,7 @@ }, { "name": "displayFormat", - "type": "Object", + "type": "object", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -5186,7 +5186,7 @@ "deprecationMessage": "", "description": "

Adapts the native JS Date for use with cdk-based components that work with dates.

\n", "rawdescription": "\nAdapts the native JS Date for use with cdk-based components that work with dates.", - "sourceCode": "import { Platform } from '@angular/cdk/platform';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { DateAdapter, OUI_DATE_LOCALE } from './date-adapter';\n\n// TODO(mmalerba): Remove when we no longer support safari 9.\n/** Whether the browser supports the Intl API. */\nconst SUPPORTS_INTL_API = typeof Intl !== 'undefined';\n\n/** The default month names to use if Intl API is not available. */\nconst DEFAULT_MONTH_NAMES = {\n long: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n short: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ],\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n};\n\n/** The default date names to use if Intl API is not available. */\nconst DEFAULT_DATE_NAMES = range(31, (i) => String(i + 1));\n\n/** The default day of the week names to use if Intl API is not available. */\nconst DEFAULT_DAY_OF_WEEK_NAMES = {\n long: [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ],\n short: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n narrow: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sat'],\n};\n\n/**\n * Matches strings that have the form of a valid RFC 3339 string\n * (https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date\n * because the regex will match strings an with out of bounds month, date, etc.\n */\nconst ISO_8601_REGEX =\n /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|(?:(?:\\+|-)\\d{2}:\\d{2}))?)?$/;\n\n/** Creates an array and fills it with values. */\nfunction range(length: number, valueFunction: (index: number) => T): T[] {\n const valuesArray = Array(length);\n for (let i = 0; i < length; i++) {\n valuesArray[i] = valueFunction(i);\n }\n return valuesArray;\n}\n\n/** Adapts the native JS Date for use with cdk-based components that work with dates. */\n@Injectable()\nexport class NativeDateAdapter extends DateAdapter {\n /** Whether to clamp the date between 1 and 9999 to avoid IE and Edge errors. */\n private readonly _clampDate: boolean;\n\n /**\n * Whether to use `timeZone: 'utc'` with `Intl.DateTimeFormat` when formatting dates.\n * Without this `Intl.DateTimeFormat` sometimes chooses the wrong timeZone, which can throw off\n * the result. (e.g. in the en-US locale `new Date(1800, 7, 14).toLocaleDateString()`\n * will produce `'8/13/1800'`.\n *\n * TODO(mmalerba): drop this variable. It's not being used in the code right now. We're now\n * getting the string representation of a Date object from it's utc representation. We're keeping\n * it here for sometime, just for precaution, in case we decide to revert some of these changes\n * though.\n */\n useUtcForDisplay = true;\n\n constructor(\n @Optional() @Inject(OUI_DATE_LOCALE) ouiDateLocale: string,\n platform: Platform\n ) {\n super();\n super.setLocale(ouiDateLocale);\n\n // IE does its own time zone correction, so we disable this on IE.\n this.useUtcForDisplay = !platform.TRIDENT;\n this._clampDate = platform.TRIDENT || platform.EDGE;\n }\n\n getYear(date: Date): number {\n return date.getFullYear();\n }\n\n getMonth(date: Date): number {\n return date.getMonth();\n }\n\n getDate(date: Date): number {\n return date.getDate();\n }\n\n getDayOfWeek(date: Date): number {\n return date.getDay();\n }\n\n getMonthNames(style: 'long' | 'short' | 'narrow'): string[] {\n return DEFAULT_MONTH_NAMES[style];\n }\n\n getDateNames(): string[] {\n return DEFAULT_DATE_NAMES;\n }\n\n getDayOfWeekNames(style: 'long' | 'short' | 'narrow'): string[] {\n return DEFAULT_DAY_OF_WEEK_NAMES[style];\n }\n\n getYearName(date: Date): string {\n return String(this.getYear(date));\n }\n\n getFirstDayOfWeek(): number {\n // We can't tell using native JS Date what the first day of the week is, we default to Sunday.\n return 0;\n }\n\n getNumDaysInMonth(date: Date): number {\n return this.getDate(\n this._createDateWithOverflow(\n this.getYear(date),\n this.getMonth(date) + 1,\n 0\n )\n );\n }\n\n clone(date: Date): Date {\n return this.createDate(\n this.getYear(date),\n this.getMonth(date),\n this.getDate(date)\n );\n }\n\n createDate(year: number, month: number, date: number): Date {\n // Check for invalid month and date (except upper bound on date which we have to check after\n // creating the Date).\n if (month < 0 || month > 11) {\n throw Error(\n `Invalid month index \"${month}\". Month index has to be between 0 and 11.`\n );\n }\n\n if (date < 1) {\n throw Error(`Invalid date \"${date}\". Date has to be greater than 0.`);\n }\n\n const result = this._createDateWithOverflow(year, month, date);\n // Check that the date wasn't above the upper bound for the month, causing the month to overflow\n if (result.getMonth() !== month) {\n throw Error(`Invalid date \"${date}\" for month with index \"${month}\".`);\n }\n\n return result;\n }\n\n today(): Date {\n return new Date();\n }\n\n parse(value: any): Date | null {\n // We have no way using the native JS Date to set the parse format or locale, so we ignore these\n // parameters.\n if (typeof value === 'number') {\n return new Date(value);\n }\n return value ? new Date(Date.parse(value as string)) : null;\n }\n\n format(date: Date, displayFormat: Object): string {\n if (!this.isValid(date)) {\n throw Error('NativeDateAdapter: Cannot format invalid date.');\n }\n\n if (SUPPORTS_INTL_API) {\n // On IE and Edge the i18n API will throw a hard error that can crash the entire app\n // if we attempt to format a date whose year is less than 1 or greater than 9999.\n if (\n this._clampDate &&\n (date.getFullYear() < 1 || date.getFullYear() > 9999)\n ) {\n date = this.clone(date);\n date.setFullYear(Math.max(1, Math.min(9999, date.getFullYear())));\n }\n\n displayFormat = { ...displayFormat, timeZone: 'utc' };\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n const dtf = new Intl.DateTimeFormat(this.locale, displayFormat);\n return this._stripDirectionalityCharacters(this._format(dtf, date));\n }\n return this._stripDirectionalityCharacters(date.toDateString());\n }\n\n addCalendarYears(date: Date, years: number): Date {\n return this.addCalendarMonths(date, years * 12);\n }\n\n addCalendarMonths(date: Date, months: number): Date {\n let newDate = this._createDateWithOverflow(\n this.getYear(date),\n this.getMonth(date) + months,\n this.getDate(date)\n );\n\n // It's possible to wind up in the wrong month if the original month has more days than the new\n // month. In this case we want to go to the last day of the desired month.\n // Note: the additional + 12 % 12 ensures we end up with a positive number, since JS % doesn't\n // guarantee this.\n if (\n this.getMonth(newDate) !==\n (((this.getMonth(date) + months) % 12) + 12) % 12\n ) {\n newDate = this._createDateWithOverflow(\n this.getYear(newDate),\n this.getMonth(newDate),\n 0\n );\n }\n\n return newDate;\n }\n\n addCalendarDays(date: Date, days: number): Date {\n return this._createDateWithOverflow(\n this.getYear(date),\n this.getMonth(date),\n this.getDate(date) + days\n );\n }\n\n toIso8601(date: Date): string {\n return [\n date.getUTCFullYear(),\n this._2digit(date.getUTCMonth() + 1),\n this._2digit(date.getUTCDate()),\n ].join('-');\n }\n\n /**\n * Returns the given value if given a valid Date or null. Deserializes valid ISO 8601 strings\n * (https://www.ietf.org/rfc/rfc3339.txt) into valid Dates and empty string into null. Returns an\n * invalid date for all other values.\n */\n deserialize(value: any): Date | null {\n if (typeof value === 'string') {\n if (!value) {\n return null;\n }\n // The `Date` constructor accepts formats other than ISO 8601, so we need to make sure the\n // string is the right format first.\n if (ISO_8601_REGEX.test(value)) {\n const date = new Date(value);\n if (this.isValid(date)) {\n return date;\n }\n }\n }\n return super.deserialize(value);\n }\n\n isDateInstance(obj: any): boolean {\n return obj instanceof Date;\n }\n\n isValid(date: Date) {\n return !isNaN(date.getTime());\n }\n\n invalid(): Date {\n return new Date(NaN);\n }\n\n /** Creates a date but allows the month and date to overflow. */\n private _createDateWithOverflow(year: number, month: number, date: number) {\n const result = new Date(year, month, date);\n\n // We need to correct for the fact that JS native Date treats years in range [0, 99] as\n // abbreviations for 19xx.\n if (year >= 0 && year < 100) {\n result.setFullYear(this.getYear(result) - 1900);\n }\n return result;\n }\n\n /**\n * Pads a number to make it two digits.\n *\n * @param n The number to pad.\n * @returns The padded number.\n */\n private _2digit(n: number) {\n return `00${n}`.slice(-2);\n }\n\n /**\n * Strip out unicode LTR and RTL characters. Edge and IE insert these into formatted dates while\n * other browsers do not. We remove them to make output consistent and because they interfere with\n * date parsing.\n *\n * @param str The string to strip direction characters from.\n * @returns The stripped string.\n */\n private _stripDirectionalityCharacters(str: string) {\n return str.replace(/[\\u200e\\u200f]/g, '');\n }\n\n /**\n * When converting Date object to string, javascript built-in functions may return wrong\n * results because it applies its internal DST rules. The DST rules around the world change\n * very frequently, and the current valid rule is not always valid in previous years though.\n * We work around this problem building a new Date object which has its internal UTC\n * representation with the local date and time.\n *\n * @param dtf Intl.DateTimeFormat object, containg the desired string format. It must have\n * timeZone set to 'utc' to work fine.\n * @param date Date from which we want to get the string representation according to dtf\n * @returns A Date object with its UTC representation based on the passed in date info\n */\n private _format(dtf: Intl.DateTimeFormat, date: Date) {\n const d = new Date(\n Date.UTC(\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds()\n )\n );\n return dtf.format(d);\n }\n}\n", + "sourceCode": "import { Platform } from '@angular/cdk/platform';\r\nimport { Inject, Injectable, Optional } from '@angular/core';\r\nimport { DateAdapter, OUI_DATE_LOCALE } from './date-adapter';\r\n\r\n// TODO(mmalerba): Remove when we no longer support safari 9.\r\n/** Whether the browser supports the Intl API. */\r\nconst SUPPORTS_INTL_API = typeof Intl !== 'undefined';\r\n\r\n/** The default month names to use if Intl API is not available. */\r\nconst DEFAULT_MONTH_NAMES = {\r\n long: [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n ],\r\n short: [\r\n 'Jan',\r\n 'Feb',\r\n 'Mar',\r\n 'Apr',\r\n 'May',\r\n 'Jun',\r\n 'Jul',\r\n 'Aug',\r\n 'Sep',\r\n 'Oct',\r\n 'Nov',\r\n 'Dec',\r\n ],\r\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\r\n};\r\n\r\n/** The default date names to use if Intl API is not available. */\r\nconst DEFAULT_DATE_NAMES = range(31, (i) => String(i + 1));\r\n\r\n/** The default day of the week names to use if Intl API is not available. */\r\nconst DEFAULT_DAY_OF_WEEK_NAMES = {\r\n long: [\r\n 'Sunday',\r\n 'Monday',\r\n 'Tuesday',\r\n 'Wednesday',\r\n 'Thursday',\r\n 'Friday',\r\n 'Saturday',\r\n ],\r\n short: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\r\n narrow: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sat'],\r\n};\r\n\r\n/**\r\n * Matches strings that have the form of a valid RFC 3339 string\r\n * (https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date\r\n * because the regex will match strings an with out of bounds month, date, etc.\r\n */\r\nconst ISO_8601_REGEX =\r\n /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|(?:(?:\\+|-)\\d{2}:\\d{2}))?)?$/;\r\n\r\n/** Creates an array and fills it with values. */\r\nfunction range(length: number, valueFunction: (index: number) => T): T[] {\r\n const valuesArray = Array(length);\r\n for (let i = 0; i < length; i++) {\r\n valuesArray[i] = valueFunction(i);\r\n }\r\n return valuesArray;\r\n}\r\n\r\n/** Adapts the native JS Date for use with cdk-based components that work with dates. */\r\n@Injectable()\r\nexport class NativeDateAdapter extends DateAdapter {\r\n /** Whether to clamp the date between 1 and 9999 to avoid IE and Edge errors. */\r\n private readonly _clampDate: boolean;\r\n\r\n /**\r\n * Whether to use `timeZone: 'utc'` with `Intl.DateTimeFormat` when formatting dates.\r\n * Without this `Intl.DateTimeFormat` sometimes chooses the wrong timeZone, which can throw off\r\n * the result. (e.g. in the en-US locale `new Date(1800, 7, 14).toLocaleDateString()`\r\n * will produce `'8/13/1800'`.\r\n *\r\n * TODO(mmalerba): drop this variable. It's not being used in the code right now. We're now\r\n * getting the string representation of a Date object from it's utc representation. We're keeping\r\n * it here for sometime, just for precaution, in case we decide to revert some of these changes\r\n * though.\r\n */\r\n useUtcForDisplay = true;\r\n\r\n constructor(\r\n @Optional() @Inject(OUI_DATE_LOCALE) ouiDateLocale: string,\r\n platform: Platform\r\n ) {\r\n super();\r\n super.setLocale(ouiDateLocale);\r\n\r\n // IE does its own time zone correction, so we disable this on IE.\r\n this.useUtcForDisplay = !platform.TRIDENT;\r\n this._clampDate = platform.TRIDENT || platform.EDGE;\r\n }\r\n\r\n getYear(date: Date): number {\r\n return date.getFullYear();\r\n }\r\n\r\n getMonth(date: Date): number {\r\n return date.getMonth();\r\n }\r\n\r\n getDate(date: Date): number {\r\n return date.getDate();\r\n }\r\n\r\n getDayOfWeek(date: Date): number {\r\n return date.getDay();\r\n }\r\n\r\n getMonthNames(style: 'long' | 'short' | 'narrow'): string[] {\r\n return DEFAULT_MONTH_NAMES[style];\r\n }\r\n\r\n getDateNames(): string[] {\r\n return DEFAULT_DATE_NAMES;\r\n }\r\n\r\n getDayOfWeekNames(style: 'long' | 'short' | 'narrow'): string[] {\r\n return DEFAULT_DAY_OF_WEEK_NAMES[style];\r\n }\r\n\r\n getYearName(date: Date): string {\r\n return String(this.getYear(date));\r\n }\r\n\r\n getFirstDayOfWeek(): number {\r\n // We can't tell using native JS Date what the first day of the week is, we default to Sunday.\r\n return 0;\r\n }\r\n\r\n getNumDaysInMonth(date: Date): number {\r\n return this.getDate(\r\n this._createDateWithOverflow(\r\n this.getYear(date),\r\n this.getMonth(date) + 1,\r\n 0\r\n )\r\n );\r\n }\r\n\r\n clone(date: Date): Date {\r\n return this.createDate(\r\n this.getYear(date),\r\n this.getMonth(date),\r\n this.getDate(date)\r\n );\r\n }\r\n\r\n createDate(year: number, month: number, date: number): Date {\r\n // Check for invalid month and date (except upper bound on date which we have to check after\r\n // creating the Date).\r\n if (month < 0 || month > 11) {\r\n throw Error(\r\n `Invalid month index \"${month}\". Month index has to be between 0 and 11.`\r\n );\r\n }\r\n\r\n if (date < 1) {\r\n throw Error(`Invalid date \"${date}\". Date has to be greater than 0.`);\r\n }\r\n\r\n const result = this._createDateWithOverflow(year, month, date);\r\n // Check that the date wasn't above the upper bound for the month, causing the month to overflow\r\n if (result.getMonth() !== month) {\r\n throw Error(`Invalid date \"${date}\" for month with index \"${month}\".`);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n today(): Date {\r\n return new Date();\r\n }\r\n\r\n parse(value: any): Date | null {\r\n // We have no way using the native JS Date to set the parse format or locale, so we ignore these\r\n // parameters.\r\n if (typeof value === 'number') {\r\n return new Date(value);\r\n }\r\n return value ? new Date(Date.parse(value as string)) : null;\r\n }\r\n\r\n format(date: Date, displayFormat: object): string {\r\n if (!this.isValid(date)) {\r\n throw Error('NativeDateAdapter: Cannot format invalid date.');\r\n }\r\n\r\n if (SUPPORTS_INTL_API) {\r\n // On IE and Edge the i18n API will throw a hard error that can crash the entire app\r\n // if we attempt to format a date whose year is less than 1 or greater than 9999.\r\n if (\r\n this._clampDate &&\r\n (date.getFullYear() < 1 || date.getFullYear() > 9999)\r\n ) {\r\n date = this.clone(date);\r\n date.setFullYear(Math.max(1, Math.min(9999, date.getFullYear())));\r\n }\r\n\r\n displayFormat = { ...displayFormat, timeZone: 'utc' };\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n const dtf = new Intl.DateTimeFormat(this.locale, displayFormat);\r\n return this._stripDirectionalityCharacters(this._format(dtf, date));\r\n }\r\n return this._stripDirectionalityCharacters(date.toDateString());\r\n }\r\n\r\n addCalendarYears(date: Date, years: number): Date {\r\n return this.addCalendarMonths(date, years * 12);\r\n }\r\n\r\n addCalendarMonths(date: Date, months: number): Date {\r\n let newDate = this._createDateWithOverflow(\r\n this.getYear(date),\r\n this.getMonth(date) + months,\r\n this.getDate(date)\r\n );\r\n\r\n // It's possible to wind up in the wrong month if the original month has more days than the new\r\n // month. In this case we want to go to the last day of the desired month.\r\n // Note: the additional + 12 % 12 ensures we end up with a positive number, since JS % doesn't\r\n // guarantee this.\r\n if (\r\n this.getMonth(newDate) !==\r\n (((this.getMonth(date) + months) % 12) + 12) % 12\r\n ) {\r\n newDate = this._createDateWithOverflow(\r\n this.getYear(newDate),\r\n this.getMonth(newDate),\r\n 0\r\n );\r\n }\r\n\r\n return newDate;\r\n }\r\n\r\n addCalendarDays(date: Date, days: number): Date {\r\n return this._createDateWithOverflow(\r\n this.getYear(date),\r\n this.getMonth(date),\r\n this.getDate(date) + days\r\n );\r\n }\r\n\r\n toIso8601(date: Date): string {\r\n return [\r\n date.getUTCFullYear(),\r\n this._2digit(date.getUTCMonth() + 1),\r\n this._2digit(date.getUTCDate()),\r\n ].join('-');\r\n }\r\n\r\n /**\r\n * Returns the given value if given a valid Date or null. Deserializes valid ISO 8601 strings\r\n * (https://www.ietf.org/rfc/rfc3339.txt) into valid Dates and empty string into null. Returns an\r\n * invalid date for all other values.\r\n */\r\n deserialize(value: any): Date | null {\r\n if (typeof value === 'string') {\r\n if (!value) {\r\n return null;\r\n }\r\n // The `Date` constructor accepts formats other than ISO 8601, so we need to make sure the\r\n // string is the right format first.\r\n if (ISO_8601_REGEX.test(value)) {\r\n const date = new Date(value);\r\n if (this.isValid(date)) {\r\n return date;\r\n }\r\n }\r\n }\r\n return super.deserialize(value);\r\n }\r\n\r\n isDateInstance(obj: any): boolean {\r\n return obj instanceof Date;\r\n }\r\n\r\n isValid(date: Date) {\r\n return !isNaN(date.getTime());\r\n }\r\n\r\n invalid(): Date {\r\n return new Date(NaN);\r\n }\r\n\r\n /** Creates a date but allows the month and date to overflow. */\r\n private _createDateWithOverflow(year: number, month: number, date: number) {\r\n const result = new Date(year, month, date);\r\n\r\n // We need to correct for the fact that JS native Date treats years in range [0, 99] as\r\n // abbreviations for 19xx.\r\n if (year >= 0 && year < 100) {\r\n result.setFullYear(this.getYear(result) - 1900);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Pads a number to make it two digits.\r\n *\r\n * @param n The number to pad.\r\n * @returns The padded number.\r\n */\r\n private _2digit(n: number) {\r\n return `00${n}`.slice(-2);\r\n }\r\n\r\n /**\r\n * Strip out unicode LTR and RTL characters. Edge and IE insert these into formatted dates while\r\n * other browsers do not. We remove them to make output consistent and because they interfere with\r\n * date parsing.\r\n *\r\n * @param str The string to strip direction characters from.\r\n * @returns The stripped string.\r\n */\r\n private _stripDirectionalityCharacters(str: string) {\r\n return str.replace(/[\\u200e\\u200f]/g, '');\r\n }\r\n\r\n /**\r\n * When converting Date object to string, javascript built-in functions may return wrong\r\n * results because it applies its internal DST rules. The DST rules around the world change\r\n * very frequently, and the current valid rule is not always valid in previous years though.\r\n * We work around this problem building a new Date object which has its internal UTC\r\n * representation with the local date and time.\r\n *\r\n * @param dtf Intl.DateTimeFormat object, containg the desired string format. It must have\r\n * timeZone set to 'utc' to work fine.\r\n * @param date Date from which we want to get the string representation according to dtf\r\n * @returns A Date object with its UTC representation based on the passed in date info\r\n */\r\n private _format(dtf: Intl.DateTimeFormat, date: Date) {\r\n const d = new Date(\r\n Date.UTC(\r\n date.getFullYear(),\r\n date.getMonth(),\r\n date.getDate(),\r\n date.getHours(),\r\n date.getMinutes(),\r\n date.getSeconds(),\r\n date.getMilliseconds()\r\n )\r\n );\r\n return dtf.format(d);\r\n }\r\n}\r\n", "constructorObj": { "name": "constructor", "description": "", @@ -7364,6 +7364,8 @@ "deprecationMessage": "", "type": "class", "sourceCode": "export class AnimationCurves {\n static STANDARD_CURVE = 'cubic-bezier(0.4,0.0,0.2,1)';\n static DECELERATION_CURVE = 'cubic-bezier(0.0,0.0,0.2,1)';\n static ACCELERATION_CURVE = 'cubic-bezier(0.4,0.0,1,1)';\n static SHARP_CURVE = 'cubic-bezier(0.4,0.0,0.6,1)';\n}\n\n/** @docs-private */\nexport class AnimationDurations {\n static COMPLEX = '375ms';\n static ENTERING = '225ms';\n static EXITING = '195ms';\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "ACCELERATION_CURVE", @@ -7421,8 +7423,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -7434,6 +7434,8 @@ "deprecationMessage": "", "type": "class", "sourceCode": "export class AnimationCurves {\n static STANDARD_CURVE = 'cubic-bezier(0.4,0.0,0.2,1)';\n static DECELERATION_CURVE = 'cubic-bezier(0.0,0.0,0.2,1)';\n static ACCELERATION_CURVE = 'cubic-bezier(0.4,0.0,1,1)';\n static SHARP_CURVE = 'cubic-bezier(0.4,0.0,0.6,1)';\n}\n\n/** @docs-private */\nexport class AnimationDurations {\n static COMPLEX = '375ms';\n static ENTERING = '225ms';\n static EXITING = '195ms';\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "COMPLEX", @@ -7478,8 +7480,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -7532,6 +7532,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "option", @@ -7565,19 +7567,17 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, { "name": "OuiButtonBase", - "id": "class-OuiButtonBase-0d7d7fa85ca575eff44ea16216e0b4e33534845e4ea90e975cbffa14d598d4392f2620b0e45183fa30e446ad5dfa4283ef721d2475ff2f880c1047553f88955f", + "id": "class-OuiButtonBase-cd4d61dce3765d9a6e05591c78f5cba9cd5afb8c73b9e49619e9c1e784c62b00d55c1556f8363d57992e5141a8f4f160312c20c4378256befbfae3dcd72508c6", "file": "ui/src/components/button/button.ts", "deprecated": false, "deprecationMessage": "", "type": "class", - "sourceCode": "import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n OnDestroy,\n ChangeDetectorRef,\n NgZone,\n Input,\n} from '@angular/core';\nimport {\n CanDisable,\n CanColor,\n CanDisableCtor,\n CanColorCtor,\n mixinColor,\n mixinDisabled,\n} from '../core';\n\nimport { CanProgress, CanProgressCtor, mixinProgress } from './progress';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Subscription } from 'rxjs';\n/**\n * List of classes to add to Button instances based on host attributes to\n * style as different variants.\n */\nconst BUTTON_HOST_ATTRIBUTES = [\n 'oui-button',\n 'oui-ghost-button',\n 'oui-link-button',\n 'oui-icon-button',\n 'oui-icon-text-button',\n];\n\n/** Default color palette for round buttons (oui-fab and oui-mini-fab) */\nconst DEFAULT_COLOR = 'primary';\n\n// Boilerplate for applying mixins to OuiButton.\n/** @docs-private */\nexport class OuiButtonBase {\n constructor(public _elementRef: ElementRef, public _cdr: ChangeDetectorRef) {}\n}\n\nexport const OuiButtonMixinBase: CanDisableCtor &\n CanColorCtor &\n CanProgressCtor &\n typeof OuiButtonBase = mixinProgress(\n mixinColor(mixinDisabled(OuiButtonBase))\n);\n\n/**\n * Once Ui button.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `button[oui-button], button[oui-ghost-button], button[oui-link-button], button[oui-icon-button],\n button[oui-icon-text-button]`,\n exportAs: 'ouiButton',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[disabled]': 'disabled || null',\n },\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color', 'progress', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiButton\n extends OuiButtonMixinBase\n implements OnDestroy, CanDisable, CanColor, CanProgress\n{\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n public _cdr: ChangeDetectorRef,\n private _ngZone: NgZone\n ) {\n super(elementRef, _cdr);\n this.addClass();\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() =>\n this._ngZone.run(() => {\n this._cdr.markForCheck();\n })\n );\n }\n\n protected addClass() {\n for (const attr of BUTTON_HOST_ATTRIBUTES) {\n if (this.hasHostAttributes(attr)) {\n (this.elementRef.nativeElement as HTMLElement).classList.add(attr);\n }\n }\n if (!this.color) {\n this.color = DEFAULT_COLOR;\n }\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this.elementRef);\n this._monitorSubscription.unsubscribe();\n }\n\n /** Focuses the button. */\n focus(): void {\n this.getHostElement().focus();\n }\n\n getHostElement() {\n return this.elementRef.nativeElement;\n }\n /** Gets whether the button has one of the given attributes. */\n hasHostAttributes(...attributes: string[]) {\n return attributes.some((attribute) =>\n this.getHostElement().hasAttribute(attribute)\n );\n }\n}\n\n/**\n * Once UI anchor.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `a[oui-button], a[oui-ghost-button], a[oui-link-button], a[oui-icon-button],\n a[oui-icon-text-button]`,\n exportAs: 'ouiButton, ouiAnchor',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.tabindex]': 'disabled ? -1 : (tabIndex || 0)',\n '[attr.disabled]': 'disabled || null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '(click)': '_haltDisabledEvents($event)',\n },\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color'],\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiAnchor extends OuiButton {\n /** Tabindex of the button. */\n @Input() tabIndex: number;\n constructor(\n elementRef: ElementRef,\n focusMonitor: FocusMonitor,\n _cdr: ChangeDetectorRef,\n _ngZone: NgZone\n ) {\n super(elementRef, focusMonitor, _cdr, _ngZone);\n }\n\n _haltDisabledEvents(event: Event) {\n // A disabled button shouldn't apply any actions\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n", + "sourceCode": "import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n OnDestroy,\n ChangeDetectorRef,\n NgZone,\n Input,\n} from '@angular/core';\nimport {\n CanDisable,\n CanColor,\n CanDisableCtor,\n CanColorCtor,\n mixinColor,\n mixinDisabled,\n} from '../core';\n\nimport { CanProgress, CanProgressCtor, mixinProgress } from './progress';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Subscription } from 'rxjs';\n/**\n * List of classes to add to Button instances based on host attributes to\n * style as different variants.\n */\nconst BUTTON_HOST_ATTRIBUTES = [\n 'oui-button',\n 'oui-ghost-button',\n 'oui-link-button',\n 'oui-icon-button',\n 'oui-icon-text-button',\n];\n\n/** Default color palette for round buttons (oui-fab and oui-mini-fab) */\nconst DEFAULT_COLOR = 'primary';\n\n// Boilerplate for applying mixins to OuiButton.\n/** @docs-private */\nexport class OuiButtonBase {\n constructor(public _elementRef: ElementRef, public _cdr: ChangeDetectorRef) {}\n}\n\nexport const OuiButtonMixinBase: CanDisableCtor &\n CanColorCtor &\n CanProgressCtor &\n typeof OuiButtonBase = mixinProgress(\n mixinColor(mixinDisabled(OuiButtonBase))\n);\n\n/**\n * Once Ui button.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `button[oui-button], button[oui-ghost-button], button[oui-link-button], button[oui-icon-button],\n button[oui-icon-text-button]`,\n exportAs: 'ouiButton',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[disabled]': 'disabled || null',\n '[tabindex]': 'tabIndex || 0',\n },\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color', 'progress', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiButton\n extends OuiButtonMixinBase\n implements OnDestroy, CanDisable, CanColor, CanProgress\n{\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n public _cdr: ChangeDetectorRef,\n private _ngZone: NgZone\n ) {\n super(elementRef, _cdr);\n this.addClass();\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() =>\n this._ngZone.run(() => {\n this._cdr.markForCheck();\n })\n );\n }\n\n protected addClass() {\n for (const attr of BUTTON_HOST_ATTRIBUTES) {\n if (this.hasHostAttributes(attr)) {\n (this.elementRef.nativeElement as HTMLElement).classList.add(attr);\n }\n }\n if (!this.color) {\n this.color = DEFAULT_COLOR;\n }\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this.elementRef);\n this._monitorSubscription.unsubscribe();\n }\n\n /** Focuses the button. */\n focus(): void {\n this.getHostElement().focus();\n }\n\n getHostElement() {\n return this.elementRef.nativeElement;\n }\n /** Gets whether the button has one of the given attributes. */\n hasHostAttributes(...attributes: string[]) {\n return attributes.some((attribute) =>\n this.getHostElement().hasAttribute(attribute)\n );\n }\n}\n\n/**\n * Once UI anchor.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `a[oui-button], a[oui-ghost-button], a[oui-link-button], a[oui-icon-button],\n a[oui-icon-text-button]`,\n exportAs: 'ouiButton, ouiAnchor',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.tabindex]': 'disabled ? -1 : (tabIndex || 0)',\n '[attr.disabled]': 'disabled || null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '(click)': '_haltDisabledEvents($event)',\n },\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color'],\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiAnchor extends OuiButton {\n /** Tabindex of the button. */\n @Input() tabIndex: number;\n constructor(\n elementRef: ElementRef,\n focusMonitor: FocusMonitor,\n _cdr: ChangeDetectorRef,\n _ngZone: NgZone\n ) {\n super(elementRef, focusMonitor, _cdr, _ngZone);\n }\n\n _haltDisabledEvents(event: Event) {\n // A disabled button shouldn't apply any actions\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n", "constructorObj": { "name": "constructor", "description": "", @@ -7619,6 +7619,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_cdr", @@ -7648,8 +7650,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -7749,6 +7749,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "ariaLabel", @@ -7816,19 +7818,17 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, { "name": "OuiCheckboxBase", - "id": "class-OuiCheckboxBase-3f6cb79eae7dd4114475fddbea16ffc92a51d23162b97d0d54f7e02d674d5c66575ad9e8e9f7607f423d1c3c1ba33abfd9ffc3c40294186f728ffb2bd241ca42", + "id": "class-OuiCheckboxBase-01361bfeba73f4136114042a2dc1708c0fd8c7edc272687f3f86de4fd37e15c12ab7baf9e178f3362a46d3c1b27d1e899175193388faeecb0a51f49614dd1ee2", "file": "ui/src/components/checkbox/checkbox.ts", "deprecated": false, "deprecationMessage": "", "type": "class", - "sourceCode": "import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n Input,\n EventEmitter,\n Output,\n NgZone,\n ChangeDetectorRef,\n forwardRef,\n ElementRef,\n Attribute,\n ViewChild,\n OnDestroy,\n} from '@angular/core';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { HasTabIndex } from '../core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { mixinColor } from '../core';\nimport { Subscription } from 'rxjs';\n// Increasing integer for generating unique ids for checkbox components.\nlet nextUniqueId = 0;\n\n/** Change event object emitted by MatCheckbox. */\nexport class OuiCheckboxChange {\n /** The source MatCheckbox of the event. */\n source: Checkbox;\n /** The new `checked` value of the checkbox. */\n checked: boolean;\n}\n\nexport class OuiCheckboxBase {\n constructor(public _elementRef: ElementRef) {}\n}\n\nexport const OuiCheckboxMixinBase: typeof OuiCheckboxBase =\n mixinColor(OuiCheckboxBase);\n\n/**\n * Represents the different states that require custom transitions between them.\n *\n * @docs-private\n */\nexport enum TransitionCheckState {\n Init,\n /** The state representing the component when it's becoming checked. */\n Checked,\n /** The state representing the component when it's becoming unchecked. */\n Unchecked,\n}\n\n/**\n * Supports all of the functionality of an HTML5 checkbox,\n * and exposes a similar API. A MatCheckbox can be either checked, unchecked, or\n * disabled. Note that all additional accessibility attributes are taken care of by the component,\n * so there is no need to provide them yourself. However, if you want to omit a label and still\n * have the checkbox be accessible, you may supply an [aria-label] input.\n * See: https://github.com/scheduleonce/once-ui/tree/master/ui/src/components/checkbox/README.md\n */\n@Component({\n selector: 'oui-checkbox',\n templateUrl: './checkbox.html',\n styleUrls: ['./checkbox.scss'],\n exportAs: 'ouiCheckbox',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-checkbox',\n '[id]': 'id',\n '[attr.tabindex]': 'null',\n '[class.oui-checkbox-checked]': 'checked',\n '[class.oui-checkbox-disabled]': 'disabled',\n '[class.oui-checkbox-label-before]': 'labelPosition == \"before\"',\n },\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['tabIndex', 'color'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => Checkbox),\n multi: true,\n },\n ],\n})\nexport class Checkbox\n extends OuiCheckboxMixinBase\n implements ControlValueAccessor, HasTabIndex, OnDestroy\n{\n /**\n * Attached to the aria-label attribute of the host element. In most cases, arial-labelledby will\n * take precedence so this may be omitted.\n */\n /**\n * Implemented as part of CanColor.\n */\n color = 'primary';\n\n @Input('aria-label')\n ariaLabel: any = '';\n\n /**\n * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\n */\n @Input('aria-labelledby')\n ariaLabelledby: any | null = null;\n\n private _uniqueId: any = `oui-checkbox-${++nextUniqueId}`;\n\n /** A unique id for the checkbox input. If none is supplied, it will be auto-generated. */\n\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n @Input()\n id: string = this._uniqueId;\n\n /** Returns the unique id for the visual hidden input. */\n get inputId(): string {\n return `${this.id || this._uniqueId}-input`;\n }\n\n /** Whether the checkbox is required. */\n @Input()\n get required(): boolean {\n return this._required;\n }\n\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n }\n\n private _required: boolean;\n\n /** Whether the label should appear after or before the checkbox. Defaults to 'after' */\n @Input()\n labelPosition: 'before' | 'after' = 'after';\n\n /** Name value will be applied to the input element if present */\n @Input()\n name: string | null = null;\n\n /** Event emitted when the checkbox's `checked` value changes. */\n @Output()\n readonly change: EventEmitter =\n new EventEmitter();\n\n /** The native `` element */\n @ViewChild('input') _inputElement: ElementRef;\n\n /** The value attribute of the native input element */\n @Input()\n value: string;\n\n /**\n * Whether the checkbox is checked.\n */\n @Input()\n get checked(): boolean {\n return this._checked;\n }\n\n set checked(value: boolean) {\n if (value !== this.checked) {\n this._checked = value;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n private _checked: any = false;\n\n /**\n * Whether the checkbox is disabled. This fully overrides the implementation provided by\n * mixinDisabled, but the mixin is still required because mixinTabIndex requires it.\n */\n @Input()\n get disabled() {\n return this._disabled;\n }\n\n set disabled(value: any) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this.disabled) {\n this._disabled = newValue;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n private _disabled = false;\n private _currentCheckState: TransitionCheckState = TransitionCheckState.Init;\n private _currentAnimationClass = '';\n\n /**\n * Implemented as part of HasTabIndex.\n */\n tabIndex: any;\n constructor(\n private _changeDetectorRef: ChangeDetectorRef,\n public _elementRef: ElementRef,\n private _ngZone: NgZone,\n private _focusMonitor: FocusMonitor,\n @Attribute('tabindex') tabIndex: string\n ) {\n super(_elementRef);\n this.tabIndex = parseInt(tabIndex, 10) || 0;\n this._monitorSubscription = this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(() =>\n this._ngZone.run(() => {\n this._changeDetectorRef.markForCheck();\n })\n );\n }\n\n _getAriaChecked(): 'true' | 'false' {\n return this.checked ? 'true' : 'false';\n }\n\n /** Focuses the checkbox. */\n focus(): void {\n this._focusMonitor.focusVia(this._inputElement, 'keyboard');\n }\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n this._monitorSubscription.unsubscribe();\n }\n /**\n * Event handler for checkbox input element.\n * Toggles checked state if element is not disabled.\n * Do not toggle on (change) event since IE doesn't fire change event when\n * indeterminate checkbox is clicked.\n *\n * @param event\n */\n _onInputClick(event: Event) {\n // We have to stop propagation for click events on the visual hidden input element.\n // By default, when a user clicks on a label element, a generated click event will be\n // dispatched on the associated input element. Since we are using a label element as our\n // root container, the click event on the `checkbox` will be executed twice.\n // The real click event will bubble up, and the generated click event also tries to bubble up.\n // This will lead to multiple click events.\n // Preventing bubbling for the second event will solve that issue.\n event.stopPropagation();\n\n // If resetIndeterminate is false, and the current state is indeterminate, do nothing on click\n if (!this.disabled) {\n this.toggle();\n this._transitionCheckState(\n this._checked\n ? TransitionCheckState.Checked\n : TransitionCheckState.Unchecked\n );\n\n // Emit our custom change event if the native input emitted one.\n // It is important to only emit it, if the native input triggered one, because\n // we don't want to trigger a change event, when the `checked` variable changes for example.\n this._emitChangeEvent();\n }\n }\n\n private _transitionCheckState(newState: TransitionCheckState) {\n const oldState = this._currentCheckState;\n const element: HTMLElement = this._elementRef.nativeElement;\n\n if (oldState === newState) {\n return;\n }\n if (this._currentAnimationClass.length > 0) {\n element.classList.remove(this._currentAnimationClass);\n }\n\n this._currentAnimationClass =\n this._getAnimationClassForCheckStateTransition(oldState, newState);\n this._currentCheckState = newState;\n\n if (this._currentAnimationClass.length > 0) {\n element.classList.add(this._currentAnimationClass);\n\n // Remove the animation class to avoid animation when the checkbox is moved between containers\n const animationClass = this._currentAnimationClass;\n\n this._ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n element.classList.remove(animationClass);\n }, 1000);\n });\n }\n }\n\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled: boolean) {\n this.disabled = isDisabled;\n }\n\n private _emitChangeEvent() {\n const event = new OuiCheckboxChange();\n event.source = this;\n event.checked = this.checked;\n this._controlValueAccessorChangeFn(this.checked);\n this.change.emit(event);\n }\n\n /** Toggles the `checked` state of the checkbox. */\n toggle(): void {\n this.checked = !this.checked;\n }\n\n _onInteractionEvent(event: Event) {\n // We always have to stop propagation on the change event.\n // Otherwise the change event, from the input element, will bubble up and\n // emit its event object to the `change` output.\n event.stopPropagation();\n }\n\n // Implemented as part of ControlValueAccessor.\n writeValue(value: any) {\n this.checked = !!value;\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn: (value: any) => void) {\n this._controlValueAccessorChangeFn = fn;\n }\n\n /**\n * Called when the checkbox is blurred. Needed to properly implement ControlValueAccessor.\n *\n * @docs-private\n */\n _onTouched: () => any = () => {};\n\n private _controlValueAccessorChangeFn: (value: any) => void = () => {};\n\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn: any) {\n this._onTouched = fn;\n }\n\n private _getAnimationClassForCheckStateTransition(\n oldState: TransitionCheckState,\n newState: TransitionCheckState\n ): string {\n let animSuffix: any = '';\n\n switch (oldState) {\n case TransitionCheckState.Init:\n // Handle edge case where user interacts with checkbox that does not have [(ngModel)] or\n // [checked] bound to it.\n if (newState === TransitionCheckState.Checked) {\n animSuffix = 'unchecked-checked';\n } else if (newState === TransitionCheckState.Unchecked) {\n animSuffix = 'unchecked-unchecked';\n } else {\n return '';\n }\n break;\n case TransitionCheckState.Unchecked:\n animSuffix =\n newState === TransitionCheckState.Checked ? 'unchecked-checked' : '';\n break;\n case TransitionCheckState.Checked:\n animSuffix =\n newState === TransitionCheckState.Unchecked\n ? 'checked-unchecked'\n : '';\n break;\n }\n\n return `oui-checkbox-anim-${animSuffix}`;\n }\n}\n", + "sourceCode": "import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n Input,\r\n EventEmitter,\r\n Output,\r\n NgZone,\r\n ChangeDetectorRef,\r\n forwardRef,\r\n ElementRef,\r\n Attribute,\r\n ViewChild,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { HasTabIndex } from '../core';\r\nimport { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { mixinColor } from '../core';\r\nimport { Subscription } from 'rxjs';\r\n// Increasing integer for generating unique ids for checkbox components.\r\nlet nextUniqueId = 0;\r\n\r\n/** Change event object emitted by MatCheckbox. */\r\nexport class OuiCheckboxChange {\r\n /** The source MatCheckbox of the event. */\r\n source: Checkbox;\r\n /** The new `checked` value of the checkbox. */\r\n checked: boolean;\r\n}\r\n\r\nexport class OuiCheckboxBase {\r\n constructor(public _elementRef: ElementRef) {}\r\n}\r\n\r\nexport const OuiCheckboxMixinBase: typeof OuiCheckboxBase =\r\n mixinColor(OuiCheckboxBase);\r\n\r\n/**\r\n * Represents the different states that require custom transitions between them.\r\n *\r\n * @docs-private\r\n */\r\nexport enum TransitionCheckState {\r\n Init,\r\n /** The state representing the component when it's becoming checked. */\r\n Checked,\r\n /** The state representing the component when it's becoming unchecked. */\r\n Unchecked,\r\n}\r\n\r\n/**\r\n * Supports all of the functionality of an HTML5 checkbox,\r\n * and exposes a similar API. A MatCheckbox can be either checked, unchecked, or\r\n * disabled. Note that all additional accessibility attributes are taken care of by the component,\r\n * so there is no need to provide them yourself. However, if you want to omit a label and still\r\n * have the checkbox be accessible, you may supply an [aria-label] input.\r\n * See: https://github.com/scheduleonce/once-ui/tree/master/ui/src/components/checkbox/README.md\r\n */\r\n@Component({\r\n selector: 'oui-checkbox',\r\n templateUrl: './checkbox.html',\r\n styleUrls: ['./checkbox.scss'],\r\n exportAs: 'ouiCheckbox',\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n class: 'oui-checkbox',\r\n '[id]': 'id',\r\n '[attr.tabindex]': 'null',\r\n '[class.oui-checkbox-checked]': 'checked',\r\n '[class.oui-checkbox-disabled]': 'disabled',\r\n '[class.oui-checkbox-label-before]': 'labelPosition == \"before\"',\r\n },\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['tabIndex', 'color'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => Checkbox),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class Checkbox\r\n extends OuiCheckboxMixinBase\r\n implements ControlValueAccessor, HasTabIndex, OnDestroy\r\n{\r\n /**\r\n * Attached to the aria-label attribute of the host element. In most cases, arial-labelledby will\r\n * take precedence so this may be omitted.\r\n */\r\n /**\r\n * Implemented as part of CanColor.\r\n */\r\n color = 'primary';\r\n\r\n @Input('aria-label')\r\n ariaLabel: any = '';\r\n\r\n /**\r\n * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\r\n */\r\n @Input('aria-labelledby')\r\n ariaLabelledby: any = null;\r\n\r\n private _uniqueId: any = `oui-checkbox-${++nextUniqueId}`;\r\n\r\n /** A unique id for the checkbox input. If none is supplied, it will be auto-generated. */\r\n\r\n private _monitorSubscription: Subscription = Subscription.EMPTY;\r\n\r\n @Input()\r\n id: string = this._uniqueId;\r\n\r\n /** Returns the unique id for the visual hidden input. */\r\n get inputId(): string {\r\n return `${this.id || this._uniqueId}-input`;\r\n }\r\n\r\n /** Whether the checkbox is required. */\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n }\r\n\r\n private _required: boolean;\r\n\r\n /** Whether the label should appear after or before the checkbox. Defaults to 'after' */\r\n @Input()\r\n labelPosition: 'before' | 'after' = 'after';\r\n\r\n /** Name value will be applied to the input element if present */\r\n @Input()\r\n name: string | null = null;\r\n\r\n /** Event emitted when the checkbox's `checked` value changes. */\r\n @Output()\r\n readonly change: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** The native `` element */\r\n @ViewChild('input') _inputElement: ElementRef;\r\n\r\n /** The value attribute of the native input element */\r\n @Input()\r\n value: string;\r\n\r\n /**\r\n * Whether the checkbox is checked.\r\n */\r\n @Input()\r\n get checked(): boolean {\r\n return this._checked;\r\n }\r\n\r\n set checked(value: boolean) {\r\n if (value !== this.checked) {\r\n this._checked = value;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n private _checked: any = false;\r\n\r\n /**\r\n * Whether the checkbox is disabled. This fully overrides the implementation provided by\r\n * mixinDisabled, but the mixin is still required because mixinTabIndex requires it.\r\n */\r\n @Input()\r\n get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n set disabled(value: any) {\r\n const newValue = coerceBooleanProperty(value);\r\n\r\n if (newValue !== this.disabled) {\r\n this._disabled = newValue;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n private _disabled = false;\r\n private _currentCheckState: TransitionCheckState = TransitionCheckState.Init;\r\n private _currentAnimationClass = '';\r\n\r\n /**\r\n * Implemented as part of HasTabIndex.\r\n */\r\n tabIndex: any;\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n public _elementRef: ElementRef,\r\n private _ngZone: NgZone,\r\n private _focusMonitor: FocusMonitor,\r\n @Attribute('tabindex') tabIndex: string\r\n ) {\r\n super(_elementRef);\r\n this.tabIndex = parseInt(tabIndex, 10) || 0;\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this._elementRef, true)\r\n .subscribe(() =>\r\n this._ngZone.run(() => {\r\n this._changeDetectorRef.markForCheck();\r\n })\r\n );\r\n }\r\n\r\n _getAriaChecked(): 'true' | 'false' {\r\n return this.checked ? 'true' : 'false';\r\n }\r\n\r\n /** Focuses the checkbox. */\r\n focus(): void {\r\n this._focusMonitor.focusVia(this._inputElement, 'keyboard');\r\n }\r\n ngOnDestroy() {\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n this._monitorSubscription.unsubscribe();\r\n }\r\n /**\r\n * Event handler for checkbox input element.\r\n * Toggles checked state if element is not disabled.\r\n * Do not toggle on (change) event since IE doesn't fire change event when\r\n * indeterminate checkbox is clicked.\r\n *\r\n * @param event\r\n */\r\n _onInputClick(event: Event) {\r\n // We have to stop propagation for click events on the visual hidden input element.\r\n // By default, when a user clicks on a label element, a generated click event will be\r\n // dispatched on the associated input element. Since we are using a label element as our\r\n // root container, the click event on the `checkbox` will be executed twice.\r\n // The real click event will bubble up, and the generated click event also tries to bubble up.\r\n // This will lead to multiple click events.\r\n // Preventing bubbling for the second event will solve that issue.\r\n event.stopPropagation();\r\n\r\n // If resetIndeterminate is false, and the current state is indeterminate, do nothing on click\r\n if (!this.disabled) {\r\n this.toggle();\r\n this._transitionCheckState(\r\n this._checked\r\n ? TransitionCheckState.Checked\r\n : TransitionCheckState.Unchecked\r\n );\r\n\r\n // Emit our custom change event if the native input emitted one.\r\n // It is important to only emit it, if the native input triggered one, because\r\n // we don't want to trigger a change event, when the `checked` variable changes for example.\r\n this._emitChangeEvent();\r\n }\r\n }\r\n\r\n private _transitionCheckState(newState: TransitionCheckState) {\r\n const oldState = this._currentCheckState;\r\n const element: HTMLElement = this._elementRef.nativeElement;\r\n\r\n if (oldState === newState) {\r\n return;\r\n }\r\n if (this._currentAnimationClass.length > 0) {\r\n element.classList.remove(this._currentAnimationClass);\r\n }\r\n\r\n this._currentAnimationClass =\r\n this._getAnimationClassForCheckStateTransition(oldState, newState);\r\n this._currentCheckState = newState;\r\n\r\n if (this._currentAnimationClass.length > 0) {\r\n element.classList.add(this._currentAnimationClass);\r\n\r\n // Remove the animation class to avoid animation when the checkbox is moved between containers\r\n const animationClass = this._currentAnimationClass;\r\n\r\n this._ngZone.runOutsideAngular(() => {\r\n setTimeout(() => {\r\n element.classList.remove(animationClass);\r\n }, 1000);\r\n });\r\n }\r\n }\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n setDisabledState(isDisabled: boolean) {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n private _emitChangeEvent() {\r\n const event = new OuiCheckboxChange();\r\n event.source = this;\r\n event.checked = this.checked;\r\n this._controlValueAccessorChangeFn(this.checked);\r\n this.change.emit(event);\r\n }\r\n\r\n /** Toggles the `checked` state of the checkbox. */\r\n toggle(): void {\r\n this.checked = !this.checked;\r\n }\r\n\r\n _onInteractionEvent(event: Event) {\r\n // We always have to stop propagation on the change event.\r\n // Otherwise the change event, from the input element, will bubble up and\r\n // emit its event object to the `change` output.\r\n event.stopPropagation();\r\n }\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n writeValue(value: any) {\r\n this.checked = !!value;\r\n }\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n registerOnChange(fn: (value: any) => void) {\r\n this._controlValueAccessorChangeFn = fn;\r\n }\r\n\r\n /**\r\n * Called when the checkbox is blurred. Needed to properly implement ControlValueAccessor.\r\n *\r\n * @docs-private\r\n */\r\n _onTouched: () => any = () => {};\r\n\r\n private _controlValueAccessorChangeFn: (value: any) => void = () => {};\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n registerOnTouched(fn: any) {\r\n this._onTouched = fn;\r\n }\r\n\r\n private _getAnimationClassForCheckStateTransition(\r\n oldState: TransitionCheckState,\r\n newState: TransitionCheckState\r\n ): string {\r\n let animSuffix: any = '';\r\n\r\n switch (oldState) {\r\n case TransitionCheckState.Init:\r\n // Handle edge case where user interacts with checkbox that does not have [(ngModel)] or\r\n // [checked] bound to it.\r\n if (newState === TransitionCheckState.Checked) {\r\n animSuffix = 'unchecked-checked';\r\n } else if (newState === TransitionCheckState.Unchecked) {\r\n animSuffix = 'unchecked-unchecked';\r\n } else {\r\n return '';\r\n }\r\n break;\r\n case TransitionCheckState.Unchecked:\r\n animSuffix =\r\n newState === TransitionCheckState.Checked ? 'unchecked-checked' : '';\r\n break;\r\n case TransitionCheckState.Checked:\r\n animSuffix =\r\n newState === TransitionCheckState.Unchecked\r\n ? 'checked-unchecked'\r\n : '';\r\n break;\r\n }\r\n\r\n return `oui-checkbox-anim-${animSuffix}`;\r\n }\r\n}\r\n", "constructorObj": { "name": "constructor", "description": "", @@ -7855,6 +7855,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_elementRef", @@ -7872,19 +7874,19 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, { "name": "OuiCheckboxChange", - "id": "class-OuiCheckboxChange-3f6cb79eae7dd4114475fddbea16ffc92a51d23162b97d0d54f7e02d674d5c66575ad9e8e9f7607f423d1c3c1ba33abfd9ffc3c40294186f728ffb2bd241ca42", + "id": "class-OuiCheckboxChange-01361bfeba73f4136114042a2dc1708c0fd8c7edc272687f3f86de4fd37e15c12ab7baf9e178f3362a46d3c1b27d1e899175193388faeecb0a51f49614dd1ee2", "file": "ui/src/components/checkbox/checkbox.ts", "deprecated": false, "deprecationMessage": "", "type": "class", - "sourceCode": "import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n Input,\n EventEmitter,\n Output,\n NgZone,\n ChangeDetectorRef,\n forwardRef,\n ElementRef,\n Attribute,\n ViewChild,\n OnDestroy,\n} from '@angular/core';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { HasTabIndex } from '../core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { mixinColor } from '../core';\nimport { Subscription } from 'rxjs';\n// Increasing integer for generating unique ids for checkbox components.\nlet nextUniqueId = 0;\n\n/** Change event object emitted by MatCheckbox. */\nexport class OuiCheckboxChange {\n /** The source MatCheckbox of the event. */\n source: Checkbox;\n /** The new `checked` value of the checkbox. */\n checked: boolean;\n}\n\nexport class OuiCheckboxBase {\n constructor(public _elementRef: ElementRef) {}\n}\n\nexport const OuiCheckboxMixinBase: typeof OuiCheckboxBase =\n mixinColor(OuiCheckboxBase);\n\n/**\n * Represents the different states that require custom transitions between them.\n *\n * @docs-private\n */\nexport enum TransitionCheckState {\n Init,\n /** The state representing the component when it's becoming checked. */\n Checked,\n /** The state representing the component when it's becoming unchecked. */\n Unchecked,\n}\n\n/**\n * Supports all of the functionality of an HTML5 checkbox,\n * and exposes a similar API. A MatCheckbox can be either checked, unchecked, or\n * disabled. Note that all additional accessibility attributes are taken care of by the component,\n * so there is no need to provide them yourself. However, if you want to omit a label and still\n * have the checkbox be accessible, you may supply an [aria-label] input.\n * See: https://github.com/scheduleonce/once-ui/tree/master/ui/src/components/checkbox/README.md\n */\n@Component({\n selector: 'oui-checkbox',\n templateUrl: './checkbox.html',\n styleUrls: ['./checkbox.scss'],\n exportAs: 'ouiCheckbox',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-checkbox',\n '[id]': 'id',\n '[attr.tabindex]': 'null',\n '[class.oui-checkbox-checked]': 'checked',\n '[class.oui-checkbox-disabled]': 'disabled',\n '[class.oui-checkbox-label-before]': 'labelPosition == \"before\"',\n },\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['tabIndex', 'color'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => Checkbox),\n multi: true,\n },\n ],\n})\nexport class Checkbox\n extends OuiCheckboxMixinBase\n implements ControlValueAccessor, HasTabIndex, OnDestroy\n{\n /**\n * Attached to the aria-label attribute of the host element. In most cases, arial-labelledby will\n * take precedence so this may be omitted.\n */\n /**\n * Implemented as part of CanColor.\n */\n color = 'primary';\n\n @Input('aria-label')\n ariaLabel: any = '';\n\n /**\n * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\n */\n @Input('aria-labelledby')\n ariaLabelledby: any | null = null;\n\n private _uniqueId: any = `oui-checkbox-${++nextUniqueId}`;\n\n /** A unique id for the checkbox input. If none is supplied, it will be auto-generated. */\n\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n @Input()\n id: string = this._uniqueId;\n\n /** Returns the unique id for the visual hidden input. */\n get inputId(): string {\n return `${this.id || this._uniqueId}-input`;\n }\n\n /** Whether the checkbox is required. */\n @Input()\n get required(): boolean {\n return this._required;\n }\n\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n }\n\n private _required: boolean;\n\n /** Whether the label should appear after or before the checkbox. Defaults to 'after' */\n @Input()\n labelPosition: 'before' | 'after' = 'after';\n\n /** Name value will be applied to the input element if present */\n @Input()\n name: string | null = null;\n\n /** Event emitted when the checkbox's `checked` value changes. */\n @Output()\n readonly change: EventEmitter =\n new EventEmitter();\n\n /** The native `` element */\n @ViewChild('input') _inputElement: ElementRef;\n\n /** The value attribute of the native input element */\n @Input()\n value: string;\n\n /**\n * Whether the checkbox is checked.\n */\n @Input()\n get checked(): boolean {\n return this._checked;\n }\n\n set checked(value: boolean) {\n if (value !== this.checked) {\n this._checked = value;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n private _checked: any = false;\n\n /**\n * Whether the checkbox is disabled. This fully overrides the implementation provided by\n * mixinDisabled, but the mixin is still required because mixinTabIndex requires it.\n */\n @Input()\n get disabled() {\n return this._disabled;\n }\n\n set disabled(value: any) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this.disabled) {\n this._disabled = newValue;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n private _disabled = false;\n private _currentCheckState: TransitionCheckState = TransitionCheckState.Init;\n private _currentAnimationClass = '';\n\n /**\n * Implemented as part of HasTabIndex.\n */\n tabIndex: any;\n constructor(\n private _changeDetectorRef: ChangeDetectorRef,\n public _elementRef: ElementRef,\n private _ngZone: NgZone,\n private _focusMonitor: FocusMonitor,\n @Attribute('tabindex') tabIndex: string\n ) {\n super(_elementRef);\n this.tabIndex = parseInt(tabIndex, 10) || 0;\n this._monitorSubscription = this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(() =>\n this._ngZone.run(() => {\n this._changeDetectorRef.markForCheck();\n })\n );\n }\n\n _getAriaChecked(): 'true' | 'false' {\n return this.checked ? 'true' : 'false';\n }\n\n /** Focuses the checkbox. */\n focus(): void {\n this._focusMonitor.focusVia(this._inputElement, 'keyboard');\n }\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n this._monitorSubscription.unsubscribe();\n }\n /**\n * Event handler for checkbox input element.\n * Toggles checked state if element is not disabled.\n * Do not toggle on (change) event since IE doesn't fire change event when\n * indeterminate checkbox is clicked.\n *\n * @param event\n */\n _onInputClick(event: Event) {\n // We have to stop propagation for click events on the visual hidden input element.\n // By default, when a user clicks on a label element, a generated click event will be\n // dispatched on the associated input element. Since we are using a label element as our\n // root container, the click event on the `checkbox` will be executed twice.\n // The real click event will bubble up, and the generated click event also tries to bubble up.\n // This will lead to multiple click events.\n // Preventing bubbling for the second event will solve that issue.\n event.stopPropagation();\n\n // If resetIndeterminate is false, and the current state is indeterminate, do nothing on click\n if (!this.disabled) {\n this.toggle();\n this._transitionCheckState(\n this._checked\n ? TransitionCheckState.Checked\n : TransitionCheckState.Unchecked\n );\n\n // Emit our custom change event if the native input emitted one.\n // It is important to only emit it, if the native input triggered one, because\n // we don't want to trigger a change event, when the `checked` variable changes for example.\n this._emitChangeEvent();\n }\n }\n\n private _transitionCheckState(newState: TransitionCheckState) {\n const oldState = this._currentCheckState;\n const element: HTMLElement = this._elementRef.nativeElement;\n\n if (oldState === newState) {\n return;\n }\n if (this._currentAnimationClass.length > 0) {\n element.classList.remove(this._currentAnimationClass);\n }\n\n this._currentAnimationClass =\n this._getAnimationClassForCheckStateTransition(oldState, newState);\n this._currentCheckState = newState;\n\n if (this._currentAnimationClass.length > 0) {\n element.classList.add(this._currentAnimationClass);\n\n // Remove the animation class to avoid animation when the checkbox is moved between containers\n const animationClass = this._currentAnimationClass;\n\n this._ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n element.classList.remove(animationClass);\n }, 1000);\n });\n }\n }\n\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled: boolean) {\n this.disabled = isDisabled;\n }\n\n private _emitChangeEvent() {\n const event = new OuiCheckboxChange();\n event.source = this;\n event.checked = this.checked;\n this._controlValueAccessorChangeFn(this.checked);\n this.change.emit(event);\n }\n\n /** Toggles the `checked` state of the checkbox. */\n toggle(): void {\n this.checked = !this.checked;\n }\n\n _onInteractionEvent(event: Event) {\n // We always have to stop propagation on the change event.\n // Otherwise the change event, from the input element, will bubble up and\n // emit its event object to the `change` output.\n event.stopPropagation();\n }\n\n // Implemented as part of ControlValueAccessor.\n writeValue(value: any) {\n this.checked = !!value;\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn: (value: any) => void) {\n this._controlValueAccessorChangeFn = fn;\n }\n\n /**\n * Called when the checkbox is blurred. Needed to properly implement ControlValueAccessor.\n *\n * @docs-private\n */\n _onTouched: () => any = () => {};\n\n private _controlValueAccessorChangeFn: (value: any) => void = () => {};\n\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn: any) {\n this._onTouched = fn;\n }\n\n private _getAnimationClassForCheckStateTransition(\n oldState: TransitionCheckState,\n newState: TransitionCheckState\n ): string {\n let animSuffix: any = '';\n\n switch (oldState) {\n case TransitionCheckState.Init:\n // Handle edge case where user interacts with checkbox that does not have [(ngModel)] or\n // [checked] bound to it.\n if (newState === TransitionCheckState.Checked) {\n animSuffix = 'unchecked-checked';\n } else if (newState === TransitionCheckState.Unchecked) {\n animSuffix = 'unchecked-unchecked';\n } else {\n return '';\n }\n break;\n case TransitionCheckState.Unchecked:\n animSuffix =\n newState === TransitionCheckState.Checked ? 'unchecked-checked' : '';\n break;\n case TransitionCheckState.Checked:\n animSuffix =\n newState === TransitionCheckState.Unchecked\n ? 'checked-unchecked'\n : '';\n break;\n }\n\n return `oui-checkbox-anim-${animSuffix}`;\n }\n}\n", + "sourceCode": "import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n Input,\r\n EventEmitter,\r\n Output,\r\n NgZone,\r\n ChangeDetectorRef,\r\n forwardRef,\r\n ElementRef,\r\n Attribute,\r\n ViewChild,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { HasTabIndex } from '../core';\r\nimport { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { mixinColor } from '../core';\r\nimport { Subscription } from 'rxjs';\r\n// Increasing integer for generating unique ids for checkbox components.\r\nlet nextUniqueId = 0;\r\n\r\n/** Change event object emitted by MatCheckbox. */\r\nexport class OuiCheckboxChange {\r\n /** The source MatCheckbox of the event. */\r\n source: Checkbox;\r\n /** The new `checked` value of the checkbox. */\r\n checked: boolean;\r\n}\r\n\r\nexport class OuiCheckboxBase {\r\n constructor(public _elementRef: ElementRef) {}\r\n}\r\n\r\nexport const OuiCheckboxMixinBase: typeof OuiCheckboxBase =\r\n mixinColor(OuiCheckboxBase);\r\n\r\n/**\r\n * Represents the different states that require custom transitions between them.\r\n *\r\n * @docs-private\r\n */\r\nexport enum TransitionCheckState {\r\n Init,\r\n /** The state representing the component when it's becoming checked. */\r\n Checked,\r\n /** The state representing the component when it's becoming unchecked. */\r\n Unchecked,\r\n}\r\n\r\n/**\r\n * Supports all of the functionality of an HTML5 checkbox,\r\n * and exposes a similar API. A MatCheckbox can be either checked, unchecked, or\r\n * disabled. Note that all additional accessibility attributes are taken care of by the component,\r\n * so there is no need to provide them yourself. However, if you want to omit a label and still\r\n * have the checkbox be accessible, you may supply an [aria-label] input.\r\n * See: https://github.com/scheduleonce/once-ui/tree/master/ui/src/components/checkbox/README.md\r\n */\r\n@Component({\r\n selector: 'oui-checkbox',\r\n templateUrl: './checkbox.html',\r\n styleUrls: ['./checkbox.scss'],\r\n exportAs: 'ouiCheckbox',\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n class: 'oui-checkbox',\r\n '[id]': 'id',\r\n '[attr.tabindex]': 'null',\r\n '[class.oui-checkbox-checked]': 'checked',\r\n '[class.oui-checkbox-disabled]': 'disabled',\r\n '[class.oui-checkbox-label-before]': 'labelPosition == \"before\"',\r\n },\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['tabIndex', 'color'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => Checkbox),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class Checkbox\r\n extends OuiCheckboxMixinBase\r\n implements ControlValueAccessor, HasTabIndex, OnDestroy\r\n{\r\n /**\r\n * Attached to the aria-label attribute of the host element. In most cases, arial-labelledby will\r\n * take precedence so this may be omitted.\r\n */\r\n /**\r\n * Implemented as part of CanColor.\r\n */\r\n color = 'primary';\r\n\r\n @Input('aria-label')\r\n ariaLabel: any = '';\r\n\r\n /**\r\n * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\r\n */\r\n @Input('aria-labelledby')\r\n ariaLabelledby: any = null;\r\n\r\n private _uniqueId: any = `oui-checkbox-${++nextUniqueId}`;\r\n\r\n /** A unique id for the checkbox input. If none is supplied, it will be auto-generated. */\r\n\r\n private _monitorSubscription: Subscription = Subscription.EMPTY;\r\n\r\n @Input()\r\n id: string = this._uniqueId;\r\n\r\n /** Returns the unique id for the visual hidden input. */\r\n get inputId(): string {\r\n return `${this.id || this._uniqueId}-input`;\r\n }\r\n\r\n /** Whether the checkbox is required. */\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n }\r\n\r\n private _required: boolean;\r\n\r\n /** Whether the label should appear after or before the checkbox. Defaults to 'after' */\r\n @Input()\r\n labelPosition: 'before' | 'after' = 'after';\r\n\r\n /** Name value will be applied to the input element if present */\r\n @Input()\r\n name: string | null = null;\r\n\r\n /** Event emitted when the checkbox's `checked` value changes. */\r\n @Output()\r\n readonly change: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** The native `` element */\r\n @ViewChild('input') _inputElement: ElementRef;\r\n\r\n /** The value attribute of the native input element */\r\n @Input()\r\n value: string;\r\n\r\n /**\r\n * Whether the checkbox is checked.\r\n */\r\n @Input()\r\n get checked(): boolean {\r\n return this._checked;\r\n }\r\n\r\n set checked(value: boolean) {\r\n if (value !== this.checked) {\r\n this._checked = value;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n private _checked: any = false;\r\n\r\n /**\r\n * Whether the checkbox is disabled. This fully overrides the implementation provided by\r\n * mixinDisabled, but the mixin is still required because mixinTabIndex requires it.\r\n */\r\n @Input()\r\n get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n set disabled(value: any) {\r\n const newValue = coerceBooleanProperty(value);\r\n\r\n if (newValue !== this.disabled) {\r\n this._disabled = newValue;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n private _disabled = false;\r\n private _currentCheckState: TransitionCheckState = TransitionCheckState.Init;\r\n private _currentAnimationClass = '';\r\n\r\n /**\r\n * Implemented as part of HasTabIndex.\r\n */\r\n tabIndex: any;\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n public _elementRef: ElementRef,\r\n private _ngZone: NgZone,\r\n private _focusMonitor: FocusMonitor,\r\n @Attribute('tabindex') tabIndex: string\r\n ) {\r\n super(_elementRef);\r\n this.tabIndex = parseInt(tabIndex, 10) || 0;\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this._elementRef, true)\r\n .subscribe(() =>\r\n this._ngZone.run(() => {\r\n this._changeDetectorRef.markForCheck();\r\n })\r\n );\r\n }\r\n\r\n _getAriaChecked(): 'true' | 'false' {\r\n return this.checked ? 'true' : 'false';\r\n }\r\n\r\n /** Focuses the checkbox. */\r\n focus(): void {\r\n this._focusMonitor.focusVia(this._inputElement, 'keyboard');\r\n }\r\n ngOnDestroy() {\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n this._monitorSubscription.unsubscribe();\r\n }\r\n /**\r\n * Event handler for checkbox input element.\r\n * Toggles checked state if element is not disabled.\r\n * Do not toggle on (change) event since IE doesn't fire change event when\r\n * indeterminate checkbox is clicked.\r\n *\r\n * @param event\r\n */\r\n _onInputClick(event: Event) {\r\n // We have to stop propagation for click events on the visual hidden input element.\r\n // By default, when a user clicks on a label element, a generated click event will be\r\n // dispatched on the associated input element. Since we are using a label element as our\r\n // root container, the click event on the `checkbox` will be executed twice.\r\n // The real click event will bubble up, and the generated click event also tries to bubble up.\r\n // This will lead to multiple click events.\r\n // Preventing bubbling for the second event will solve that issue.\r\n event.stopPropagation();\r\n\r\n // If resetIndeterminate is false, and the current state is indeterminate, do nothing on click\r\n if (!this.disabled) {\r\n this.toggle();\r\n this._transitionCheckState(\r\n this._checked\r\n ? TransitionCheckState.Checked\r\n : TransitionCheckState.Unchecked\r\n );\r\n\r\n // Emit our custom change event if the native input emitted one.\r\n // It is important to only emit it, if the native input triggered one, because\r\n // we don't want to trigger a change event, when the `checked` variable changes for example.\r\n this._emitChangeEvent();\r\n }\r\n }\r\n\r\n private _transitionCheckState(newState: TransitionCheckState) {\r\n const oldState = this._currentCheckState;\r\n const element: HTMLElement = this._elementRef.nativeElement;\r\n\r\n if (oldState === newState) {\r\n return;\r\n }\r\n if (this._currentAnimationClass.length > 0) {\r\n element.classList.remove(this._currentAnimationClass);\r\n }\r\n\r\n this._currentAnimationClass =\r\n this._getAnimationClassForCheckStateTransition(oldState, newState);\r\n this._currentCheckState = newState;\r\n\r\n if (this._currentAnimationClass.length > 0) {\r\n element.classList.add(this._currentAnimationClass);\r\n\r\n // Remove the animation class to avoid animation when the checkbox is moved between containers\r\n const animationClass = this._currentAnimationClass;\r\n\r\n this._ngZone.runOutsideAngular(() => {\r\n setTimeout(() => {\r\n element.classList.remove(animationClass);\r\n }, 1000);\r\n });\r\n }\r\n }\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n setDisabledState(isDisabled: boolean) {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n private _emitChangeEvent() {\r\n const event = new OuiCheckboxChange();\r\n event.source = this;\r\n event.checked = this.checked;\r\n this._controlValueAccessorChangeFn(this.checked);\r\n this.change.emit(event);\r\n }\r\n\r\n /** Toggles the `checked` state of the checkbox. */\r\n toggle(): void {\r\n this.checked = !this.checked;\r\n }\r\n\r\n _onInteractionEvent(event: Event) {\r\n // We always have to stop propagation on the change event.\r\n // Otherwise the change event, from the input element, will bubble up and\r\n // emit its event object to the `change` output.\r\n event.stopPropagation();\r\n }\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n writeValue(value: any) {\r\n this.checked = !!value;\r\n }\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n registerOnChange(fn: (value: any) => void) {\r\n this._controlValueAccessorChangeFn = fn;\r\n }\r\n\r\n /**\r\n * Called when the checkbox is blurred. Needed to properly implement ControlValueAccessor.\r\n *\r\n * @docs-private\r\n */\r\n _onTouched: () => any = () => {};\r\n\r\n private _controlValueAccessorChangeFn: (value: any) => void = () => {};\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n registerOnTouched(fn: any) {\r\n this._onTouched = fn;\r\n }\r\n\r\n private _getAnimationClassForCheckStateTransition(\r\n oldState: TransitionCheckState,\r\n newState: TransitionCheckState\r\n ): string {\r\n let animSuffix: any = '';\r\n\r\n switch (oldState) {\r\n case TransitionCheckState.Init:\r\n // Handle edge case where user interacts with checkbox that does not have [(ngModel)] or\r\n // [checked] bound to it.\r\n if (newState === TransitionCheckState.Checked) {\r\n animSuffix = 'unchecked-checked';\r\n } else if (newState === TransitionCheckState.Unchecked) {\r\n animSuffix = 'unchecked-unchecked';\r\n } else {\r\n return '';\r\n }\r\n break;\r\n case TransitionCheckState.Unchecked:\r\n animSuffix =\r\n newState === TransitionCheckState.Checked ? 'unchecked-checked' : '';\r\n break;\r\n case TransitionCheckState.Checked:\r\n animSuffix =\r\n newState === TransitionCheckState.Unchecked\r\n ? 'checked-unchecked'\r\n : '';\r\n break;\r\n }\r\n\r\n return `oui-checkbox-anim-${animSuffix}`;\r\n }\r\n}\r\n", + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "checked", @@ -7912,19 +7914,17 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, { "name": "OuiDatepickerContentBase", - "id": "class-OuiDatepickerContentBase-ef2f443418fcda96544206a6e7f04650559ef230ba716a2fcd192fcccff22a5183bd00b300ca1bd0840b2bdab9f680685ecce9b42c0d3c890966f004ff76d557", + "id": "class-OuiDatepickerContentBase-ef3921776ad0b82cfce69b5c144771b4138dd78e0575d40f4974599120fe3e1e28ceff4f20e944b010d0518aa308aae69e37dd81b1e5162259dfe51af7495093", "file": "ui/src/components/datepicker/datepicker.ts", "deprecated": false, "deprecationMessage": "", "type": "class", - "sourceCode": "import { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ESCAPE, UP_ARROW } from '@angular/cdk/keycodes';\nimport {\n Overlay,\n OverlayConfig,\n OverlayRef,\n PositionStrategy,\n ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal, ComponentType } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n Output,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { OuiDialog, OuiDialogRef } from '../dialog/public-api';\nimport { merge, Subject, Subscription } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\nimport { OuiCalendar } from './calendar';\nimport { ouiDatepickerAnimations } from './datepicker-animations';\nimport { createMissingDateImplError } from './datepicker-errors';\nimport { OuiDatepickerInput } from './datepicker-input';\nimport { OuiCalendarCellCssClasses } from './calendar-body';\nimport { CanColorCtor, mixinColor, CanColor, ThemePalette } from '../core';\nimport { DateAdapter } from './date-adapter';\n\n/** Used to generate a unique ID for each datepicker instance. */\nlet datepickerUid = 0;\n\n/** Injection token that determines the scroll handling while the calendar is open. */\nexport const OUI_DATEPICKER_SCROLL_STRATEGY = new InjectionToken<\n () => ScrollStrategy\n>('oui-datepicker-scroll-strategy');\n\nexport function OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY(\n overlay: Overlay\n): () => ScrollStrategy {\n return () => overlay.scrollStrategies.reposition();\n}\n\nexport const OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: OUI_DATEPICKER_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY,\n};\n\n// Boilerplate for applying mixins to OuiDatepickerContent.\nexport class OuiDatepickerContentBase {\n constructor(public _elementRef: ElementRef) {}\n}\nexport const _OuiDatepickerContentMixinBase: CanColorCtor &\n typeof OuiDatepickerContentBase = mixinColor(OuiDatepickerContentBase);\n\n/**\n * Component used as the content for the datepicker dialog and popup. We use this instead of using\n * OuiCalendar directly as the content so we can control the initial focus. This also gives us a\n * place to put additional features of the popup that are not part of the calendar itself in the\n * future. (e.g. confirmation buttons).\n */\n@Component({\n selector: 'oui-datepicker-content',\n templateUrl: 'datepicker-content.html',\n styleUrls: ['datepicker-content.scss'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-datepicker-content',\n '[@transformPanel]': '\"enter\"',\n '[class.oui-datepicker-content-touch]': 'datepicker.touchUi',\n },\n animations: [\n ouiDatepickerAnimations.transformPanel,\n ouiDatepickerAnimations.fadeInCalendar,\n ],\n exportAs: 'ouiDatepickerContent',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['color'],\n})\nexport class OuiDatepickerContent\n extends _OuiDatepickerContentMixinBase\n implements AfterViewInit, CanColor\n{\n /** Reference to the internal calendar component. */\n @ViewChild(OuiCalendar) _calendar: OuiCalendar;\n\n /** Reference to the datepicker that created the overlay. */\n datepicker: OuiDatepicker;\n\n /** Whether the datepicker is above or below the input. */\n _isAbove: boolean;\n\n constructor(elementRef: ElementRef) {\n super(elementRef);\n }\n\n ngAfterViewInit() {\n this._calendar.focusActiveCell();\n }\n}\n\n// TODO(mmalerba): We use a component instead of a directive here so the user can use implicit\n// template reference variables (e.g. #d vs #d=\"ouiDatepicker\"). We can change this to a directive\n// if angular adds support for `exportAs: '$implicit'` on directives.\n/** Component responsible for managing the datepicker popup/dialog. */\n@Component({\n selector: 'oui-datepicker',\n template: '',\n exportAs: 'ouiDatepicker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.oui-datepicker-disabled]': 'disabled',\n },\n})\nexport class OuiDatepicker implements OnDestroy, CanColor {\n private _scrollStrategy: () => ScrollStrategy;\n\n /** An input indicating the type of the custom header component for the calendar, if set. */\n @Input() calendarHeaderComponent: ComponentType;\n\n /** The date to open the calendar to initially. */\n @Input()\n get startAt(): D | null {\n // If an explicit startAt is set we start there, otherwise we start at whatever the currently\n // selected value is.\n return (\n this._startAt ||\n (this._datepickerInput ? this._datepickerInput.value : null)\n );\n }\n set startAt(value: D | null) {\n this._startAt = this._getValidDateOrNull(\n this._dateAdapter.deserialize(value)\n );\n }\n private _startAt: D | null;\n\n /** The view that the calendar should start in. */\n @Input() startView: 'month' | 'year' | 'multi-year' = 'month';\n\n /** Color palette to use on the datepicker's calendar. */\n @Input()\n get color(): ThemePalette {\n return (\n this._color ||\n (this._datepickerInput\n ? this._datepickerInput._getThemePalette()\n : undefined)\n );\n }\n set color(value: ThemePalette) {\n this._color = value;\n }\n _color: ThemePalette;\n\n /**\n * Whether the calendar UI is in touch mode. In touch mode the calendar opens in a dialog rather\n * than a popup and elements have more padding to allow for bigger touch targets.\n */\n @Input()\n get touchUi(): boolean {\n return this._touchUi;\n }\n set touchUi(value: boolean) {\n this._touchUi = coerceBooleanProperty(value);\n }\n private _touchUi = false;\n\n /** Whether the datepicker pop-up should be disabled. */\n @Input()\n get disabled(): boolean {\n return this._disabled === undefined && this._datepickerInput\n ? this._datepickerInput.disabled\n : !!this._disabled;\n }\n set disabled(value: boolean) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this._disabled) {\n this._disabled = newValue;\n this._disabledChange.next(newValue);\n this._datepickerInput._datepickerDisabled = newValue;\n }\n }\n private _disabled = false;\n\n /**\n * Emits selected year in multiyear view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly yearSelected: EventEmitter = new EventEmitter();\n\n /**\n * Emits selected month in year view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly monthSelected: EventEmitter = new EventEmitter();\n\n /** Classes to be passed to the date picker panel. Supports the same syntax as `ngClass`. */\n @Input() panelClass: string | string[];\n\n /** Function that can be used to add custom CSS classes to dates. */\n @Input() dateClass: (date: D) => OuiCalendarCellCssClasses;\n\n /** Emits when the datepicker has been opened. */\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('opened') openedStream: EventEmitter = new EventEmitter();\n\n /** Emits when the datepicker has been closed. */\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('closed') closedStream: EventEmitter = new EventEmitter();\n\n /** Whether the calendar is open. */\n @Input()\n get opened(): boolean {\n return this._opened;\n }\n set opened(value: boolean) {\n value ? this.open() : this.close();\n }\n private _opened = false;\n\n /** The id for the datepicker calendar. */\n id = `oui-datepicker-${datepickerUid++}`;\n\n /** The currently selected date. */\n get _selected(): D | null {\n return this._validSelected;\n }\n set _selected(value: D | null) {\n this._validSelected = value;\n }\n private _validSelected: D | null = null;\n\n /** The minimum selectable date. */\n get _minDate(): D | null {\n return this._datepickerInput && this._datepickerInput.min;\n }\n\n /** The maximum selectable date. */\n get _maxDate(): D | null {\n return this._datepickerInput && this._datepickerInput.max;\n }\n\n get _dateFilter(): (date: D | null) => boolean {\n return this._datepickerInput && this._datepickerInput._dateFilter;\n }\n\n /** A reference to the overlay when the calendar is opened as a popup. */\n _popupRef: OverlayRef;\n\n /** A reference to the dialog when the calendar is opened as a dialog. */\n private _dialogRef: OuiDialogRef> | null;\n\n /** A portal containing the calendar for this datepicker. */\n private _calendarPortal: ComponentPortal>;\n\n /** Reference to the component instantiated in popup mode. */\n private _popupComponentRef: ComponentRef> | null;\n\n /** The element that was focused before the datepicker was opened. */\n private _focusedElementBeforeOpen: HTMLElement | null = null;\n\n /** Subscription to value changes in the associated input element. */\n private _inputSubscription = Subscription.EMPTY;\n\n /** The input element this datepicker is associated with. */\n _datepickerInput: OuiDatepickerInput;\n\n /** Emits when the datepicker is disabled. */\n readonly _disabledChange = new Subject();\n\n /** Emits new selected date when selected date changes. */\n readonly _selectedChanged = new Subject();\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private _dialog: OuiDialog,\n private _overlay: Overlay,\n private _ngZone: NgZone,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _viewContainerRef: ViewContainerRef,\n @Inject(OUI_DATEPICKER_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _dateAdapter: DateAdapter,\n @Optional() private _dir: Directionality,\n @Optional() @Inject(DOCUMENT) private _document: any\n ) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n this._scrollStrategy = scrollStrategy;\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n\n ngOnDestroy() {\n this.close();\n this._inputSubscription.unsubscribe();\n this._disabledChange.complete();\n this._monitorSubscription.unsubscribe();\n\n if (this._popupRef) {\n this._popupRef.dispose();\n this._popupComponentRef = null;\n }\n }\n\n /** Selects the given date */\n select(date: D): void {\n const oldValue = this._selected;\n this._selected = date;\n if (!this._dateAdapter.sameDate(oldValue, this._selected)) {\n this._selectedChanged.next(date);\n }\n }\n\n /** Emits the selected year in multiyear view */\n _selectYear(normalizedYear: D): void {\n this.yearSelected.emit(normalizedYear);\n }\n\n /** Emits selected month in year view */\n _selectMonth(normalizedMonth: D): void {\n this.monthSelected.emit(normalizedMonth);\n }\n\n /**\n * Register an input with this datepicker.\n *\n * @param input The datepicker input to register with this datepicker.\n */\n _registerInput(input: OuiDatepickerInput): void {\n if (this._datepickerInput) {\n throw Error(\n 'A OuiDatepicker can only be associated with a single input.'\n );\n }\n this._datepickerInput = input;\n this._inputSubscription = this._datepickerInput._valueChange.subscribe(\n (value: D | null) => (this._selected = value)\n );\n }\n\n /** Open the calendar. */\n open(): void {\n if (this._opened || this.disabled) {\n return;\n }\n if (!this._datepickerInput) {\n throw Error(\n 'Attempted to open an OuiDatepicker with no associated input.'\n );\n }\n if (this._document) {\n this._focusedElementBeforeOpen = this._document.activeElement;\n }\n\n this.touchUi ? this._openAsDialog() : this._openAsPopup();\n this._opened = true;\n // add input focus here\n this._datepickerInput.focus();\n this.openedStream.emit();\n }\n\n /** Close the calendar. */\n close(): void {\n if (!this._opened) {\n return;\n }\n if (this._popupRef && this._popupRef.hasAttached()) {\n this._popupRef.detach();\n }\n if (this._dialogRef) {\n this._dialogRef.close();\n this._dialogRef = null;\n }\n if (this._calendarPortal && this._calendarPortal.isAttached) {\n this._calendarPortal.detach();\n }\n\n const completeClose = () => {\n // The `_opened` could've been reset already if\n // we got two events in quick succession.\n if (this._opened) {\n this._opened = false;\n this.closedStream.emit();\n this._focusedElementBeforeOpen = null;\n this._datepickerInput.blur();\n }\n };\n\n if (\n this._focusedElementBeforeOpen &&\n typeof this._focusedElementBeforeOpen.focus === 'function'\n ) {\n // Because IE moves focus asynchronously, we can't count on it being restored before we've\n // marked the datepicker as closed. If the event fires out of sequence and the element that\n // we're refocusing opens the datepicker on focus, the user could be stuck with not being\n // able to close the calendar at all. We work around it by making the logic, that marks\n // the datepicker as closed, async as well.\n this._focusedElementBeforeOpen.focus();\n setTimeout(completeClose);\n } else {\n completeClose();\n }\n }\n\n /** Open the calendar as a dialog. */\n private _openAsDialog(): void {\n // Usually this would be handled by `open` which ensures that we can only have one overlay\n // open at a time, however since we reset the variables in async handlers some overlays\n // may slip through if the user opens and closes multiple times in quick succession (e.g.\n // by holding down the enter key).\n if (this._dialogRef) {\n this._dialogRef.close();\n }\n\n this._dialogRef = this._dialog.open>(\n OuiDatepickerContent,\n {\n direction: this._dir ? this._dir.value : 'ltr',\n viewContainerRef: this._viewContainerRef,\n panelClass: 'oui-datepicker-dialog',\n }\n );\n\n this._dialogRef.afterClosed().subscribe(() => this.close());\n this._dialogRef.componentInstance.datepicker = this;\n this._setColor();\n }\n\n /** Open the calendar as a popup. */\n private _openAsPopup(): void {\n if (!this._calendarPortal) {\n this._calendarPortal = new ComponentPortal>(\n OuiDatepickerContent,\n this._viewContainerRef\n );\n }\n\n if (!this._popupRef) {\n this._createPopup();\n }\n\n if (!this._popupRef.hasAttached()) {\n this._popupComponentRef = this._popupRef.attach(this._calendarPortal);\n this._popupComponentRef.instance.datepicker = this;\n this._setColor();\n\n // Update the position once the calendar has rendered.\n this._ngZone.onStable\n .asObservable()\n .pipe(take(1))\n .subscribe(() => {\n this._popupRef.updatePosition();\n });\n }\n }\n\n /** Create the popup. */\n private _createPopup(): void {\n const overlayConfig = new OverlayConfig({\n positionStrategy: this._createPopupPositionStrategy(),\n hasBackdrop: true,\n backdropClass: 'oui-overlay-transparent-backdrop',\n direction: this._dir,\n scrollStrategy: this._scrollStrategy(),\n panelClass: 'oui-datepicker-popup',\n });\n\n this._popupRef = this._overlay.create(overlayConfig);\n this._popupRef.overlayElement.setAttribute('role', 'dialog');\n\n merge(\n this._popupRef.backdropClick(),\n this._popupRef.detachments(),\n this._popupRef.keydownEvents().pipe(\n filter(\n (event) =>\n // Closing on alt + up is only valid when there's an input associated with the datepicker.\n event.keyCode === ESCAPE ||\n (this._datepickerInput &&\n event.altKey &&\n event.keyCode === UP_ARROW)\n )\n )\n ).subscribe(() => this.close());\n }\n\n /** Create the popup PositionStrategy. */\n private _createPopupPositionStrategy(): PositionStrategy {\n return this._overlay\n .position()\n .flexibleConnectedTo(this._datepickerInput.getConnectedOverlayOrigin())\n .withTransformOriginOn('.oui-datepicker-content')\n .withFlexibleDimensions(false)\n .withViewportMargin(8)\n .withLockedPosition()\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n },\n ]);\n }\n\n /**\n * @param obj The object to check.\n * @returns The given object if it is both a date instance and valid, otherwise null.\n */\n private _getValidDateOrNull(obj: any): D | null {\n return this._dateAdapter.isDateInstance(obj) &&\n this._dateAdapter.isValid(obj as any as D)\n ? obj\n : null;\n }\n\n /** Passes the current theme color along to the calendar overlay. */\n private _setColor(): void {\n const color = this.color;\n if (this._popupComponentRef) {\n this._popupComponentRef.instance.color = color;\n }\n if (this._dialogRef) {\n this._dialogRef.componentInstance.color = color;\n }\n }\n}\n", + "sourceCode": "import { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { ESCAPE, UP_ARROW } from '@angular/cdk/keycodes';\r\nimport {\r\n Overlay,\r\n OverlayConfig,\r\n OverlayRef,\r\n PositionStrategy,\r\n ScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { ComponentPortal, ComponentType } from '@angular/cdk/portal';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ComponentRef,\r\n ElementRef,\r\n EventEmitter,\r\n Inject,\r\n InjectionToken,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Optional,\r\n Output,\r\n ViewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { OuiDialog, OuiDialogRef } from '../dialog/public-api';\r\nimport { merge, Subject, Subscription } from 'rxjs';\r\nimport { filter, take } from 'rxjs/operators';\r\nimport { OuiCalendar } from './calendar';\r\nimport { ouiDatepickerAnimations } from './datepicker-animations';\r\nimport { createMissingDateImplError } from './datepicker-errors';\r\nimport { OuiDatepickerInput } from './datepicker-input';\r\nimport { OuiCalendarCellCssClasses } from './calendar-body';\r\nimport { CanColorCtor, mixinColor, CanColor, ThemePalette } from '../core';\r\nimport { DateAdapter } from './date-adapter';\r\n\r\n/** Used to generate a unique ID for each datepicker instance. */\r\nlet datepickerUid = 0;\r\n\r\n/** Injection token that determines the scroll handling while the calendar is open. */\r\nexport const OUI_DATEPICKER_SCROLL_STRATEGY = new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-datepicker-scroll-strategy');\r\n\r\nexport function OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY(\r\n overlay: Overlay\r\n): () => ScrollStrategy {\r\n return () => overlay.scrollStrategies.reposition();\r\n}\r\n\r\nexport const OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER = {\r\n provide: OUI_DATEPICKER_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY,\r\n};\r\n\r\n// Boilerplate for applying mixins to OuiDatepickerContent.\r\nexport class OuiDatepickerContentBase {\r\n constructor(public _elementRef: ElementRef) {}\r\n}\r\nexport const _OuiDatepickerContentMixinBase: CanColorCtor &\r\n typeof OuiDatepickerContentBase = mixinColor(OuiDatepickerContentBase);\r\n\r\n/**\r\n * Component used as the content for the datepicker dialog and popup. We use this instead of using\r\n * OuiCalendar directly as the content so we can control the initial focus. This also gives us a\r\n * place to put additional features of the popup that are not part of the calendar itself in the\r\n * future. (e.g. confirmation buttons).\r\n */\r\n@Component({\r\n selector: 'oui-datepicker-content',\r\n templateUrl: 'datepicker-content.html',\r\n styleUrls: ['datepicker-content.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n class: 'oui-datepicker-content',\r\n '[@transformPanel]': '\"enter\"',\r\n '[class.oui-datepicker-content-touch]': 'datepicker.touchUi',\r\n },\r\n animations: [\r\n ouiDatepickerAnimations.transformPanel,\r\n ouiDatepickerAnimations.fadeInCalendar,\r\n ],\r\n exportAs: 'ouiDatepickerContent',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['color'],\r\n})\r\nexport class OuiDatepickerContent\r\n extends _OuiDatepickerContentMixinBase\r\n implements AfterViewInit, CanColor\r\n{\r\n /** Reference to the internal calendar component. */\r\n @ViewChild(OuiCalendar) _calendar: OuiCalendar;\r\n\r\n /** Reference to the datepicker that created the overlay. */\r\n datepicker: OuiDatepicker;\r\n\r\n /** Whether the datepicker is above or below the input. */\r\n _isAbove: boolean;\r\n\r\n constructor(elementRef: ElementRef) {\r\n super(elementRef);\r\n }\r\n\r\n ngAfterViewInit() {\r\n this._calendar.focusActiveCell();\r\n }\r\n}\r\n\r\n// TODO(mmalerba): We use a component instead of a directive here so the user can use implicit\r\n// template reference variables (e.g. #d vs #d=\"ouiDatepicker\"). We can change this to a directive\r\n// if angular adds support for `exportAs: '$implicit'` on directives.\r\n/** Component responsible for managing the datepicker popup/dialog. */\r\n@Component({\r\n selector: 'oui-datepicker',\r\n template: '',\r\n exportAs: 'ouiDatepicker',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '[class.oui-datepicker-disabled]': 'disabled',\r\n },\r\n})\r\nexport class OuiDatepicker implements OnDestroy, CanColor {\r\n private _scrollStrategy: () => ScrollStrategy;\r\n\r\n /** An input indicating the type of the custom header component for the calendar, if set. */\r\n @Input() calendarHeaderComponent: ComponentType;\r\n\r\n /** The date to open the calendar to initially. */\r\n @Input()\r\n get startAt(): D | null {\r\n // If an explicit startAt is set we start there, otherwise we start at whatever the currently\r\n // selected value is.\r\n return (\r\n this._startAt ||\r\n (this._datepickerInput ? this._datepickerInput.value : null)\r\n );\r\n }\r\n set startAt(value: D | null) {\r\n this._startAt = this._getValidDateOrNull(\r\n this._dateAdapter.deserialize(value)\r\n );\r\n }\r\n private _startAt: D | null;\r\n\r\n /** The view that the calendar should start in. */\r\n @Input() startView: 'month' | 'year' | 'multi-year' = 'month';\r\n\r\n /** Color palette to use on the datepicker's calendar. */\r\n @Input()\r\n get color(): ThemePalette {\r\n return (\r\n this._color ||\r\n (this._datepickerInput\r\n ? this._datepickerInput._getThemePalette()\r\n : undefined)\r\n );\r\n }\r\n set color(value: ThemePalette) {\r\n this._color = value;\r\n }\r\n _color: ThemePalette;\r\n\r\n /**\r\n * Whether the calendar UI is in touch mode. In touch mode the calendar opens in a dialog rather\r\n * than a popup and elements have more padding to allow for bigger touch targets.\r\n */\r\n @Input()\r\n get touchUi(): boolean {\r\n return this._touchUi;\r\n }\r\n set touchUi(value: boolean) {\r\n this._touchUi = coerceBooleanProperty(value);\r\n }\r\n private _touchUi = false;\r\n\r\n /** Whether the datepicker pop-up should be disabled. */\r\n @Input()\r\n get disabled(): boolean {\r\n return this._disabled === undefined && this._datepickerInput\r\n ? this._datepickerInput.disabled\r\n : !!this._disabled;\r\n }\r\n set disabled(value: boolean) {\r\n const newValue = coerceBooleanProperty(value);\r\n\r\n if (newValue !== this._disabled) {\r\n this._disabled = newValue;\r\n this._disabledChange.next(newValue);\r\n this._datepickerInput._datepickerDisabled = newValue;\r\n }\r\n }\r\n private _disabled = false;\r\n\r\n /**\r\n * Emits selected year in multiyear view.\r\n * This doesn't imply a change on the selected date.\r\n */\r\n @Output() readonly yearSelected: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Emits selected month in year view.\r\n * This doesn't imply a change on the selected date.\r\n */\r\n @Output() readonly monthSelected: EventEmitter = new EventEmitter();\r\n\r\n /** Classes to be passed to the date picker panel. Supports the same syntax as `ngClass`. */\r\n @Input() panelClass: string | string[];\r\n\r\n /** Function that can be used to add custom CSS classes to dates. */\r\n @Input() dateClass: (date: D) => OuiCalendarCellCssClasses;\r\n\r\n /** Emits when the datepicker has been opened. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('opened') openedStream: EventEmitter = new EventEmitter();\r\n\r\n /** Emits when the datepicker has been closed. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('closed') closedStream: EventEmitter = new EventEmitter();\r\n\r\n /** Whether the calendar is open. */\r\n @Input()\r\n get opened(): boolean {\r\n return this._opened;\r\n }\r\n set opened(value: boolean) {\r\n if (value) {\r\n this.open();\r\n } else {\r\n this.close();\r\n }\r\n }\r\n private _opened = false;\r\n\r\n /** The id for the datepicker calendar. */\r\n id = `oui-datepicker-${datepickerUid++}`;\r\n\r\n /** The currently selected date. */\r\n get _selected(): D | null {\r\n return this._validSelected;\r\n }\r\n set _selected(value: D | null) {\r\n this._validSelected = value;\r\n }\r\n private _validSelected: D | null = null;\r\n\r\n /** The minimum selectable date. */\r\n get _minDate(): D | null {\r\n return this._datepickerInput && this._datepickerInput.min;\r\n }\r\n\r\n /** The maximum selectable date. */\r\n get _maxDate(): D | null {\r\n return this._datepickerInput && this._datepickerInput.max;\r\n }\r\n\r\n get _dateFilter(): (date: D | null) => boolean {\r\n return this._datepickerInput && this._datepickerInput._dateFilter;\r\n }\r\n\r\n /** A reference to the overlay when the calendar is opened as a popup. */\r\n _popupRef: OverlayRef;\r\n\r\n /** A reference to the dialog when the calendar is opened as a dialog. */\r\n private _dialogRef: OuiDialogRef> | null;\r\n\r\n /** A portal containing the calendar for this datepicker. */\r\n private _calendarPortal: ComponentPortal>;\r\n\r\n /** Reference to the component instantiated in popup mode. */\r\n private _popupComponentRef: ComponentRef> | null;\r\n\r\n /** The element that was focused before the datepicker was opened. */\r\n private _focusedElementBeforeOpen: HTMLElement | null = null;\r\n\r\n /** Subscription to value changes in the associated input element. */\r\n private _inputSubscription = Subscription.EMPTY;\r\n\r\n /** The input element this datepicker is associated with. */\r\n _datepickerInput: OuiDatepickerInput;\r\n\r\n /** Emits when the datepicker is disabled. */\r\n readonly _disabledChange = new Subject();\r\n\r\n /** Emits new selected date when selected date changes. */\r\n readonly _selectedChanged = new Subject();\r\n private _monitorSubscription: Subscription = Subscription.EMPTY;\r\n constructor(\r\n private _dialog: OuiDialog,\r\n private _overlay: Overlay,\r\n private _ngZone: NgZone,\r\n protected elementRef: ElementRef,\r\n private _focusMonitor: FocusMonitor,\r\n private _viewContainerRef: ViewContainerRef,\r\n @Inject(OUI_DATEPICKER_SCROLL_STRATEGY) scrollStrategy: any,\r\n @Optional() private _dateAdapter: DateAdapter,\r\n @Optional() private _dir: Directionality,\r\n @Optional() @Inject(DOCUMENT) private _document: any\r\n ) {\r\n if (!this._dateAdapter) {\r\n throw createMissingDateImplError('DateAdapter');\r\n }\r\n this._scrollStrategy = scrollStrategy;\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this.elementRef, true)\r\n .subscribe(() => this._ngZone.run(() => {}));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.close();\r\n this._inputSubscription.unsubscribe();\r\n this._disabledChange.complete();\r\n this._monitorSubscription.unsubscribe();\r\n\r\n if (this._popupRef) {\r\n this._popupRef.dispose();\r\n this._popupComponentRef = null;\r\n }\r\n }\r\n\r\n /** Selects the given date */\r\n select(date: D): void {\r\n const oldValue = this._selected;\r\n this._selected = date;\r\n if (!this._dateAdapter.sameDate(oldValue, this._selected)) {\r\n this._selectedChanged.next(date);\r\n }\r\n }\r\n\r\n /** Emits the selected year in multiyear view */\r\n _selectYear(normalizedYear: D): void {\r\n this.yearSelected.emit(normalizedYear);\r\n }\r\n\r\n /** Emits selected month in year view */\r\n _selectMonth(normalizedMonth: D): void {\r\n this.monthSelected.emit(normalizedMonth);\r\n }\r\n\r\n /**\r\n * Register an input with this datepicker.\r\n *\r\n * @param input The datepicker input to register with this datepicker.\r\n */\r\n _registerInput(input: OuiDatepickerInput): void {\r\n if (this._datepickerInput) {\r\n throw Error(\r\n 'A OuiDatepicker can only be associated with a single input.'\r\n );\r\n }\r\n this._datepickerInput = input;\r\n this._inputSubscription = this._datepickerInput._valueChange.subscribe(\r\n (value: D | null) => (this._selected = value)\r\n );\r\n }\r\n\r\n /** Open the calendar. */\r\n open(): void {\r\n if (this._opened || this.disabled) {\r\n return;\r\n }\r\n if (!this._datepickerInput) {\r\n throw Error(\r\n 'Attempted to open an OuiDatepicker with no associated input.'\r\n );\r\n }\r\n if (this._document) {\r\n this._focusedElementBeforeOpen = this._document.activeElement;\r\n }\r\n\r\n if (this.touchUi) {\r\n this._openAsDialog();\r\n } else {\r\n this._openAsPopup();\r\n }\r\n this._opened = true;\r\n // add input focus here\r\n this._datepickerInput.focus();\r\n this.openedStream.emit();\r\n }\r\n\r\n /** Close the calendar. */\r\n close(): void {\r\n if (!this._opened) {\r\n return;\r\n }\r\n if (this._popupRef && this._popupRef.hasAttached()) {\r\n this._popupRef.detach();\r\n }\r\n if (this._dialogRef) {\r\n this._dialogRef.close();\r\n this._dialogRef = null;\r\n }\r\n if (this._calendarPortal && this._calendarPortal.isAttached) {\r\n this._calendarPortal.detach();\r\n }\r\n\r\n const completeClose = () => {\r\n // The `_opened` could've been reset already if\r\n // we got two events in quick succession.\r\n if (this._opened) {\r\n this._opened = false;\r\n this.closedStream.emit();\r\n this._focusedElementBeforeOpen = null;\r\n this._datepickerInput.blur();\r\n }\r\n };\r\n\r\n if (\r\n this._focusedElementBeforeOpen &&\r\n typeof this._focusedElementBeforeOpen.focus === 'function'\r\n ) {\r\n // Because IE moves focus asynchronously, we can't count on it being restored before we've\r\n // marked the datepicker as closed. If the event fires out of sequence and the element that\r\n // we're refocusing opens the datepicker on focus, the user could be stuck with not being\r\n // able to close the calendar at all. We work around it by making the logic, that marks\r\n // the datepicker as closed, async as well.\r\n this._focusedElementBeforeOpen.focus();\r\n setTimeout(completeClose);\r\n } else {\r\n completeClose();\r\n }\r\n }\r\n\r\n /** Open the calendar as a dialog. */\r\n private _openAsDialog(): void {\r\n // Usually this would be handled by `open` which ensures that we can only have one overlay\r\n // open at a time, however since we reset the variables in async handlers some overlays\r\n // may slip through if the user opens and closes multiple times in quick succession (e.g.\r\n // by holding down the enter key).\r\n if (this._dialogRef) {\r\n this._dialogRef.close();\r\n }\r\n\r\n this._dialogRef = this._dialog.open>(\r\n OuiDatepickerContent,\r\n {\r\n direction: this._dir ? this._dir.value : 'ltr',\r\n viewContainerRef: this._viewContainerRef,\r\n panelClass: 'oui-datepicker-dialog',\r\n }\r\n );\r\n\r\n this._dialogRef.afterClosed().subscribe(() => this.close());\r\n this._dialogRef.componentInstance.datepicker = this;\r\n this._setColor();\r\n }\r\n\r\n /** Open the calendar as a popup. */\r\n private _openAsPopup(): void {\r\n if (!this._calendarPortal) {\r\n this._calendarPortal = new ComponentPortal>(\r\n OuiDatepickerContent,\r\n this._viewContainerRef\r\n );\r\n }\r\n\r\n if (!this._popupRef) {\r\n this._createPopup();\r\n }\r\n\r\n if (!this._popupRef.hasAttached()) {\r\n this._popupComponentRef = this._popupRef.attach(this._calendarPortal);\r\n this._popupComponentRef.instance.datepicker = this;\r\n this._setColor();\r\n\r\n // Update the position once the calendar has rendered.\r\n this._ngZone.onStable\r\n .asObservable()\r\n .pipe(take(1))\r\n .subscribe(() => {\r\n this._popupRef.updatePosition();\r\n });\r\n }\r\n }\r\n\r\n /** Create the popup. */\r\n private _createPopup(): void {\r\n const overlayConfig = new OverlayConfig({\r\n positionStrategy: this._createPopupPositionStrategy(),\r\n hasBackdrop: true,\r\n backdropClass: 'oui-overlay-transparent-backdrop',\r\n direction: this._dir,\r\n scrollStrategy: this._scrollStrategy(),\r\n panelClass: 'oui-datepicker-popup',\r\n });\r\n\r\n this._popupRef = this._overlay.create(overlayConfig);\r\n this._popupRef.overlayElement.setAttribute('role', 'dialog');\r\n\r\n merge(\r\n this._popupRef.backdropClick(),\r\n this._popupRef.detachments(),\r\n this._popupRef.keydownEvents().pipe(\r\n filter(\r\n (event) =>\r\n // Closing on alt + up is only valid when there's an input associated with the datepicker.\r\n event.keyCode === ESCAPE ||\r\n (this._datepickerInput &&\r\n event.altKey &&\r\n event.keyCode === UP_ARROW)\r\n )\r\n )\r\n ).subscribe(() => this.close());\r\n }\r\n\r\n /** Create the popup PositionStrategy. */\r\n private _createPopupPositionStrategy(): PositionStrategy {\r\n return this._overlay\r\n .position()\r\n .flexibleConnectedTo(this._datepickerInput.getConnectedOverlayOrigin())\r\n .withTransformOriginOn('.oui-datepicker-content')\r\n .withFlexibleDimensions(false)\r\n .withViewportMargin(8)\r\n .withLockedPosition()\r\n .withPositions([\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n },\r\n {\r\n originX: 'end',\r\n originY: 'bottom',\r\n overlayX: 'end',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'end',\r\n originY: 'top',\r\n overlayX: 'end',\r\n overlayY: 'bottom',\r\n },\r\n ]);\r\n }\r\n\r\n /**\r\n * @param obj The object to check.\r\n * @returns The given object if it is both a date instance and valid, otherwise null.\r\n */\r\n private _getValidDateOrNull(obj: any): D | null {\r\n return this._dateAdapter.isDateInstance(obj) &&\r\n this._dateAdapter.isValid(obj as any as D)\r\n ? obj\r\n : null;\r\n }\r\n\r\n /** Passes the current theme color along to the calendar overlay. */\r\n private _setColor(): void {\r\n const color = this.color;\r\n if (this._popupComponentRef) {\r\n this._popupComponentRef.instance.color = color;\r\n }\r\n if (this._dialogRef) {\r\n this._dialogRef.componentInstance.color = color;\r\n }\r\n }\r\n}\r\n", "constructorObj": { "name": "constructor", "description": "", @@ -7951,6 +7951,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_elementRef", @@ -7968,8 +7970,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -8022,6 +8022,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "target", @@ -8065,8 +8067,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -8078,6 +8078,8 @@ "deprecationMessage": "", "type": "class", "sourceCode": "import { ViewContainerRef } from '@angular/core';\nimport { Direction } from '@angular/cdk/bidi';\nimport { ScrollStrategy } from '@angular/cdk/overlay';\n\n/** Possible overrides for a dialog's position. */\nexport interface DialogPosition {\n /** Override for the dialog's top position. */\n top?: string;\n\n /** Override for the dialog's bottom position. */\n bottom?: string;\n\n /** Override for the dialog's left position. */\n left?: string;\n\n /** Override for the dialog's right position. */\n right?: string;\n}\n\n/**\n * Configuration for opening a modal dialog with the OuiDialog service.\n */\nexport class OuiDialogConfig {\n /**\n * Where the attached component should live in Angular's *logical* component tree.\n * This affects what is available for injection and the change detection order for the\n * component instantiated inside of the dialog. This does not affect where the dialog\n * content will be rendered.\n */\n viewContainerRef?: ViewContainerRef;\n\n /** ID for the dialog. If omitted, a unique one will be generated. */\n id?: string;\n\n /** The ARIA role of the dialog element. */\n role? = 'dialog';\n\n /** Custom class for the overlay pane. */\n panelClass?: string | string[] = '';\n\n /** Whether the dialog has a backdrop. */\n hasBackdrop? = true;\n\n /** Custom class for the backdrop, */\n backdropClass? = '';\n\n /** Whether the user can use escape or clicking on the backdrop to close the modal. */\n disableClose? = false;\n\n /** Width of the dialog. */\n width? = '607px';\n\n /** Height of the dialog. */\n height? = '';\n\n /** Min-width of the dialog. If a number is provided, pixel units are assumed. */\n minWidth?: number | string = '607px';\n\n /** Min-height of the dialog. If a number is provided, pixel units are assumed. */\n minHeight?: number | string;\n\n /** Max-width of the dialog. If a number is provided, pixel units are assumed. Defaults to 80vw */\n maxWidth?: number | string = '80vw';\n\n /** Max-height of the dialog. If a number is provided, pixel units are assumed. */\n maxHeight?: number | string;\n\n /** Position overrides. */\n position?: DialogPosition;\n\n /** Data being injected into the child component. */\n data?: D | null = null;\n\n /** Layout direction for the dialog's content. */\n direction?: Direction;\n\n /** ID of the element that describes the dialog. */\n ariaDescribedBy?: string | null = null;\n\n /** Aria label to assign to the dialog element */\n ariaLabel?: string | null = null;\n\n /** Whether the dialog should focus the first focusable element on open. */\n autoFocus? = false;\n\n /**\n * Whether the dialog should restore focus to the\n * previously-focused element, after it's closed.\n */\n restoreFocus? = true;\n\n /** Scroll strategy to be used for the dialog. */\n scrollStrategy?: ScrollStrategy;\n\n // TODO(jelbourn): add configuration for lifecycle hooks, ARIA labelling.\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "ariaDescribedBy", @@ -8309,19 +8311,17 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, { "name": "OuiDialogRef", - "id": "class-OuiDialogRef-be1ab57005a2f89f2b1e38b8e2cb049298a7e6d9ed789333cdcaf8ec054066fcca749b17643a9bf0f1317db48ef177bd93225070a11551d50dd25249a7ec3760", + "id": "class-OuiDialogRef-d27a78af79d58dcf29aca3ea530b0469a68a719d186128983c7dd2d76547609d20935509ce5424efcaf6a79ee18aa50105d64dd203d3df583f7e747c6b58d895", "file": "ui/src/components/dialog/dialog-ref.ts", "deprecated": false, "deprecationMessage": "", "type": "class", - "sourceCode": "import { GlobalPositionStrategy, OverlayRef } from '@angular/cdk/overlay';\nimport { Observable, Subject } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { DialogPosition, OuiDialogConfig } from './dialog-config';\nimport { OuiDialogContainer } from './dialog-container';\n\n// TODO(jelbourn): resizing\n\n// Counter for unique dialog ids.\nlet uniqueId = 0;\n\n/**\n * Reference to a dialog opened via the OuiDialog service.\n */\nexport class OuiDialogRef {\n /** The instance of component opened into the dialog. */\n componentInstance: T;\n\n /** Whether the user is allowed to close the dialog. */\n disableClose: boolean | undefined =\n this._containerInstance._config.disableClose;\n\n /** Subject for notifying the user that the dialog has finished opening. */\n private readonly _afterOpened = new Subject();\n\n /** Subject for notifying the user that the dialog has finished closing. */\n private readonly _afterClosed = new Subject();\n\n /** Subject for notifying the user that the dialog has started closing. */\n private readonly _beforeClosed = new Subject();\n\n /** Result to be passed to afterClosed. */\n private _result: R | undefined;\n\n private _dialogConfig: OuiDialogConfig;\n\n public get dialogConfig(): OuiDialogConfig {\n return this._dialogConfig;\n }\n\n public set dialogConfig(config: OuiDialogConfig) {\n this._dialogConfig = config;\n }\n\n constructor(\n private _overlayRef: OverlayRef,\n public _containerInstance: OuiDialogContainer,\n readonly id: string = `oui-dialog-${uniqueId++}`\n ) {\n // Pass the id along to the container.\n _containerInstance._id = id;\n\n this._afterOpened.next();\n this._afterOpened.complete();\n\n _overlayRef.detachments().subscribe(() => {\n this._beforeClosed.next(this._result);\n this._beforeClosed.complete();\n this._afterClosed.next(this._result);\n this._afterClosed.complete();\n this.componentInstance = null!;\n this._overlayRef.dispose();\n });\n\n _overlayRef\n .keydownEvents()\n .pipe(filter((event) => event.key === 'Escape' && !this.disableClose))\n .subscribe(() => this.close());\n }\n\n /**\n * Close the dialog.\n *\n * @param dialogResult Optional result to return to the dialog opener.\n */\n close(dialogResult?: R): void {\n this._result = dialogResult;\n this._beforeClosed.next(dialogResult);\n this._beforeClosed.complete();\n this._overlayRef.detachBackdrop();\n this._overlayRef.dispose();\n }\n\n /**\n * Gets an observable that is notified when the dialog is finished opening.\n */\n afterOpened(): Observable {\n return this._afterOpened.asObservable();\n }\n\n /**\n * Gets an observable that is notified when the dialog is finished closing.\n */\n afterClosed(): Observable {\n return this._afterClosed.asObservable();\n }\n\n /**\n * Gets an observable that is notified when the dialog has started closing.\n */\n beforeClosed(): Observable {\n return this._beforeClosed.asObservable();\n }\n\n /**\n * Gets an observable that emits when the overlay's backdrop has been clicked.\n */\n backdropClick(): Observable {\n return this._overlayRef.backdropClick();\n }\n\n /**\n * Gets an observable that emits when keydown events are targeted on the overlay.\n */\n keydownEvents(): Observable {\n return this._overlayRef.keydownEvents();\n }\n\n /**\n * Updates the dialog's position.\n *\n * @param position New dialog position.\n */\n updatePosition(position?: DialogPosition): this {\n const strategy = this._getPositionStrategy();\n\n if (position && (position.left || position.right)) {\n position.left\n ? strategy.left(position.left)\n : strategy.right(position.right);\n } else {\n strategy.centerHorizontally();\n }\n\n if (position && (position.top || position.bottom)) {\n position.top\n ? strategy.top(position.top)\n : strategy.bottom(position.bottom);\n } else {\n strategy.centerVertically();\n }\n\n this._overlayRef.updatePosition();\n\n return this;\n }\n\n /**\n * Updates the dialog's width and height.\n *\n * @param width New width of the dialog.\n * @param height New height of the dialog.\n */\n updateSize(width = '', height = ''): this {\n this._getPositionStrategy()\n // eslint-disable-next-line\n .width(width)\n // eslint-disable-next-line\n .height(height);\n this._overlayRef.updatePosition();\n return this;\n }\n\n /** Fetches the position strategy object from the overlay ref. */\n private _getPositionStrategy(): GlobalPositionStrategy {\n return this._overlayRef.getConfig()\n .positionStrategy as GlobalPositionStrategy;\n }\n}\n", + "sourceCode": "import { GlobalPositionStrategy, OverlayRef } from '@angular/cdk/overlay';\r\nimport { Observable, Subject } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { DialogPosition, OuiDialogConfig } from './dialog-config';\r\nimport { OuiDialogContainer } from './dialog-container';\r\n\r\n// TODO(jelbourn): resizing\r\n\r\n// Counter for unique dialog ids.\r\nlet uniqueId = 0;\r\n\r\n/**\r\n * Reference to a dialog opened via the OuiDialog service.\r\n */\r\nexport class OuiDialogRef {\r\n /** The instance of component opened into the dialog. */\r\n componentInstance: T;\r\n\r\n /** Whether the user is allowed to close the dialog. */\r\n disableClose: boolean | undefined =\r\n this._containerInstance._config.disableClose;\r\n\r\n /** Subject for notifying the user that the dialog has finished opening. */\r\n private readonly _afterOpened = new Subject();\r\n\r\n /** Subject for notifying the user that the dialog has finished closing. */\r\n private readonly _afterClosed = new Subject();\r\n\r\n /** Subject for notifying the user that the dialog has started closing. */\r\n private readonly _beforeClosed = new Subject();\r\n\r\n /** Result to be passed to afterClosed. */\r\n private _result: R | undefined;\r\n\r\n private _dialogConfig: OuiDialogConfig;\r\n\r\n public get dialogConfig(): OuiDialogConfig {\r\n return this._dialogConfig;\r\n }\r\n\r\n public set dialogConfig(config: OuiDialogConfig) {\r\n this._dialogConfig = config;\r\n }\r\n\r\n constructor(\r\n private _overlayRef: OverlayRef,\r\n public _containerInstance: OuiDialogContainer,\r\n readonly id: string = `oui-dialog-${uniqueId++}`\r\n ) {\r\n // Pass the id along to the container.\r\n _containerInstance._id = id;\r\n\r\n this._afterOpened.next();\r\n this._afterOpened.complete();\r\n\r\n _overlayRef.detachments().subscribe(() => {\r\n this._beforeClosed.next(this._result);\r\n this._beforeClosed.complete();\r\n this._afterClosed.next(this._result);\r\n this._afterClosed.complete();\r\n this.componentInstance = null!;\r\n this._overlayRef.dispose();\r\n });\r\n\r\n _overlayRef\r\n .keydownEvents()\r\n .pipe(filter((event) => event.key === 'Escape' && !this.disableClose))\r\n .subscribe(() => this.close());\r\n }\r\n\r\n /**\r\n * Close the dialog.\r\n *\r\n * @param dialogResult Optional result to return to the dialog opener.\r\n */\r\n close(dialogResult?: R): void {\r\n this._result = dialogResult;\r\n this._beforeClosed.next(dialogResult);\r\n this._beforeClosed.complete();\r\n this._overlayRef.detachBackdrop();\r\n this._overlayRef.dispose();\r\n }\r\n\r\n /**\r\n * Dynamically adds or removes focus from all open dialog containers.\r\n *\r\n * @param addFocus Whether to add focus (true) or remove focus (false).\r\n */\r\n toggleFocus(addFocus: boolean): void {\r\n this._containerInstance._toggleFocus(addFocus);\r\n }\r\n\r\n /**\r\n * Gets an observable that is notified when the dialog is finished opening.\r\n */\r\n afterOpened(): Observable {\r\n return this._afterOpened.asObservable();\r\n }\r\n\r\n /**\r\n * Gets an observable that is notified when the dialog is finished closing.\r\n */\r\n afterClosed(): Observable {\r\n return this._afterClosed.asObservable();\r\n }\r\n\r\n /**\r\n * Gets an observable that is notified when the dialog has started closing.\r\n */\r\n beforeClosed(): Observable {\r\n return this._beforeClosed.asObservable();\r\n }\r\n\r\n /**\r\n * Gets an observable that emits when the overlay's backdrop has been clicked.\r\n */\r\n backdropClick(): Observable {\r\n return this._overlayRef.backdropClick();\r\n }\r\n\r\n /**\r\n * Gets an observable that emits when keydown events are targeted on the overlay.\r\n */\r\n keydownEvents(): Observable {\r\n return this._overlayRef.keydownEvents();\r\n }\r\n\r\n /**\r\n * Updates the dialog's position.\r\n *\r\n * @param position New dialog position.\r\n */\r\n updatePosition(position?: DialogPosition): this {\r\n const strategy = this._getPositionStrategy();\r\n\r\n if (position && (position.left || position.right)) {\r\n if (position.left) {\r\n strategy.left(position.left);\r\n } else {\r\n strategy.right(position.right);\r\n }\r\n } else {\r\n strategy.centerHorizontally();\r\n }\r\n\r\n if (position && (position.top || position.bottom)) {\r\n if (position.top) {\r\n strategy.top(position.top);\r\n } else {\r\n strategy.bottom(position.bottom);\r\n }\r\n } else {\r\n strategy.centerVertically();\r\n }\r\n\r\n this._overlayRef.updatePosition();\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Updates the dialog's width and height.\r\n *\r\n * @param width New width of the dialog.\r\n * @param height New height of the dialog.\r\n */\r\n updateSize(width = '', height = ''): this {\r\n this._getPositionStrategy()\r\n // eslint-disable-next-line\r\n .width(width)\r\n // eslint-disable-next-line\r\n .height(height);\r\n this._overlayRef.updatePosition();\r\n return this;\r\n }\r\n\r\n /** Fetches the position strategy object from the overlay ref. */\r\n private _getPositionStrategy(): GlobalPositionStrategy {\r\n return this._overlayRef.getConfig()\r\n .positionStrategy as GlobalPositionStrategy;\r\n }\r\n}\r\n", "constructorObj": { "name": "constructor", "description": "", @@ -8380,6 +8380,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_afterClosed", @@ -8494,7 +8496,7 @@ "optional": false, "returnType": "GlobalPositionStrategy", "typeParameters": [], - "line": 165, + "line": 178, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nFetches the position strategy object from the overlay ref.", @@ -8509,7 +8511,7 @@ "optional": false, "returnType": "Observable", "typeParameters": [], - "line": 94, + "line": 103, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nGets an observable that is notified when the dialog is finished closing.\n", @@ -8521,7 +8523,7 @@ "optional": false, "returnType": "Observable", "typeParameters": [], - "line": 87, + "line": 96, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nGets an observable that is notified when the dialog is finished opening.\n", @@ -8533,7 +8535,7 @@ "optional": false, "returnType": "Observable", "typeParameters": [], - "line": 108, + "line": 117, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nGets an observable that emits when the overlay's backdrop has been clicked.\n", @@ -8545,7 +8547,7 @@ "optional": false, "returnType": "Observable", "typeParameters": [], - "line": 101, + "line": 110, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nGets an observable that is notified when the dialog has started closing.\n", @@ -8573,8 +8575,8 @@ "jsdoctags": [ { "name": { - "pos": 2222, - "end": 2234, + "pos": 2295, + "end": 2307, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -8586,8 +8588,8 @@ "deprecationMessage": "", "optional": true, "tagName": { - "pos": 2216, - "end": 2221, + "pos": 2289, + "end": 2294, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -8604,12 +8606,57 @@ "optional": false, "returnType": "Observable", "typeParameters": [], - "line": 115, + "line": 124, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nGets an observable that emits when keydown events are targeted on the overlay.\n", "description": "

Gets an observable that emits when keydown events are targeted on the overlay.

\n" }, + { + "name": "toggleFocus", + "args": [ + { + "name": "addFocus", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 89, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDynamically adds or removes focus from all open dialog containers.\n\n", + "description": "

Dynamically adds or removes focus from all open dialog containers.

\n", + "jsdoctags": [ + { + "name": { + "pos": 2691, + "end": 2699, + "flags": 16842752, + "modifierFlagsCache": 0, + "transformFlags": 0, + "kind": 80, + "escapedText": "addFocus" + }, + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "pos": 2685, + "end": 2690, + "flags": 16842752, + "modifierFlagsCache": 0, + "transformFlags": 0, + "kind": 80, + "escapedText": "param" + }, + "comment": "

Whether to add focus (true) or remove focus (false).

\n" + } + ] + }, { "name": "updatePosition", "args": [ @@ -8624,7 +8671,7 @@ "optional": false, "returnType": "", "typeParameters": [], - "line": 124, + "line": 133, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nUpdates the dialog's position.\n\n", @@ -8632,8 +8679,8 @@ "jsdoctags": [ { "name": { - "pos": 3497, - "end": 3505, + "pos": 3888, + "end": 3896, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -8645,8 +8692,8 @@ "deprecationMessage": "", "optional": true, "tagName": { - "pos": 3491, - "end": 3496, + "pos": 3882, + "end": 3887, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -8678,7 +8725,7 @@ "optional": false, "returnType": "", "typeParameters": [], - "line": 154, + "line": 167, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nUpdates the dialog's width and height.\n\n", @@ -8686,8 +8733,8 @@ "jsdoctags": [ { "name": { - "pos": 4192, - "end": 4197, + "pos": 4670, + "end": 4675, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -8699,8 +8746,8 @@ "deprecationMessage": "", "defaultValue": "''", "tagName": { - "pos": 4186, - "end": 4191, + "pos": 4664, + "end": 4669, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -8711,8 +8758,8 @@ }, { "name": { - "pos": 4235, - "end": 4241, + "pos": 4714, + "end": 4720, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -8724,8 +8771,8 @@ "deprecationMessage": "", "defaultValue": "''", "tagName": { - "pos": 4229, - "end": 4234, + "pos": 4708, + "end": 4713, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -8777,8 +8824,6 @@ } } }, - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -8816,6 +8861,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_elementRef", @@ -8835,8 +8882,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -8848,6 +8893,8 @@ "deprecationMessage": "", "type": "class", "sourceCode": "import { Observable } from 'rxjs';\nimport { NgControl } from '@angular/forms';\n\n/** An interface which allows a control to work inside of a `OuiFormField`. */\nexport abstract class OuiFormFieldControl {\n /** The value of the control. */\n value: T | null;\n\n /**\n * Stream that emits whenever the state of the control changes such that the parent `OuiFormField`\n * needs to run change detection.\n */\n readonly stateChanges: Observable;\n\n /** The element ID for this control. */\n readonly id: string;\n\n /** The placeholder for this control. */\n readonly placeholder: string;\n\n /** Gets the NgControl for this control. */\n readonly ngControl: NgControl | null;\n\n /** Whether the control is focused. */\n readonly focused: boolean;\n\n /** Whether the control is empty. */\n readonly empty: boolean;\n\n /** Whether the `OuiFormField` label should try to float. */\n readonly shouldLabelFloat: boolean;\n\n /** Whether the control is required. */\n readonly required: boolean;\n\n /** Whether the control is disabled. */\n readonly disabled: boolean;\n\n /** Whether the control is in an error state. */\n readonly errorState: boolean;\n\n /**\n * An optional name for the control type that can be used to distinguish `oui-form-field` elements\n * based on their control type. The form field will add a class,\n * `oui-form-field-type-{{controlType}}` to its root element.\n */\n readonly controlType?: string;\n\n /**\n * Whether the input is currently in an autofilled state. If property is not present on the\n * control it is assumed to be false.\n */\n readonly autofilled?: boolean;\n\n /** Sets the list of element IDs that currently describe this control. */\n abstract setDescribedByIds(ids: string[]): void;\n\n /** Handles a click on the control's container. */\n abstract onContainerClick(event: MouseEvent): void;\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "autofilled", @@ -9088,8 +9135,6 @@ ], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -9127,6 +9172,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_elementRef", @@ -9144,19 +9191,17 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, { "name": "OuiInkBar", - "id": "class-OuiInkBar-50fe2f1bca65db33aac094b14b277a02924ff4199f4bfe029de4c7e70c55f0d0b3d8f03cc04d8961159c28f0d20d52a85a2edbaf9f6b9506a466792860b45ccf", + "id": "class-OuiInkBar-135c8ccdab508fcf19b684306b7b52fe3cacc460ac2081644d8b0d211b3fb9a93c581e6b1e98ed9fdc3965312903a402f79f7ef73e228a1ef8f3bd236d89976f", "file": "ui/src/components/tabs/ink-bar.ts", "deprecated": false, "deprecationMessage": "", "type": "class", - "sourceCode": "import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport {\r\n ElementRef,\r\n InjectionToken,\r\n OnDestroy,\r\n OnInit,\r\n QueryList,\r\n} from '@angular/core';\r\nimport { isDevMode } from '@angular/core';\r\n\r\n/**\r\n * Item inside a tab header relative to which the ink bar can be aligned.\r\n * @docs-private\r\n */\r\nexport interface MatInkBarItem extends OnInit, OnDestroy {\r\n elementRef: ElementRef;\r\n activateInkBar(previousIndicatorClientRect?: ClientRect): void;\r\n deactivateInkBar(): void;\r\n fitInkBarToContent: boolean;\r\n}\r\n\r\n/** Class that is applied when a tab indicator is active. */\r\nconst ACTIVE_CLASS = 'mdc-tab-indicator--active';\r\n\r\n/** Class that is applied when the tab indicator should not transition. */\r\nconst NO_TRANSITION_CLASS = 'mdc-tab-indicator--no-transition';\r\n\r\n/**\r\n * Abstraction around the MDC tab indicator that acts as the tab header's ink bar.\r\n * @docs-private\r\n */\r\nexport class OuiInkBar {\r\n /** Item to which the ink bar is aligned currently. */\r\n private _currentItem: MatInkBarItem | undefined;\r\n\r\n constructor(private _items: QueryList) {}\r\n\r\n /** Hides the ink bar. */\r\n hide() {\r\n this._items.forEach((item) => item.deactivateInkBar());\r\n }\r\n\r\n /** Aligns the ink bar to a DOM node. */\r\n alignToElement(element: HTMLElement) {\r\n const correspondingItem = this._items.find(\r\n (item) => item.elementRef.nativeElement === element\r\n );\r\n const currentItem = this._currentItem;\r\n\r\n if (correspondingItem === currentItem) {\r\n return;\r\n }\r\n\r\n currentItem?.deactivateInkBar();\r\n\r\n if (correspondingItem) {\r\n const clientRect =\r\n currentItem?.elementRef.nativeElement.getBoundingClientRect?.();\r\n\r\n // The ink bar won't animate unless we give it the `ClientRect` of the previous item.\r\n correspondingItem.activateInkBar(clientRect);\r\n this._currentItem = correspondingItem;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Mixin that can be used to apply the `MatInkBarItem` behavior to a class.\r\n * Base on MDC's `MDCSlidingTabIndicatorFoundation`:\r\n * https://github.com/material-components/material-components-web/blob/c0a11ef0d000a098fd0c372be8f12d6a99302855/packages/mdc-tab-indicator/sliding-foundation.ts\r\n * @docs-private\r\n */\r\nexport function mixinInkBarItem<\r\n T extends new (...args: any[]) => { elementRef: ElementRef }\r\n>(base: T): T & (new (...args: any[]) => MatInkBarItem) {\r\n return class extends base {\r\n constructor(...args: any[]) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n super(...args);\r\n }\r\n\r\n private _inkBarElement: HTMLElement | null;\r\n private _inkBarContentElement: HTMLElement | null;\r\n private _fitToContent = false;\r\n\r\n /** Whether the ink bar should fit to the entire tab or just its content. */\r\n get fitInkBarToContent(): boolean {\r\n return this._fitToContent;\r\n }\r\n set fitInkBarToContent(v: BooleanInput) {\r\n const newValue = coerceBooleanProperty(v);\r\n\r\n if (this._fitToContent !== newValue) {\r\n this._fitToContent = newValue;\r\n\r\n if (this._inkBarElement) {\r\n this._appendInkBarElement();\r\n }\r\n }\r\n }\r\n\r\n /** Aligns the ink bar to the current item. */\r\n activateInkBar(previousIndicatorClientRect?: ClientRect) {\r\n const element = this.elementRef.nativeElement;\r\n\r\n // Early exit if no indicator is present to handle cases where an indicator\r\n // may be activated without a prior indicator state\r\n if (\r\n !previousIndicatorClientRect ||\r\n !element.getBoundingClientRect ||\r\n !this._inkBarContentElement\r\n ) {\r\n element.classList.add(ACTIVE_CLASS);\r\n return;\r\n }\r\n\r\n // This animation uses the FLIP approach. You can read more about it at the link below:\r\n // https://aerotwist.com/blog/flip-your-animations/\r\n\r\n // Calculate the dimensions based on the dimensions of the previous indicator\r\n const currentClientRect = element.getBoundingClientRect();\r\n const widthDelta =\r\n previousIndicatorClientRect.width / currentClientRect.width;\r\n const xPosition =\r\n previousIndicatorClientRect.left - currentClientRect.left;\r\n element.classList.add(NO_TRANSITION_CLASS);\r\n this._inkBarContentElement.style.setProperty(\r\n 'transform',\r\n `translateX(${xPosition}px) scaleX(${widthDelta})`\r\n );\r\n\r\n // Force repaint before updating classes and transform to ensure the transform properly takes effect\r\n element.getBoundingClientRect();\r\n\r\n element.classList.remove(NO_TRANSITION_CLASS);\r\n element.classList.add(ACTIVE_CLASS);\r\n this._inkBarContentElement.style.setProperty('transform', '');\r\n }\r\n\r\n /** Removes the ink bar from the current item. */\r\n deactivateInkBar() {\r\n this.elementRef.nativeElement.classList.remove(ACTIVE_CLASS);\r\n }\r\n\r\n /** Initializes the foundation. */\r\n ngOnInit() {\r\n this._createInkBarElement();\r\n }\r\n\r\n /** Destroys the foundation. */\r\n ngOnDestroy() {\r\n this._inkBarElement?.remove();\r\n this._inkBarElement = this._inkBarContentElement = null!;\r\n }\r\n\r\n /** Creates and appends the ink bar element. */\r\n private _createInkBarElement() {\r\n const documentNode =\r\n this.elementRef.nativeElement.ownerDocument || document;\r\n this._inkBarElement = documentNode.createElement('span');\r\n this._inkBarContentElement = documentNode.createElement('span');\r\n\r\n this._inkBarElement.className = 'mdc-tab-indicator';\r\n this._inkBarContentElement.className =\r\n 'mdc-tab-indicator__content mdc-tab-indicator__content--underline';\r\n\r\n this._inkBarElement.appendChild(this._inkBarContentElement);\r\n this._appendInkBarElement();\r\n }\r\n\r\n /**\r\n * Appends the ink bar to the tab host element or content, depending on whether\r\n * the ink bar should fit to content.\r\n */\r\n private _appendInkBarElement() {\r\n if (\r\n !this._inkBarElement &&\r\n (typeof isDevMode === 'undefined' || isDevMode)\r\n ) {\r\n throw Error(\r\n 'Ink bar element has not been created and cannot be appended'\r\n );\r\n }\r\n\r\n const parentElement = this._fitToContent\r\n ? this.elementRef.nativeElement.querySelector('.mdc-tab__content')\r\n : this.elementRef.nativeElement;\r\n\r\n if (!parentElement && (typeof isDevMode === 'undefined' || isDevMode)) {\r\n throw Error('Missing element to host the ink bar');\r\n }\r\n\r\n parentElement!.appendChild(this._inkBarElement!);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Interface for a OuiInkBar positioner method, defining the positioning and width of the ink\r\n * bar in a set of tabs.\r\n */\r\nexport interface _OuiInkBarPositioner {\r\n (element: HTMLElement): { left: string; width: string };\r\n}\r\n\r\n/**\r\n * The default positioner function for the OuiInkBar.\r\n * @docs-private\r\n */\r\nexport function _OUI_INK_BAR_POSITIONER_FACTORY(): _OuiInkBarPositioner {\r\n const method = (element: HTMLElement) => ({\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n left: element ? (element.offsetLeft || 0) + 'px' : '0',\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n width: element ? (element.offsetWidth || 0) + 'px' : '0',\r\n });\r\n\r\n return method;\r\n}\r\n\r\n/** Injection token for the OuiInkBar's Positioner. */\r\nexport const _OUI_INK_BAR_POSITIONER = new InjectionToken<_OuiInkBarPositioner>(\r\n 'MatInkBarPositioner',\r\n {\r\n providedIn: 'root',\r\n factory: _OUI_INK_BAR_POSITIONER_FACTORY,\r\n }\r\n);\r\n", + "sourceCode": "import { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n ElementRef,\n InjectionToken,\n OnDestroy,\n OnInit,\n QueryList,\n} from '@angular/core';\nimport { isDevMode } from '@angular/core';\n\n/**\n * Item inside a tab header relative to which the ink bar can be aligned.\n * @docs-private\n */\nexport interface MatInkBarItem extends OnInit, OnDestroy {\n elementRef: ElementRef;\n activateInkBar(previousIndicatorClientRect?: ClientRect): void;\n deactivateInkBar(): void;\n fitInkBarToContent: boolean;\n}\n\n/** Class that is applied when a tab indicator is active. */\nconst ACTIVE_CLASS = 'mdc-tab-indicator--active';\n\n/** Class that is applied when the tab indicator should not transition. */\nconst NO_TRANSITION_CLASS = 'mdc-tab-indicator--no-transition';\n\n/**\n * Abstraction around the MDC tab indicator that acts as the tab header's ink bar.\n * @docs-private\n */\nexport class OuiInkBar {\n /** Item to which the ink bar is aligned currently. */\n private _currentItem: MatInkBarItem | undefined;\n\n constructor(private _items: QueryList) {}\n\n /** Hides the ink bar. */\n hide() {\n this._items.forEach((item) => item.deactivateInkBar());\n }\n\n /** Aligns the ink bar to a DOM node. */\n alignToElement(element: HTMLElement) {\n const correspondingItem = this._items.find(\n (item) => item.elementRef.nativeElement === element\n );\n const currentItem = this._currentItem;\n\n if (correspondingItem === currentItem) {\n return;\n }\n\n currentItem?.deactivateInkBar();\n\n if (correspondingItem) {\n const clientRect =\n currentItem?.elementRef.nativeElement.getBoundingClientRect?.();\n\n // The ink bar won't animate unless we give it the `ClientRect` of the previous item.\n correspondingItem.activateInkBar(clientRect);\n this._currentItem = correspondingItem;\n }\n }\n}\n\n/**\n * Mixin that can be used to apply the `MatInkBarItem` behavior to a class.\n * Base on MDC's `MDCSlidingTabIndicatorFoundation`:\n * https://github.com/material-components/material-components-web/blob/c0a11ef0d000a098fd0c372be8f12d6a99302855/packages/mdc-tab-indicator/sliding-foundation.ts\n * @docs-private\n */\nexport function mixinInkBarItem<\n T extends new (...args: any[]) => { elementRef: ElementRef }\n>(base: T): T & (new (...args: any[]) => MatInkBarItem) {\n return class extends base {\n constructor(...args: any[]) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n super(...args);\n }\n\n private _inkBarElement: HTMLElement | null;\n private _inkBarContentElement: HTMLElement | null;\n private _fitToContent = false;\n\n /** Whether the ink bar should fit to the entire tab or just its content. */\n get fitInkBarToContent(): boolean {\n return this._fitToContent;\n }\n set fitInkBarToContent(v: BooleanInput) {\n const newValue = coerceBooleanProperty(v);\n\n if (this._fitToContent !== newValue) {\n this._fitToContent = newValue;\n\n if (this._inkBarElement) {\n this._appendInkBarElement();\n }\n }\n }\n\n /** Aligns the ink bar to the current item. */\n activateInkBar(previousIndicatorClientRect?: ClientRect) {\n const element = this.elementRef.nativeElement;\n\n // Early exit if no indicator is present to handle cases where an indicator\n // may be activated without a prior indicator state\n if (\n !previousIndicatorClientRect ||\n !element.getBoundingClientRect ||\n !this._inkBarContentElement\n ) {\n element.classList.add(ACTIVE_CLASS);\n return;\n }\n\n // This animation uses the FLIP approach. You can read more about it at the link below:\n // https://aerotwist.com/blog/flip-your-animations/\n\n // Calculate the dimensions based on the dimensions of the previous indicator\n const currentClientRect = element.getBoundingClientRect();\n const widthDelta =\n previousIndicatorClientRect.width / currentClientRect.width;\n const xPosition =\n previousIndicatorClientRect.left - currentClientRect.left;\n element.classList.add(NO_TRANSITION_CLASS);\n this._inkBarContentElement.style.setProperty(\n 'transform',\n `translateX(${xPosition}px) scaleX(${widthDelta})`\n );\n\n // Force repaint before updating classes and transform to ensure the transform properly takes effect\n element.getBoundingClientRect();\n\n element.classList.remove(NO_TRANSITION_CLASS);\n element.classList.add(ACTIVE_CLASS);\n this._inkBarContentElement.style.setProperty('transform', '');\n }\n\n /** Removes the ink bar from the current item. */\n deactivateInkBar() {\n this.elementRef.nativeElement.classList.remove(ACTIVE_CLASS);\n }\n\n /** Initializes the foundation. */\n ngOnInit() {\n this._createInkBarElement();\n }\n\n /** Destroys the foundation. */\n ngOnDestroy() {\n this._inkBarElement?.remove();\n this._inkBarElement = this._inkBarContentElement = null!;\n }\n\n /** Creates and appends the ink bar element. */\n private _createInkBarElement() {\n const documentNode =\n this.elementRef.nativeElement.ownerDocument || document;\n this._inkBarElement = documentNode.createElement('span');\n this._inkBarContentElement = documentNode.createElement('span');\n\n this._inkBarElement.className = 'mdc-tab-indicator';\n this._inkBarContentElement.className =\n 'mdc-tab-indicator__content mdc-tab-indicator__content--underline';\n\n this._inkBarElement.appendChild(this._inkBarContentElement);\n this._appendInkBarElement();\n }\n\n /**\n * Appends the ink bar to the tab host element or content, depending on whether\n * the ink bar should fit to content.\n */\n private _appendInkBarElement() {\n if (\n !this._inkBarElement &&\n (typeof isDevMode === 'undefined' || isDevMode)\n ) {\n throw Error(\n 'Ink bar element has not been created and cannot be appended'\n );\n }\n\n const parentElement = this._fitToContent\n ? this.elementRef.nativeElement.querySelector('.mdc-tab__content')\n : this.elementRef.nativeElement;\n\n if (!parentElement && (typeof isDevMode === 'undefined' || isDevMode)) {\n throw Error('Missing element to host the ink bar');\n }\n\n parentElement!.appendChild(this._inkBarElement!);\n }\n };\n}\n\n/**\n * Interface for a OuiInkBar positioner method, defining the positioning and width of the ink\n * bar in a set of tabs.\n */\nexport interface _OuiInkBarPositioner {\n (element: HTMLElement): { left: string; width: string };\n}\n\n/**\n * The default positioner function for the OuiInkBar.\n * @docs-private\n */\nexport function _OUI_INK_BAR_POSITIONER_FACTORY(): _OuiInkBarPositioner {\n const method = (element: HTMLElement) => ({\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n left: element ? (element.offsetLeft || 0) + 'px' : '0',\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n width: element ? (element.offsetWidth || 0) + 'px' : '0',\n });\n\n return method;\n}\n\n/** Injection token for the OuiInkBar's Positioner. */\nexport const _OUI_INK_BAR_POSITIONER = new InjectionToken<_OuiInkBarPositioner>(\n 'MatInkBarPositioner',\n {\n providedIn: 'root',\n factory: _OUI_INK_BAR_POSITIONER_FACTORY,\n }\n);\n", "constructorObj": { "name": "constructor", "description": "", @@ -9183,6 +9228,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_currentItem", @@ -9246,8 +9293,6 @@ ], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -9345,6 +9390,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_defaultErrorStateMatcher", @@ -9433,8 +9480,6 @@ "extends": [ "_OuiInputErrorMixinBase" ], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -9517,6 +9562,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_defaultErrorStateMatcher", @@ -9591,8 +9638,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -9604,12 +9649,12 @@ "deprecationMessage": "", "type": "class", "sourceCode": "import { FocusableOption, FocusMonitor, FocusOrigin } from '@angular/cdk/a11y';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n OnDestroy,\n ViewEncapsulation,\n Inject,\n Optional,\n Input,\n} from '@angular/core';\nimport { CanDisable, CanDisableCtor, mixinDisabled } from '../core';\nimport { Subject } from 'rxjs';\nimport { DOCUMENT } from '@angular/common';\nimport { OUI_MENU_PANEL, OuiMenuPanel } from './menu-panel';\n\n// Boilerplate for applying mixins to OuiMenuItem.\n\nexport class OuiMenuItemBase {}\nexport const _OuiMenuItemMixinBase: CanDisableCtor & typeof OuiMenuItemBase =\n mixinDisabled(OuiMenuItemBase);\n\n/**\n * This directive is intended to be used inside an oui-menu tag.\n * It exists mostly to set the role attribute.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `[oui-menu-item]`,\n exportAs: 'ouiMenuItem',\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.role]': 'role',\n class: 'oui-menu-item',\n '[class.oui-menu-item-highlighted]': '_highlighted',\n '[class.oui-menu-item-submenu-trigger]': '_triggersSubmenu',\n '[attr.tabindex]': '_getTabIndex()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.disabled]': 'disabled || null',\n '(click)': '_checkDisabled($event)',\n '(mouseenter)': '_handleMouseEnter()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: 'menu-item.html',\n})\nexport class OuiMenuItem\n extends _OuiMenuItemMixinBase\n implements FocusableOption, CanDisable, OnDestroy\n{\n /** ARIA role for the menu item. */\n @Input()\n role: 'menuitem' | 'menuitemradio' | 'menuitemcheckbox' = 'menuitem';\n\n private _document: Document;\n\n /** Stream that emits when the menu item is hovered. */\n readonly _hovered: Subject = new Subject();\n\n /** Whether the menu item is highlighted. */\n _highlighted = false;\n\n /** Whether the menu item acts as a trigger for a sub-menu. */\n _triggersSubmenu = false;\n\n constructor(\n private _elementRef: ElementRef,\n @Inject(DOCUMENT) document?: any,\n private _focusMonitor?: FocusMonitor,\n @Inject(OUI_MENU_PANEL)\n @Optional()\n private _parentMenu?: OuiMenuPanel\n ) {\n // @breaking-change 8.0.0 make `_focusMonitor` and `document` required params.\n super();\n\n if (_focusMonitor) {\n // Start monitoring the element so it gets the appropriate focused classes. We want\n // to show the focus style for menu items only when the focus was not caused by a\n // mouse or touch interaction.\n _focusMonitor.monitor(this._elementRef.nativeElement, false);\n }\n\n if (_parentMenu && _parentMenu.addItem) {\n _parentMenu.addItem(this);\n }\n\n this._document = document;\n }\n\n /** Focuses the menu item. */\n focus(origin: FocusOrigin = 'program'): void {\n if (this._focusMonitor) {\n this._focusMonitor.focusVia(this._getHostElement(), origin);\n } else {\n this._getHostElement().focus();\n }\n }\n\n ngOnDestroy() {\n if (this._focusMonitor) {\n this._focusMonitor.stopMonitoring(this._elementRef.nativeElement);\n }\n\n if (this._parentMenu && this._parentMenu.removeItem) {\n this._parentMenu.removeItem(this);\n }\n\n this._hovered.complete();\n }\n\n /** Used to set the `tabindex`. */\n _getTabIndex(): string {\n return this.disabled ? '-1' : '0';\n }\n\n /** Returns the host DOM element. */\n _getHostElement(): HTMLElement {\n return this._elementRef.nativeElement;\n }\n\n /** Prevents the default element actions if it is disabled. */\n _checkDisabled(event: Event): void {\n if (this.disabled) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n /** Emits to the hover stream. */\n _handleMouseEnter() {\n this._hovered.next(this);\n }\n\n /** Gets the label to be used when determining whether the option should be focused. */\n getLabel(): string {\n const element: HTMLElement = this._elementRef.nativeElement;\n const textNodeType = this._document ? this._document.TEXT_NODE : 3;\n let output = '';\n\n if (element.childNodes) {\n const length = element.childNodes.length;\n\n // Go through all the top-level text nodes and extract their text.\n // We skip anything that's not a text node to prevent the text from\n // being thrown off by something like an icon.\n for (let i = 0; i < length; i++) {\n if (element.childNodes[i].nodeType === textNodeType) {\n output += element.childNodes[i].textContent;\n }\n }\n }\n\n return output.trim();\n }\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [], "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -9621,23 +9666,23 @@ "deprecationMessage": "", "type": "class", "sourceCode": "import {\n ChangeDetectionStrategy,\n Component,\n Input,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n CanDisable,\n CanDisableCtor,\n mixinDisabled,\n} from '../common-behaviors/disabled';\n\n// Boilerplate for applying mixins to OuiOptgroup.\n/** @docs-private */\nexport class OuiOptgroupBase {}\nexport const _OuiOptgroupMixinBase: CanDisableCtor & typeof OuiOptgroupBase =\n mixinDisabled(OuiOptgroupBase);\n\n// Counter for unique group ids.\nlet _uniqueOptgroupIdCounter = 0;\n\n/**\n * Component that is used to group instances of `oui-option`.\n */\n@Component({\n selector: 'oui-optgroup',\n exportAs: 'ouiOptgroup',\n templateUrl: 'optgroup.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled'],\n styleUrls: ['optgroup.scss'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-optgroup',\n role: 'group',\n '[class.oui-optgroup-disabled]': 'disabled',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.aria-labelledby]': '_labelId',\n },\n})\nexport class OuiOptgroup extends _OuiOptgroupMixinBase implements CanDisable {\n /** Label for the option group. */\n @Input()\n label: string;\n\n /** Unique id for the underlying label. */\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n _labelId: string = `oui-optgroup-label-${_uniqueOptgroupIdCounter++}`;\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [], "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, { "name": "OuiOptionSelectionChange", - "id": "class-OuiOptionSelectionChange-436221d2917bb329efe9ec76f95eb377b81359f9380f577db0c0ce2da5a0904b6eee34d58bbfe6f9af17f79a4a5c6deb5879f211cbb416ef7a77f3b11b3bc534", + "id": "class-OuiOptionSelectionChange-6803c2b34ba11ee66c956668869be7746da442626cda9f8b384b5071dcad58a7685f856cc2e7cb60f03aba43a3989b6e24b0ec44dbf21413ada07dbfb2fa712a", "file": "ui/src/components/core/option/option.ts", "deprecated": false, "deprecationMessage": "", "type": "class", - "sourceCode": "import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\nimport {\n AfterViewChecked,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewEncapsulation,\n NgZone,\n} from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { OuiOptgroup } from './optgroup';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/**\n * Option IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nlet _uniqueIdCounter = 0;\n\n/** Event object emitted by OuiOption when selected or deselected. */\nexport class OuiOptionSelectionChange {\n constructor(\n /** Reference to the option that emitted the event. */\n public source: OuiOption,\n /** Whether the change in the option's value was a result of a user action. */\n public isUserInput = false\n ) {}\n}\n\n/**\n * Describes a parent component that manages a list of options.\n * Contains properties that the options can inherit.\n *\n * @docs-private\n */\nexport interface OuiOptionParentComponent {\n multiple?: boolean;\n}\n\n/**\n * Injection token used to provide the parent component to options.\n */\nexport const OUI_OPTION_PARENT_COMPONENT =\n new InjectionToken('OUI_OPTION_PARENT_COMPONENT');\n\n/**\n * Single option inside of a `` element.\n */\n@Component({\n selector: 'oui-option',\n exportAs: 'ouiOption',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n role: 'option',\n '[attr.tabindex]': '_getTabIndex()',\n '[class.oui-selected]': 'selected',\n '[class.oui-option-multiple]': 'multiple',\n '[class.oui-active]': 'active',\n '[id]': 'id',\n '[attr.aria-selected]': 'selected.toString()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[class.oui-option-disabled]': 'disabled',\n '(click)': '_selectViaInteraction()',\n '(keydown)': '_handleKeydown($event)',\n class: 'oui-option',\n },\n styleUrls: ['option.scss'],\n templateUrl: 'option.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiOption implements AfterViewChecked, OnDestroy {\n private _selected = false;\n private _active = false;\n private _disabled = false;\n private _mostRecentViewValue = '';\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n /** Whether the wrapping component is in multiple selection mode. */\n get multiple() {\n return this._parent && this._parent.multiple;\n }\n\n /** Whether or not the option is currently selected. */\n get selected(): boolean {\n return this._selected;\n }\n\n /** The form value of the option. */\n @Input()\n value: any;\n\n /** The unique ID of the option. */\n @Input()\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n id = `oui-option-${_uniqueIdCounter++}`;\n\n /** Whether the option is disabled. */\n @Input()\n get disabled() {\n return (this.group && this.group.disabled) || this._disabled;\n }\n set disabled(value: any) {\n this._disabled = coerceBooleanProperty(value);\n }\n\n /** Event emitted when the option is selected or deselected. */\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onSelectionChange = new EventEmitter();\n\n /** Emits when the state of the option changes and any parents have to be notified. */\n readonly _stateChanges = new Subject();\n\n constructor(\n private _element: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Optional()\n @Inject(OUI_OPTION_PARENT_COMPONENT)\n private _parent: OuiOptionParentComponent,\n @Optional() readonly group: OuiOptgroup\n ) {\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n\n /**\n * Whether or not the option is currently active and ready to be selected.\n * An active option displays styles as if it is focused, but the\n * focus is actually retained somewhere else. This comes in handy\n * for components like autocomplete where focus must remain on the input.\n */\n get active(): boolean {\n return this._active;\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValue(): string {\n return (this._getHostElement().textContent || '').trim();\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValueForSelect(): string {\n return this._getHostElement().querySelector('.oui-option-text').innerHTML;\n }\n\n /** Selects the option. */\n select(): void {\n if (!this._selected) {\n this._selected = true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Deselects the option. */\n deselect(): void {\n if (this._selected) {\n this._selected = false;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Sets focus onto this option. */\n focus(): void {\n const element = this._getHostElement();\n\n if (typeof element.focus === 'function') {\n element.focus();\n }\n }\n\n /**\n * This method sets display styles on the option to make it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setActiveStyles(): void {\n if (!this._active) {\n this._active = true;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * This method removes display styles on the option that made it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setInactiveStyles(): void {\n if (this._active) {\n this._active = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /** Gets the label to be used when determining whether the option should be focused. */\n getLabel(): string {\n return this.viewValue;\n }\n\n /** Ensures the option is selected when activated from the keyboard. */\n _handleKeydown(event: KeyboardEvent): void {\n if (event.keyCode === ENTER || event.keyCode === SPACE) {\n this._selectViaInteraction();\n\n // Prevent the page from scrolling down and form submits.\n event.preventDefault();\n }\n }\n\n /**\n * `Selects the option while indicating the selection came from the user. Used to\n * determine if the select's view -> model callback should be invoked.`\n */\n _selectViaInteraction(): void {\n if (!this.disabled) {\n this._selected = this.multiple ? !this._selected : true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent(true);\n }\n }\n\n /** Returns the correct tabindex for the option depending on disabled state. */\n _getTabIndex(): string {\n return this.disabled ? '-1' : '0';\n }\n\n /** Gets the host DOM element. */\n _getHostElement(): HTMLElement {\n return this._element.nativeElement;\n }\n\n ngAfterViewChecked() {\n // Since parent components could be using the option's label to display the selected values\n // (e.g. `oui-select`) and they don't have a way of knowing if the option's label has changed\n // we have to check for changes in the DOM ourselves and dispatch an event. These checks are\n // relatively cheap, however we still limit them only to selected options in order to avoid\n // hitting the DOM too often.\n if (this._selected) {\n const viewValue = this.viewValue;\n\n if (viewValue !== this._mostRecentViewValue) {\n this._mostRecentViewValue = viewValue;\n this._stateChanges.next();\n }\n }\n }\n\n ngOnDestroy() {\n this._stateChanges.complete();\n this._monitorSubscription.unsubscribe();\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n\n /** Emits the selection change event. */\n private _emitSelectionChangeEvent(isUserInput = false): void {\n this.onSelectionChange.emit(\n new OuiOptionSelectionChange(this, isUserInput)\n );\n }\n}\n\n/**\n * Counts the amount of option group labels that precede the specified option.\n *\n * @param optionIndex Index of the option at which to start counting.\n * @param options Flat list of all of the options.\n * @param optionGroups Flat list of all of the option groups.\n * @docs-private\n */\nexport function _countGroupLabelsBeforeOption(\n optionIndex: number,\n options: QueryList,\n optionGroups: QueryList\n): number {\n if (optionGroups.length) {\n const optionsArray = options.toArray();\n const groups = optionGroups.toArray();\n let groupCounter = 0;\n\n for (let i = 0; i <= optionIndex; i++) {\n if (\n optionsArray[i].group &&\n optionsArray[i].group === groups[groupCounter]\n ) {\n groupCounter++;\n }\n }\n\n return groupCounter;\n }\n\n return 0;\n}\n\n/**\n * Determines the position to which to scroll a panel in order for an option to be into view.\n *\n * @param optionIndex Index of the option to be scrolled into the view.\n * @param optionHeight Height of the options.\n * @param currentScrollPosition Current scroll position of the panel.\n * @param panelHeight Height of the panel.\n * @docs-private\n */\nexport function _getOptionScrollPosition(\n optionIndex: number,\n optionHeight: number,\n currentScrollPosition: number,\n panelHeight: number\n): number {\n const optionOffset = optionIndex * optionHeight;\n\n if (optionOffset < currentScrollPosition) {\n return optionOffset;\n }\n\n if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {\n return Math.max(0, optionOffset - panelHeight + optionHeight);\n }\n\n return currentScrollPosition;\n}\n", + "sourceCode": "import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\nimport {\n AfterViewChecked,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewEncapsulation,\n NgZone,\n} from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { OuiOptgroup } from './optgroup';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/**\n * Option IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nlet _uniqueIdCounter = 0;\n\n/** Event object emitted by OuiOption when selected or deselected. */\nexport class OuiOptionSelectionChange {\n constructor(\n /** Reference to the option that emitted the event. */\n public source: OuiOption,\n /** Whether the change in the option's value was a result of a user action. */\n public isUserInput = false\n ) {}\n}\n\n/**\n * Describes a parent component that manages a list of options.\n * Contains properties that the options can inherit.\n *\n * @docs-private\n */\nexport interface OuiOptionParentComponent {\n multiple?: boolean;\n}\n\n/**\n * Injection token used to provide the parent component to options.\n */\nexport const OUI_OPTION_PARENT_COMPONENT =\n new InjectionToken('OUI_OPTION_PARENT_COMPONENT');\n\n/**\n * Single option inside of a `` element.\n */\n@Component({\n selector: 'oui-option',\n exportAs: 'ouiOption',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n role: 'option',\n '[attr.tabindex]': '_getTabIndex()',\n '[class.oui-selected]': 'selected',\n '[class.oui-option-multiple]': 'multiple',\n '[class.oui-active]': 'active',\n '[id]': 'id',\n '[attr.aria-selected]': 'selected.toString()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[class.oui-option-disabled]': 'disabled',\n '(click)': '_selectViaInteraction()',\n '(keydown)': '_handleKeydown($event)',\n class: 'oui-option',\n },\n styleUrls: ['option.scss'],\n templateUrl: 'option.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiOption implements AfterViewChecked, OnDestroy {\n private _selected = false;\n private _active = false;\n private _disabled = false;\n private _mostRecentViewValue = '';\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n /** Whether the wrapping component is in multiple selection mode. */\n get multiple() {\n return this._parent && this._parent.multiple;\n }\n\n /** Whether or not the option is currently selected. */\n get selected(): boolean {\n return this._selected;\n }\n\n /** The form value of the option. */\n @Input()\n value: any;\n\n /** The unique ID of the option. */\n @Input()\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n id = `oui-option-${_uniqueIdCounter++}`;\n\n /** Whether the option is disabled. */\n @Input()\n get disabled() {\n return (this.group && this.group.disabled) || this._disabled;\n }\n set disabled(value: any) {\n this._disabled = coerceBooleanProperty(value);\n }\n\n /** Event emitted when the option is selected or deselected. */\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onSelectionChange = new EventEmitter();\n\n /** Emits when the state of the option changes and any parents have to be notified. */\n readonly _stateChanges = new Subject();\n\n constructor(\n private _element: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Optional()\n @Inject(OUI_OPTION_PARENT_COMPONENT)\n private _parent: OuiOptionParentComponent,\n @Optional() readonly group: OuiOptgroup\n ) {\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n\n /**\n * Whether or not the option is currently active and ready to be selected.\n * An active option displays styles as if it is focused, but the\n * focus is actually retained somewhere else. This comes in handy\n * for components like autocomplete where focus must remain on the input.\n */\n get active(): boolean {\n return this._active;\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValue(): string {\n return (this._getHostElement().textContent || '').trim();\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValueForSelect(): string {\n return this._getHostElement().querySelector('.oui-option-text').innerHTML;\n }\n\n /** Selects the option. */\n select(): void {\n if (!this._selected) {\n this._selected = true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Deselects the option. */\n deselect(): void {\n if (this._selected) {\n this._selected = false;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Sets focus onto this option. */\n focus(): void {\n const element = this._getHostElement();\n\n if (typeof element.focus === 'function') {\n element.focus();\n }\n }\n\n /**\n * This method sets display styles on the option to make it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setActiveStyles(): void {\n if (!this._active) {\n this._active = true;\n setTimeout((_) => {\n const focusedElement = document.querySelector(\n '.oui-active'\n ) as HTMLElement;\n const multiSelect = document.querySelector(\n '.oui-option-pseudo-checkbox'\n ) as HTMLElement;\n const ouiSearch = document.querySelector('.oui-select-search-input');\n if (focusedElement && !multiSelect && !ouiSearch) {\n focusedElement?.focus();\n }\n });\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * This method removes display styles on the option that made it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setInactiveStyles(): void {\n if (this._active) {\n this._active = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /** Gets the label to be used when determining whether the option should be focused. */\n getLabel(): string {\n return this.viewValue;\n }\n\n /** Ensures the option is selected when activated from the keyboard. */\n _handleKeydown(event: KeyboardEvent): void {\n if (event.keyCode === ENTER || event.keyCode === SPACE) {\n this._selectViaInteraction();\n\n // Prevent the page from scrolling down and form submits.\n event.preventDefault();\n }\n }\n\n /**\n * `Selects the option while indicating the selection came from the user. Used to\n * determine if the select's view -> model callback should be invoked.`\n */\n _selectViaInteraction(): void {\n if (!this.disabled) {\n this._selected = this.multiple ? !this._selected : true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent(true);\n }\n }\n\n /** Returns the correct tabindex for the option depending on disabled state. */\n _getTabIndex(): string {\n return this.disabled ? '-1' : '0';\n }\n\n /** Gets the host DOM element. */\n _getHostElement(): HTMLElement {\n return this._element.nativeElement;\n }\n\n ngAfterViewChecked() {\n // Since parent components could be using the option's label to display the selected values\n // (e.g. `oui-select`) and they don't have a way of knowing if the option's label has changed\n // we have to check for changes in the DOM ourselves and dispatch an event. These checks are\n // relatively cheap, however we still limit them only to selected options in order to avoid\n // hitting the DOM too often.\n if (this._selected) {\n const viewValue = this.viewValue;\n\n if (viewValue !== this._mostRecentViewValue) {\n this._mostRecentViewValue = viewValue;\n this._stateChanges.next();\n }\n }\n }\n\n ngOnDestroy() {\n this._stateChanges.complete();\n this._monitorSubscription.unsubscribe();\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n\n /** Emits the selection change event. */\n private _emitSelectionChangeEvent(isUserInput = false): void {\n this.onSelectionChange.emit(\n new OuiOptionSelectionChange(this, isUserInput)\n );\n }\n}\n\n/**\n * Counts the amount of option group labels that precede the specified option.\n *\n * @param optionIndex Index of the option at which to start counting.\n * @param options Flat list of all of the options.\n * @param optionGroups Flat list of all of the option groups.\n * @docs-private\n */\nexport function _countGroupLabelsBeforeOption(\n optionIndex: number,\n options: QueryList,\n optionGroups: QueryList\n): number {\n if (optionGroups.length) {\n const optionsArray = options.toArray();\n const groups = optionGroups.toArray();\n let groupCounter = 0;\n\n for (let i = 0; i <= optionIndex; i++) {\n if (\n optionsArray[i].group &&\n optionsArray[i].group === groups[groupCounter]\n ) {\n groupCounter++;\n }\n }\n\n return groupCounter;\n }\n\n return 0;\n}\n\n/**\n * Determines the position to which to scroll a panel in order for an option to be into view.\n *\n * @param optionIndex Index of the option to be scrolled into the view.\n * @param optionHeight Height of the options.\n * @param currentScrollPosition Current scroll position of the panel.\n * @param panelHeight Height of the panel.\n * @docs-private\n */\nexport function _getOptionScrollPosition(\n optionIndex: number,\n optionHeight: number,\n currentScrollPosition: number,\n panelHeight: number,\n selectedOptionOffset?: number\n): number {\n const optionOffset = selectedOptionOffset || optionIndex * optionHeight;\n\n if (optionOffset < currentScrollPosition) {\n return optionOffset;\n }\n\n if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {\n return Math.max(0, optionOffset - panelHeight + optionHeight);\n }\n\n return currentScrollPosition;\n}\n", "constructorObj": { "name": "constructor", "description": "", @@ -9681,6 +9726,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "isUserInput", @@ -9715,8 +9762,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -9728,12 +9773,12 @@ "deprecationMessage": "", "type": "class", "sourceCode": "import {\n coerceNumberProperty,\n coerceBooleanProperty,\n} from '@angular/cdk/coercion';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { OuiPaginatorIntl } from './paginator-intl';\nimport {\n HasInitialized,\n HasInitializedCtor,\n mixinInitialized,\n mixinDisabled,\n CanDisableCtor,\n CanDisable,\n} from '../core';\n\n/** The default page size if there is no page size and there are no provided page size options. */\nconst DEFAULT_PAGE_SIZE = 30;\n\n/**\n * Change event object that is emitted when the user selects a\n * different page size or navigates to another page.\n */\nexport class PageEvent {\n /** The current page index. */\n pageIndex: number;\n\n /**\n * Index of the page that was selected previously.\n *\n * @breaking-change 8.0.0 To be made into a required property.\n */\n previousPageIndex?: number;\n\n /** The current page size */\n pageSize: number;\n\n /** The current total number of items being paged */\n length: number;\n}\n\n// Boilerplate for applying mixins to OuiPaginator.\n/** @docs-private */\nexport class OuiPaginatorBase {}\nexport const _OuiPaginatorBase: CanDisableCtor &\n HasInitializedCtor &\n typeof OuiPaginatorBase = mixinDisabled(mixinInitialized(OuiPaginatorBase));\n\n/**\n * Component to provide navigation between paged information. Displays the size of the current\n * page, user-selectable options to change that size, what items are being shown, and\n * navigational button to go to the previous or next page.\n */\n@Component({\n selector: 'oui-paginator',\n exportAs: 'ouiPaginator',\n templateUrl: 'paginator.html',\n styleUrls: ['paginator.scss'],\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-paginator',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class OuiPaginator\n extends _OuiPaginatorBase\n implements OnInit, OnDestroy, CanDisable, HasInitialized\n{\n private _initialized: boolean;\n private _intlChanges: Subscription;\n\n /** The zero-based page index of the displayed list of items. Defaulted to 0. */\n @Input()\n get pageIndex(): number {\n return this._pageIndex;\n }\n set pageIndex(value: number) {\n this._pageIndex = Math.max(coerceNumberProperty(value), 0);\n this._changeDetectorRef.markForCheck();\n }\n _pageIndex = 0;\n\n /** The length of the total number of items that are being paginated. Defaulted to 0. */\n @Input()\n get length(): number {\n return this._length;\n }\n set length(value: number) {\n this._length = coerceNumberProperty(value);\n this._changeDetectorRef.markForCheck();\n }\n _length = 0;\n\n /** Number of items to display on a page. By default set to 50. */\n @Input()\n get pageSize(): number {\n return this._pageSize;\n }\n set pageSize(value: number) {\n this._pageSize = Math.max(coerceNumberProperty(value), 0);\n }\n private _pageSize: number = DEFAULT_PAGE_SIZE;\n\n /** Whether to hide the page size selection UI from the user. */\n @Input()\n get hidePageSize(): boolean {\n return this._hidePageSize;\n }\n set hidePageSize(value: boolean) {\n this._hidePageSize = coerceBooleanProperty(value);\n }\n private _hidePageSize = false;\n\n /** Event emitted when the paginator changes the page size or page index. */\n @Output()\n readonly page: EventEmitter = new EventEmitter();\n\n /** Displayed set of page size options. Will be sorted and include current page size. */\n _displayedPageSizeOptions: number;\n\n constructor(\n public _intl: OuiPaginatorIntl,\n private _changeDetectorRef: ChangeDetectorRef\n ) {\n super();\n this._intlChanges = _intl.changes.subscribe(() =>\n this._changeDetectorRef.markForCheck()\n );\n }\n\n ngOnInit() {\n this._initialized = true;\n this._markInitialized();\n }\n\n ngOnDestroy() {\n this._intlChanges.unsubscribe();\n }\n\n /** Advances to the next page if it exists. */\n nextPage(): void {\n if (!this.hasNextPage() || !this._initialized) {\n return;\n }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex++;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Move back to the previous page if it exists. */\n previousPage(): void {\n if (!this.hasPreviousPage()) {\n return;\n }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex--;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Move to the first page if not already there. */\n firstPage(): void {\n // hasPreviousPage being false implies at the start\n if (!this.hasPreviousPage()) {\n return;\n }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex = 0;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Move to the last page if not already there. */\n lastPage(): void {\n // hasNextPage being false implies at the end\n if (!this.hasNextPage()) {\n return;\n }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex = this.getNumberOfPages() - 1;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Whether there is a previous page. */\n hasPreviousPage(): boolean {\n return this.pageIndex >= 1 && this.pageSize !== 0;\n }\n\n /** Whether there is a next page. */\n hasNextPage(): boolean {\n const maxPageIndex = this.getNumberOfPages() - 1;\n return this.pageIndex < maxPageIndex && this.pageSize !== 0;\n }\n\n /** Calculate the number of pages */\n getNumberOfPages(): number {\n if (!this.pageSize || this.length < 0) {\n return 0;\n }\n\n return Math.ceil(this.length / this.pageSize);\n }\n\n /** Get current page */\n getCurrentPage(): number {\n if (!this.pageSize || this.length <= 0) {\n return 0;\n }\n\n return this.pageIndex + 1;\n }\n\n /**\n * Changes the page size so that the first item displayed on the page will still be\n * displayed using the new page size.\n *\n * For example, if the page size is 10 and on the second page (items indexed 10-19) then\n * switching so that the page size is 5 will set the third page as the current page so\n * that the 10th item will still be displayed.\n */\n _changePageSize(pageSize: number) {\n // Current page needs to be updated to reflect the new page size. Navigate to the page\n // containing the previous page's first item.\n const startIndex = this.pageIndex * this.pageSize;\n const previousPageIndex = this.pageIndex;\n\n this.pageIndex = Math.floor(startIndex / pageSize) || 0;\n this.pageSize = pageSize;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Checks whether the buttons for going forwards should be disabled. */\n _nextButtonsDisabled() {\n return this.disabled || !this.hasNextPage();\n }\n\n /** Checks whether the buttons for going backwards should be disabled. */\n _previousButtonsDisabled() {\n return this.disabled || !this.hasPreviousPage();\n }\n\n /** Emits an event notifying that a change of the paginator's properties has been triggered. */\n private _emitPageEvent(previousPageIndex: number) {\n this.page.emit({\n previousPageIndex,\n pageIndex: this.pageIndex,\n pageSize: this.pageSize,\n length: this.length,\n });\n }\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [], "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -9771,6 +9816,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_elementRef", @@ -9788,8 +9835,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -9827,6 +9872,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_elementRef", @@ -9844,8 +9891,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -9883,6 +9928,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_elementRef", @@ -9900,8 +9947,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -9954,6 +9999,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "source", @@ -9987,8 +10034,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -10000,23 +10045,23 @@ "deprecationMessage": "", "type": "class", "sourceCode": "import { FocusMonitor } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { UniqueSelectionDispatcher } from '@angular/cdk/collections';\nimport {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n forwardRef,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { mixinColor } from '../core';\nimport { Subscription } from 'rxjs';\n// Increasing integer for generating unique ids for radio components.\nlet nextUniqueId = 0;\n\n/**\n * Provider Expression that allows oui-radio-group to register as a ControlValueAccessor. This\n * allows it to support [(ngModel)] and ngControl.\n *\n * @docs-private\n */\nexport const OUI_RADIO_GROUP_CONTROL_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OuiRadioGroup),\n multi: true,\n};\n\n/** Change event object emitted by OuiRadio and OuiRadioGroup. */\nexport class OuiRadioChange {\n constructor(\n /** The OuiRadioButton that emits the change event. */\n public source: OuiRadioButton,\n /** The value of the OuiRadioButton. */\n public value: any\n ) {}\n}\n\n// Boilerplate for applying mixins to OuiRadioGroup.\n/** @docs-private */\nexport class OuiRadioGroupBase {}\n\n/**\n * A group of radio buttons. May contain one or more `` elements.\n */\n@Component({\n selector: 'oui-radio-group',\n exportAs: 'ouiRadioGroup',\n template: ` `,\n providers: [OUI_RADIO_GROUP_CONTROL_VALUE_ACCESSOR],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n role: 'radiogroup',\n class: 'oui-radio-group',\n },\n})\nexport class OuiRadioGroup implements AfterContentInit, ControlValueAccessor {\n /**\n * Event emitted when the group value changes.\n * Change events are only emitted when the value changes due to user interaction with\n * a radio button (the same behavior as ``).\n */\n @Output()\n readonly change: EventEmitter =\n new EventEmitter();\n\n /** Child radio buttons. */\n @ContentChildren(forwardRef(() => OuiRadioButton), { descendants: true })\n _radios: QueryList;\n /** Selected value for the radio group. */\n private _value: any = null;\n\n /** The HTML name attribute applied to radio buttons in this group. */\n private _name = `oui-radio-group-${nextUniqueId++}`;\n\n /** The currently selected radio button. Should match value. */\n private _selected: OuiRadioButton | null = null;\n\n /** Whether the `value` has been set to its initial value. */\n private _isInitialized = false;\n\n /** Whether the labels should appear after or before the radio-buttons. Defaults to 'after' */\n private _labelPosition: 'before' | 'after' = 'after';\n\n /** Whether the radio group is disabled. */\n private _disabled = false;\n\n /** Whether the radio group is required. */\n private _required = false;\n\n /** The method to be called in order to update ngModel */\n _controlValueAccessorChangeFn: (value: any) => void = () => {};\n\n /**\n * onTouch function registered via registerOnTouch (ControlValueAccessor).\n *\n * @docs-private\n */\n onTouched: () => any = () => {};\n\n /** Name of the radio button group. All radio buttons inside this group will use this name. */\n @Input()\n get name(): string {\n return this._name;\n }\n set name(value: string) {\n this._name = value;\n this._updateRadioButtonNames();\n }\n\n /** Whether the labels should appear after or before the radio-buttons. Defaults to `after` */\n @Input()\n get labelPosition(): 'before' | 'after' {\n return this._labelPosition;\n }\n set labelPosition(v) {\n this._labelPosition = v === 'before' ? 'before' : 'after';\n this._markRadiosForCheck();\n }\n\n /**\n * Value for the radio-group. Should equal the value of the selected radio button if there is\n * a corresponding radio button with a matching value. If there is not such a corresponding\n * radio button, this value persists to be applied in case a new radio button is added with a\n * matching value.\n */\n @Input()\n get value(): any {\n return this._value;\n }\n set value(newValue: any) {\n if (this._value !== newValue) {\n // Set this before proceeding to ensure no circular loop occurs with selection.\n this._value = newValue;\n\n this._updateSelectedRadioFromValue();\n this._checkSelectedRadioButton();\n }\n }\n\n _checkSelectedRadioButton() {\n if (this._selected && !this._selected.checked) {\n this._selected.checked = true;\n }\n }\n\n /**\n * The currently selected radio button. If set to a new radio button, the radio group value\n * will be updated to match the new selected button.\n */\n @Input()\n get selected() {\n return this._selected;\n }\n set selected(selected) {\n this._selected = selected;\n this.value = selected ? selected.value : null;\n this._checkSelectedRadioButton();\n }\n\n /** Whether the radio group is disabled */\n @Input()\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n this._markRadiosForCheck();\n }\n\n /** Whether the radio group is required */\n @Input()\n get required(): boolean {\n return this._required;\n }\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n this._markRadiosForCheck();\n }\n\n constructor(private _changeDetector: ChangeDetectorRef) {}\n\n /**\n * Initialize properties once content children are available.\n * This allows us to propagate relevant attributes to associated buttons.\n */\n ngAfterContentInit() {\n // Mark this component as initialized in AfterContentInit because the initial value can\n // possibly be set by NgModel on OuiRadioGroup, and it is possible that the OnInit of the\n // NgModel occurs *after* the OnInit of the OuiRadioGroup.\n this._isInitialized = true;\n }\n\n /**\n * Mark this group as being \"touched\" (for ngModel). Meant to be called by the contained\n * radio buttons upon their blur.\n */\n _touch() {\n if (this.onTouched) {\n this.onTouched();\n }\n }\n\n private _updateRadioButtonNames(): void {\n if (this._radios) {\n this._radios.forEach((radio) => {\n radio.name = this.name;\n });\n }\n }\n\n /** Updates the `selected` radio button from the internal _value state. */\n private _updateSelectedRadioFromValue(): void {\n // If the value already matches the selected radio, do nothing.\n const isAlreadySelected =\n this._selected !== null && this._selected.value === this._value;\n\n if (this._radios && !isAlreadySelected) {\n this._selected = null;\n this._radios.forEach((radio) => {\n radio.checked = this.value === radio.value;\n if (radio.checked) {\n this._selected = radio;\n }\n });\n }\n }\n\n /** Dispatch change event with current selection and group value. */\n _emitChangeEvent(): void {\n if (this._isInitialized) {\n this.change.emit(new OuiRadioChange(this._selected!, this._value));\n }\n }\n\n _markRadiosForCheck() {\n if (this._radios) {\n this._radios.forEach((radio) => radio._markForCheck());\n }\n }\n\n /**\n * Sets the model value. Implemented as part of ControlValueAccessor.\n *\n * @param value\n */\n writeValue(value: any) {\n this.value = value;\n this._changeDetector.markForCheck();\n }\n\n /**\n * Registers a callback to be triggered when the model value changes.\n * Implemented as part of ControlValueAccessor.\n *\n * @param fn Callback to be registered.\n */\n registerOnChange(fn: (value: any) => void) {\n this._controlValueAccessorChangeFn = fn;\n }\n\n /**\n * Registers a callback to be triggered when the control is touched.\n * Implemented as part of ControlValueAccessor.\n *\n * @param fn Callback to be registered.\n */\n registerOnTouched(fn: any) {\n this.onTouched = fn;\n }\n\n /**\n * Sets the disabled state of the control. Implemented as a part of ControlValueAccessor.\n *\n * @param isDisabled Whether the control should be disabled.\n */\n setDisabledState(isDisabled: boolean) {\n this.disabled = isDisabled;\n this._changeDetector.markForCheck();\n }\n}\n\n// Boilerplate for applying mixins to OuiRadioButton.\n/** @docs-private */\nexport class OuiRadioButtonBase {\n // Since the disabled property is manually defined for the OuiRadioButton and isn't set up in\n // the mixin base class. To be able to use the tabindex mixin, a disabled property must be\n // defined to properly work.\n // disabled: boolean;\n\n constructor(public _elementRef: ElementRef) {}\n}\n\nexport const OuiRadioButtonMixinBase: typeof OuiRadioButtonBase =\n mixinColor(OuiRadioButtonBase);\n\n@Component({\n selector: 'oui-radio-button',\n templateUrl: 'radio.html',\n styleUrls: ['radio.scss'],\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiRadioButton',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-radio-button',\n '[class.oui-radio-checked]': 'checked',\n '[class.oui-radio-disabled]': 'disabled',\n '[class._oui-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n '[attr.tabindex]': 'null',\n '[attr.id]': 'id',\n // Note: under normal conditions focus shouldn't land on this element, however it may be\n // programmatically set, for example inside of a focus trap, in this case we want to forward\n // the focus to the native element.\n '(focus)': '_inputElement.nativeElement.focus()',\n '(click)': '_fireInputChange()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiRadioButton\n extends OuiRadioButtonMixinBase\n implements OnInit, AfterViewInit, OnDestroy\n{\n private _uniqueId = `oui-radio-${++nextUniqueId}`;\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n /**\n * Implemented as part of CanColor.\n */\n @Input() color = 'primary';\n /** The unique ID for the radio button. */\n @Input() id: string = this._uniqueId;\n\n /** Analog to HTML `name` attribute used to group radios for unique selection. */\n @Input() name: string;\n\n /** Used to set the `aria-label` attribute on the underlying input element. */\n @Input('aria-label') ariaLabel: string;\n\n /** The `aria-labelledby` attribute takes precedence as the element text alternative. */\n @Input('aria-labelledby') ariaLabelledby: string;\n /** The `aria-labelledby` attribute takes precedence as the element text alternative. */\n @Input() tabIndex: number;\n\n /** The `aria-describedby` attribute is read after the element label and field type. */\n @Input('aria-describedby') ariaDescribedby: string;\n\n /** Whether this radio button is checked. */\n @Input()\n get checked(): boolean {\n return this._checked;\n }\n set checked(value: boolean) {\n const newCheckedState = coerceBooleanProperty(value);\n if (this._checked !== newCheckedState) {\n this._checked = newCheckedState;\n if (\n newCheckedState &&\n this.radioGroup &&\n this.radioGroup.value !== this.value\n ) {\n this.radioGroup.selected = this;\n } else if (\n !newCheckedState &&\n this.radioGroup &&\n this.radioGroup.value === this.value\n ) {\n // When unchecking the selected radio button, update the selected radio\n // property on the group.\n this.radioGroup.selected = null;\n }\n\n if (newCheckedState) {\n // Notify all radio buttons with the same name to un-check.\n this._radioDispatcher.notify(this.id, this.name);\n }\n this._changeDetector.markForCheck();\n }\n }\n\n /** The value of this radio button. */\n @Input()\n get value(): any {\n return this._value;\n }\n set value(value: any) {\n if (this._value !== value) {\n this._value = value;\n if (this.radioGroup !== null) {\n if (!this.checked) {\n // Update checked when the value changed to match the radio group's value\n this.checked = this.radioGroup.value === value;\n }\n if (this.checked) {\n this.radioGroup.selected = this;\n }\n }\n }\n }\n\n /** Whether the label should appear after or before the radio button. Defaults to `after` */\n @Input()\n get labelPosition(): 'before' | 'after' {\n return (\n this._labelPosition ||\n (this.radioGroup && this.radioGroup.labelPosition) ||\n 'after'\n );\n }\n set labelPosition(value) {\n this._labelPosition = value;\n }\n private _labelPosition: 'before' | 'after';\n\n /** Whether the radio button is disabled. */\n @Input()\n get disabled(): boolean {\n return (\n this._disabled || (this.radioGroup !== null && this.radioGroup.disabled)\n );\n }\n set disabled(value: boolean) {\n const newDisabledState = coerceBooleanProperty(value);\n if (this._disabled !== newDisabledState) {\n this._disabled = newDisabledState;\n this._changeDetector.markForCheck();\n }\n }\n\n /** Whether the radio button is required. */\n @Input()\n get required(): boolean {\n return this._required || (this.radioGroup && this.radioGroup.required);\n }\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n }\n\n /**\n * Event emitted when the checked state of this radio button changes.\n * Change events are only emitted when the value changes due to user interaction with\n * the radio button (the same behavior as ``).\n */\n @Output()\n readonly change: EventEmitter =\n new EventEmitter();\n\n /** The native `` element */\n @ViewChild('input') _inputElement: ElementRef;\n\n /** The parent radio group. May or may not be present. */\n radioGroup: OuiRadioGroup;\n\n /** ID of the native input element inside `` */\n get inputId(): string {\n return `${this.id || this._uniqueId}-input`;\n }\n\n /** Whether this radio is checked. */\n private _checked = false;\n\n /** Whether this radio is disabled. */\n private _disabled: boolean;\n\n /** Whether this radio is required. */\n private _required: boolean;\n\n /** Value assigned to this radio. */\n private _value: any = null;\n\n /** Unregister function for _radioDispatcher */\n private _removeUniqueSelectionListener: () => void = () => {};\n\n constructor(\n @Optional() radioGroup: OuiRadioGroup,\n elementRef: ElementRef,\n private _changeDetector: ChangeDetectorRef,\n private _focusMonitor: FocusMonitor,\n private _radioDispatcher: UniqueSelectionDispatcher,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string\n ) {\n super(elementRef);\n // Assertions. Ideally these should be stripped out by the compiler.\n // TODO(jelbourn): Assert that there's no name binding AND a parent radio group.\n this.radioGroup = radioGroup;\n\n this._removeUniqueSelectionListener = _radioDispatcher.listen(\n (id: string, name: string) => {\n if (id !== this.id && name === this.name) {\n this.checked = false;\n }\n }\n );\n }\n\n /** Focuses the radio button. */\n focus(): void {\n this._focusMonitor.focusVia(this._inputElement, 'keyboard');\n }\n\n _fireInputChange(): void {\n if (!this.disabled) {\n const event = document.createEvent('Event');\n event.initEvent('change', false, true);\n this._inputElement.nativeElement.dispatchEvent(event);\n }\n }\n\n /**\n * Marks the radio button as needing checking for change detection.\n * This method is exposed because the parent radio group will directly\n * update bound properties of the radio button.\n */\n _markForCheck() {\n // When group value changes, the button will not be notified. Use `markForCheck` to explicit\n // update radio button's status\n this._changeDetector.markForCheck();\n }\n\n ngOnInit() {\n if (this.radioGroup) {\n // If the radio is inside a radio group, determine if it should be checked\n this.checked = this.radioGroup.value === this._value;\n // Copy name from parent radio group\n this.name = this.radioGroup.name;\n }\n }\n\n ngAfterViewInit() {\n this._monitorSubscription = this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe((focusOrigin) => {\n if (!focusOrigin && this.radioGroup) {\n this.radioGroup._touch();\n }\n });\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n this._removeUniqueSelectionListener();\n this._monitorSubscription.unsubscribe();\n }\n\n /** Dispatch change event with current value. */\n private _emitChangeEvent(): void {\n this.change.emit(new OuiRadioChange(this, this._value));\n }\n\n _onInputClick(event: Event) {\n // We have to stop propagation for click events on the visual hidden input element.\n // By default, when a user clicks on a label element, a generated click event will be\n // dispatched on the associated input element. Since we are using a label element as our\n // root container, the click event on the `radio-button` will be executed twice.\n // The real click event will bubble up, and the generated click event also tries to bubble up.\n // This will lead to multiple click events.\n // Preventing bubbling for the second event will solve that issue.\n event.stopPropagation();\n }\n\n /**\n * Triggered when the radio button received a click or the input recognized any change.\n * Clicking on a label element, will trigger a change event on the associated input.\n */\n _onInputChange(event: Event) {\n // We always have to stop propagation on the change event.\n // Otherwise the change event, from the input element, will bubble up and\n // emit its event object to the `change` output.\n event.stopPropagation();\n const groupValueChanged =\n this.radioGroup && this.value !== this.radioGroup.value;\n this.checked = true;\n this._changeDetector.detectChanges();\n this._emitChangeEvent();\n\n if (this.radioGroup) {\n this.radioGroup._controlValueAccessorChangeFn(this.value);\n this.radioGroup._touch();\n if (groupValueChanged) {\n this.radioGroup._emitChangeEvent();\n }\n }\n }\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [], "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, { "name": "OuiSelectBase", - "id": "class-OuiSelectBase-69627b742fec8101b0c412f353bb903b4d499f0f8291080ef1d6ac0c418484f2235fec3981e84104b948fe2f242b0a29fea2c39687b9ed9b01e6aa4fcda7ba37", + "id": "class-OuiSelectBase-08d5ca0d9e57fe0b53fd1a332196d178df30100ca9fb0087259f4b8a1ae16a1016170481f04d33ecca5ee382a48196b5a882bb369fc5cad3a4a4f2d289256b1b", "file": "ui/src/components/select/select.component.ts", "deprecated": false, "deprecationMessage": "", "type": "class", - "sourceCode": "import { ActiveDescendantKeyManager, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { SelectionModel } from '@angular/cdk/collections';\r\nimport {\r\n A,\r\n DOWN_ARROW,\r\n END,\r\n ENTER,\r\n HOME,\r\n LEFT_ARROW,\r\n RIGHT_ARROW,\r\n SPACE,\r\n UP_ARROW,\r\n hasModifierKey,\r\n TAB,\r\n} from '@angular/cdk/keycodes';\r\nimport { CdkConnectedOverlay } from '@angular/cdk/overlay';\r\nimport {\r\n AfterContentInit,\r\n Attribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n ContentChildren,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n isDevMode,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n QueryList,\r\n Self,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n Inject,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n} from '@angular/forms';\r\nimport {\r\n _countGroupLabelsBeforeOption,\r\n _getOptionScrollPosition,\r\n CanDisable,\r\n CanDisableCtor,\r\n CanUpdateErrorState,\r\n CanUpdateErrorStateCtor,\r\n HasTabIndex,\r\n HasTabIndexCtor,\r\n OuiOptionSelectionChange,\r\n mixinErrorState,\r\n mixinTabIndex,\r\n mixinDisabled,\r\n} from '../core';\r\nimport { OuiFormField, OuiFormFieldControl } from '../form-field/public-api';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { OUI_OPTION_PARENT_COMPONENT, OuiOption } from '../core/option/option';\r\nimport { OuiOptgroup } from '../core/option/optgroup';\r\nimport { ErrorStateMatcher } from '../core/error/error-options';\r\nimport { defer, merge, Observable, Subject } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n filter,\r\n map,\r\n startWith,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n} from 'rxjs/operators';\r\nimport {\r\n getOuiSelectDynamicMultipleError,\r\n getOuiSelectNonArrayValueError,\r\n getOuiSelectNonFunctionValueError,\r\n} from './select-errors';\r\nimport { OuiIconRegistry } from '../icon/icon-registery';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ICONS } from '../core/shared/icons';\r\n\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * The following style constants are necessary to save here in order\r\n * to properly calculate the alignment of the selected option over\r\n * the trigger element.\r\n */\r\n\r\n/** The height of each select option. */\r\nexport const SELECT_OPTION_HEIGHT = 40;\r\n\r\n/** The panel's padding on the x-axis */\r\nexport const SELECT_PANEL_PADDING_X = 16;\r\n\r\n/** The panel's x axis padding if it is indented (e.g. there is an option group). */\r\nexport const SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;\r\n\r\n/** The height of the select items in `em` units. */\r\nexport const SELECT_ITEM_HEIGHT_EM = 3;\r\n\r\n/** The total height of the select panel. */\r\nexport const SELECT_PANEL_HEIGHT = 200;\r\n\r\n// TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.\r\n/**\r\n * Distance between the panel edge and the option text in\r\n * multi-selection mode.\r\n *\r\n * Calculated as:\r\n * (SELECT_PANEL_PADDING_X * 1.5) + 20 = 44\r\n * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.\r\n * The checkbox width is 16px.\r\n */\r\nexport let SELECT_MULTIPLE_PANEL_PADDING_X = 0;\r\n\r\n/**\r\n * The select panel will only \"fit\" inside the viewport if it is positioned at\r\n * this value or more away from the viewport boundary.\r\n */\r\nexport const SELECT_PANEL_VIEWPORT_PADDING = 8;\r\n\r\n/** Change event object that is emitted when the select value has changed. */\r\nexport class OuiSelectChange {\r\n constructor(\r\n /** Reference to the select that emitted the change event. */\r\n public source: OuiSelect,\r\n /** Current value of the select that emitted the event. */\r\n public value: any\r\n ) {}\r\n}\r\n\r\n// Boilerplate for applying mixins to OuiSelect.\r\n/** @docs-private */\r\nexport class OuiSelectBase {\r\n constructor(\r\n public _elementRef: ElementRef,\r\n public _defaultErrorStateMatcher: ErrorStateMatcher,\r\n public _parentForm: NgForm,\r\n public _parentFormGroup: FormGroupDirective,\r\n public ngControl: NgControl\r\n ) {}\r\n}\r\n\r\nexport const _OuiSelectMixinBase: CanDisableCtor &\r\n HasTabIndexCtor &\r\n CanUpdateErrorStateCtor &\r\n typeof OuiSelectBase = mixinTabIndex(\r\n mixinDisabled(mixinErrorState(OuiSelectBase))\r\n);\r\n\r\n/**\r\n * Allows the user to customize the trigger that is displayed when the select has a value.\r\n */\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: 'oui-select-trigger',\r\n})\r\nexport class OuiSelectTrigger {}\r\n\r\n@Component({\r\n selector: 'oui-select',\r\n exportAs: 'ouiSelect',\r\n templateUrl: 'select.html',\r\n styleUrls: ['select.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['disabled', 'tabIndex'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n role: 'listbox',\r\n '[attr.id]': 'id',\r\n '[attr.tabindex]': 'tabIndex',\r\n '[attr.aria-label]': '_getAriaLabel()',\r\n '[attr.aria-labelledby]': '_getAriaLabelledby()',\r\n '[attr.aria-required]': 'required.toString()',\r\n '[attr.aria-disabled]': 'disabled.toString()',\r\n '[attr.aria-invalid]': 'errorState',\r\n '[attr.aria-owns]': 'panelOpen ? _optionIds : null',\r\n '[attr.aria-multiselectable]': 'multiple',\r\n '[attr.aria-describedby]': '_ariaDescribedby || null',\r\n '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\r\n '[class.oui-select-disabled]': 'disabled',\r\n '[class.oui-select-invalid]': 'errorState',\r\n '[class.oui-select-required]': 'required',\r\n '[class.oui-select-empty]': 'empty',\r\n class: 'oui-select oui-input',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(focus)': '_onFocus()',\r\n '(blur)': '_onBlur()',\r\n },\r\n providers: [\r\n { provide: OuiFormFieldControl, useExisting: OuiSelect },\r\n { provide: OUI_OPTION_PARENT_COMPONENT, useExisting: OuiSelect },\r\n ],\r\n})\r\nexport class OuiSelect\r\n extends _OuiSelectMixinBase\r\n implements\r\n AfterContentInit,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n DoCheck,\r\n ControlValueAccessor,\r\n CanDisable,\r\n HasTabIndex,\r\n OuiFormFieldControl,\r\n CanUpdateErrorState\r\n{\r\n /**Holds selected values after done */\r\n @Input() savedValues = [];\r\n /**Done button disabled until dropdown is dirty */\r\n disableDoneButton = true;\r\n /** Whether or not the overlay panel is open. */\r\n private _panelOpen = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _required = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _actionItems = false;\r\n\r\n /** The scroll position of the overlay panel, calculated to center the selected option. */\r\n private _scrollTop = 0;\r\n\r\n /** The placeholder displayed in the trigger of the select. */\r\n private _placeholder: string;\r\n\r\n /** Whether the component is in multiple selection mode. */\r\n private _multiple = false;\r\n\r\n /** Search input field **/\r\n isSearchFieldPresent: boolean;\r\n\r\n /** Unique id for this input. */\r\n private _uid = `oui-select-${nextUniqueId++}`;\r\n\r\n /** The last measured value for the trigger's client bounding rect. */\r\n _triggerRect: ClientRect;\r\n\r\n /** The aria-describedby attribute on the select for improved a11y. */\r\n _ariaDescribedby: string;\r\n\r\n /** The cached font-size of the trigger element. */\r\n _triggerFontSize = 0;\r\n\r\n /** Deals with the selection logic. */\r\n _selectionModel: SelectionModel;\r\n\r\n /** Manages keyboard events for options in the panel. */\r\n _keyManager: ActiveDescendantKeyManager;\r\n\r\n /** The IDs of child options to be passed to the aria-owns attribute. */\r\n _optionIds = '';\r\n\r\n /** The value of the select panel's transform-origin property. */\r\n _transformOrigin = 'top';\r\n\r\n /** If there is search input field a class is added dynamically to the perfect scrollbar **/\r\n ouiSelectInputOuterClassName: string;\r\n\r\n /** Adding top class to overlay panel */\r\n cdkConnectionOverlayPanel = '';\r\n\r\n /**\r\n * The y-offset of the overlay panel in relation to the trigger's top start corner.\r\n * This must be adjusted to align the selected option text over the trigger text.\r\n * when the panel opens. Will change based on the y-position of the selected option.\r\n */\r\n _offsetY = 0;\r\n\r\n /**\r\n * This position config ensures that the top \"start\" corner of the overlay\r\n * is aligned with with the top \"start\" of the origin by default (overlapping\r\n * the trigger completely). If the panel cannot fit below the trigger, it\r\n * will fall back to a position above the trigger.\r\n */\r\n _positions = [\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n },\r\n ];\r\n /** Emits whenever the component is destroyed. */\r\n private readonly _destroy = new Subject();\r\n\r\n /** Whether the component is disabling centering of the active option over the trigger. */\r\n private _disableOptionCentering = false;\r\n\r\n private _focused = false;\r\n\r\n /** A name for this control that can be used by `oui-form-field`. */\r\n controlType = 'oui-select';\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('trigger') trigger: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddCancelButton', { read: ElementRef }) ddCancelButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddDoneButton', { read: ElementRef }) ddDoneButton: ElementRef;\r\n\r\n /** Panel containing the select options. */\r\n @ViewChild('panel', { read: ElementRef }) panel: ElementRef;\r\n\r\n private _value: any;\r\n\r\n /**\r\n * Function used to sort the values in a select in multiple mode.\r\n * Follows the same logic as `Array.prototype.sort`.\r\n */\r\n @Input() sortComparator: (\r\n a: OuiOption,\r\n b: OuiOption,\r\n options: OuiOption[]\r\n ) => number;\r\n\r\n /** Aria label of the select. If not specified, the placeholder will be used as label. */\r\n @Input('aria-label') ariaLabel = '';\r\n\r\n /** Input that can be used to specify the `aria-labelledby` attribute. */\r\n @Input('aria-labelledby') ariaLabelledby: string;\r\n private _large = false;\r\n _monitorSubscription: any;\r\n\r\n /** Whether the oui-select is of large size. */\r\n @Input()\r\n get large(): boolean {\r\n return this._large;\r\n }\r\n set large(value) {\r\n this._large = coerceBooleanProperty(value);\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n private _id: string;\r\n\r\n /** Event emitted when the select panel has been toggled. */\r\n @Output()\r\n readonly openedChange: EventEmitter = new EventEmitter();\r\n\r\n /** Combined stream of all of the child options' change events. */\r\n readonly optionSelectionChanges: Observable = defer(\r\n (): Observable => {\r\n if (this.options) {\r\n return merge(...this.options.map((option) => option.onSelectionChange));\r\n }\r\n\r\n return this._ngZone.onStable.asObservable().pipe(\r\n take(1),\r\n switchMap(() => this.optionSelectionChanges)\r\n );\r\n }\r\n );\r\n\r\n /**\r\n * Event that emits whenever the raw value of the select changes. This is here primarily\r\n * to facilitate the two-way binding for the `value` input.\r\n *\r\n * @docs-private\r\n */\r\n @Output() readonly valueChange: EventEmitter = new EventEmitter();\r\n\r\n /** Object used to control when error messages are shown. */\r\n @Input() errorStateMatcher: ErrorStateMatcher;\r\n\r\n /** All of the defined select options. */\r\n @ContentChildren(OuiOption, { descendants: true })\r\n options: QueryList;\r\n\r\n /** Event emitted when the select has been opened. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('opened')\r\n readonly _openedStream: Observable = this.openedChange.pipe(\r\n filter((o) => o),\r\n map(() => {})\r\n );\r\n\r\n /** Event emitted when the select has been closed. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('closed')\r\n readonly _closedStream: Observable = this.openedChange.pipe(\r\n filter((o) => !o),\r\n map(() => {\r\n this.isSearchFieldPresent = false;\r\n })\r\n );\r\n\r\n /** Event emitted when the selected value has been changed by the user. */\r\n @Output()\r\n readonly selectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the selected value has been changed and saved by the user. */\r\n @Output()\r\n readonly saveSelectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** All of the defined groups of options. */\r\n @ContentChildren(OuiOptgroup) optionGroups: QueryList;\r\n\r\n /** User-supplied override of the trigger element. */\r\n @ContentChild(OuiSelectTrigger)\r\n customTrigger: OuiSelectTrigger;\r\n\r\n /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */\r\n @Input() panelClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** Overlay pane containing the options. */\r\n @ViewChild(CdkConnectedOverlay)\r\n overlayDir: CdkConnectedOverlay;\r\n\r\n /** Emits when the panel element is finished transforming in. */\r\n _panelDoneAnimatingStream = new Subject();\r\n\r\n /** Comparison function to specify which option is displayed. Defaults to object equality. */\r\n private _compareWith = (o1: any, o2: any) => o1 === o2;\r\n\r\n /** Whether the select is focused. */\r\n get focused(): boolean {\r\n return this._focused || this._panelOpen;\r\n }\r\n /**\r\n * @deprecated Setter to be removed as this property is intended to be readonly.\r\n */\r\n set focused(value: boolean) {\r\n this._focused = value;\r\n }\r\n /** `View -> model callback called when value changes` */\r\n _onChange: (value: any) => void = () => {};\r\n\r\n /** `View -> model callback called when select has been touched` */\r\n _onTouched = () => {};\r\n\r\n /** Placeholder to be shown if no value has been selected. */\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the component is required. */\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the user should be allowed to select multiple options. */\r\n @Input()\r\n get multiple(): boolean {\r\n return this._multiple;\r\n }\r\n set multiple(value: boolean) {\r\n if (this._selectionModel) {\r\n throw getOuiSelectDynamicMultipleError();\r\n }\r\n\r\n this._multiple = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the action items are required and use saveSelectionChange instead of selectionChange. */\r\n @Input()\r\n get actionItems(): boolean {\r\n return this._actionItems;\r\n }\r\n set actionItems(value: boolean) {\r\n if (this._multiple) {\r\n this._actionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Whether to center the active option over the trigger. */\r\n @Input()\r\n get disableOptionCentering(): boolean {\r\n return this._disableOptionCentering;\r\n }\r\n set disableOptionCentering(value: boolean) {\r\n this._disableOptionCentering = coerceBooleanProperty(value);\r\n }\r\n\r\n /**\r\n * Function to compare the option values with the selected values. The first argument\r\n * is a value from an option. The second is a value from the selection. A boolean\r\n * should be returned.\r\n */\r\n @Input()\r\n get compareWith() {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (o1: any, o2: any) => boolean) {\r\n if (typeof fn !== 'function') {\r\n throw getOuiSelectNonFunctionValueError();\r\n }\r\n this._compareWith = fn;\r\n if (this._selectionModel) {\r\n // A different comparator means the selection could change.\r\n this._initializeSelection();\r\n }\r\n }\r\n\r\n /** Value of the select control. */\r\n @Input()\r\n get value(): any {\r\n return this._value;\r\n }\r\n set value(newValue: any) {\r\n if (newValue !== this._value) {\r\n this.writeValue(newValue);\r\n this._value = newValue;\r\n }\r\n }\r\n\r\n /** Unique id of the element. */\r\n @Input()\r\n get id(): string {\r\n return this._id;\r\n }\r\n set id(value: string) {\r\n this._id = value || this._uid;\r\n this.stateChanges.next();\r\n }\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _ngZone: NgZone,\r\n _defaultErrorStateMatcher: ErrorStateMatcher,\r\n elementRef: ElementRef,\r\n private _focusMonitor: FocusMonitor,\r\n @Optional() private _dir: Directionality,\r\n @Optional() _parentForm: NgForm,\r\n @Optional() _parentFormGroup: FormGroupDirective,\r\n @Optional() private _parentFormField: OuiFormField,\r\n @Self() @Optional() public ngControl: NgControl,\r\n @Attribute('tabindex') tabIndex: string,\r\n @Optional() @Inject(DOCUMENT) private _document: any,\r\n public _elementRef: ElementRef,\r\n public _ouiIconRegistry: OuiIconRegistry,\r\n private _domSanitizer: DomSanitizer\r\n ) {\r\n super(\r\n elementRef,\r\n _defaultErrorStateMatcher,\r\n _parentForm,\r\n _parentFormGroup,\r\n ngControl\r\n );\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this._elementRef, true)\r\n .subscribe(() => this._ngZone.run(() => {}));\r\n this._ouiIconRegistry.addSvgIconLiteral(\r\n `select-arrow-icon`,\r\n this._domSanitizer.bypassSecurityTrustHtml(ICONS.SELECT_ARROW_ICON)\r\n );\r\n\r\n if (this.ngControl) {\r\n // Note: we provide the value accessor through here, instead of\r\n // the `providers` to avoid running into a circular import.\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n this.tabIndex = parseInt(tabIndex, 10) || 0;\r\n\r\n // Force setter to be called in case id was not specified.\r\n this.id = this.id;\r\n }\r\n\r\n ngOnInit() {\r\n this._selectionModel = new SelectionModel(this.multiple);\r\n this.stateChanges.next();\r\n\r\n // We need `distinctUntilChanged` here, because some browsers will\r\n // fire the animation end event twice for the same animation. See:\r\n // https://github.com/angular/angular/issues/24084\r\n this._panelDoneAnimatingStream\r\n .pipe(distinctUntilChanged(), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n if (this.panelOpen) {\r\n this._scrollTop = 0;\r\n this.openedChange.emit(true);\r\n } else {\r\n this.openedChange.emit(false);\r\n this.overlayDir.offsetX = 0;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._initKeyManager();\r\n\r\n this._selectionModel.changed\r\n .pipe(takeUntil(this._destroy))\r\n .subscribe((event) => {\r\n event.added.forEach((option) => option.select());\r\n event.removed.forEach((option) => option.deselect());\r\n });\r\n\r\n this.options.changes\r\n .pipe(startWith(null), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n this._resetOptions();\r\n this._initializeSelection();\r\n });\r\n }\r\n\r\n ngDoCheck() {\r\n if (this.ngControl) {\r\n this.updateErrorState();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let\r\n // the parent form field know to run change detection when the disabled state changes.\r\n if (changes.disabled) {\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._monitorSubscription.unsubscribe();\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n this._destroy.next();\r\n this._destroy.complete();\r\n this.stateChanges.complete();\r\n }\r\n\r\n /** Toggles the overlay panel open or closed. */\r\n toggle(): void {\r\n this.panelOpen ? this.close() : this.open();\r\n }\r\n\r\n /** Opens the overlay panel. */\r\n open(): void {\r\n if (\r\n this.disabled ||\r\n !this.options ||\r\n !this.options.length ||\r\n this._panelOpen\r\n ) {\r\n return;\r\n }\r\n\r\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\r\n\r\n this._panelOpen = true;\r\n this._keyManager.withHorizontalOrientation(null);\r\n\r\n this._highlightCorrectOption();\r\n this._changeDetectorRef.markForCheck();\r\n this.openedChange.emit(true);\r\n this._elementRef.nativeElement.classList.add(\r\n 'oui-select-list-options-opened'\r\n );\r\n }\r\n\r\n /** Closes the overlay panel and focuses the host element. */\r\n close(): void {\r\n if (this._panelOpen) {\r\n this._panelOpen = false;\r\n this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');\r\n this._changeDetectorRef.markForCheck();\r\n this._onTouched();\r\n this.openedChange.emit(false);\r\n this._elementRef.nativeElement.classList.remove(\r\n 'oui-select-list-options-opened'\r\n );\r\n setTimeout((_) => this._document.activeElement.blur());\r\n }\r\n }\r\n\r\n /**\r\n * Sets the select's value. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param value New value to be written to the model.\r\n */\r\n writeValue(value: any): void {\r\n if (this.options) {\r\n this._setSelectionByValue(value);\r\n }\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select's value\r\n * changes from user input. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the value changes.\r\n */\r\n registerOnChange(fn: (value: any) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select is blurred\r\n * by the user. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the component has been touched.\r\n */\r\n registerOnTouched(fn: () => {}): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n /**\r\n * Disables the select. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param isDisabled Sets whether the component is disabled.\r\n */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether or not the overlay panel is open. */\r\n get panelOpen(): boolean {\r\n return this._panelOpen;\r\n }\r\n\r\n /** The currently selected option. */\r\n get selected(): OuiOption | OuiOption[] {\r\n return this.multiple\r\n ? this._selectionModel.selected\r\n : this._selectionModel.selected[0];\r\n }\r\n\r\n /** The value displayed in the trigger. */\r\n get triggerValue(): string {\r\n if (this.empty) {\r\n return '';\r\n }\r\n if (this._multiple) {\r\n const selectedOptions = this._selectionModel.selected.map(\r\n (option) => option.viewValueForSelect\r\n );\r\n\r\n if (this._isRtl()) {\r\n selectedOptions.reverse();\r\n }\r\n return selectedOptions.join(', ');\r\n }\r\n return this._selectionModel.selected[0].viewValueForSelect;\r\n }\r\n\r\n /** Whether the element is in RTL mode. */\r\n _isRtl(): boolean {\r\n return this._dir ? this._dir.value === 'rtl' : false;\r\n }\r\n\r\n /** Handles all keydown events on the select. */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (!this.disabled) {\r\n this.panelOpen\r\n ? this._handleOpenKeydown(event)\r\n : this._handleClosedKeydown(event);\r\n }\r\n }\r\n\r\n /** Handles keyboard events while the select is closed. */\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const keyCode = event.keyCode;\r\n const isArrowKey =\r\n keyCode === DOWN_ARROW ||\r\n keyCode === UP_ARROW ||\r\n keyCode === LEFT_ARROW ||\r\n keyCode === RIGHT_ARROW;\r\n const isOpenKey = keyCode === ENTER || keyCode === SPACE;\r\n const manager = this._keyManager;\r\n\r\n // Open the select on ALT + arrow key to match the native \r\n event.preventDefault();\r\n this.close();\r\n } else if (\r\n (keyCode === ENTER || keyCode === SPACE) &&\r\n manager.activeItem &&\r\n !hasModifierKey(event)\r\n ) {\r\n event.preventDefault();\r\n manager.activeItem._selectViaInteraction();\r\n } else if (this._multiple && keyCode === A && event.ctrlKey) {\r\n event.preventDefault();\r\n this.handleCtrlKey();\r\n } else if (normalNavigationCheck) {\r\n // Check for non multiple select dropdown that the key pressed is not Tab, Space, Enter\r\n if (!this.isSearchFieldPresent) this.focus();\r\n this.handleScrolling(manager, event, isArrowKey, keyCode);\r\n }\r\n }\r\n\r\n /**\r\n * Handle ctrl key\r\n */\r\n private handleCtrlKey() {\r\n const hasDeselectedOptions = this.options.some(\r\n (opt) => !opt.disabled && !opt.selected\r\n );\r\n\r\n this.options.forEach((option) => {\r\n if (!option.disabled) {\r\n hasDeselectedOptions ? option.select() : option.deselect();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @param manager\r\n * @param event\r\n * @param isArrowKey\r\n * @param keyCode\r\n */\r\n private handleScrolling(\r\n manager: ActiveDescendantKeyManager,\r\n event: KeyboardEvent,\r\n isArrowKey: boolean,\r\n keyCode: number\r\n ) {\r\n const previouslyFocusedIndex = manager.activeItemIndex;\r\n\r\n manager.onKeydown(event);\r\n\r\n if (\r\n this._multiple &&\r\n isArrowKey &&\r\n event.shiftKey &&\r\n manager.activeItem &&\r\n manager.activeItemIndex !== previouslyFocusedIndex\r\n ) {\r\n manager.activeItem._selectViaInteraction();\r\n }\r\n if (isArrowKey && manager.activeItemIndex !== previouslyFocusedIndex) {\r\n this._scrollToOption();\r\n } else {\r\n // First or last\r\n if (keyCode === DOWN_ARROW) {\r\n manager.setFirstItemActive();\r\n this._setScrollTop(0);\r\n }\r\n if (keyCode === UP_ARROW) {\r\n manager.setLastItemActive();\r\n this._scrollToOption();\r\n }\r\n }\r\n }\r\n\r\n _onFocus() {\r\n if (!this.disabled) {\r\n this._focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\r\n * \"blur\" to the panel when it opens, causing a false positive.\r\n */\r\n _onBlur() {\r\n this._focused = false;\r\n // this.isSearchFieldPresent = false;\r\n\r\n if (!this.disabled && !this.panelOpen) {\r\n this._onTouched();\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Callback that is invoked when the overlay panel has been attached.\r\n */\r\n _onAttached(): void {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {\r\n this._setPseudoCheckboxPaddingSize();\r\n this._changeDetectorRef.detectChanges();\r\n this.panel.nativeElement.scrollTop = this._scrollTop;\r\n });\r\n }\r\n\r\n /** Returns the theme to be used on the panel. */\r\n _getPanelTheme(): string {\r\n return this._parentFormField ? `oui-${this._parentFormField.color}` : '';\r\n }\r\n\r\n // TODO(josephperrott): Remove after 2018 spec updates are fully merged.\r\n /** Sets the pseudo checkbox padding size based on the width of the pseudo checkbox. */\r\n private _setPseudoCheckboxPaddingSize() {\r\n if (!SELECT_MULTIPLE_PANEL_PADDING_X && this.multiple) {\r\n const pseudoCheckbox = this.panel.nativeElement.querySelector(\r\n '.oui-pseudo-checkbox'\r\n );\r\n if (pseudoCheckbox) {\r\n SELECT_MULTIPLE_PANEL_PADDING_X =\r\n SELECT_PANEL_PADDING_X * 1.5 + pseudoCheckbox.offsetWidth;\r\n }\r\n }\r\n }\r\n\r\n /** Whether the select has a value. */\r\n get empty(): boolean {\r\n return !this._selectionModel || this._selectionModel.isEmpty();\r\n }\r\n\r\n private _initializeSelection(): void {\r\n // Defer setting the value in order to avoid the \"Expression\r\n // has changed after it was checked\" errors from Angular.\r\n Promise.resolve().then(() => {\r\n this._setSelectionByValue(\r\n this.ngControl ? this.ngControl.value : this._value\r\n );\r\n this.savedValues = this.ngControl ? this.ngControl.value : this._value;\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the selected option based on a value. If no option can be\r\n * found with the designated value, the select trigger is cleared.\r\n */\r\n private _setSelectionByValue(value: any | any[]): void {\r\n if (this.multiple && value) {\r\n if (!Array.isArray(value)) {\r\n throw getOuiSelectNonArrayValueError();\r\n }\r\n\r\n this._selectionModel.clear();\r\n value.forEach((currentValue: any) => this._selectValue(currentValue));\r\n this._sortValues();\r\n } else {\r\n this._selectionModel.clear();\r\n const correspondingOption = this._selectValue(value);\r\n // Shift focus to the active item. Note that we shouldn't do this in multiple\r\n // mode, because we don't know what option the user interacted with last.\r\n if (correspondingOption) {\r\n this._keyManager.setActiveItem(correspondingOption);\r\n }\r\n }\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /**\r\n * Finds and selects and option based on its value.\r\n *\r\n * @returns Option that has the corresponding value.\r\n */\r\n private _selectValue(value: any): OuiOption | undefined {\r\n const correspondingOption = this.options.find((option: OuiOption) => {\r\n try {\r\n // Treat null as a special reset value.\r\n return option.value != null && this._compareWith(option.value, value);\r\n } catch (error) {\r\n if (isDevMode()) {\r\n // Notify developers of errors in their comparator.\r\n console.warn(error);\r\n }\r\n return false;\r\n }\r\n });\r\n\r\n if (correspondingOption) {\r\n this._selectionModel.select(correspondingOption);\r\n }\r\n\r\n return correspondingOption;\r\n }\r\n\r\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\r\n private _initKeyManager() {\r\n this._keyManager = new ActiveDescendantKeyManager(this.options)\r\n .withTypeAhead()\r\n .withVerticalOrientation()\r\n .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')\r\n .withAllowedModifierKeys(['shiftKey']);\r\n\r\n this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n // Restore focus to the trigger before closing. Ensures that the focus\r\n // position won't be lost if the user got focus into the overlay.\r\n this.focus();\r\n this.close();\r\n });\r\n\r\n this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n if (this._panelOpen && this.panel) {\r\n // Panel is opened\r\n // Need not to scroll\r\n } else if (\r\n !this._panelOpen &&\r\n !this.multiple &&\r\n this._keyManager.activeItem\r\n ) {\r\n this._keyManager.activeItem._selectViaInteraction();\r\n }\r\n });\r\n }\r\n\r\n /** Drops current option subscriptions and IDs and resets from scratch. */\r\n private _resetOptions(): void {\r\n const changedOrDestroyed = merge(this.options.changes, this._destroy);\r\n\r\n this.optionSelectionChanges\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe((event) => {\r\n this._onSelect(event.source, event.isUserInput);\r\n\r\n if (event.isUserInput && !this.multiple && this._panelOpen) {\r\n this.close();\r\n this.focus();\r\n }\r\n });\r\n\r\n // Listen to changes in the internal state of the options and react accordingly.\r\n // Handles cases like the labels of the selected options changing.\r\n merge(...this.options.map((option) => option._stateChanges))\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe(() => {\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n });\r\n\r\n this._setOptionIds();\r\n }\r\n\r\n /** Invoked when an option is clicked. */\r\n private _onSelect(option: OuiOption, isUserInput: boolean): void {\r\n const wasSelected = this._selectionModel.isSelected(option);\r\n\r\n if (option.value == null && !this._multiple) {\r\n option.deselect();\r\n this._selectionModel.clear();\r\n this._propagateChanges(option.value);\r\n } else {\r\n option.selected\r\n ? this._selectionModel.select(option)\r\n : this._selectionModel.deselect(option);\r\n\r\n if (isUserInput) {\r\n this._keyManager.setActiveItem(option);\r\n }\r\n\r\n if (this.multiple) {\r\n this._sortValues();\r\n\r\n if (isUserInput) {\r\n // In case the user selected the option with their mouse, we\r\n // want to restore focus back to the trigger, in order to\r\n // prevent the select keyboard controls from clashing with\r\n // the ones from `oui-option`.\r\n this.focus();\r\n }\r\n }\r\n }\r\n\r\n if (wasSelected !== this._selectionModel.isSelected(option)) {\r\n this._propagateChanges();\r\n }\r\n this.disableDoneButton = false;\r\n this.stateChanges.next();\r\n }\r\n discardRecentChanges() {\r\n this.value = this.savedValues;\r\n this._setSelectionByValue(this.value);\r\n this.disableDoneButton = true;\r\n this.close();\r\n }\r\n doneRecentChanges() {\r\n this.savedValues = this.value;\r\n this.disableDoneButton = true;\r\n this.saveSelectionChange.emit(new OuiSelectChange(this, this.value));\r\n this.close();\r\n }\r\n /** Sorts the selected values in the selected based on their order in the panel. */\r\n private _sortValues() {\r\n if (this.multiple) {\r\n const options = this.options.toArray();\r\n\r\n this._selectionModel.sort((a, b) =>\r\n this.sortComparator\r\n ? this.sortComparator(a, b, options)\r\n : options.indexOf(a) - options.indexOf(b)\r\n );\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Emits change event to set the model value. */\r\n private _propagateChanges(fallbackValue?: any): void {\r\n let valueToEmit: any = null;\r\n\r\n if (this.multiple) {\r\n valueToEmit = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n } else {\r\n valueToEmit = this.selected\r\n ? (this.selected as OuiOption).value\r\n : fallbackValue;\r\n }\r\n\r\n this._value = valueToEmit;\r\n this.valueChange.emit(valueToEmit);\r\n this._onChange(valueToEmit);\r\n this.selectionChange.emit(new OuiSelectChange(this, valueToEmit));\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /** Records option IDs to pass to the aria-owns property. */\r\n private _setOptionIds() {\r\n this._optionIds = this.options.map((option) => option.id).join(' ');\r\n }\r\n\r\n /**\r\n * Highlights the selected item. If no option is selected, it will highlight\r\n * the first item instead.\r\n */\r\n private _highlightCorrectOption(): void {\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n } else if (this._keyManager) {\r\n if (this.empty) {\r\n this._keyManager.setFirstItemActive();\r\n } else {\r\n this._keyManager.setActiveItem(this._selectionModel.selected[0]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Highlights the first of the filtered options if no element is currently highlighted\r\n */\r\n private _highlightFirstFilteredOption(): void {\r\n if (this._keyManager) {\r\n const activeElement = this._keyManager.activeItem?._getHostElement();\r\n // activeElement is not part of DOM if there is no parent element\r\n if (!activeElement || !activeElement.parentElement) {\r\n // highlight first element if there is no active element or active element is not part of DOM\r\n this._keyManager.setFirstItemActive();\r\n }\r\n }\r\n }\r\n\r\n /** Focuses the select element. */\r\n focus(): void {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n\r\n /** Returns the aria-label of the select component. */\r\n _getAriaLabel(): string | null {\r\n // If an ariaLabelledby value has been set by the consumer, the select should not overwrite the\r\n // `aria-labelledby` value by setting the ariaLabel to the placeholder.\r\n return this.ariaLabelledby ? null : this.ariaLabel || this.placeholder;\r\n }\r\n\r\n /** Returns the aria-labelledby of the select component. */\r\n _getAriaLabelledby(): string | null {\r\n if (this.ariaLabelledby) {\r\n return this.ariaLabelledby;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Determines the `aria-activedescendant` to be set on the host. */\r\n _getAriaActiveDescendant(): string | null {\r\n if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\r\n return this._keyManager.activeItem.id;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n setDescribedByIds(ids: string[]) {\r\n this._ariaDescribedby = ids.join(' ');\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n onContainerClick() {\r\n this.focus();\r\n this.open();\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n get shouldLabelFloat(): boolean {\r\n return this._panelOpen || !this.empty;\r\n }\r\n\r\n /**\r\n * Add outer class to perfect scrollbar\r\n * This is added only when there is a search field\r\n */\r\n ouiSelectInputOuter() {\r\n this.ouiSelectInputOuterClassName = 'oui-select-input-outer';\r\n }\r\n\r\n /**\r\n * Custom overlay class for cdk overlay container\r\n */\r\n openCdk() {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe((e) => {\r\n this.cdkConnectionOverlayPanel = '';\r\n if (e.connectionPair.originY === 'top') {\r\n this.cdkConnectionOverlayPanel = 'select-overlay-top';\r\n }\r\n this._changeDetectorRef.detectChanges();\r\n setTimeout((_) => this._scrollToOption());\r\n });\r\n\r\n const cdkOverLayContainer = this._document.querySelector(\r\n '.cdk-overlay-container'\r\n );\r\n const ouiSelectPanel = this._document.querySelector('.oui-select-panel');\r\n cdkOverLayContainer.classList.add('oui-select-overlay-container');\r\n const containerWidth = this._elementRef.nativeElement.offsetWidth;\r\n ouiSelectPanel.style.width = `${containerWidth}px`;\r\n const searchQueryString = '.oui-select-search-inner';\r\n if (this._document.querySelector(searchQueryString)) {\r\n this.scrollCalc(searchQueryString);\r\n }\r\n const actionItemsQueryString = '.oui-select-action-items';\r\n if (this._document.querySelector(actionItemsQueryString)) {\r\n this.scrollCalc(actionItemsQueryString);\r\n }\r\n }\r\n scrollCalc(selectQueryString: string) {\r\n const searchInput = this._document.querySelector(selectQueryString);\r\n const outter = this._document.querySelector('.oui-select-panel');\r\n let inner = this._document.querySelector('.oui-option');\r\n if (inner === null) {\r\n inner = 0;\r\n }\r\n const scrollbarWidth = outter.offsetWidth - inner.offsetWidth;\r\n if (scrollbarWidth > 5) {\r\n searchInput.style.width = `${inner.offsetWidth}px`;\r\n } else {\r\n searchInput.style.width = `calc(100% + 8px)`;\r\n }\r\n }\r\n\r\n /**\r\n * Given that we are not actually focusing active options, we must manually adjust scroll\r\n * to reveal options below the fold. First, we find the offset of the option from the top\r\n * of the panel. If that offset is below the fold, the new scrollTop will be the offset -\r\n * the panel height + the option height, so the active option will be just visible at the\r\n * bottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\r\n * will become the offset. If that offset is visible within the panel already, the scrollTop is\r\n * not adjusted.\r\n */\r\n private _scrollToOption(): void {\r\n const manager = this._keyManager;\r\n const index = manager.activeItemIndex || 0;\r\n const labelCount = _countGroupLabelsBeforeOption(\r\n index,\r\n this.options,\r\n this.optionGroups\r\n );\r\n const scrollTop = this._getScrollTop();\r\n const newScrollPosition = _getOptionScrollPosition(\r\n index + labelCount,\r\n SELECT_OPTION_HEIGHT,\r\n scrollTop,\r\n SELECT_PANEL_HEIGHT\r\n );\r\n this._setScrollTop(newScrollPosition);\r\n }\r\n\r\n /**\r\n * Sets the panel scrollTop. This allows us to manually scroll to display options\r\n * above or below the fold, as they are not actually being focused when active.\r\n */\r\n _setScrollTop(scrollTop: number): void {\r\n if (this.panel) {\r\n this.panel.nativeElement.scrollTop = scrollTop;\r\n }\r\n }\r\n\r\n /** Returns the panel's scrollTop. */\r\n _getScrollTop(): number {\r\n return this.panel ? this.panel.nativeElement.scrollTop : 0;\r\n }\r\n}\r\n", + "sourceCode": "import { ActiveDescendantKeyManager, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { SelectionModel } from '@angular/cdk/collections';\r\nimport {\r\n A,\r\n DOWN_ARROW,\r\n END,\r\n ENTER,\r\n HOME,\r\n LEFT_ARROW,\r\n RIGHT_ARROW,\r\n SPACE,\r\n UP_ARROW,\r\n hasModifierKey,\r\n TAB,\r\n} from '@angular/cdk/keycodes';\r\nimport { CdkConnectedOverlay } from '@angular/cdk/overlay';\r\nimport {\r\n AfterContentInit,\r\n Attribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n ContentChildren,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n isDevMode,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n QueryList,\r\n Self,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n Inject,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n} from '@angular/forms';\r\nimport {\r\n _countGroupLabelsBeforeOption,\r\n _getOptionScrollPosition,\r\n CanDisable,\r\n CanDisableCtor,\r\n CanUpdateErrorState,\r\n CanUpdateErrorStateCtor,\r\n HasTabIndex,\r\n HasTabIndexCtor,\r\n OuiOptionSelectionChange,\r\n mixinErrorState,\r\n mixinTabIndex,\r\n mixinDisabled,\r\n} from '../core';\r\nimport { OuiFormField, OuiFormFieldControl } from '../form-field/public-api';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { OUI_OPTION_PARENT_COMPONENT, OuiOption } from '../core/option/option';\r\nimport { OuiOptgroup } from '../core/option/optgroup';\r\nimport { ErrorStateMatcher } from '../core/error/error-options';\r\nimport { defer, merge, Observable, Subject } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n filter,\r\n map,\r\n startWith,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n} from 'rxjs/operators';\r\nimport {\r\n getOuiSelectDynamicMultipleError,\r\n getOuiSelectNonArrayValueError,\r\n getOuiSelectNonFunctionValueError,\r\n} from './select-errors';\r\nimport { OuiIconRegistry } from '../icon/icon-registery';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ICONS } from '../core/shared/icons';\r\n\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * The following style constants are necessary to save here in order\r\n * to properly calculate the alignment of the selected option over\r\n * the trigger element.\r\n */\r\n\r\n/** The height of each select option. */\r\nexport const SELECT_OPTION_HEIGHT = 40;\r\n\r\n/** The panel's padding on the x-axis */\r\nexport const SELECT_PANEL_PADDING_X = 16;\r\n\r\n/** The panel's x axis padding if it is indented (e.g. there is an option group). */\r\nexport const SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;\r\n\r\n/** The height of the select items in `em` units. */\r\nexport const SELECT_ITEM_HEIGHT_EM = 3;\r\n\r\n/** The total height of the select panel. */\r\nexport const SELECT_PANEL_HEIGHT = 200;\r\n\r\n// TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.\r\n/**\r\n * Distance between the panel edge and the option text in\r\n * multi-selection mode.\r\n *\r\n * Calculated as:\r\n * (SELECT_PANEL_PADDING_X * 1.5) + 20 = 44\r\n * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.\r\n * The checkbox width is 16px.\r\n */\r\nexport let SELECT_MULTIPLE_PANEL_PADDING_X = 0;\r\n\r\n/**\r\n * The select panel will only \"fit\" inside the viewport if it is positioned at\r\n * this value or more away from the viewport boundary.\r\n */\r\nexport const SELECT_PANEL_VIEWPORT_PADDING = 8;\r\n\r\n/** Change event object that is emitted when the select value has changed. */\r\nexport class OuiSelectChange {\r\n constructor(\r\n /** Reference to the select that emitted the change event. */\r\n public source: OuiSelect,\r\n /** Current value of the select that emitted the event. */\r\n public value: any\r\n ) {}\r\n}\r\n\r\n// Boilerplate for applying mixins to OuiSelect.\r\n/** @docs-private */\r\nexport class OuiSelectBase {\r\n constructor(\r\n public _elementRef: ElementRef,\r\n public _defaultErrorStateMatcher: ErrorStateMatcher,\r\n public _parentForm: NgForm,\r\n public _parentFormGroup: FormGroupDirective,\r\n public ngControl: NgControl\r\n ) {}\r\n}\r\n\r\nexport const _OuiSelectMixinBase: CanDisableCtor &\r\n HasTabIndexCtor &\r\n CanUpdateErrorStateCtor &\r\n typeof OuiSelectBase = mixinTabIndex(\r\n mixinDisabled(mixinErrorState(OuiSelectBase))\r\n);\r\n\r\n/**\r\n * Allows the user to customize the trigger that is displayed when the select has a value.\r\n */\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: 'oui-select-trigger',\r\n})\r\nexport class OuiSelectTrigger {}\r\n\r\n@Component({\r\n selector: 'oui-select',\r\n exportAs: 'ouiSelect',\r\n templateUrl: 'select.html',\r\n styleUrls: ['select.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['disabled', 'tabIndex'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n role: 'listbox',\r\n '[attr.id]': 'id',\r\n '[attr.tabindex]': 'tabIndex',\r\n '[attr.aria-label]': '_getAriaLabel()',\r\n '[attr.aria-labelledby]': '_getAriaLabelledby()',\r\n '[attr.aria-required]': 'required.toString()',\r\n '[attr.aria-disabled]': 'disabled.toString()',\r\n '[attr.aria-invalid]': 'errorState',\r\n '[attr.aria-owns]': 'panelOpen ? _optionIds : null',\r\n '[attr.aria-multiselectable]': 'multiple',\r\n '[attr.aria-describedby]': '_ariaDescribedby || null',\r\n '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\r\n '[class.oui-select-disabled]': 'disabled',\r\n '[class.oui-select-invalid]': 'errorState',\r\n '[class.oui-select-required]': 'required',\r\n '[class.oui-select-empty]': 'empty',\r\n class: 'oui-select oui-input',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(focus)': '_onFocus()',\r\n '(blur)': '_onBlur()',\r\n },\r\n providers: [\r\n { provide: OuiFormFieldControl, useExisting: OuiSelect },\r\n { provide: OUI_OPTION_PARENT_COMPONENT, useExisting: OuiSelect },\r\n ],\r\n})\r\nexport class OuiSelect\r\n extends _OuiSelectMixinBase\r\n implements\r\n AfterContentInit,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n DoCheck,\r\n ControlValueAccessor,\r\n CanDisable,\r\n HasTabIndex,\r\n OuiFormFieldControl,\r\n CanUpdateErrorState\r\n{\r\n /**Holds selected values after done */\r\n @Input() savedValues = [];\r\n /**Done button disabled until dropdown is dirty */\r\n disableDoneButton = true;\r\n /** Whether or not the overlay panel is open. */\r\n private _panelOpen = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _required = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _actionItems = false;\r\n private _singleActionItems = false;\r\n\r\n /** The scroll position of the overlay panel, calculated to center the selected option. */\r\n private _scrollTop = 0;\r\n\r\n /** The placeholder displayed in the trigger of the select. */\r\n private _placeholder: string;\r\n\r\n /** The label displayed on the cancel button of the select in case of multi-select. */\r\n private _cancelLabel = 'Cancel';\r\n\r\n /** The label displayed on the done button of the select in case of multi-select. */\r\n private _doneLabel = 'Done';\r\n\r\n /** The label displayed on the singleSelect and multiSelect of the select as a actionItem. */\r\n private _singleActionLabel = 'New action button';\r\n\r\n /** Whether the component is in multiple selection mode. */\r\n private _multiple = false;\r\n\r\n /** In multiple selection mode, enable Done button even in case of no option selected */\r\n private _allowNoSelection = false;\r\n\r\n /** Search input field **/\r\n isSearchFieldPresent: boolean;\r\n\r\n /** Unique id for this input. */\r\n private _uid = `oui-select-${nextUniqueId++}`;\r\n\r\n /** The last measured value for the trigger's client bounding rect. */\r\n _triggerRect: ClientRect;\r\n\r\n /** The aria-describedby attribute on the select for improved a11y. */\r\n _ariaDescribedby: string;\r\n\r\n /** The cached font-size of the trigger element. */\r\n _triggerFontSize = 0;\r\n\r\n /** Deals with the selection logic. */\r\n _selectionModel: SelectionModel;\r\n\r\n /** Manages keyboard events for options in the panel. */\r\n _keyManager: ActiveDescendantKeyManager;\r\n\r\n /** The IDs of child options to be passed to the aria-owns attribute. */\r\n _optionIds = '';\r\n\r\n /** The value of the select panel's transform-origin property. */\r\n _transformOrigin = 'top';\r\n\r\n /** If there is search input field a class is added dynamically to the perfect scrollbar **/\r\n ouiSelectInputOuterClassName: string;\r\n\r\n /** Adding top class to overlay panel */\r\n cdkConnectionOverlayPanel = '';\r\n\r\n /**\r\n * The y-offset of the overlay panel in relation to the trigger's top start corner.\r\n * This must be adjusted to align the selected option text over the trigger text.\r\n * when the panel opens. Will change based on the y-position of the selected option.\r\n */\r\n _offsetY = 0;\r\n\r\n /**\r\n * This position config ensures that the top \"start\" corner of the overlay\r\n * is aligned with with the top \"start\" of the origin by default (overlapping\r\n * the trigger completely). If the panel cannot fit below the trigger, it\r\n * will fall back to a position above the trigger.\r\n */\r\n _positions = [\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n },\r\n ];\r\n /** Emits whenever the component is destroyed. */\r\n private readonly _destroy = new Subject();\r\n\r\n /** Whether the component is disabling centering of the active option over the trigger. */\r\n private _disableOptionCentering = false;\r\n\r\n private _focused = false;\r\n\r\n /** A name for this control that can be used by `oui-form-field`. */\r\n controlType = 'oui-select';\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('trigger') trigger: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddCancelButton', { read: ElementRef }) ddCancelButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddDoneButton', { read: ElementRef }) ddDoneButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('singleButton', { read: ElementRef }) singleButton: ElementRef;\r\n\r\n /** Panel containing the select options. */\r\n @ViewChild('panel', { read: ElementRef }) panel: ElementRef;\r\n\r\n private _value: any;\r\n\r\n /**\r\n * Function used to sort the values in a select in multiple mode.\r\n * Follows the same logic as `Array.prototype.sort`.\r\n */\r\n @Input() sortComparator: (\r\n a: OuiOption,\r\n b: OuiOption,\r\n options: OuiOption[]\r\n ) => number;\r\n\r\n /** Aria label of the select. If not specified, the placeholder will be used as label. */\r\n @Input('aria-label') ariaLabel = '';\r\n\r\n /** Input that can be used to specify the `aria-labelledby` attribute. */\r\n @Input('aria-labelledby') ariaLabelledby: string;\r\n private _large = false;\r\n _monitorSubscription: any;\r\n\r\n /** Whether the oui-select is of large size. */\r\n @Input()\r\n get large(): boolean {\r\n return this._large;\r\n }\r\n set large(value) {\r\n this._large = coerceBooleanProperty(value);\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n private _id: string;\r\n\r\n /** Event emitted when the select panel has been toggled. */\r\n @Output()\r\n readonly openedChange: EventEmitter = new EventEmitter();\r\n\r\n /** Combined stream of all of the child options' change events. */\r\n readonly optionSelectionChanges: Observable = defer(\r\n (): Observable => {\r\n if (this.options) {\r\n return merge(...this.options.map((option) => option.onSelectionChange));\r\n }\r\n\r\n return this._ngZone.onStable.asObservable().pipe(\r\n take(1),\r\n switchMap(() => this.optionSelectionChanges)\r\n );\r\n }\r\n );\r\n\r\n /**\r\n * Event that emits whenever the raw value of the select changes. This is here primarily\r\n * to facilitate the two-way binding for the `value` input.\r\n *\r\n * @docs-private\r\n */\r\n @Output() readonly valueChange: EventEmitter = new EventEmitter();\r\n\r\n /** Object used to control when error messages are shown. */\r\n @Input() errorStateMatcher: ErrorStateMatcher;\r\n\r\n /** All of the defined select options. */\r\n @ContentChildren(OuiOption, { descendants: true })\r\n options: QueryList;\r\n\r\n /** Event emitted when the select has been opened. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('opened')\r\n readonly _openedStream: Observable = this.openedChange.pipe(\r\n filter((o) => o),\r\n map(() => {})\r\n );\r\n\r\n /** Event emitted when the select has been closed. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('closed')\r\n readonly _closedStream: Observable = this.openedChange.pipe(\r\n filter((o) => !o),\r\n map(() => {\r\n this.isSearchFieldPresent = false;\r\n })\r\n );\r\n\r\n /** Event emitted when the selected value has been changed by the user. */\r\n @Output()\r\n readonly selectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the selected value has been changed and saved by the user. */\r\n @Output()\r\n readonly saveSelectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Can pass any method to be triggered on singleActionItem click. */\r\n @Output()\r\n readonly singleSelectionChange = new EventEmitter();\r\n\r\n /** All of the defined groups of options. */\r\n @ContentChildren(OuiOptgroup) optionGroups: QueryList;\r\n\r\n /** User-supplied override of the trigger element. */\r\n @ContentChild(OuiSelectTrigger)\r\n customTrigger: OuiSelectTrigger;\r\n\r\n /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */\r\n @Input() panelClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** Overlay pane containing the options. */\r\n @ViewChild(CdkConnectedOverlay)\r\n overlayDir: CdkConnectedOverlay;\r\n\r\n /** Emits when the panel element is finished transforming in. */\r\n _panelDoneAnimatingStream = new Subject();\r\n\r\n /** Comparison function to specify which option is displayed. Defaults to object equality. */\r\n private _compareWith = (o1: any, o2: any) => o1 === o2;\r\n\r\n /** Whether the select is focused. */\r\n get focused(): boolean {\r\n return this._focused || this._panelOpen;\r\n }\r\n /**\r\n * @deprecated Setter to be removed as this property is intended to be readonly.\r\n */\r\n set focused(value: boolean) {\r\n this._focused = value;\r\n }\r\n /** `View -> model callback called when value changes` */\r\n _onChange: (value: any) => void = () => {};\r\n\r\n /** `View -> model callback called when select has been touched` */\r\n _onTouched = () => {};\r\n\r\n /** Placeholder to be shown if no value has been selected. */\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of multiple the cancelLabel to be shown on cancel action button. */\r\n @Input()\r\n get cancelLabel(): string {\r\n return this._cancelLabel;\r\n }\r\n set cancelLabel(value: string) {\r\n this._cancelLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of multiple the doneLabel to be shown on apply action button. */\r\n @Input()\r\n get doneLabel(): string {\r\n return this._doneLabel;\r\n }\r\n set doneLabel(value: string) {\r\n this._doneLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of singleSelect and multiSelect the singleActionLabel to be shown on actionItem. */\r\n @Input()\r\n get singleActionLabel(): string {\r\n return this._singleActionLabel;\r\n }\r\n set singleActionLabel(value: string) {\r\n this._singleActionLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the component is required. */\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the user should be allowed to select multiple options. */\r\n @Input()\r\n get multiple(): boolean {\r\n return this._multiple;\r\n }\r\n set multiple(value: boolean) {\r\n if (this._selectionModel) {\r\n throw getOuiSelectDynamicMultipleError();\r\n }\r\n\r\n this._multiple = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the user should be allowed to select no option in case of multiple options. */\r\n @Input()\r\n get allowNoSelection(): boolean {\r\n return this._allowNoSelection;\r\n }\r\n set allowNoSelection(value: boolean) {\r\n this._allowNoSelection = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the action items are required and use saveSelectionChange instead of selectionChange. */\r\n @Input()\r\n get actionItems(): boolean {\r\n return this._actionItems;\r\n }\r\n set actionItems(value: boolean) {\r\n if (this._multiple) {\r\n this._actionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n @Input()\r\n get singleActionItem(): boolean {\r\n return this._singleActionItems;\r\n }\r\n set singleActionItem(value: boolean) {\r\n this._singleActionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether to center the active option over the trigger. */\r\n @Input()\r\n get disableOptionCentering(): boolean {\r\n return this._disableOptionCentering;\r\n }\r\n set disableOptionCentering(value: boolean) {\r\n this._disableOptionCentering = coerceBooleanProperty(value);\r\n }\r\n\r\n /**\r\n * Function to compare the option values with the selected values. The first argument\r\n * is a value from an option. The second is a value from the selection. A boolean\r\n * should be returned.\r\n */\r\n @Input()\r\n get compareWith() {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (o1: any, o2: any) => boolean) {\r\n if (typeof fn !== 'function') {\r\n throw getOuiSelectNonFunctionValueError();\r\n }\r\n this._compareWith = fn;\r\n if (this._selectionModel) {\r\n // A different comparator means the selection could change.\r\n this._initializeSelection();\r\n }\r\n }\r\n\r\n /** Value of the select control. */\r\n @Input()\r\n get value(): any {\r\n return this._value;\r\n }\r\n set value(newValue: any) {\r\n if (newValue !== this._value) {\r\n this.writeValue(newValue);\r\n this._value = newValue;\r\n }\r\n }\r\n\r\n /** Unique id of the element. */\r\n @Input()\r\n get id(): string {\r\n return this._id;\r\n }\r\n set id(value: string) {\r\n this._id = value || this._uid;\r\n this.stateChanges.next();\r\n }\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _ngZone: NgZone,\r\n _defaultErrorStateMatcher: ErrorStateMatcher,\r\n elementRef: ElementRef,\r\n private _focusMonitor: FocusMonitor,\r\n @Optional() private _dir: Directionality,\r\n @Optional() _parentForm: NgForm,\r\n @Optional() _parentFormGroup: FormGroupDirective,\r\n @Optional() private _parentFormField: OuiFormField,\r\n @Self() @Optional() public ngControl: NgControl,\r\n @Attribute('tabindex') tabIndex: string,\r\n @Optional() @Inject(DOCUMENT) private _document: any,\r\n public _elementRef: ElementRef,\r\n public _ouiIconRegistry: OuiIconRegistry,\r\n private _domSanitizer: DomSanitizer\r\n ) {\r\n super(\r\n elementRef,\r\n _defaultErrorStateMatcher,\r\n _parentForm,\r\n _parentFormGroup,\r\n ngControl\r\n );\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this._elementRef, true)\r\n .subscribe(() => this._ngZone.run(() => {}));\r\n this._ouiIconRegistry.addSvgIconLiteral(\r\n `select-arrow-icon`,\r\n this._domSanitizer.bypassSecurityTrustHtml(ICONS.SELECT_ARROW_ICON)\r\n );\r\n\r\n if (this.ngControl) {\r\n // Note: we provide the value accessor through here, instead of\r\n // the `providers` to avoid running into a circular import.\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n this.tabIndex = parseInt(tabIndex, 10) || 0;\r\n\r\n // Force setter to be called in case id was not specified.\r\n this.id = this.id;\r\n }\r\n\r\n ngOnInit() {\r\n this._selectionModel = new SelectionModel(this.multiple);\r\n this.stateChanges.next();\r\n\r\n // We need `distinctUntilChanged` here, because some browsers will\r\n // fire the animation end event twice for the same animation. See:\r\n // https://github.com/angular/angular/issues/24084\r\n this._panelDoneAnimatingStream\r\n .pipe(distinctUntilChanged(), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n if (this.panelOpen) {\r\n this._scrollTop = 0;\r\n this.openedChange.emit(true);\r\n } else {\r\n this.openedChange.emit(false);\r\n this.overlayDir.offsetX = 0;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._initKeyManager();\r\n\r\n this._selectionModel.changed\r\n .pipe(takeUntil(this._destroy))\r\n .subscribe((event) => {\r\n event.added.forEach((option) => option.select());\r\n event.removed.forEach((option) => option.deselect());\r\n });\r\n\r\n this.options.changes\r\n .pipe(startWith(null), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n this._resetOptions();\r\n this._initializeSelection();\r\n });\r\n }\r\n\r\n ngDoCheck() {\r\n if (this.ngControl) {\r\n this.updateErrorState();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let\r\n // the parent form field know to run change detection when the disabled state changes.\r\n if (changes.disabled) {\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._monitorSubscription.unsubscribe();\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n this._destroy.next();\r\n this._destroy.complete();\r\n this.stateChanges.complete();\r\n }\r\n\r\n /** Toggles the overlay panel open or closed. */\r\n toggle(): void {\r\n if (this.panelOpen) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /** Opens the overlay panel. */\r\n open(): void {\r\n if (\r\n this.disabled ||\r\n !this.options ||\r\n !this.options.length ||\r\n this._panelOpen\r\n ) {\r\n return;\r\n }\r\n\r\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\r\n\r\n this._panelOpen = true;\r\n this._keyManager.withHorizontalOrientation(null);\r\n\r\n this._highlightCorrectOption();\r\n this._changeDetectorRef.markForCheck();\r\n this.openedChange.emit(true);\r\n this._elementRef.nativeElement.classList.add(\r\n 'oui-select-list-options-opened'\r\n );\r\n }\r\n\r\n /** Closes the overlay panel and focuses the host element. */\r\n close(): void {\r\n if (this._panelOpen) {\r\n this._panelOpen = false;\r\n this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');\r\n this._changeDetectorRef.markForCheck();\r\n this._onTouched();\r\n this.openedChange.emit(false);\r\n this._elementRef.nativeElement.classList.remove(\r\n 'oui-select-list-options-opened'\r\n );\r\n setTimeout((_) => this._document.activeElement.blur());\r\n }\r\n }\r\n\r\n /**\r\n * Sets the select's value. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param value New value to be written to the model.\r\n */\r\n writeValue(value: any): void {\r\n if (this.options) {\r\n this._setSelectionByValue(value);\r\n }\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select's value\r\n * changes from user input. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the value changes.\r\n */\r\n registerOnChange(fn: (value: any) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select is blurred\r\n * by the user. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the component has been touched.\r\n */\r\n registerOnTouched(fn: () => {}): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n /**\r\n * Disables the select. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param isDisabled Sets whether the component is disabled.\r\n */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether or not the overlay panel is open. */\r\n get panelOpen(): boolean {\r\n return this._panelOpen;\r\n }\r\n\r\n /** The currently selected option. */\r\n get selected(): OuiOption | OuiOption[] {\r\n return this.multiple\r\n ? this._selectionModel.selected\r\n : this._selectionModel.selected[0];\r\n }\r\n\r\n /** The value displayed in the trigger. */\r\n get triggerValue(): string {\r\n if (this.empty) {\r\n return '';\r\n }\r\n if (this._multiple) {\r\n const selectedOptions = this._selectionModel.selected.map(\r\n (option) => option.viewValueForSelect\r\n );\r\n\r\n if (this._isRtl()) {\r\n selectedOptions.reverse();\r\n }\r\n return selectedOptions.join(', ');\r\n }\r\n return this._selectionModel.selected[0].viewValueForSelect;\r\n }\r\n\r\n /** Whether the element is in RTL mode. */\r\n _isRtl(): boolean {\r\n return this._dir ? this._dir.value === 'rtl' : false;\r\n }\r\n\r\n /** Handles all keydown events on the select. */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (!this.disabled) {\r\n if (this.panelOpen) {\r\n this._handleOpenKeydown(event);\r\n } else {\r\n this._handleClosedKeydown(event);\r\n }\r\n }\r\n }\r\n\r\n /** Handles keyboard events while the select is closed. */\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const keyCode = event.keyCode;\r\n const isArrowKey =\r\n keyCode === DOWN_ARROW ||\r\n keyCode === UP_ARROW ||\r\n keyCode === LEFT_ARROW ||\r\n keyCode === RIGHT_ARROW;\r\n const isOpenKey = keyCode === ENTER || keyCode === SPACE;\r\n const manager = this._keyManager;\r\n\r\n // Open the select on ALT + arrow key to match the native \r\n event.preventDefault();\r\n this.close();\r\n } else if (\r\n (keyCode === ENTER || keyCode === SPACE) &&\r\n manager.activeItem &&\r\n !hasModifierKey(event)\r\n ) {\r\n event.preventDefault();\r\n manager.activeItem._selectViaInteraction();\r\n } else if (this._multiple && keyCode === A && event.ctrlKey) {\r\n event.preventDefault();\r\n this.handleCtrlKey();\r\n } else if (normalNavigationCheck) {\r\n // Check for non multiple select dropdown that the key pressed is not Tab, Space, Enter\r\n if (!this.isSearchFieldPresent) this.focus();\r\n this.handleScrolling(manager, event, isArrowKey, keyCode);\r\n }\r\n }\r\n\r\n /**\r\n * Handle ctrl key\r\n */\r\n private handleCtrlKey() {\r\n const hasDeselectedOptions = this.options.some(\r\n (opt) => !opt.disabled && !opt.selected\r\n );\r\n\r\n this.options.forEach((option) => {\r\n if (!option.disabled) {\r\n if (hasDeselectedOptions) {\r\n option.select();\r\n } else {\r\n option.deselect();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @param manager\r\n * @param event\r\n * @param isArrowKey\r\n * @param keyCode\r\n */\r\n private handleScrolling(\r\n manager: ActiveDescendantKeyManager,\r\n event: KeyboardEvent,\r\n isArrowKey: boolean,\r\n keyCode: number\r\n ) {\r\n const previouslyFocusedIndex = manager.activeItemIndex;\r\n\r\n manager.onKeydown(event);\r\n\r\n if (\r\n this._multiple &&\r\n isArrowKey &&\r\n event.shiftKey &&\r\n manager.activeItem &&\r\n manager.activeItemIndex !== previouslyFocusedIndex\r\n ) {\r\n manager.activeItem._selectViaInteraction();\r\n }\r\n if (isArrowKey && manager.activeItemIndex !== previouslyFocusedIndex) {\r\n this._scrollToOption();\r\n } else {\r\n // First or last\r\n if (keyCode === DOWN_ARROW) {\r\n manager.setFirstItemActive();\r\n this._setScrollTop(0);\r\n }\r\n if (keyCode === UP_ARROW) {\r\n manager.setLastItemActive();\r\n this._scrollToOption();\r\n }\r\n }\r\n }\r\n\r\n _onFocus() {\r\n if (!this.disabled) {\r\n this._focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\r\n * \"blur\" to the panel when it opens, causing a false positive.\r\n */\r\n _onBlur() {\r\n this._focused = false;\r\n // this.isSearchFieldPresent = false;\r\n\r\n if (!this.disabled && !this.panelOpen) {\r\n this._onTouched();\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Callback that is invoked when the overlay panel has been attached.\r\n */\r\n _onAttached(): void {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {\r\n this._setPseudoCheckboxPaddingSize();\r\n this._changeDetectorRef.detectChanges();\r\n this.panel.nativeElement.scrollTop = this._scrollTop;\r\n });\r\n }\r\n\r\n /** Returns the theme to be used on the panel. */\r\n _getPanelTheme(): string {\r\n return this._parentFormField ? `oui-${this._parentFormField.color}` : '';\r\n }\r\n\r\n // TODO(josephperrott): Remove after 2018 spec updates are fully merged.\r\n /** Sets the pseudo checkbox padding size based on the width of the pseudo checkbox. */\r\n private _setPseudoCheckboxPaddingSize() {\r\n if (!SELECT_MULTIPLE_PANEL_PADDING_X && this.multiple) {\r\n const pseudoCheckbox = this.panel.nativeElement.querySelector(\r\n '.oui-pseudo-checkbox'\r\n );\r\n if (pseudoCheckbox) {\r\n SELECT_MULTIPLE_PANEL_PADDING_X =\r\n SELECT_PANEL_PADDING_X * 1.5 + pseudoCheckbox.offsetWidth;\r\n }\r\n }\r\n }\r\n\r\n /** Whether the select has a value. */\r\n get empty(): boolean {\r\n return !this._selectionModel || this._selectionModel.isEmpty();\r\n }\r\n\r\n private _initializeSelection(): void {\r\n // Defer setting the value in order to avoid the \"Expression\r\n // has changed after it was checked\" errors from Angular.\r\n Promise.resolve().then(() => {\r\n this._setSelectionByValue(\r\n this.ngControl ? this.ngControl.value : this._value\r\n );\r\n this.savedValues = this.ngControl ? this.ngControl.value : this._value;\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the selected option based on a value. If no option can be\r\n * found with the designated value, the select trigger is cleared.\r\n */\r\n private _setSelectionByValue(value: any): void {\r\n if (this.multiple && value) {\r\n if (!Array.isArray(value)) {\r\n throw getOuiSelectNonArrayValueError();\r\n }\r\n\r\n this._selectionModel.clear();\r\n value.forEach((currentValue: any) => this._selectValue(currentValue));\r\n this._sortValues();\r\n } else {\r\n this._selectionModel.clear();\r\n const correspondingOption = this._selectValue(value);\r\n // Shift focus to the active item. Note that we shouldn't do this in multiple\r\n // mode, because we don't know what option the user interacted with last.\r\n if (correspondingOption) {\r\n this._keyManager.setActiveItem(correspondingOption);\r\n }\r\n }\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /**\r\n * Finds and selects and option based on its value.\r\n *\r\n * @returns Option that has the corresponding value.\r\n */\r\n private _selectValue(value: any): OuiOption | undefined {\r\n const correspondingOption = this.options.find((option: OuiOption) => {\r\n try {\r\n // Treat null as a special reset value.\r\n return option.value != null && this._compareWith(option.value, value);\r\n } catch (error) {\r\n if (isDevMode()) {\r\n // Notify developers of errors in their comparator.\r\n console.warn(error);\r\n }\r\n return false;\r\n }\r\n });\r\n\r\n if (correspondingOption) {\r\n this._selectionModel.select(correspondingOption);\r\n }\r\n\r\n return correspondingOption;\r\n }\r\n\r\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\r\n private _initKeyManager() {\r\n this._keyManager = new ActiveDescendantKeyManager(this.options)\r\n .withTypeAhead()\r\n .withVerticalOrientation()\r\n .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')\r\n .withAllowedModifierKeys(['shiftKey']);\r\n\r\n this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n // Restore focus to the trigger before closing. Ensures that the focus\r\n // position won't be lost if the user got focus into the overlay.\r\n if (!this.singleActionItem) {\r\n this.focus();\r\n this.close();\r\n }\r\n });\r\n\r\n this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n if (this._panelOpen && this.panel) {\r\n // Panel is opened\r\n // Need not to scroll\r\n } else if (\r\n !this._panelOpen &&\r\n !this.multiple &&\r\n this._keyManager.activeItem\r\n ) {\r\n this._keyManager.activeItem._selectViaInteraction();\r\n }\r\n });\r\n }\r\n\r\n /** Drops current option subscriptions and IDs and resets from scratch. */\r\n private _resetOptions(): void {\r\n const changedOrDestroyed = merge(this.options.changes, this._destroy);\r\n\r\n this.optionSelectionChanges\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe((event) => {\r\n this._onSelect(event.source, event.isUserInput);\r\n\r\n if (event.isUserInput && !this.multiple && this._panelOpen) {\r\n this.close();\r\n this.focus();\r\n }\r\n });\r\n\r\n // Listen to changes in the internal state of the options and react accordingly.\r\n // Handles cases like the labels of the selected options changing.\r\n merge(...this.options.map((option) => option._stateChanges))\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe(() => {\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n });\r\n\r\n this._setOptionIds();\r\n }\r\n\r\n /** Invoked when an option is clicked. */\r\n private _onSelect(option: OuiOption, isUserInput: boolean): void {\r\n const wasSelected = this._selectionModel.isSelected(option);\r\n\r\n if (option.value == null && !this._multiple) {\r\n option.deselect();\r\n this._selectionModel.clear();\r\n this._propagateChanges(option.value);\r\n } else {\r\n if (option.selected) {\r\n this._selectionModel.select(option);\r\n } else {\r\n this._selectionModel.deselect(option);\r\n }\r\n\r\n if (isUserInput) {\r\n this._keyManager.setActiveItem(option);\r\n }\r\n\r\n if (this.multiple) {\r\n this._sortValues();\r\n\r\n if (isUserInput) {\r\n // In case the user selected the option with their mouse, we\r\n // want to restore focus back to the trigger, in order to\r\n // prevent the select keyboard controls from clashing with\r\n // the ones from `oui-option`.\r\n this.focus();\r\n }\r\n }\r\n }\r\n\r\n if (wasSelected !== this._selectionModel.isSelected(option)) {\r\n this._propagateChanges();\r\n }\r\n if (this.multiple) {\r\n this.disableDoneButton = this._isDoneButtonDisabled();\r\n }\r\n this.stateChanges.next();\r\n }\r\n discardRecentChanges() {\r\n this.value = this.savedValues;\r\n this._setSelectionByValue(this.value);\r\n this.disableDoneButton = true;\r\n this.close();\r\n }\r\n doneRecentChanges() {\r\n this.savedValues = this.value;\r\n this.disableDoneButton = true;\r\n this.saveSelectionChange.emit(new OuiSelectChange(this, this.value));\r\n this.close();\r\n }\r\n\r\n handleSingleActionItemClick() {\r\n this.singleSelectionChange.emit();\r\n this.close();\r\n }\r\n\r\n /** Determine whether the \"Done\" button should be enabled or disabled based on the selection state */\r\n private _isDoneButtonDisabled(): boolean {\r\n const selectedItems = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n if (this.allowNoSelection) {\r\n return false;\r\n }\r\n return selectedItems.length === 0;\r\n }\r\n\r\n /** Sorts the selected values in the selected based on their order in the panel. */\r\n private _sortValues() {\r\n if (this.multiple) {\r\n const options = this.options.toArray();\r\n\r\n this._selectionModel.sort((a, b) =>\r\n this.sortComparator\r\n ? this.sortComparator(a, b, options)\r\n : options.indexOf(a) - options.indexOf(b)\r\n );\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Emits change event to set the model value. */\r\n private _propagateChanges(fallbackValue?: any): void {\r\n let valueToEmit: any = null;\r\n\r\n if (this.multiple) {\r\n valueToEmit = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n } else {\r\n valueToEmit = this.selected\r\n ? (this.selected as OuiOption).value\r\n : fallbackValue;\r\n }\r\n\r\n this._value = valueToEmit;\r\n this.valueChange.emit(valueToEmit);\r\n this._onChange(valueToEmit);\r\n this.selectionChange.emit(new OuiSelectChange(this, valueToEmit));\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /** Records option IDs to pass to the aria-owns property. */\r\n private _setOptionIds() {\r\n this._optionIds = this.options.map((option) => option.id).join(' ');\r\n }\r\n\r\n /**\r\n * Highlights the selected item. If no option is selected, it will highlight\r\n * the first item instead.\r\n */\r\n private _highlightCorrectOption(): void {\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n } else if (this._keyManager) {\r\n if (this.empty) {\r\n this._keyManager.setFirstItemActive();\r\n } else {\r\n this._keyManager.setActiveItem(this._selectionModel.selected[0]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Highlights the first of the filtered options if no element is currently highlighted\r\n */\r\n private _highlightFirstFilteredOption(): void {\r\n if (this._keyManager) {\r\n const activeElement = this._keyManager.activeItem?._getHostElement();\r\n // activeElement is not part of DOM if there is no parent element\r\n if (!activeElement || !activeElement.parentElement) {\r\n // highlight first element if there is no active element or active element is not part of DOM\r\n this._keyManager.setFirstItemActive();\r\n }\r\n }\r\n }\r\n\r\n /** Focuses the select element. */\r\n focus(): void {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n\r\n /** Returns the aria-label of the select component. */\r\n _getAriaLabel(): string | null {\r\n // If an ariaLabelledby value has been set by the consumer, the select should not overwrite the\r\n // `aria-labelledby` value by setting the ariaLabel to the placeholder.\r\n return this.ariaLabelledby ? null : this.ariaLabel || this.placeholder;\r\n }\r\n\r\n /** Returns the aria-labelledby of the select component. */\r\n _getAriaLabelledby(): string | null {\r\n if (this.ariaLabelledby) {\r\n return this.ariaLabelledby;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Determines the `aria-activedescendant` to be set on the host. */\r\n _getAriaActiveDescendant(): string | null {\r\n if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\r\n return this._keyManager.activeItem.id;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n setDescribedByIds(ids: string[]) {\r\n this._ariaDescribedby = ids.join(' ');\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n onContainerClick() {\r\n this.focus();\r\n this.open();\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n get shouldLabelFloat(): boolean {\r\n return this._panelOpen || !this.empty;\r\n }\r\n\r\n /**\r\n * Add outer class to perfect scrollbar\r\n * This is added only when there is a search field\r\n */\r\n ouiSelectInputOuter() {\r\n this.ouiSelectInputOuterClassName = 'oui-select-input-outer';\r\n }\r\n\r\n /**\r\n * Custom overlay class for cdk overlay container\r\n */\r\n openCdk() {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe((e) => {\r\n this.cdkConnectionOverlayPanel = '';\r\n if (e.connectionPair.originY === 'top') {\r\n this.cdkConnectionOverlayPanel = 'select-overlay-top';\r\n }\r\n this._changeDetectorRef.detectChanges();\r\n setTimeout((_) => this._scrollToOption());\r\n });\r\n\r\n const cdkOverLayContainer = this._document.querySelector(\r\n '.cdk-overlay-container'\r\n );\r\n const ouiSelectPanel = this._document.querySelector('.oui-select-panel');\r\n cdkOverLayContainer.classList.add('oui-select-overlay-container');\r\n const containerWidth = this._elementRef.nativeElement.offsetWidth;\r\n ouiSelectPanel.style.width = `${containerWidth}px`;\r\n const searchQueryString = '.oui-select-search-inner';\r\n if (this._document.querySelector(searchQueryString)) {\r\n this.scrollCalc(searchQueryString);\r\n }\r\n }\r\n scrollCalc(selectQueryString: string) {\r\n const searchInput = this._document.querySelector(selectQueryString);\r\n const outter = this._document.querySelector('.oui-select-panel');\r\n let inner = this._document.querySelector('.oui-option');\r\n if (inner === null) {\r\n inner = 0;\r\n }\r\n const scrollbarWidth = outter.offsetWidth - inner.offsetWidth;\r\n if (scrollbarWidth > 5) {\r\n searchInput.style.width = `${inner.offsetWidth}px`;\r\n } else {\r\n searchInput.style.width = '100%';\r\n }\r\n }\r\n\r\n /**\r\n * Given that we are not actually focusing active options, we must manually adjust scroll\r\n * to reveal options below the fold. First, we find the offset of the option from the top\r\n * of the panel. If that offset is below the fold, the new scrollTop will be the offset -\r\n * the panel height + the option height, so the active option will be just visible at the\r\n * bottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\r\n * will become the offset. If that offset is visible within the panel already, the scrollTop is\r\n * not adjusted.\r\n */\r\n private _scrollToOption(): void {\r\n const manager = this._keyManager;\r\n const index = manager.activeItemIndex || 0;\r\n const labelCount = _countGroupLabelsBeforeOption(\r\n index,\r\n this.options,\r\n this.optionGroups\r\n );\r\n const selectedOption = manager.activeItem?._getHostElement();\r\n const selectActionWrapperElement = this._document.querySelector(\r\n '.oui-select-action-wrapper'\r\n ) as HTMLElement;\r\n const selectPanelElement = this._document.querySelector(\r\n '.oui-select-panel'\r\n ) as HTMLElement;\r\n const selectSearchBox = this._document.querySelector(\r\n '.oui-select-search-inner'\r\n ) as HTMLElement;\r\n const selectOptionsWrapper = this._document.querySelector(\r\n '.oui-select-options-wrapper'\r\n ) as HTMLElement;\r\n const labelHeight = labelCount ? (labelCount - 1) * 10 : 0;\r\n const optionHeight = selectedOption?.clientHeight || SELECT_OPTION_HEIGHT;\r\n const ouiSelectActionWrapperHeight =\r\n selectActionWrapperElement?.clientHeight ?? 0;\r\n const selectSearchBoxheight = selectSearchBox?.clientHeight - 10 || 0;\r\n const selectPanelHeight =\r\n selectPanelElement?.clientHeight -\r\n ouiSelectActionWrapperHeight -\r\n selectSearchBoxheight -\r\n 20 -\r\n labelHeight || SELECT_PANEL_HEIGHT;\r\n const selectOptionsWrapperRect =\r\n selectOptionsWrapper?.getBoundingClientRect();\r\n const selectedOptionRect = selectedOption?.getBoundingClientRect();\r\n const selectedOptionOffset =\r\n selectedOptionRect?.top -\r\n selectSearchBoxheight -\r\n selectOptionsWrapperRect?.top -\r\n 10;\r\n const scrollTop = this._getScrollTop();\r\n const newScrollPosition = _getOptionScrollPosition(\r\n index + labelCount,\r\n optionHeight,\r\n scrollTop,\r\n selectPanelHeight,\r\n selectedOptionOffset\r\n );\r\n this._setScrollTop(newScrollPosition);\r\n }\r\n\r\n /**\r\n * Sets the panel scrollTop. This allows us to manually scroll to display options\r\n * above or below the fold, as they are not actually being focused when active.\r\n */\r\n _setScrollTop(scrollTop: number): void {\r\n if (this.panel) {\r\n this.panel.nativeElement.querySelector('.oui-select-options').scrollTop =\r\n scrollTop;\r\n }\r\n }\r\n\r\n /** Returns the panel's scrollTop. */\r\n _getScrollTop(): number {\r\n return this.panel\r\n ? this.panel.nativeElement.querySelector('.oui-select-options').scrollTop\r\n : 0;\r\n }\r\n}\r\n", "constructorObj": { "name": "constructor", "description": "", @@ -10103,6 +10148,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_defaultErrorStateMatcher", @@ -10168,19 +10215,17 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, { "name": "OuiSelectChange", - "id": "class-OuiSelectChange-69627b742fec8101b0c412f353bb903b4d499f0f8291080ef1d6ac0c418484f2235fec3981e84104b948fe2f242b0a29fea2c39687b9ed9b01e6aa4fcda7ba37", + "id": "class-OuiSelectChange-08d5ca0d9e57fe0b53fd1a332196d178df30100ca9fb0087259f4b8a1ae16a1016170481f04d33ecca5ee382a48196b5a882bb369fc5cad3a4a4f2d289256b1b", "file": "ui/src/components/select/select.component.ts", "deprecated": false, "deprecationMessage": "", "type": "class", - "sourceCode": "import { ActiveDescendantKeyManager, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { SelectionModel } from '@angular/cdk/collections';\r\nimport {\r\n A,\r\n DOWN_ARROW,\r\n END,\r\n ENTER,\r\n HOME,\r\n LEFT_ARROW,\r\n RIGHT_ARROW,\r\n SPACE,\r\n UP_ARROW,\r\n hasModifierKey,\r\n TAB,\r\n} from '@angular/cdk/keycodes';\r\nimport { CdkConnectedOverlay } from '@angular/cdk/overlay';\r\nimport {\r\n AfterContentInit,\r\n Attribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n ContentChildren,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n isDevMode,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n QueryList,\r\n Self,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n Inject,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n} from '@angular/forms';\r\nimport {\r\n _countGroupLabelsBeforeOption,\r\n _getOptionScrollPosition,\r\n CanDisable,\r\n CanDisableCtor,\r\n CanUpdateErrorState,\r\n CanUpdateErrorStateCtor,\r\n HasTabIndex,\r\n HasTabIndexCtor,\r\n OuiOptionSelectionChange,\r\n mixinErrorState,\r\n mixinTabIndex,\r\n mixinDisabled,\r\n} from '../core';\r\nimport { OuiFormField, OuiFormFieldControl } from '../form-field/public-api';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { OUI_OPTION_PARENT_COMPONENT, OuiOption } from '../core/option/option';\r\nimport { OuiOptgroup } from '../core/option/optgroup';\r\nimport { ErrorStateMatcher } from '../core/error/error-options';\r\nimport { defer, merge, Observable, Subject } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n filter,\r\n map,\r\n startWith,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n} from 'rxjs/operators';\r\nimport {\r\n getOuiSelectDynamicMultipleError,\r\n getOuiSelectNonArrayValueError,\r\n getOuiSelectNonFunctionValueError,\r\n} from './select-errors';\r\nimport { OuiIconRegistry } from '../icon/icon-registery';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ICONS } from '../core/shared/icons';\r\n\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * The following style constants are necessary to save here in order\r\n * to properly calculate the alignment of the selected option over\r\n * the trigger element.\r\n */\r\n\r\n/** The height of each select option. */\r\nexport const SELECT_OPTION_HEIGHT = 40;\r\n\r\n/** The panel's padding on the x-axis */\r\nexport const SELECT_PANEL_PADDING_X = 16;\r\n\r\n/** The panel's x axis padding if it is indented (e.g. there is an option group). */\r\nexport const SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;\r\n\r\n/** The height of the select items in `em` units. */\r\nexport const SELECT_ITEM_HEIGHT_EM = 3;\r\n\r\n/** The total height of the select panel. */\r\nexport const SELECT_PANEL_HEIGHT = 200;\r\n\r\n// TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.\r\n/**\r\n * Distance between the panel edge and the option text in\r\n * multi-selection mode.\r\n *\r\n * Calculated as:\r\n * (SELECT_PANEL_PADDING_X * 1.5) + 20 = 44\r\n * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.\r\n * The checkbox width is 16px.\r\n */\r\nexport let SELECT_MULTIPLE_PANEL_PADDING_X = 0;\r\n\r\n/**\r\n * The select panel will only \"fit\" inside the viewport if it is positioned at\r\n * this value or more away from the viewport boundary.\r\n */\r\nexport const SELECT_PANEL_VIEWPORT_PADDING = 8;\r\n\r\n/** Change event object that is emitted when the select value has changed. */\r\nexport class OuiSelectChange {\r\n constructor(\r\n /** Reference to the select that emitted the change event. */\r\n public source: OuiSelect,\r\n /** Current value of the select that emitted the event. */\r\n public value: any\r\n ) {}\r\n}\r\n\r\n// Boilerplate for applying mixins to OuiSelect.\r\n/** @docs-private */\r\nexport class OuiSelectBase {\r\n constructor(\r\n public _elementRef: ElementRef,\r\n public _defaultErrorStateMatcher: ErrorStateMatcher,\r\n public _parentForm: NgForm,\r\n public _parentFormGroup: FormGroupDirective,\r\n public ngControl: NgControl\r\n ) {}\r\n}\r\n\r\nexport const _OuiSelectMixinBase: CanDisableCtor &\r\n HasTabIndexCtor &\r\n CanUpdateErrorStateCtor &\r\n typeof OuiSelectBase = mixinTabIndex(\r\n mixinDisabled(mixinErrorState(OuiSelectBase))\r\n);\r\n\r\n/**\r\n * Allows the user to customize the trigger that is displayed when the select has a value.\r\n */\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: 'oui-select-trigger',\r\n})\r\nexport class OuiSelectTrigger {}\r\n\r\n@Component({\r\n selector: 'oui-select',\r\n exportAs: 'ouiSelect',\r\n templateUrl: 'select.html',\r\n styleUrls: ['select.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['disabled', 'tabIndex'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n role: 'listbox',\r\n '[attr.id]': 'id',\r\n '[attr.tabindex]': 'tabIndex',\r\n '[attr.aria-label]': '_getAriaLabel()',\r\n '[attr.aria-labelledby]': '_getAriaLabelledby()',\r\n '[attr.aria-required]': 'required.toString()',\r\n '[attr.aria-disabled]': 'disabled.toString()',\r\n '[attr.aria-invalid]': 'errorState',\r\n '[attr.aria-owns]': 'panelOpen ? _optionIds : null',\r\n '[attr.aria-multiselectable]': 'multiple',\r\n '[attr.aria-describedby]': '_ariaDescribedby || null',\r\n '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\r\n '[class.oui-select-disabled]': 'disabled',\r\n '[class.oui-select-invalid]': 'errorState',\r\n '[class.oui-select-required]': 'required',\r\n '[class.oui-select-empty]': 'empty',\r\n class: 'oui-select oui-input',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(focus)': '_onFocus()',\r\n '(blur)': '_onBlur()',\r\n },\r\n providers: [\r\n { provide: OuiFormFieldControl, useExisting: OuiSelect },\r\n { provide: OUI_OPTION_PARENT_COMPONENT, useExisting: OuiSelect },\r\n ],\r\n})\r\nexport class OuiSelect\r\n extends _OuiSelectMixinBase\r\n implements\r\n AfterContentInit,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n DoCheck,\r\n ControlValueAccessor,\r\n CanDisable,\r\n HasTabIndex,\r\n OuiFormFieldControl,\r\n CanUpdateErrorState\r\n{\r\n /**Holds selected values after done */\r\n @Input() savedValues = [];\r\n /**Done button disabled until dropdown is dirty */\r\n disableDoneButton = true;\r\n /** Whether or not the overlay panel is open. */\r\n private _panelOpen = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _required = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _actionItems = false;\r\n\r\n /** The scroll position of the overlay panel, calculated to center the selected option. */\r\n private _scrollTop = 0;\r\n\r\n /** The placeholder displayed in the trigger of the select. */\r\n private _placeholder: string;\r\n\r\n /** Whether the component is in multiple selection mode. */\r\n private _multiple = false;\r\n\r\n /** Search input field **/\r\n isSearchFieldPresent: boolean;\r\n\r\n /** Unique id for this input. */\r\n private _uid = `oui-select-${nextUniqueId++}`;\r\n\r\n /** The last measured value for the trigger's client bounding rect. */\r\n _triggerRect: ClientRect;\r\n\r\n /** The aria-describedby attribute on the select for improved a11y. */\r\n _ariaDescribedby: string;\r\n\r\n /** The cached font-size of the trigger element. */\r\n _triggerFontSize = 0;\r\n\r\n /** Deals with the selection logic. */\r\n _selectionModel: SelectionModel;\r\n\r\n /** Manages keyboard events for options in the panel. */\r\n _keyManager: ActiveDescendantKeyManager;\r\n\r\n /** The IDs of child options to be passed to the aria-owns attribute. */\r\n _optionIds = '';\r\n\r\n /** The value of the select panel's transform-origin property. */\r\n _transformOrigin = 'top';\r\n\r\n /** If there is search input field a class is added dynamically to the perfect scrollbar **/\r\n ouiSelectInputOuterClassName: string;\r\n\r\n /** Adding top class to overlay panel */\r\n cdkConnectionOverlayPanel = '';\r\n\r\n /**\r\n * The y-offset of the overlay panel in relation to the trigger's top start corner.\r\n * This must be adjusted to align the selected option text over the trigger text.\r\n * when the panel opens. Will change based on the y-position of the selected option.\r\n */\r\n _offsetY = 0;\r\n\r\n /**\r\n * This position config ensures that the top \"start\" corner of the overlay\r\n * is aligned with with the top \"start\" of the origin by default (overlapping\r\n * the trigger completely). If the panel cannot fit below the trigger, it\r\n * will fall back to a position above the trigger.\r\n */\r\n _positions = [\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n },\r\n ];\r\n /** Emits whenever the component is destroyed. */\r\n private readonly _destroy = new Subject();\r\n\r\n /** Whether the component is disabling centering of the active option over the trigger. */\r\n private _disableOptionCentering = false;\r\n\r\n private _focused = false;\r\n\r\n /** A name for this control that can be used by `oui-form-field`. */\r\n controlType = 'oui-select';\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('trigger') trigger: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddCancelButton', { read: ElementRef }) ddCancelButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddDoneButton', { read: ElementRef }) ddDoneButton: ElementRef;\r\n\r\n /** Panel containing the select options. */\r\n @ViewChild('panel', { read: ElementRef }) panel: ElementRef;\r\n\r\n private _value: any;\r\n\r\n /**\r\n * Function used to sort the values in a select in multiple mode.\r\n * Follows the same logic as `Array.prototype.sort`.\r\n */\r\n @Input() sortComparator: (\r\n a: OuiOption,\r\n b: OuiOption,\r\n options: OuiOption[]\r\n ) => number;\r\n\r\n /** Aria label of the select. If not specified, the placeholder will be used as label. */\r\n @Input('aria-label') ariaLabel = '';\r\n\r\n /** Input that can be used to specify the `aria-labelledby` attribute. */\r\n @Input('aria-labelledby') ariaLabelledby: string;\r\n private _large = false;\r\n _monitorSubscription: any;\r\n\r\n /** Whether the oui-select is of large size. */\r\n @Input()\r\n get large(): boolean {\r\n return this._large;\r\n }\r\n set large(value) {\r\n this._large = coerceBooleanProperty(value);\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n private _id: string;\r\n\r\n /** Event emitted when the select panel has been toggled. */\r\n @Output()\r\n readonly openedChange: EventEmitter = new EventEmitter();\r\n\r\n /** Combined stream of all of the child options' change events. */\r\n readonly optionSelectionChanges: Observable = defer(\r\n (): Observable => {\r\n if (this.options) {\r\n return merge(...this.options.map((option) => option.onSelectionChange));\r\n }\r\n\r\n return this._ngZone.onStable.asObservable().pipe(\r\n take(1),\r\n switchMap(() => this.optionSelectionChanges)\r\n );\r\n }\r\n );\r\n\r\n /**\r\n * Event that emits whenever the raw value of the select changes. This is here primarily\r\n * to facilitate the two-way binding for the `value` input.\r\n *\r\n * @docs-private\r\n */\r\n @Output() readonly valueChange: EventEmitter = new EventEmitter();\r\n\r\n /** Object used to control when error messages are shown. */\r\n @Input() errorStateMatcher: ErrorStateMatcher;\r\n\r\n /** All of the defined select options. */\r\n @ContentChildren(OuiOption, { descendants: true })\r\n options: QueryList;\r\n\r\n /** Event emitted when the select has been opened. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('opened')\r\n readonly _openedStream: Observable = this.openedChange.pipe(\r\n filter((o) => o),\r\n map(() => {})\r\n );\r\n\r\n /** Event emitted when the select has been closed. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('closed')\r\n readonly _closedStream: Observable = this.openedChange.pipe(\r\n filter((o) => !o),\r\n map(() => {\r\n this.isSearchFieldPresent = false;\r\n })\r\n );\r\n\r\n /** Event emitted when the selected value has been changed by the user. */\r\n @Output()\r\n readonly selectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the selected value has been changed and saved by the user. */\r\n @Output()\r\n readonly saveSelectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** All of the defined groups of options. */\r\n @ContentChildren(OuiOptgroup) optionGroups: QueryList;\r\n\r\n /** User-supplied override of the trigger element. */\r\n @ContentChild(OuiSelectTrigger)\r\n customTrigger: OuiSelectTrigger;\r\n\r\n /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */\r\n @Input() panelClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** Overlay pane containing the options. */\r\n @ViewChild(CdkConnectedOverlay)\r\n overlayDir: CdkConnectedOverlay;\r\n\r\n /** Emits when the panel element is finished transforming in. */\r\n _panelDoneAnimatingStream = new Subject();\r\n\r\n /** Comparison function to specify which option is displayed. Defaults to object equality. */\r\n private _compareWith = (o1: any, o2: any) => o1 === o2;\r\n\r\n /** Whether the select is focused. */\r\n get focused(): boolean {\r\n return this._focused || this._panelOpen;\r\n }\r\n /**\r\n * @deprecated Setter to be removed as this property is intended to be readonly.\r\n */\r\n set focused(value: boolean) {\r\n this._focused = value;\r\n }\r\n /** `View -> model callback called when value changes` */\r\n _onChange: (value: any) => void = () => {};\r\n\r\n /** `View -> model callback called when select has been touched` */\r\n _onTouched = () => {};\r\n\r\n /** Placeholder to be shown if no value has been selected. */\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the component is required. */\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the user should be allowed to select multiple options. */\r\n @Input()\r\n get multiple(): boolean {\r\n return this._multiple;\r\n }\r\n set multiple(value: boolean) {\r\n if (this._selectionModel) {\r\n throw getOuiSelectDynamicMultipleError();\r\n }\r\n\r\n this._multiple = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the action items are required and use saveSelectionChange instead of selectionChange. */\r\n @Input()\r\n get actionItems(): boolean {\r\n return this._actionItems;\r\n }\r\n set actionItems(value: boolean) {\r\n if (this._multiple) {\r\n this._actionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Whether to center the active option over the trigger. */\r\n @Input()\r\n get disableOptionCentering(): boolean {\r\n return this._disableOptionCentering;\r\n }\r\n set disableOptionCentering(value: boolean) {\r\n this._disableOptionCentering = coerceBooleanProperty(value);\r\n }\r\n\r\n /**\r\n * Function to compare the option values with the selected values. The first argument\r\n * is a value from an option. The second is a value from the selection. A boolean\r\n * should be returned.\r\n */\r\n @Input()\r\n get compareWith() {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (o1: any, o2: any) => boolean) {\r\n if (typeof fn !== 'function') {\r\n throw getOuiSelectNonFunctionValueError();\r\n }\r\n this._compareWith = fn;\r\n if (this._selectionModel) {\r\n // A different comparator means the selection could change.\r\n this._initializeSelection();\r\n }\r\n }\r\n\r\n /** Value of the select control. */\r\n @Input()\r\n get value(): any {\r\n return this._value;\r\n }\r\n set value(newValue: any) {\r\n if (newValue !== this._value) {\r\n this.writeValue(newValue);\r\n this._value = newValue;\r\n }\r\n }\r\n\r\n /** Unique id of the element. */\r\n @Input()\r\n get id(): string {\r\n return this._id;\r\n }\r\n set id(value: string) {\r\n this._id = value || this._uid;\r\n this.stateChanges.next();\r\n }\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _ngZone: NgZone,\r\n _defaultErrorStateMatcher: ErrorStateMatcher,\r\n elementRef: ElementRef,\r\n private _focusMonitor: FocusMonitor,\r\n @Optional() private _dir: Directionality,\r\n @Optional() _parentForm: NgForm,\r\n @Optional() _parentFormGroup: FormGroupDirective,\r\n @Optional() private _parentFormField: OuiFormField,\r\n @Self() @Optional() public ngControl: NgControl,\r\n @Attribute('tabindex') tabIndex: string,\r\n @Optional() @Inject(DOCUMENT) private _document: any,\r\n public _elementRef: ElementRef,\r\n public _ouiIconRegistry: OuiIconRegistry,\r\n private _domSanitizer: DomSanitizer\r\n ) {\r\n super(\r\n elementRef,\r\n _defaultErrorStateMatcher,\r\n _parentForm,\r\n _parentFormGroup,\r\n ngControl\r\n );\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this._elementRef, true)\r\n .subscribe(() => this._ngZone.run(() => {}));\r\n this._ouiIconRegistry.addSvgIconLiteral(\r\n `select-arrow-icon`,\r\n this._domSanitizer.bypassSecurityTrustHtml(ICONS.SELECT_ARROW_ICON)\r\n );\r\n\r\n if (this.ngControl) {\r\n // Note: we provide the value accessor through here, instead of\r\n // the `providers` to avoid running into a circular import.\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n this.tabIndex = parseInt(tabIndex, 10) || 0;\r\n\r\n // Force setter to be called in case id was not specified.\r\n this.id = this.id;\r\n }\r\n\r\n ngOnInit() {\r\n this._selectionModel = new SelectionModel(this.multiple);\r\n this.stateChanges.next();\r\n\r\n // We need `distinctUntilChanged` here, because some browsers will\r\n // fire the animation end event twice for the same animation. See:\r\n // https://github.com/angular/angular/issues/24084\r\n this._panelDoneAnimatingStream\r\n .pipe(distinctUntilChanged(), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n if (this.panelOpen) {\r\n this._scrollTop = 0;\r\n this.openedChange.emit(true);\r\n } else {\r\n this.openedChange.emit(false);\r\n this.overlayDir.offsetX = 0;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._initKeyManager();\r\n\r\n this._selectionModel.changed\r\n .pipe(takeUntil(this._destroy))\r\n .subscribe((event) => {\r\n event.added.forEach((option) => option.select());\r\n event.removed.forEach((option) => option.deselect());\r\n });\r\n\r\n this.options.changes\r\n .pipe(startWith(null), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n this._resetOptions();\r\n this._initializeSelection();\r\n });\r\n }\r\n\r\n ngDoCheck() {\r\n if (this.ngControl) {\r\n this.updateErrorState();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let\r\n // the parent form field know to run change detection when the disabled state changes.\r\n if (changes.disabled) {\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._monitorSubscription.unsubscribe();\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n this._destroy.next();\r\n this._destroy.complete();\r\n this.stateChanges.complete();\r\n }\r\n\r\n /** Toggles the overlay panel open or closed. */\r\n toggle(): void {\r\n this.panelOpen ? this.close() : this.open();\r\n }\r\n\r\n /** Opens the overlay panel. */\r\n open(): void {\r\n if (\r\n this.disabled ||\r\n !this.options ||\r\n !this.options.length ||\r\n this._panelOpen\r\n ) {\r\n return;\r\n }\r\n\r\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\r\n\r\n this._panelOpen = true;\r\n this._keyManager.withHorizontalOrientation(null);\r\n\r\n this._highlightCorrectOption();\r\n this._changeDetectorRef.markForCheck();\r\n this.openedChange.emit(true);\r\n this._elementRef.nativeElement.classList.add(\r\n 'oui-select-list-options-opened'\r\n );\r\n }\r\n\r\n /** Closes the overlay panel and focuses the host element. */\r\n close(): void {\r\n if (this._panelOpen) {\r\n this._panelOpen = false;\r\n this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');\r\n this._changeDetectorRef.markForCheck();\r\n this._onTouched();\r\n this.openedChange.emit(false);\r\n this._elementRef.nativeElement.classList.remove(\r\n 'oui-select-list-options-opened'\r\n );\r\n setTimeout((_) => this._document.activeElement.blur());\r\n }\r\n }\r\n\r\n /**\r\n * Sets the select's value. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param value New value to be written to the model.\r\n */\r\n writeValue(value: any): void {\r\n if (this.options) {\r\n this._setSelectionByValue(value);\r\n }\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select's value\r\n * changes from user input. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the value changes.\r\n */\r\n registerOnChange(fn: (value: any) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select is blurred\r\n * by the user. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the component has been touched.\r\n */\r\n registerOnTouched(fn: () => {}): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n /**\r\n * Disables the select. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param isDisabled Sets whether the component is disabled.\r\n */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether or not the overlay panel is open. */\r\n get panelOpen(): boolean {\r\n return this._panelOpen;\r\n }\r\n\r\n /** The currently selected option. */\r\n get selected(): OuiOption | OuiOption[] {\r\n return this.multiple\r\n ? this._selectionModel.selected\r\n : this._selectionModel.selected[0];\r\n }\r\n\r\n /** The value displayed in the trigger. */\r\n get triggerValue(): string {\r\n if (this.empty) {\r\n return '';\r\n }\r\n if (this._multiple) {\r\n const selectedOptions = this._selectionModel.selected.map(\r\n (option) => option.viewValueForSelect\r\n );\r\n\r\n if (this._isRtl()) {\r\n selectedOptions.reverse();\r\n }\r\n return selectedOptions.join(', ');\r\n }\r\n return this._selectionModel.selected[0].viewValueForSelect;\r\n }\r\n\r\n /** Whether the element is in RTL mode. */\r\n _isRtl(): boolean {\r\n return this._dir ? this._dir.value === 'rtl' : false;\r\n }\r\n\r\n /** Handles all keydown events on the select. */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (!this.disabled) {\r\n this.panelOpen\r\n ? this._handleOpenKeydown(event)\r\n : this._handleClosedKeydown(event);\r\n }\r\n }\r\n\r\n /** Handles keyboard events while the select is closed. */\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const keyCode = event.keyCode;\r\n const isArrowKey =\r\n keyCode === DOWN_ARROW ||\r\n keyCode === UP_ARROW ||\r\n keyCode === LEFT_ARROW ||\r\n keyCode === RIGHT_ARROW;\r\n const isOpenKey = keyCode === ENTER || keyCode === SPACE;\r\n const manager = this._keyManager;\r\n\r\n // Open the select on ALT + arrow key to match the native \r\n event.preventDefault();\r\n this.close();\r\n } else if (\r\n (keyCode === ENTER || keyCode === SPACE) &&\r\n manager.activeItem &&\r\n !hasModifierKey(event)\r\n ) {\r\n event.preventDefault();\r\n manager.activeItem._selectViaInteraction();\r\n } else if (this._multiple && keyCode === A && event.ctrlKey) {\r\n event.preventDefault();\r\n this.handleCtrlKey();\r\n } else if (normalNavigationCheck) {\r\n // Check for non multiple select dropdown that the key pressed is not Tab, Space, Enter\r\n if (!this.isSearchFieldPresent) this.focus();\r\n this.handleScrolling(manager, event, isArrowKey, keyCode);\r\n }\r\n }\r\n\r\n /**\r\n * Handle ctrl key\r\n */\r\n private handleCtrlKey() {\r\n const hasDeselectedOptions = this.options.some(\r\n (opt) => !opt.disabled && !opt.selected\r\n );\r\n\r\n this.options.forEach((option) => {\r\n if (!option.disabled) {\r\n hasDeselectedOptions ? option.select() : option.deselect();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @param manager\r\n * @param event\r\n * @param isArrowKey\r\n * @param keyCode\r\n */\r\n private handleScrolling(\r\n manager: ActiveDescendantKeyManager,\r\n event: KeyboardEvent,\r\n isArrowKey: boolean,\r\n keyCode: number\r\n ) {\r\n const previouslyFocusedIndex = manager.activeItemIndex;\r\n\r\n manager.onKeydown(event);\r\n\r\n if (\r\n this._multiple &&\r\n isArrowKey &&\r\n event.shiftKey &&\r\n manager.activeItem &&\r\n manager.activeItemIndex !== previouslyFocusedIndex\r\n ) {\r\n manager.activeItem._selectViaInteraction();\r\n }\r\n if (isArrowKey && manager.activeItemIndex !== previouslyFocusedIndex) {\r\n this._scrollToOption();\r\n } else {\r\n // First or last\r\n if (keyCode === DOWN_ARROW) {\r\n manager.setFirstItemActive();\r\n this._setScrollTop(0);\r\n }\r\n if (keyCode === UP_ARROW) {\r\n manager.setLastItemActive();\r\n this._scrollToOption();\r\n }\r\n }\r\n }\r\n\r\n _onFocus() {\r\n if (!this.disabled) {\r\n this._focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\r\n * \"blur\" to the panel when it opens, causing a false positive.\r\n */\r\n _onBlur() {\r\n this._focused = false;\r\n // this.isSearchFieldPresent = false;\r\n\r\n if (!this.disabled && !this.panelOpen) {\r\n this._onTouched();\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Callback that is invoked when the overlay panel has been attached.\r\n */\r\n _onAttached(): void {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {\r\n this._setPseudoCheckboxPaddingSize();\r\n this._changeDetectorRef.detectChanges();\r\n this.panel.nativeElement.scrollTop = this._scrollTop;\r\n });\r\n }\r\n\r\n /** Returns the theme to be used on the panel. */\r\n _getPanelTheme(): string {\r\n return this._parentFormField ? `oui-${this._parentFormField.color}` : '';\r\n }\r\n\r\n // TODO(josephperrott): Remove after 2018 spec updates are fully merged.\r\n /** Sets the pseudo checkbox padding size based on the width of the pseudo checkbox. */\r\n private _setPseudoCheckboxPaddingSize() {\r\n if (!SELECT_MULTIPLE_PANEL_PADDING_X && this.multiple) {\r\n const pseudoCheckbox = this.panel.nativeElement.querySelector(\r\n '.oui-pseudo-checkbox'\r\n );\r\n if (pseudoCheckbox) {\r\n SELECT_MULTIPLE_PANEL_PADDING_X =\r\n SELECT_PANEL_PADDING_X * 1.5 + pseudoCheckbox.offsetWidth;\r\n }\r\n }\r\n }\r\n\r\n /** Whether the select has a value. */\r\n get empty(): boolean {\r\n return !this._selectionModel || this._selectionModel.isEmpty();\r\n }\r\n\r\n private _initializeSelection(): void {\r\n // Defer setting the value in order to avoid the \"Expression\r\n // has changed after it was checked\" errors from Angular.\r\n Promise.resolve().then(() => {\r\n this._setSelectionByValue(\r\n this.ngControl ? this.ngControl.value : this._value\r\n );\r\n this.savedValues = this.ngControl ? this.ngControl.value : this._value;\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the selected option based on a value. If no option can be\r\n * found with the designated value, the select trigger is cleared.\r\n */\r\n private _setSelectionByValue(value: any | any[]): void {\r\n if (this.multiple && value) {\r\n if (!Array.isArray(value)) {\r\n throw getOuiSelectNonArrayValueError();\r\n }\r\n\r\n this._selectionModel.clear();\r\n value.forEach((currentValue: any) => this._selectValue(currentValue));\r\n this._sortValues();\r\n } else {\r\n this._selectionModel.clear();\r\n const correspondingOption = this._selectValue(value);\r\n // Shift focus to the active item. Note that we shouldn't do this in multiple\r\n // mode, because we don't know what option the user interacted with last.\r\n if (correspondingOption) {\r\n this._keyManager.setActiveItem(correspondingOption);\r\n }\r\n }\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /**\r\n * Finds and selects and option based on its value.\r\n *\r\n * @returns Option that has the corresponding value.\r\n */\r\n private _selectValue(value: any): OuiOption | undefined {\r\n const correspondingOption = this.options.find((option: OuiOption) => {\r\n try {\r\n // Treat null as a special reset value.\r\n return option.value != null && this._compareWith(option.value, value);\r\n } catch (error) {\r\n if (isDevMode()) {\r\n // Notify developers of errors in their comparator.\r\n console.warn(error);\r\n }\r\n return false;\r\n }\r\n });\r\n\r\n if (correspondingOption) {\r\n this._selectionModel.select(correspondingOption);\r\n }\r\n\r\n return correspondingOption;\r\n }\r\n\r\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\r\n private _initKeyManager() {\r\n this._keyManager = new ActiveDescendantKeyManager(this.options)\r\n .withTypeAhead()\r\n .withVerticalOrientation()\r\n .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')\r\n .withAllowedModifierKeys(['shiftKey']);\r\n\r\n this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n // Restore focus to the trigger before closing. Ensures that the focus\r\n // position won't be lost if the user got focus into the overlay.\r\n this.focus();\r\n this.close();\r\n });\r\n\r\n this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n if (this._panelOpen && this.panel) {\r\n // Panel is opened\r\n // Need not to scroll\r\n } else if (\r\n !this._panelOpen &&\r\n !this.multiple &&\r\n this._keyManager.activeItem\r\n ) {\r\n this._keyManager.activeItem._selectViaInteraction();\r\n }\r\n });\r\n }\r\n\r\n /** Drops current option subscriptions and IDs and resets from scratch. */\r\n private _resetOptions(): void {\r\n const changedOrDestroyed = merge(this.options.changes, this._destroy);\r\n\r\n this.optionSelectionChanges\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe((event) => {\r\n this._onSelect(event.source, event.isUserInput);\r\n\r\n if (event.isUserInput && !this.multiple && this._panelOpen) {\r\n this.close();\r\n this.focus();\r\n }\r\n });\r\n\r\n // Listen to changes in the internal state of the options and react accordingly.\r\n // Handles cases like the labels of the selected options changing.\r\n merge(...this.options.map((option) => option._stateChanges))\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe(() => {\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n });\r\n\r\n this._setOptionIds();\r\n }\r\n\r\n /** Invoked when an option is clicked. */\r\n private _onSelect(option: OuiOption, isUserInput: boolean): void {\r\n const wasSelected = this._selectionModel.isSelected(option);\r\n\r\n if (option.value == null && !this._multiple) {\r\n option.deselect();\r\n this._selectionModel.clear();\r\n this._propagateChanges(option.value);\r\n } else {\r\n option.selected\r\n ? this._selectionModel.select(option)\r\n : this._selectionModel.deselect(option);\r\n\r\n if (isUserInput) {\r\n this._keyManager.setActiveItem(option);\r\n }\r\n\r\n if (this.multiple) {\r\n this._sortValues();\r\n\r\n if (isUserInput) {\r\n // In case the user selected the option with their mouse, we\r\n // want to restore focus back to the trigger, in order to\r\n // prevent the select keyboard controls from clashing with\r\n // the ones from `oui-option`.\r\n this.focus();\r\n }\r\n }\r\n }\r\n\r\n if (wasSelected !== this._selectionModel.isSelected(option)) {\r\n this._propagateChanges();\r\n }\r\n this.disableDoneButton = false;\r\n this.stateChanges.next();\r\n }\r\n discardRecentChanges() {\r\n this.value = this.savedValues;\r\n this._setSelectionByValue(this.value);\r\n this.disableDoneButton = true;\r\n this.close();\r\n }\r\n doneRecentChanges() {\r\n this.savedValues = this.value;\r\n this.disableDoneButton = true;\r\n this.saveSelectionChange.emit(new OuiSelectChange(this, this.value));\r\n this.close();\r\n }\r\n /** Sorts the selected values in the selected based on their order in the panel. */\r\n private _sortValues() {\r\n if (this.multiple) {\r\n const options = this.options.toArray();\r\n\r\n this._selectionModel.sort((a, b) =>\r\n this.sortComparator\r\n ? this.sortComparator(a, b, options)\r\n : options.indexOf(a) - options.indexOf(b)\r\n );\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Emits change event to set the model value. */\r\n private _propagateChanges(fallbackValue?: any): void {\r\n let valueToEmit: any = null;\r\n\r\n if (this.multiple) {\r\n valueToEmit = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n } else {\r\n valueToEmit = this.selected\r\n ? (this.selected as OuiOption).value\r\n : fallbackValue;\r\n }\r\n\r\n this._value = valueToEmit;\r\n this.valueChange.emit(valueToEmit);\r\n this._onChange(valueToEmit);\r\n this.selectionChange.emit(new OuiSelectChange(this, valueToEmit));\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /** Records option IDs to pass to the aria-owns property. */\r\n private _setOptionIds() {\r\n this._optionIds = this.options.map((option) => option.id).join(' ');\r\n }\r\n\r\n /**\r\n * Highlights the selected item. If no option is selected, it will highlight\r\n * the first item instead.\r\n */\r\n private _highlightCorrectOption(): void {\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n } else if (this._keyManager) {\r\n if (this.empty) {\r\n this._keyManager.setFirstItemActive();\r\n } else {\r\n this._keyManager.setActiveItem(this._selectionModel.selected[0]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Highlights the first of the filtered options if no element is currently highlighted\r\n */\r\n private _highlightFirstFilteredOption(): void {\r\n if (this._keyManager) {\r\n const activeElement = this._keyManager.activeItem?._getHostElement();\r\n // activeElement is not part of DOM if there is no parent element\r\n if (!activeElement || !activeElement.parentElement) {\r\n // highlight first element if there is no active element or active element is not part of DOM\r\n this._keyManager.setFirstItemActive();\r\n }\r\n }\r\n }\r\n\r\n /** Focuses the select element. */\r\n focus(): void {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n\r\n /** Returns the aria-label of the select component. */\r\n _getAriaLabel(): string | null {\r\n // If an ariaLabelledby value has been set by the consumer, the select should not overwrite the\r\n // `aria-labelledby` value by setting the ariaLabel to the placeholder.\r\n return this.ariaLabelledby ? null : this.ariaLabel || this.placeholder;\r\n }\r\n\r\n /** Returns the aria-labelledby of the select component. */\r\n _getAriaLabelledby(): string | null {\r\n if (this.ariaLabelledby) {\r\n return this.ariaLabelledby;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Determines the `aria-activedescendant` to be set on the host. */\r\n _getAriaActiveDescendant(): string | null {\r\n if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\r\n return this._keyManager.activeItem.id;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n setDescribedByIds(ids: string[]) {\r\n this._ariaDescribedby = ids.join(' ');\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n onContainerClick() {\r\n this.focus();\r\n this.open();\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n get shouldLabelFloat(): boolean {\r\n return this._panelOpen || !this.empty;\r\n }\r\n\r\n /**\r\n * Add outer class to perfect scrollbar\r\n * This is added only when there is a search field\r\n */\r\n ouiSelectInputOuter() {\r\n this.ouiSelectInputOuterClassName = 'oui-select-input-outer';\r\n }\r\n\r\n /**\r\n * Custom overlay class for cdk overlay container\r\n */\r\n openCdk() {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe((e) => {\r\n this.cdkConnectionOverlayPanel = '';\r\n if (e.connectionPair.originY === 'top') {\r\n this.cdkConnectionOverlayPanel = 'select-overlay-top';\r\n }\r\n this._changeDetectorRef.detectChanges();\r\n setTimeout((_) => this._scrollToOption());\r\n });\r\n\r\n const cdkOverLayContainer = this._document.querySelector(\r\n '.cdk-overlay-container'\r\n );\r\n const ouiSelectPanel = this._document.querySelector('.oui-select-panel');\r\n cdkOverLayContainer.classList.add('oui-select-overlay-container');\r\n const containerWidth = this._elementRef.nativeElement.offsetWidth;\r\n ouiSelectPanel.style.width = `${containerWidth}px`;\r\n const searchQueryString = '.oui-select-search-inner';\r\n if (this._document.querySelector(searchQueryString)) {\r\n this.scrollCalc(searchQueryString);\r\n }\r\n const actionItemsQueryString = '.oui-select-action-items';\r\n if (this._document.querySelector(actionItemsQueryString)) {\r\n this.scrollCalc(actionItemsQueryString);\r\n }\r\n }\r\n scrollCalc(selectQueryString: string) {\r\n const searchInput = this._document.querySelector(selectQueryString);\r\n const outter = this._document.querySelector('.oui-select-panel');\r\n let inner = this._document.querySelector('.oui-option');\r\n if (inner === null) {\r\n inner = 0;\r\n }\r\n const scrollbarWidth = outter.offsetWidth - inner.offsetWidth;\r\n if (scrollbarWidth > 5) {\r\n searchInput.style.width = `${inner.offsetWidth}px`;\r\n } else {\r\n searchInput.style.width = `calc(100% + 8px)`;\r\n }\r\n }\r\n\r\n /**\r\n * Given that we are not actually focusing active options, we must manually adjust scroll\r\n * to reveal options below the fold. First, we find the offset of the option from the top\r\n * of the panel. If that offset is below the fold, the new scrollTop will be the offset -\r\n * the panel height + the option height, so the active option will be just visible at the\r\n * bottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\r\n * will become the offset. If that offset is visible within the panel already, the scrollTop is\r\n * not adjusted.\r\n */\r\n private _scrollToOption(): void {\r\n const manager = this._keyManager;\r\n const index = manager.activeItemIndex || 0;\r\n const labelCount = _countGroupLabelsBeforeOption(\r\n index,\r\n this.options,\r\n this.optionGroups\r\n );\r\n const scrollTop = this._getScrollTop();\r\n const newScrollPosition = _getOptionScrollPosition(\r\n index + labelCount,\r\n SELECT_OPTION_HEIGHT,\r\n scrollTop,\r\n SELECT_PANEL_HEIGHT\r\n );\r\n this._setScrollTop(newScrollPosition);\r\n }\r\n\r\n /**\r\n * Sets the panel scrollTop. This allows us to manually scroll to display options\r\n * above or below the fold, as they are not actually being focused when active.\r\n */\r\n _setScrollTop(scrollTop: number): void {\r\n if (this.panel) {\r\n this.panel.nativeElement.scrollTop = scrollTop;\r\n }\r\n }\r\n\r\n /** Returns the panel's scrollTop. */\r\n _getScrollTop(): number {\r\n return this.panel ? this.panel.nativeElement.scrollTop : 0;\r\n }\r\n}\r\n", + "sourceCode": "import { ActiveDescendantKeyManager, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { SelectionModel } from '@angular/cdk/collections';\r\nimport {\r\n A,\r\n DOWN_ARROW,\r\n END,\r\n ENTER,\r\n HOME,\r\n LEFT_ARROW,\r\n RIGHT_ARROW,\r\n SPACE,\r\n UP_ARROW,\r\n hasModifierKey,\r\n TAB,\r\n} from '@angular/cdk/keycodes';\r\nimport { CdkConnectedOverlay } from '@angular/cdk/overlay';\r\nimport {\r\n AfterContentInit,\r\n Attribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n ContentChildren,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n isDevMode,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n QueryList,\r\n Self,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n Inject,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n} from '@angular/forms';\r\nimport {\r\n _countGroupLabelsBeforeOption,\r\n _getOptionScrollPosition,\r\n CanDisable,\r\n CanDisableCtor,\r\n CanUpdateErrorState,\r\n CanUpdateErrorStateCtor,\r\n HasTabIndex,\r\n HasTabIndexCtor,\r\n OuiOptionSelectionChange,\r\n mixinErrorState,\r\n mixinTabIndex,\r\n mixinDisabled,\r\n} from '../core';\r\nimport { OuiFormField, OuiFormFieldControl } from '../form-field/public-api';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { OUI_OPTION_PARENT_COMPONENT, OuiOption } from '../core/option/option';\r\nimport { OuiOptgroup } from '../core/option/optgroup';\r\nimport { ErrorStateMatcher } from '../core/error/error-options';\r\nimport { defer, merge, Observable, Subject } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n filter,\r\n map,\r\n startWith,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n} from 'rxjs/operators';\r\nimport {\r\n getOuiSelectDynamicMultipleError,\r\n getOuiSelectNonArrayValueError,\r\n getOuiSelectNonFunctionValueError,\r\n} from './select-errors';\r\nimport { OuiIconRegistry } from '../icon/icon-registery';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ICONS } from '../core/shared/icons';\r\n\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * The following style constants are necessary to save here in order\r\n * to properly calculate the alignment of the selected option over\r\n * the trigger element.\r\n */\r\n\r\n/** The height of each select option. */\r\nexport const SELECT_OPTION_HEIGHT = 40;\r\n\r\n/** The panel's padding on the x-axis */\r\nexport const SELECT_PANEL_PADDING_X = 16;\r\n\r\n/** The panel's x axis padding if it is indented (e.g. there is an option group). */\r\nexport const SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;\r\n\r\n/** The height of the select items in `em` units. */\r\nexport const SELECT_ITEM_HEIGHT_EM = 3;\r\n\r\n/** The total height of the select panel. */\r\nexport const SELECT_PANEL_HEIGHT = 200;\r\n\r\n// TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.\r\n/**\r\n * Distance between the panel edge and the option text in\r\n * multi-selection mode.\r\n *\r\n * Calculated as:\r\n * (SELECT_PANEL_PADDING_X * 1.5) + 20 = 44\r\n * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.\r\n * The checkbox width is 16px.\r\n */\r\nexport let SELECT_MULTIPLE_PANEL_PADDING_X = 0;\r\n\r\n/**\r\n * The select panel will only \"fit\" inside the viewport if it is positioned at\r\n * this value or more away from the viewport boundary.\r\n */\r\nexport const SELECT_PANEL_VIEWPORT_PADDING = 8;\r\n\r\n/** Change event object that is emitted when the select value has changed. */\r\nexport class OuiSelectChange {\r\n constructor(\r\n /** Reference to the select that emitted the change event. */\r\n public source: OuiSelect,\r\n /** Current value of the select that emitted the event. */\r\n public value: any\r\n ) {}\r\n}\r\n\r\n// Boilerplate for applying mixins to OuiSelect.\r\n/** @docs-private */\r\nexport class OuiSelectBase {\r\n constructor(\r\n public _elementRef: ElementRef,\r\n public _defaultErrorStateMatcher: ErrorStateMatcher,\r\n public _parentForm: NgForm,\r\n public _parentFormGroup: FormGroupDirective,\r\n public ngControl: NgControl\r\n ) {}\r\n}\r\n\r\nexport const _OuiSelectMixinBase: CanDisableCtor &\r\n HasTabIndexCtor &\r\n CanUpdateErrorStateCtor &\r\n typeof OuiSelectBase = mixinTabIndex(\r\n mixinDisabled(mixinErrorState(OuiSelectBase))\r\n);\r\n\r\n/**\r\n * Allows the user to customize the trigger that is displayed when the select has a value.\r\n */\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: 'oui-select-trigger',\r\n})\r\nexport class OuiSelectTrigger {}\r\n\r\n@Component({\r\n selector: 'oui-select',\r\n exportAs: 'ouiSelect',\r\n templateUrl: 'select.html',\r\n styleUrls: ['select.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['disabled', 'tabIndex'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n role: 'listbox',\r\n '[attr.id]': 'id',\r\n '[attr.tabindex]': 'tabIndex',\r\n '[attr.aria-label]': '_getAriaLabel()',\r\n '[attr.aria-labelledby]': '_getAriaLabelledby()',\r\n '[attr.aria-required]': 'required.toString()',\r\n '[attr.aria-disabled]': 'disabled.toString()',\r\n '[attr.aria-invalid]': 'errorState',\r\n '[attr.aria-owns]': 'panelOpen ? _optionIds : null',\r\n '[attr.aria-multiselectable]': 'multiple',\r\n '[attr.aria-describedby]': '_ariaDescribedby || null',\r\n '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\r\n '[class.oui-select-disabled]': 'disabled',\r\n '[class.oui-select-invalid]': 'errorState',\r\n '[class.oui-select-required]': 'required',\r\n '[class.oui-select-empty]': 'empty',\r\n class: 'oui-select oui-input',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(focus)': '_onFocus()',\r\n '(blur)': '_onBlur()',\r\n },\r\n providers: [\r\n { provide: OuiFormFieldControl, useExisting: OuiSelect },\r\n { provide: OUI_OPTION_PARENT_COMPONENT, useExisting: OuiSelect },\r\n ],\r\n})\r\nexport class OuiSelect\r\n extends _OuiSelectMixinBase\r\n implements\r\n AfterContentInit,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n DoCheck,\r\n ControlValueAccessor,\r\n CanDisable,\r\n HasTabIndex,\r\n OuiFormFieldControl,\r\n CanUpdateErrorState\r\n{\r\n /**Holds selected values after done */\r\n @Input() savedValues = [];\r\n /**Done button disabled until dropdown is dirty */\r\n disableDoneButton = true;\r\n /** Whether or not the overlay panel is open. */\r\n private _panelOpen = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _required = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _actionItems = false;\r\n private _singleActionItems = false;\r\n\r\n /** The scroll position of the overlay panel, calculated to center the selected option. */\r\n private _scrollTop = 0;\r\n\r\n /** The placeholder displayed in the trigger of the select. */\r\n private _placeholder: string;\r\n\r\n /** The label displayed on the cancel button of the select in case of multi-select. */\r\n private _cancelLabel = 'Cancel';\r\n\r\n /** The label displayed on the done button of the select in case of multi-select. */\r\n private _doneLabel = 'Done';\r\n\r\n /** The label displayed on the singleSelect and multiSelect of the select as a actionItem. */\r\n private _singleActionLabel = 'New action button';\r\n\r\n /** Whether the component is in multiple selection mode. */\r\n private _multiple = false;\r\n\r\n /** In multiple selection mode, enable Done button even in case of no option selected */\r\n private _allowNoSelection = false;\r\n\r\n /** Search input field **/\r\n isSearchFieldPresent: boolean;\r\n\r\n /** Unique id for this input. */\r\n private _uid = `oui-select-${nextUniqueId++}`;\r\n\r\n /** The last measured value for the trigger's client bounding rect. */\r\n _triggerRect: ClientRect;\r\n\r\n /** The aria-describedby attribute on the select for improved a11y. */\r\n _ariaDescribedby: string;\r\n\r\n /** The cached font-size of the trigger element. */\r\n _triggerFontSize = 0;\r\n\r\n /** Deals with the selection logic. */\r\n _selectionModel: SelectionModel;\r\n\r\n /** Manages keyboard events for options in the panel. */\r\n _keyManager: ActiveDescendantKeyManager;\r\n\r\n /** The IDs of child options to be passed to the aria-owns attribute. */\r\n _optionIds = '';\r\n\r\n /** The value of the select panel's transform-origin property. */\r\n _transformOrigin = 'top';\r\n\r\n /** If there is search input field a class is added dynamically to the perfect scrollbar **/\r\n ouiSelectInputOuterClassName: string;\r\n\r\n /** Adding top class to overlay panel */\r\n cdkConnectionOverlayPanel = '';\r\n\r\n /**\r\n * The y-offset of the overlay panel in relation to the trigger's top start corner.\r\n * This must be adjusted to align the selected option text over the trigger text.\r\n * when the panel opens. Will change based on the y-position of the selected option.\r\n */\r\n _offsetY = 0;\r\n\r\n /**\r\n * This position config ensures that the top \"start\" corner of the overlay\r\n * is aligned with with the top \"start\" of the origin by default (overlapping\r\n * the trigger completely). If the panel cannot fit below the trigger, it\r\n * will fall back to a position above the trigger.\r\n */\r\n _positions = [\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n },\r\n ];\r\n /** Emits whenever the component is destroyed. */\r\n private readonly _destroy = new Subject();\r\n\r\n /** Whether the component is disabling centering of the active option over the trigger. */\r\n private _disableOptionCentering = false;\r\n\r\n private _focused = false;\r\n\r\n /** A name for this control that can be used by `oui-form-field`. */\r\n controlType = 'oui-select';\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('trigger') trigger: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddCancelButton', { read: ElementRef }) ddCancelButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddDoneButton', { read: ElementRef }) ddDoneButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('singleButton', { read: ElementRef }) singleButton: ElementRef;\r\n\r\n /** Panel containing the select options. */\r\n @ViewChild('panel', { read: ElementRef }) panel: ElementRef;\r\n\r\n private _value: any;\r\n\r\n /**\r\n * Function used to sort the values in a select in multiple mode.\r\n * Follows the same logic as `Array.prototype.sort`.\r\n */\r\n @Input() sortComparator: (\r\n a: OuiOption,\r\n b: OuiOption,\r\n options: OuiOption[]\r\n ) => number;\r\n\r\n /** Aria label of the select. If not specified, the placeholder will be used as label. */\r\n @Input('aria-label') ariaLabel = '';\r\n\r\n /** Input that can be used to specify the `aria-labelledby` attribute. */\r\n @Input('aria-labelledby') ariaLabelledby: string;\r\n private _large = false;\r\n _monitorSubscription: any;\r\n\r\n /** Whether the oui-select is of large size. */\r\n @Input()\r\n get large(): boolean {\r\n return this._large;\r\n }\r\n set large(value) {\r\n this._large = coerceBooleanProperty(value);\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n private _id: string;\r\n\r\n /** Event emitted when the select panel has been toggled. */\r\n @Output()\r\n readonly openedChange: EventEmitter = new EventEmitter();\r\n\r\n /** Combined stream of all of the child options' change events. */\r\n readonly optionSelectionChanges: Observable = defer(\r\n (): Observable => {\r\n if (this.options) {\r\n return merge(...this.options.map((option) => option.onSelectionChange));\r\n }\r\n\r\n return this._ngZone.onStable.asObservable().pipe(\r\n take(1),\r\n switchMap(() => this.optionSelectionChanges)\r\n );\r\n }\r\n );\r\n\r\n /**\r\n * Event that emits whenever the raw value of the select changes. This is here primarily\r\n * to facilitate the two-way binding for the `value` input.\r\n *\r\n * @docs-private\r\n */\r\n @Output() readonly valueChange: EventEmitter = new EventEmitter();\r\n\r\n /** Object used to control when error messages are shown. */\r\n @Input() errorStateMatcher: ErrorStateMatcher;\r\n\r\n /** All of the defined select options. */\r\n @ContentChildren(OuiOption, { descendants: true })\r\n options: QueryList;\r\n\r\n /** Event emitted when the select has been opened. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('opened')\r\n readonly _openedStream: Observable = this.openedChange.pipe(\r\n filter((o) => o),\r\n map(() => {})\r\n );\r\n\r\n /** Event emitted when the select has been closed. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('closed')\r\n readonly _closedStream: Observable = this.openedChange.pipe(\r\n filter((o) => !o),\r\n map(() => {\r\n this.isSearchFieldPresent = false;\r\n })\r\n );\r\n\r\n /** Event emitted when the selected value has been changed by the user. */\r\n @Output()\r\n readonly selectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the selected value has been changed and saved by the user. */\r\n @Output()\r\n readonly saveSelectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Can pass any method to be triggered on singleActionItem click. */\r\n @Output()\r\n readonly singleSelectionChange = new EventEmitter();\r\n\r\n /** All of the defined groups of options. */\r\n @ContentChildren(OuiOptgroup) optionGroups: QueryList;\r\n\r\n /** User-supplied override of the trigger element. */\r\n @ContentChild(OuiSelectTrigger)\r\n customTrigger: OuiSelectTrigger;\r\n\r\n /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */\r\n @Input() panelClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** Overlay pane containing the options. */\r\n @ViewChild(CdkConnectedOverlay)\r\n overlayDir: CdkConnectedOverlay;\r\n\r\n /** Emits when the panel element is finished transforming in. */\r\n _panelDoneAnimatingStream = new Subject();\r\n\r\n /** Comparison function to specify which option is displayed. Defaults to object equality. */\r\n private _compareWith = (o1: any, o2: any) => o1 === o2;\r\n\r\n /** Whether the select is focused. */\r\n get focused(): boolean {\r\n return this._focused || this._panelOpen;\r\n }\r\n /**\r\n * @deprecated Setter to be removed as this property is intended to be readonly.\r\n */\r\n set focused(value: boolean) {\r\n this._focused = value;\r\n }\r\n /** `View -> model callback called when value changes` */\r\n _onChange: (value: any) => void = () => {};\r\n\r\n /** `View -> model callback called when select has been touched` */\r\n _onTouched = () => {};\r\n\r\n /** Placeholder to be shown if no value has been selected. */\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of multiple the cancelLabel to be shown on cancel action button. */\r\n @Input()\r\n get cancelLabel(): string {\r\n return this._cancelLabel;\r\n }\r\n set cancelLabel(value: string) {\r\n this._cancelLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of multiple the doneLabel to be shown on apply action button. */\r\n @Input()\r\n get doneLabel(): string {\r\n return this._doneLabel;\r\n }\r\n set doneLabel(value: string) {\r\n this._doneLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of singleSelect and multiSelect the singleActionLabel to be shown on actionItem. */\r\n @Input()\r\n get singleActionLabel(): string {\r\n return this._singleActionLabel;\r\n }\r\n set singleActionLabel(value: string) {\r\n this._singleActionLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the component is required. */\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the user should be allowed to select multiple options. */\r\n @Input()\r\n get multiple(): boolean {\r\n return this._multiple;\r\n }\r\n set multiple(value: boolean) {\r\n if (this._selectionModel) {\r\n throw getOuiSelectDynamicMultipleError();\r\n }\r\n\r\n this._multiple = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the user should be allowed to select no option in case of multiple options. */\r\n @Input()\r\n get allowNoSelection(): boolean {\r\n return this._allowNoSelection;\r\n }\r\n set allowNoSelection(value: boolean) {\r\n this._allowNoSelection = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the action items are required and use saveSelectionChange instead of selectionChange. */\r\n @Input()\r\n get actionItems(): boolean {\r\n return this._actionItems;\r\n }\r\n set actionItems(value: boolean) {\r\n if (this._multiple) {\r\n this._actionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n @Input()\r\n get singleActionItem(): boolean {\r\n return this._singleActionItems;\r\n }\r\n set singleActionItem(value: boolean) {\r\n this._singleActionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether to center the active option over the trigger. */\r\n @Input()\r\n get disableOptionCentering(): boolean {\r\n return this._disableOptionCentering;\r\n }\r\n set disableOptionCentering(value: boolean) {\r\n this._disableOptionCentering = coerceBooleanProperty(value);\r\n }\r\n\r\n /**\r\n * Function to compare the option values with the selected values. The first argument\r\n * is a value from an option. The second is a value from the selection. A boolean\r\n * should be returned.\r\n */\r\n @Input()\r\n get compareWith() {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (o1: any, o2: any) => boolean) {\r\n if (typeof fn !== 'function') {\r\n throw getOuiSelectNonFunctionValueError();\r\n }\r\n this._compareWith = fn;\r\n if (this._selectionModel) {\r\n // A different comparator means the selection could change.\r\n this._initializeSelection();\r\n }\r\n }\r\n\r\n /** Value of the select control. */\r\n @Input()\r\n get value(): any {\r\n return this._value;\r\n }\r\n set value(newValue: any) {\r\n if (newValue !== this._value) {\r\n this.writeValue(newValue);\r\n this._value = newValue;\r\n }\r\n }\r\n\r\n /** Unique id of the element. */\r\n @Input()\r\n get id(): string {\r\n return this._id;\r\n }\r\n set id(value: string) {\r\n this._id = value || this._uid;\r\n this.stateChanges.next();\r\n }\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _ngZone: NgZone,\r\n _defaultErrorStateMatcher: ErrorStateMatcher,\r\n elementRef: ElementRef,\r\n private _focusMonitor: FocusMonitor,\r\n @Optional() private _dir: Directionality,\r\n @Optional() _parentForm: NgForm,\r\n @Optional() _parentFormGroup: FormGroupDirective,\r\n @Optional() private _parentFormField: OuiFormField,\r\n @Self() @Optional() public ngControl: NgControl,\r\n @Attribute('tabindex') tabIndex: string,\r\n @Optional() @Inject(DOCUMENT) private _document: any,\r\n public _elementRef: ElementRef,\r\n public _ouiIconRegistry: OuiIconRegistry,\r\n private _domSanitizer: DomSanitizer\r\n ) {\r\n super(\r\n elementRef,\r\n _defaultErrorStateMatcher,\r\n _parentForm,\r\n _parentFormGroup,\r\n ngControl\r\n );\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this._elementRef, true)\r\n .subscribe(() => this._ngZone.run(() => {}));\r\n this._ouiIconRegistry.addSvgIconLiteral(\r\n `select-arrow-icon`,\r\n this._domSanitizer.bypassSecurityTrustHtml(ICONS.SELECT_ARROW_ICON)\r\n );\r\n\r\n if (this.ngControl) {\r\n // Note: we provide the value accessor through here, instead of\r\n // the `providers` to avoid running into a circular import.\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n this.tabIndex = parseInt(tabIndex, 10) || 0;\r\n\r\n // Force setter to be called in case id was not specified.\r\n this.id = this.id;\r\n }\r\n\r\n ngOnInit() {\r\n this._selectionModel = new SelectionModel(this.multiple);\r\n this.stateChanges.next();\r\n\r\n // We need `distinctUntilChanged` here, because some browsers will\r\n // fire the animation end event twice for the same animation. See:\r\n // https://github.com/angular/angular/issues/24084\r\n this._panelDoneAnimatingStream\r\n .pipe(distinctUntilChanged(), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n if (this.panelOpen) {\r\n this._scrollTop = 0;\r\n this.openedChange.emit(true);\r\n } else {\r\n this.openedChange.emit(false);\r\n this.overlayDir.offsetX = 0;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._initKeyManager();\r\n\r\n this._selectionModel.changed\r\n .pipe(takeUntil(this._destroy))\r\n .subscribe((event) => {\r\n event.added.forEach((option) => option.select());\r\n event.removed.forEach((option) => option.deselect());\r\n });\r\n\r\n this.options.changes\r\n .pipe(startWith(null), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n this._resetOptions();\r\n this._initializeSelection();\r\n });\r\n }\r\n\r\n ngDoCheck() {\r\n if (this.ngControl) {\r\n this.updateErrorState();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let\r\n // the parent form field know to run change detection when the disabled state changes.\r\n if (changes.disabled) {\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._monitorSubscription.unsubscribe();\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n this._destroy.next();\r\n this._destroy.complete();\r\n this.stateChanges.complete();\r\n }\r\n\r\n /** Toggles the overlay panel open or closed. */\r\n toggle(): void {\r\n if (this.panelOpen) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /** Opens the overlay panel. */\r\n open(): void {\r\n if (\r\n this.disabled ||\r\n !this.options ||\r\n !this.options.length ||\r\n this._panelOpen\r\n ) {\r\n return;\r\n }\r\n\r\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\r\n\r\n this._panelOpen = true;\r\n this._keyManager.withHorizontalOrientation(null);\r\n\r\n this._highlightCorrectOption();\r\n this._changeDetectorRef.markForCheck();\r\n this.openedChange.emit(true);\r\n this._elementRef.nativeElement.classList.add(\r\n 'oui-select-list-options-opened'\r\n );\r\n }\r\n\r\n /** Closes the overlay panel and focuses the host element. */\r\n close(): void {\r\n if (this._panelOpen) {\r\n this._panelOpen = false;\r\n this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');\r\n this._changeDetectorRef.markForCheck();\r\n this._onTouched();\r\n this.openedChange.emit(false);\r\n this._elementRef.nativeElement.classList.remove(\r\n 'oui-select-list-options-opened'\r\n );\r\n setTimeout((_) => this._document.activeElement.blur());\r\n }\r\n }\r\n\r\n /**\r\n * Sets the select's value. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param value New value to be written to the model.\r\n */\r\n writeValue(value: any): void {\r\n if (this.options) {\r\n this._setSelectionByValue(value);\r\n }\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select's value\r\n * changes from user input. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the value changes.\r\n */\r\n registerOnChange(fn: (value: any) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select is blurred\r\n * by the user. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the component has been touched.\r\n */\r\n registerOnTouched(fn: () => {}): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n /**\r\n * Disables the select. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param isDisabled Sets whether the component is disabled.\r\n */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether or not the overlay panel is open. */\r\n get panelOpen(): boolean {\r\n return this._panelOpen;\r\n }\r\n\r\n /** The currently selected option. */\r\n get selected(): OuiOption | OuiOption[] {\r\n return this.multiple\r\n ? this._selectionModel.selected\r\n : this._selectionModel.selected[0];\r\n }\r\n\r\n /** The value displayed in the trigger. */\r\n get triggerValue(): string {\r\n if (this.empty) {\r\n return '';\r\n }\r\n if (this._multiple) {\r\n const selectedOptions = this._selectionModel.selected.map(\r\n (option) => option.viewValueForSelect\r\n );\r\n\r\n if (this._isRtl()) {\r\n selectedOptions.reverse();\r\n }\r\n return selectedOptions.join(', ');\r\n }\r\n return this._selectionModel.selected[0].viewValueForSelect;\r\n }\r\n\r\n /** Whether the element is in RTL mode. */\r\n _isRtl(): boolean {\r\n return this._dir ? this._dir.value === 'rtl' : false;\r\n }\r\n\r\n /** Handles all keydown events on the select. */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (!this.disabled) {\r\n if (this.panelOpen) {\r\n this._handleOpenKeydown(event);\r\n } else {\r\n this._handleClosedKeydown(event);\r\n }\r\n }\r\n }\r\n\r\n /** Handles keyboard events while the select is closed. */\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const keyCode = event.keyCode;\r\n const isArrowKey =\r\n keyCode === DOWN_ARROW ||\r\n keyCode === UP_ARROW ||\r\n keyCode === LEFT_ARROW ||\r\n keyCode === RIGHT_ARROW;\r\n const isOpenKey = keyCode === ENTER || keyCode === SPACE;\r\n const manager = this._keyManager;\r\n\r\n // Open the select on ALT + arrow key to match the native \r\n event.preventDefault();\r\n this.close();\r\n } else if (\r\n (keyCode === ENTER || keyCode === SPACE) &&\r\n manager.activeItem &&\r\n !hasModifierKey(event)\r\n ) {\r\n event.preventDefault();\r\n manager.activeItem._selectViaInteraction();\r\n } else if (this._multiple && keyCode === A && event.ctrlKey) {\r\n event.preventDefault();\r\n this.handleCtrlKey();\r\n } else if (normalNavigationCheck) {\r\n // Check for non multiple select dropdown that the key pressed is not Tab, Space, Enter\r\n if (!this.isSearchFieldPresent) this.focus();\r\n this.handleScrolling(manager, event, isArrowKey, keyCode);\r\n }\r\n }\r\n\r\n /**\r\n * Handle ctrl key\r\n */\r\n private handleCtrlKey() {\r\n const hasDeselectedOptions = this.options.some(\r\n (opt) => !opt.disabled && !opt.selected\r\n );\r\n\r\n this.options.forEach((option) => {\r\n if (!option.disabled) {\r\n if (hasDeselectedOptions) {\r\n option.select();\r\n } else {\r\n option.deselect();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @param manager\r\n * @param event\r\n * @param isArrowKey\r\n * @param keyCode\r\n */\r\n private handleScrolling(\r\n manager: ActiveDescendantKeyManager,\r\n event: KeyboardEvent,\r\n isArrowKey: boolean,\r\n keyCode: number\r\n ) {\r\n const previouslyFocusedIndex = manager.activeItemIndex;\r\n\r\n manager.onKeydown(event);\r\n\r\n if (\r\n this._multiple &&\r\n isArrowKey &&\r\n event.shiftKey &&\r\n manager.activeItem &&\r\n manager.activeItemIndex !== previouslyFocusedIndex\r\n ) {\r\n manager.activeItem._selectViaInteraction();\r\n }\r\n if (isArrowKey && manager.activeItemIndex !== previouslyFocusedIndex) {\r\n this._scrollToOption();\r\n } else {\r\n // First or last\r\n if (keyCode === DOWN_ARROW) {\r\n manager.setFirstItemActive();\r\n this._setScrollTop(0);\r\n }\r\n if (keyCode === UP_ARROW) {\r\n manager.setLastItemActive();\r\n this._scrollToOption();\r\n }\r\n }\r\n }\r\n\r\n _onFocus() {\r\n if (!this.disabled) {\r\n this._focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\r\n * \"blur\" to the panel when it opens, causing a false positive.\r\n */\r\n _onBlur() {\r\n this._focused = false;\r\n // this.isSearchFieldPresent = false;\r\n\r\n if (!this.disabled && !this.panelOpen) {\r\n this._onTouched();\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Callback that is invoked when the overlay panel has been attached.\r\n */\r\n _onAttached(): void {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {\r\n this._setPseudoCheckboxPaddingSize();\r\n this._changeDetectorRef.detectChanges();\r\n this.panel.nativeElement.scrollTop = this._scrollTop;\r\n });\r\n }\r\n\r\n /** Returns the theme to be used on the panel. */\r\n _getPanelTheme(): string {\r\n return this._parentFormField ? `oui-${this._parentFormField.color}` : '';\r\n }\r\n\r\n // TODO(josephperrott): Remove after 2018 spec updates are fully merged.\r\n /** Sets the pseudo checkbox padding size based on the width of the pseudo checkbox. */\r\n private _setPseudoCheckboxPaddingSize() {\r\n if (!SELECT_MULTIPLE_PANEL_PADDING_X && this.multiple) {\r\n const pseudoCheckbox = this.panel.nativeElement.querySelector(\r\n '.oui-pseudo-checkbox'\r\n );\r\n if (pseudoCheckbox) {\r\n SELECT_MULTIPLE_PANEL_PADDING_X =\r\n SELECT_PANEL_PADDING_X * 1.5 + pseudoCheckbox.offsetWidth;\r\n }\r\n }\r\n }\r\n\r\n /** Whether the select has a value. */\r\n get empty(): boolean {\r\n return !this._selectionModel || this._selectionModel.isEmpty();\r\n }\r\n\r\n private _initializeSelection(): void {\r\n // Defer setting the value in order to avoid the \"Expression\r\n // has changed after it was checked\" errors from Angular.\r\n Promise.resolve().then(() => {\r\n this._setSelectionByValue(\r\n this.ngControl ? this.ngControl.value : this._value\r\n );\r\n this.savedValues = this.ngControl ? this.ngControl.value : this._value;\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the selected option based on a value. If no option can be\r\n * found with the designated value, the select trigger is cleared.\r\n */\r\n private _setSelectionByValue(value: any): void {\r\n if (this.multiple && value) {\r\n if (!Array.isArray(value)) {\r\n throw getOuiSelectNonArrayValueError();\r\n }\r\n\r\n this._selectionModel.clear();\r\n value.forEach((currentValue: any) => this._selectValue(currentValue));\r\n this._sortValues();\r\n } else {\r\n this._selectionModel.clear();\r\n const correspondingOption = this._selectValue(value);\r\n // Shift focus to the active item. Note that we shouldn't do this in multiple\r\n // mode, because we don't know what option the user interacted with last.\r\n if (correspondingOption) {\r\n this._keyManager.setActiveItem(correspondingOption);\r\n }\r\n }\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /**\r\n * Finds and selects and option based on its value.\r\n *\r\n * @returns Option that has the corresponding value.\r\n */\r\n private _selectValue(value: any): OuiOption | undefined {\r\n const correspondingOption = this.options.find((option: OuiOption) => {\r\n try {\r\n // Treat null as a special reset value.\r\n return option.value != null && this._compareWith(option.value, value);\r\n } catch (error) {\r\n if (isDevMode()) {\r\n // Notify developers of errors in their comparator.\r\n console.warn(error);\r\n }\r\n return false;\r\n }\r\n });\r\n\r\n if (correspondingOption) {\r\n this._selectionModel.select(correspondingOption);\r\n }\r\n\r\n return correspondingOption;\r\n }\r\n\r\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\r\n private _initKeyManager() {\r\n this._keyManager = new ActiveDescendantKeyManager(this.options)\r\n .withTypeAhead()\r\n .withVerticalOrientation()\r\n .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')\r\n .withAllowedModifierKeys(['shiftKey']);\r\n\r\n this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n // Restore focus to the trigger before closing. Ensures that the focus\r\n // position won't be lost if the user got focus into the overlay.\r\n if (!this.singleActionItem) {\r\n this.focus();\r\n this.close();\r\n }\r\n });\r\n\r\n this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n if (this._panelOpen && this.panel) {\r\n // Panel is opened\r\n // Need not to scroll\r\n } else if (\r\n !this._panelOpen &&\r\n !this.multiple &&\r\n this._keyManager.activeItem\r\n ) {\r\n this._keyManager.activeItem._selectViaInteraction();\r\n }\r\n });\r\n }\r\n\r\n /** Drops current option subscriptions and IDs and resets from scratch. */\r\n private _resetOptions(): void {\r\n const changedOrDestroyed = merge(this.options.changes, this._destroy);\r\n\r\n this.optionSelectionChanges\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe((event) => {\r\n this._onSelect(event.source, event.isUserInput);\r\n\r\n if (event.isUserInput && !this.multiple && this._panelOpen) {\r\n this.close();\r\n this.focus();\r\n }\r\n });\r\n\r\n // Listen to changes in the internal state of the options and react accordingly.\r\n // Handles cases like the labels of the selected options changing.\r\n merge(...this.options.map((option) => option._stateChanges))\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe(() => {\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n });\r\n\r\n this._setOptionIds();\r\n }\r\n\r\n /** Invoked when an option is clicked. */\r\n private _onSelect(option: OuiOption, isUserInput: boolean): void {\r\n const wasSelected = this._selectionModel.isSelected(option);\r\n\r\n if (option.value == null && !this._multiple) {\r\n option.deselect();\r\n this._selectionModel.clear();\r\n this._propagateChanges(option.value);\r\n } else {\r\n if (option.selected) {\r\n this._selectionModel.select(option);\r\n } else {\r\n this._selectionModel.deselect(option);\r\n }\r\n\r\n if (isUserInput) {\r\n this._keyManager.setActiveItem(option);\r\n }\r\n\r\n if (this.multiple) {\r\n this._sortValues();\r\n\r\n if (isUserInput) {\r\n // In case the user selected the option with their mouse, we\r\n // want to restore focus back to the trigger, in order to\r\n // prevent the select keyboard controls from clashing with\r\n // the ones from `oui-option`.\r\n this.focus();\r\n }\r\n }\r\n }\r\n\r\n if (wasSelected !== this._selectionModel.isSelected(option)) {\r\n this._propagateChanges();\r\n }\r\n if (this.multiple) {\r\n this.disableDoneButton = this._isDoneButtonDisabled();\r\n }\r\n this.stateChanges.next();\r\n }\r\n discardRecentChanges() {\r\n this.value = this.savedValues;\r\n this._setSelectionByValue(this.value);\r\n this.disableDoneButton = true;\r\n this.close();\r\n }\r\n doneRecentChanges() {\r\n this.savedValues = this.value;\r\n this.disableDoneButton = true;\r\n this.saveSelectionChange.emit(new OuiSelectChange(this, this.value));\r\n this.close();\r\n }\r\n\r\n handleSingleActionItemClick() {\r\n this.singleSelectionChange.emit();\r\n this.close();\r\n }\r\n\r\n /** Determine whether the \"Done\" button should be enabled or disabled based on the selection state */\r\n private _isDoneButtonDisabled(): boolean {\r\n const selectedItems = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n if (this.allowNoSelection) {\r\n return false;\r\n }\r\n return selectedItems.length === 0;\r\n }\r\n\r\n /** Sorts the selected values in the selected based on their order in the panel. */\r\n private _sortValues() {\r\n if (this.multiple) {\r\n const options = this.options.toArray();\r\n\r\n this._selectionModel.sort((a, b) =>\r\n this.sortComparator\r\n ? this.sortComparator(a, b, options)\r\n : options.indexOf(a) - options.indexOf(b)\r\n );\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Emits change event to set the model value. */\r\n private _propagateChanges(fallbackValue?: any): void {\r\n let valueToEmit: any = null;\r\n\r\n if (this.multiple) {\r\n valueToEmit = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n } else {\r\n valueToEmit = this.selected\r\n ? (this.selected as OuiOption).value\r\n : fallbackValue;\r\n }\r\n\r\n this._value = valueToEmit;\r\n this.valueChange.emit(valueToEmit);\r\n this._onChange(valueToEmit);\r\n this.selectionChange.emit(new OuiSelectChange(this, valueToEmit));\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /** Records option IDs to pass to the aria-owns property. */\r\n private _setOptionIds() {\r\n this._optionIds = this.options.map((option) => option.id).join(' ');\r\n }\r\n\r\n /**\r\n * Highlights the selected item. If no option is selected, it will highlight\r\n * the first item instead.\r\n */\r\n private _highlightCorrectOption(): void {\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n } else if (this._keyManager) {\r\n if (this.empty) {\r\n this._keyManager.setFirstItemActive();\r\n } else {\r\n this._keyManager.setActiveItem(this._selectionModel.selected[0]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Highlights the first of the filtered options if no element is currently highlighted\r\n */\r\n private _highlightFirstFilteredOption(): void {\r\n if (this._keyManager) {\r\n const activeElement = this._keyManager.activeItem?._getHostElement();\r\n // activeElement is not part of DOM if there is no parent element\r\n if (!activeElement || !activeElement.parentElement) {\r\n // highlight first element if there is no active element or active element is not part of DOM\r\n this._keyManager.setFirstItemActive();\r\n }\r\n }\r\n }\r\n\r\n /** Focuses the select element. */\r\n focus(): void {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n\r\n /** Returns the aria-label of the select component. */\r\n _getAriaLabel(): string | null {\r\n // If an ariaLabelledby value has been set by the consumer, the select should not overwrite the\r\n // `aria-labelledby` value by setting the ariaLabel to the placeholder.\r\n return this.ariaLabelledby ? null : this.ariaLabel || this.placeholder;\r\n }\r\n\r\n /** Returns the aria-labelledby of the select component. */\r\n _getAriaLabelledby(): string | null {\r\n if (this.ariaLabelledby) {\r\n return this.ariaLabelledby;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Determines the `aria-activedescendant` to be set on the host. */\r\n _getAriaActiveDescendant(): string | null {\r\n if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\r\n return this._keyManager.activeItem.id;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n setDescribedByIds(ids: string[]) {\r\n this._ariaDescribedby = ids.join(' ');\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n onContainerClick() {\r\n this.focus();\r\n this.open();\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n get shouldLabelFloat(): boolean {\r\n return this._panelOpen || !this.empty;\r\n }\r\n\r\n /**\r\n * Add outer class to perfect scrollbar\r\n * This is added only when there is a search field\r\n */\r\n ouiSelectInputOuter() {\r\n this.ouiSelectInputOuterClassName = 'oui-select-input-outer';\r\n }\r\n\r\n /**\r\n * Custom overlay class for cdk overlay container\r\n */\r\n openCdk() {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe((e) => {\r\n this.cdkConnectionOverlayPanel = '';\r\n if (e.connectionPair.originY === 'top') {\r\n this.cdkConnectionOverlayPanel = 'select-overlay-top';\r\n }\r\n this._changeDetectorRef.detectChanges();\r\n setTimeout((_) => this._scrollToOption());\r\n });\r\n\r\n const cdkOverLayContainer = this._document.querySelector(\r\n '.cdk-overlay-container'\r\n );\r\n const ouiSelectPanel = this._document.querySelector('.oui-select-panel');\r\n cdkOverLayContainer.classList.add('oui-select-overlay-container');\r\n const containerWidth = this._elementRef.nativeElement.offsetWidth;\r\n ouiSelectPanel.style.width = `${containerWidth}px`;\r\n const searchQueryString = '.oui-select-search-inner';\r\n if (this._document.querySelector(searchQueryString)) {\r\n this.scrollCalc(searchQueryString);\r\n }\r\n }\r\n scrollCalc(selectQueryString: string) {\r\n const searchInput = this._document.querySelector(selectQueryString);\r\n const outter = this._document.querySelector('.oui-select-panel');\r\n let inner = this._document.querySelector('.oui-option');\r\n if (inner === null) {\r\n inner = 0;\r\n }\r\n const scrollbarWidth = outter.offsetWidth - inner.offsetWidth;\r\n if (scrollbarWidth > 5) {\r\n searchInput.style.width = `${inner.offsetWidth}px`;\r\n } else {\r\n searchInput.style.width = '100%';\r\n }\r\n }\r\n\r\n /**\r\n * Given that we are not actually focusing active options, we must manually adjust scroll\r\n * to reveal options below the fold. First, we find the offset of the option from the top\r\n * of the panel. If that offset is below the fold, the new scrollTop will be the offset -\r\n * the panel height + the option height, so the active option will be just visible at the\r\n * bottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\r\n * will become the offset. If that offset is visible within the panel already, the scrollTop is\r\n * not adjusted.\r\n */\r\n private _scrollToOption(): void {\r\n const manager = this._keyManager;\r\n const index = manager.activeItemIndex || 0;\r\n const labelCount = _countGroupLabelsBeforeOption(\r\n index,\r\n this.options,\r\n this.optionGroups\r\n );\r\n const selectedOption = manager.activeItem?._getHostElement();\r\n const selectActionWrapperElement = this._document.querySelector(\r\n '.oui-select-action-wrapper'\r\n ) as HTMLElement;\r\n const selectPanelElement = this._document.querySelector(\r\n '.oui-select-panel'\r\n ) as HTMLElement;\r\n const selectSearchBox = this._document.querySelector(\r\n '.oui-select-search-inner'\r\n ) as HTMLElement;\r\n const selectOptionsWrapper = this._document.querySelector(\r\n '.oui-select-options-wrapper'\r\n ) as HTMLElement;\r\n const labelHeight = labelCount ? (labelCount - 1) * 10 : 0;\r\n const optionHeight = selectedOption?.clientHeight || SELECT_OPTION_HEIGHT;\r\n const ouiSelectActionWrapperHeight =\r\n selectActionWrapperElement?.clientHeight ?? 0;\r\n const selectSearchBoxheight = selectSearchBox?.clientHeight - 10 || 0;\r\n const selectPanelHeight =\r\n selectPanelElement?.clientHeight -\r\n ouiSelectActionWrapperHeight -\r\n selectSearchBoxheight -\r\n 20 -\r\n labelHeight || SELECT_PANEL_HEIGHT;\r\n const selectOptionsWrapperRect =\r\n selectOptionsWrapper?.getBoundingClientRect();\r\n const selectedOptionRect = selectedOption?.getBoundingClientRect();\r\n const selectedOptionOffset =\r\n selectedOptionRect?.top -\r\n selectSearchBoxheight -\r\n selectOptionsWrapperRect?.top -\r\n 10;\r\n const scrollTop = this._getScrollTop();\r\n const newScrollPosition = _getOptionScrollPosition(\r\n index + labelCount,\r\n optionHeight,\r\n scrollTop,\r\n selectPanelHeight,\r\n selectedOptionOffset\r\n );\r\n this._setScrollTop(newScrollPosition);\r\n }\r\n\r\n /**\r\n * Sets the panel scrollTop. This allows us to manually scroll to display options\r\n * above or below the fold, as they are not actually being focused when active.\r\n */\r\n _setScrollTop(scrollTop: number): void {\r\n if (this.panel) {\r\n this.panel.nativeElement.querySelector('.oui-select-options').scrollTop =\r\n scrollTop;\r\n }\r\n }\r\n\r\n /** Returns the panel's scrollTop. */\r\n _getScrollTop(): number {\r\n return this.panel\r\n ? this.panel.nativeElement.querySelector('.oui-select-options').scrollTop\r\n : 0;\r\n }\r\n}\r\n", "constructorObj": { "name": "constructor", "description": "", @@ -10222,6 +10267,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "source", @@ -10255,8 +10302,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -10294,6 +10339,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_elementRef", @@ -10311,8 +10358,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -10324,12 +10369,12 @@ "deprecationMessage": "", "type": "class", "sourceCode": "import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n Directive,\n EventEmitter,\n Input,\n isDevMode,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n} from '@angular/core';\nimport {\n CanDisable,\n CanDisableCtor,\n HasInitialized,\n HasInitializedCtor,\n mixinDisabled,\n mixinInitialized,\n} from '../core';\nimport { Subject } from 'rxjs';\nimport { SortDirection } from './sort-direction';\nimport {\n getSortDuplicateSortableIdError,\n getSortHeaderMissingIdError,\n getSortInvalidDirectionError,\n} from './sort-errors';\n\n/** Interface for a directive that holds sorting state consumed by `OuiSortHeader`. */\nexport interface OuiSortable {\n /** The id of the column being sorted. */\n id: string;\n\n /** Starting sort direction. */\n start: 'asc' | 'desc';\n\n /** Whether to disable clearing the sorting state. */\n disableClear: boolean;\n}\n\n/** The current sort state. */\nexport interface Sort {\n /** The id of the column being sorted. */\n active: string;\n\n /** The sort direction. */\n direction: SortDirection;\n}\n\n// Boilerplate for applying mixins to OuiSort.\n/** @docs-private */\nexport class OuiSortBase {}\nexport const _OuiSortMixinBase: HasInitializedCtor &\n CanDisableCtor &\n typeof OuiSortBase = mixinInitialized(mixinDisabled(OuiSortBase));\n\n/** Container for OuiSortables to manage the sort state and provide default sort parameters. */\n@Directive({\n selector: '[ouiSort]',\n exportAs: 'ouiSort',\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled: ouiSortDisabled'],\n})\nexport class OuiSort\n extends _OuiSortMixinBase\n implements CanDisable, HasInitialized, OnChanges, OnDestroy, OnInit\n{\n /** Collection of all registered sortables that this directive manages. */\n sortables = new Map();\n\n /** Used to notify any child components listening to state changes. */\n readonly _stateChanges = new Subject();\n\n /** The id of the most recently sorted OuiSortable. */\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('ouiSortActive') active: string;\n\n /**\n * The direction to set when an OuiSortable is initially sorted.\n * May be overriden by the OuiSortable's sort start.\n */\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('ouiSortStart') start: 'asc' | 'desc' = 'asc';\n\n /** The sort direction of the currently active OuiSortable. */\n @Input('ouiSortDirection')\n get direction(): SortDirection {\n return this._direction;\n }\n set direction(direction: SortDirection) {\n if (\n isDevMode() &&\n direction &&\n direction !== 'asc' &&\n direction !== 'desc'\n ) {\n throw getSortInvalidDirectionError(direction);\n }\n this._direction = direction;\n }\n private _direction: SortDirection = '';\n\n /**\n * Whether to disable the user from clearing the sort by finishing the sort direction cycle.\n * May be overriden by the OuiSortable's disable clear input.\n */\n @Input('ouiSortDisableClear')\n get disableClear(): boolean {\n return this._disableClear;\n }\n set disableClear(v: boolean) {\n this._disableClear = coerceBooleanProperty(v);\n }\n private _disableClear: boolean;\n\n /** Event emitted when the user changes either the active sort or sort direction. */\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('ouiSortChange')\n readonly sortChange: EventEmitter = new EventEmitter();\n\n /**\n * Register function to be used by the contained OuiSortables. Adds the OuiSortable to the\n * collection of OuiSortables.\n */\n register(sortable: OuiSortable): void {\n if (!sortable.id) {\n throw getSortHeaderMissingIdError();\n }\n\n if (this.sortables.has(sortable.id)) {\n throw getSortDuplicateSortableIdError(sortable.id);\n }\n this.sortables.set(sortable.id, sortable);\n }\n\n /**\n * Unregister function to be used by the contained OuiSortables. Removes the OuiSortable from the\n * collection of contained OuiSortables.\n */\n deregister(sortable: OuiSortable): void {\n this.sortables.delete(sortable.id);\n }\n\n /** Sets the active sort id and determines the new sort direction. */\n sort(sortable: OuiSortable): void {\n if (this.active !== sortable.id) {\n this.active = sortable.id;\n this.direction = sortable.start ? sortable.start : this.start;\n } else {\n this.direction = this.getNextSortDirection(sortable);\n }\n\n this.sortChange.emit({ active: this.active, direction: this.direction });\n }\n\n /** Returns the next sort direction of the active sortable, checking for potential overrides. */\n getNextSortDirection(sortable: OuiSortable): SortDirection {\n if (!sortable) {\n return '';\n }\n\n const sortDirectionCycle = getSortDirectionCycle(\n sortable.start || this.start\n );\n\n // Get and return the next direction in the cycle\n let nextDirectionIndex = sortDirectionCycle.indexOf(this.direction) + 1;\n if (nextDirectionIndex >= sortDirectionCycle.length) {\n nextDirectionIndex = 0;\n }\n return sortDirectionCycle[nextDirectionIndex];\n }\n\n ngOnInit() {\n this._markInitialized();\n }\n\n ngOnChanges() {\n this._stateChanges.next();\n }\n\n ngOnDestroy() {\n this._stateChanges.complete();\n }\n}\n\n/** Returns the sort direction cycle to use given the provided parameters of order and clear. */\nfunction getSortDirectionCycle(start: 'asc' | 'desc'): SortDirection[] {\n const sortOrder: SortDirection[] = ['asc', 'desc'];\n if (start === 'desc') {\n sortOrder.reverse();\n }\n\n return sortOrder;\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [], "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -10341,23 +10386,25 @@ "deprecationMessage": "", "type": "class", "sourceCode": "import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n ViewEncapsulation,\n Inject,\n ElementRef,\n IterableDiffers,\n NgZone,\n} from '@angular/core';\nimport { CanDisable, CanDisableCtor, mixinDisabled } from '../core';\nimport { merge, Subscription } from 'rxjs';\nimport { OuiSort, OuiSortable } from './sort';\nimport { ouiSortAnimations } from './sort-animations';\nimport { SortDirection } from './sort-direction';\nimport { getSortHeaderNotContainedWithinSortError } from './sort-errors';\nimport { OuiSortHeaderIntl } from './sort-header-intl';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n// Boilerplate for applying mixins to the sort header.\n/** @docs-private */\nexport class OuiSortHeaderBase {}\nexport const _OuiSortHeaderMixinBase: CanDisableCtor &\n typeof OuiSortHeaderBase = mixinDisabled(OuiSortHeaderBase);\n\n/**\n * Valid positions for the arrow to be in for its opacity and translation. If the state is a\n * sort direction, the position of the arrow will be above/below and opacity 0. If the state is\n * hint, the arrow will be in the center with a slight opacity. Active state means the arrow will\n * be fully opaque in the center.\n *\n * @docs-private\n */\nexport type ArrowViewState = SortDirection | 'hint' | 'active';\n\n/**\n * States describing the arrow's animated position (animating fromState to toState).\n * If the fromState is not defined, there will be no animated transition to the toState.\n *\n * @docs-private\n */\nexport interface ArrowViewStateTransition {\n fromState?: ArrowViewState;\n toState: ArrowViewState;\n}\n\n/** Column definition associated with a `OuiSortHeader`. */\ninterface OuiSortHeaderColumnDef {\n name: string;\n}\n\n/**\n * Applies sorting behavior (click to change sort) and styles to an element, including an\n * arrow to display the current sort direction.\n *\n * Must be provided with an id and contained within a parent OuiSort directive.\n *\n * If used on header cells in a CdkTable, it will automatically default its id from its containing\n * column definition.\n */\n@Component({\n // eslint-disable-next-line\n selector: '[oui-sort-header]',\n exportAs: 'ouiSortHeader',\n templateUrl: 'sort-header.html',\n styleUrls: ['sort-header.scss'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '(click)': '_handleClick()',\n '(mouseenter)': '_setIndicatorHintVisible(true)',\n '(longpress)': '_setIndicatorHintVisible(true)',\n '(mouseleave)': '_setIndicatorHintVisible(false)',\n '[attr.aria-sort]': '_getAriaSortAttribute()',\n '[class.oui-sort-header-disabled]': '_isDisabled()',\n },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled'],\n animations: [\n ouiSortAnimations.indicator,\n ouiSortAnimations.leftPointer,\n ouiSortAnimations.rightPointer,\n ouiSortAnimations.arrowOpacity,\n ouiSortAnimations.arrowPosition,\n ouiSortAnimations.allowChildren,\n ],\n})\nexport class OuiSortHeader\n extends _OuiSortHeaderMixinBase\n implements CanDisable, OuiSortable, OnDestroy, OnInit\n{\n private _rerenderSubscription: Subscription;\n\n /**\n * Flag set to true when the indicator should be displayed while the sort is not active. Used to\n * provide an affordance that the header is sortable by showing on focus and hover.\n */\n _showIndicatorHint = false;\n\n /**\n * The view transition state of the arrow (translation/ opacity) - indicates its `from` and `to`\n * position through the animation. If animations are currently disabled, the fromState is removed\n * so that there is no animation displayed.\n */\n _viewState: ArrowViewStateTransition;\n\n /** The direction the arrow should be facing according to the current state. */\n _arrowDirection: SortDirection = '';\n\n /**\n * Whether the view state animation should show the transition between the `from` and `to` states.\n */\n _disableViewStateAnimation = false;\n\n /**\n * ID of this sort header. If used within the context of a CdkColumnDef, this will default to\n * the column's name.\n */\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('oui-sort-header') id: string;\n\n /** Sets the position of the arrow that displays when sorted. */\n @Input() arrowPosition: 'before' | 'after' = 'after';\n\n /** Overrides the sort start value of the containing OuiSort for this OuiSortable. */\n @Input() start: 'asc' | 'desc';\n\n // To set browser tooltip\n title: string;\n\n /** Overrides the disable clear value of the containing OuiSort for this OuiSortable. */\n @Input()\n get disableClear(): boolean {\n return this._disableClear;\n }\n set disableClear(v) {\n this._disableClear = coerceBooleanProperty(v);\n }\n private _disableClear: boolean;\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n public _intl: OuiSortHeaderIntl,\n changeDetectorRef: ChangeDetectorRef,\n protected elementRef: ElementRef,\n protected _differs: IterableDiffers,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Optional() public _sort: OuiSort,\n @Inject('OUI_SORT_HEADER_COLUMN_DEF')\n @Optional()\n public _columnDef: OuiSortHeaderColumnDef,\n private _elementRef: ElementRef\n ) {\n // Note that we use a string token for the `_columnDef`, because the value is provided both by\n // `once-ui/table` and `cdk/table` and we can't have the CDK depending on once-ui,\n // and we want to avoid having the sort header depending on the CDK table because\n // of this single reference.\n super();\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n\n if (!_sort) {\n throw getSortHeaderNotContainedWithinSortError();\n }\n\n this._rerenderSubscription = merge(\n _sort.sortChange,\n _sort._stateChanges,\n _intl.changes\n ).subscribe(() => {\n if (this._isSorted()) {\n this._updateArrowDirection();\n }\n\n // If this header was recently active and now no longer sorted, animate away the arrow.\n if (\n !this._isSorted() &&\n this._viewState &&\n this._viewState.toState === 'active'\n ) {\n this._disableViewStateAnimation = false;\n this._setAnimationTransitionState({\n fromState: 'active',\n toState: this._arrowDirection,\n });\n }\n\n changeDetectorRef.markForCheck();\n });\n }\n\n ngOnInit() {\n const columnHeading: string = this._elementRef.nativeElement.innerText;\n this.title = 'Sort by ' + columnHeading;\n if (!this.id && this._columnDef) {\n this.id = this._columnDef.name;\n }\n\n // Initialize the direction of the arrow and set the view state to be immediately that state.\n this._updateArrowDirection();\n this._setAnimationTransitionState({\n toState: this._isSorted() ? 'active' : this._arrowDirection,\n });\n\n this._sort.register(this);\n }\n\n ngOnDestroy() {\n this._sort.deregister(this);\n this._rerenderSubscription.unsubscribe();\n this._focusMonitor.stopMonitoring(this.elementRef);\n this._monitorSubscription.unsubscribe();\n }\n\n /**\n * Sets the \"hint\" state such that the arrow will be semi-transparently displayed as a hint to the\n * user showing what the active sort will become. If set to false, the arrow will fade away.\n */\n _setIndicatorHintVisible(visible: boolean) {\n // No-op if the sort header is disabled - should not make the hint visible.\n if (this._isDisabled() && visible) {\n return;\n }\n\n this._showIndicatorHint = visible;\n\n if (!this._isSorted()) {\n this._updateArrowDirection();\n if (this._showIndicatorHint) {\n this._setAnimationTransitionState({\n fromState: this._arrowDirection,\n toState: 'hint',\n });\n } else {\n this._setAnimationTransitionState({\n fromState: 'hint',\n toState: this._arrowDirection,\n });\n }\n }\n }\n\n /**\n * Sets the animation transition view state for the arrow's position and opacity. If the\n * `disableViewStateAnimation` flag is set to true, the `fromState` will be ignored so that\n * no animation appears.\n */\n _setAnimationTransitionState(viewState: ArrowViewStateTransition) {\n this._viewState = viewState;\n\n // If the animation for arrow position state (opacity/translation) should be disabled,\n // remove the fromState so that it jumps right to the toState.\n if (this._disableViewStateAnimation) {\n this._viewState = { toState: viewState.toState };\n }\n }\n\n /** Triggers the sort on this sort header and removes the indicator hint. */\n _handleClick() {\n if (this._isDisabled()) {\n return;\n }\n\n this._sort.sort(this);\n\n // Do not show the animation if the header was already shown in the right position.\n if (\n this._viewState.toState === 'hint' ||\n this._viewState.toState === 'active'\n ) {\n this._disableViewStateAnimation = true;\n }\n\n // If the arrow is now sorted, animate the arrow into place. Otherwise, animate it away into\n // the direction it is facing.\n const viewState: ArrowViewStateTransition = this._isSorted()\n ? { fromState: this._arrowDirection, toState: 'active' }\n : { fromState: 'active', toState: this._arrowDirection };\n this._setAnimationTransitionState(viewState);\n\n this._showIndicatorHint = false;\n }\n\n /** Whether this OuiSortHeader is currently sorted in either ascending or descending order. */\n _isSorted() {\n return (\n this._sort.active === this.id &&\n (this._sort.direction === 'asc' || this._sort.direction === 'desc')\n );\n }\n\n /** Returns the animation state for the arrow direction (indicator and pointers). */\n _getArrowDirectionState() {\n return `${this._isSorted() ? 'active-' : ''}${this._arrowDirection}`;\n }\n\n /** Returns the arrow position state (opacity, translation). */\n _getArrowViewState() {\n const fromState = this._viewState.fromState;\n return (fromState ? `${fromState}-to-` : '') + this._viewState.toState;\n }\n\n /**\n * Updates the direction the arrow should be pointing. If it is not sorted, the arrow should be\n * facing the start direction. Otherwise if it is sorted, the arrow should point in the currently\n * active sorted direction. The reason this is updated through a function is because the direction\n * should only be changed at specific times - when deactivated but the hint is displayed and when\n * the sort is active and the direction changes. Otherwise the arrow's direction should linger\n * in cases such as the sort becoming deactivated but we want to animate the arrow away while\n * preserving its direction, even though the next sort direction is actually different and should\n * only be changed once the arrow displays again (hint or activation).\n */\n _updateArrowDirection() {\n this._arrowDirection = this._isSorted()\n ? this._sort.direction\n : this.start || this._sort.start;\n }\n\n _isDisabled() {\n return this._sort.disabled || this.disabled;\n }\n\n /**\n * Gets the aria-sort attribute that should be applied to this sort header. If this header\n * is not sorted, returns null so that the attribute is removed from the host element. Aria spec\n * says that the aria-sort property should only be present on one header at a time, so removing\n * ensures this is true.\n */\n _getAriaSortAttribute() {\n if (!this._isSorted()) {\n return null;\n }\n\n return this._sort.direction === 'asc' ? 'ascending' : 'descending';\n }\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [], "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, { "name": "OuiTabChangeEvent", - "id": "class-OuiTabChangeEvent-589c514ba2f48297f4aa02fd4ced821bdcbc822779026ff6c817d949a12f81fcb79562a1d57b8975a29ae4b3cacdebafe77cf4a4035a5d582aa823ca4fafe395", + "id": "class-OuiTabChangeEvent-5bd712f791fcc0aa86c1f30b4ab9a43fe36ad1157ee38633b43b2e446555c539737ee10ef0e2a6280f11add0546aaaf896f547e6f902967170c5e7a0d762b311", "file": "ui/src/components/tabs/tab-group.ts", "deprecated": false, "deprecationMessage": "", "type": "class", - "sourceCode": "import {\r\n AfterContentChecked,\r\n AfterContentInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChildren,\r\n ElementRef,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Optional,\r\n Output,\r\n QueryList,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\r\nimport { OUI_TAB_GROUP, OuiTab } from './tab';\r\nimport { OuiTabHeader } from './tab-header';\r\nimport {\r\n BooleanInput,\r\n coerceBooleanProperty,\r\n coerceNumberProperty,\r\n NumberInput,\r\n} from '@angular/cdk/coercion';\r\nimport {\r\n CanColor,\r\n CanDisableRipple,\r\n mixinColor,\r\n mixinDisableRipple,\r\n ThemePalette,\r\n} from '../core';\r\nimport { merge, Subscription } from 'rxjs';\r\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from './tab-config';\r\nimport { startWith } from 'rxjs/operators';\r\nimport { FocusOrigin } from '@angular/cdk/a11y';\r\n\r\n/** Used to generate unique ID's for each tab component */\r\nlet nextId = 0;\r\n\r\n// Boilerplate for applying mixins to ouiTabGroup.\r\n/** @docs-private */\r\nconst _OuiTabGroupMixinBase = mixinColor(\r\n mixinDisableRipple(\r\n class {\r\n constructor(public _elementRef: ElementRef) {}\r\n }\r\n ),\r\n 'primary'\r\n);\r\n\r\n/** @docs-private */\r\nexport interface OuiTabGroupBaseHeader {\r\n _alignInkBarToSelectedTab(): void;\r\n updatePagination(): void;\r\n focusIndex: number;\r\n}\r\n\r\n/** Possible positions for the tab header. */\r\nexport type OuiTabHeaderPosition = 'above' | 'below';\r\n\r\n/**\r\n * Material design tab-group component. Supports basic tab pairs (label + content) and includes\r\n * animated ink-bar, keyboard navigation, and screen reader.\r\n * See: https://material.io/design/components/tabs.html\r\n */\r\n@Component({\r\n selector: 'oui-tab-group',\r\n exportAs: 'ouiTabGroup',\r\n templateUrl: 'tab-group.html',\r\n styleUrls: ['tab-group.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n // tslint:disable-next-line:validate-decorators\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n // eslint-disable-next-line\r\n inputs: ['color', 'disableRipple'],\r\n providers: [\r\n {\r\n provide: OUI_TAB_GROUP,\r\n useExisting: ouiTabGroup,\r\n },\r\n ],\r\n // eslint-disable-next-line\r\n host: {\r\n ngSkipHydration: '',\r\n class: 'oui-mdc-tab-group oui-tab',\r\n '[class.oui-mdc-tab-group-dynamic-height]': 'dynamicHeight',\r\n '[class.oui-mdc-tab-group-inverted-header]': 'headerPosition === \"below\"',\r\n '[class.oui-mdc-tab-group-stretch-tabs]': 'stretchTabs',\r\n '[style.--oui-tab-animation-duration]': 'animationDuration',\r\n },\r\n})\r\nexport class ouiTabGroup\r\n extends _OuiTabGroupMixinBase\r\n implements\r\n AfterContentInit,\r\n AfterContentChecked,\r\n OnDestroy,\r\n CanColor,\r\n CanDisableRipple\r\n{\r\n /**\r\n * All tabs inside the tab group. This includes tabs that belong to groups that are nested\r\n * inside the current one. We filter out only the tabs that belong to this group in `_tabs`.\r\n */\r\n @ContentChildren(OuiTab, { descendants: true }) _allTabs: QueryList;\r\n @ViewChild('tabBodyWrapper') _tabBodyWrapper: ElementRef;\r\n @ViewChild('tabHeader') _tabHeader: OuiTabHeader;\r\n\r\n /** All of the tabs that belong to the group. */\r\n _tabs: QueryList = new QueryList();\r\n\r\n /** The tab index that should be selected after the content has been checked. */\r\n private _indexToSelect: number | null = 0;\r\n\r\n /** Index of the tab that was focused last. */\r\n private _lastFocusedTabIndex: number | null = null;\r\n\r\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\r\n private _tabBodyWrapperHeight = 0;\r\n\r\n /** Subscription to tabs being added/removed. */\r\n private _tabsSubscription = Subscription.EMPTY;\r\n\r\n /** Subscription to changes in the tab labels. */\r\n private _tabLabelSubscription = Subscription.EMPTY;\r\n\r\n /** Whether the ink bar should fit its width to the size of the tab label content. */\r\n @Input()\r\n get fitInkBarToContent(): boolean {\r\n return this._fitInkBarToContent;\r\n }\r\n set fitInkBarToContent(v: BooleanInput) {\r\n this._fitInkBarToContent = coerceBooleanProperty(v);\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n private _fitInkBarToContent = false;\r\n\r\n /** Whether tabs should be stretched to fill the header. */\r\n @Input('oui-stretch-tabs')\r\n get stretchTabs(): boolean {\r\n return this._stretchTabs;\r\n }\r\n set stretchTabs(v: BooleanInput) {\r\n this._stretchTabs = coerceBooleanProperty(v);\r\n }\r\n private _stretchTabs = true;\r\n\r\n /** Whether the tab group should grow to the size of the active tab. */\r\n @Input()\r\n get dynamicHeight(): boolean {\r\n return this._dynamicHeight;\r\n }\r\n\r\n set dynamicHeight(value: BooleanInput) {\r\n this._dynamicHeight = coerceBooleanProperty(value);\r\n }\r\n\r\n private _dynamicHeight = false;\r\n\r\n /** The index of the active tab. */\r\n @Input()\r\n get selectedIndex(): number | null {\r\n return this._selectedIndex;\r\n }\r\n\r\n set selectedIndex(value: NumberInput) {\r\n this._indexToSelect = coerceNumberProperty(value, null);\r\n }\r\n\r\n private _selectedIndex: number | null = null;\r\n\r\n /** Position of the tab header. */\r\n @Input() headerPosition: OuiTabHeaderPosition = 'above';\r\n\r\n /** Duration for the tab animation. Will be normalized to milliseconds if no units are set. */\r\n @Input()\r\n get animationDuration(): string {\r\n return this._animationDuration;\r\n }\r\n\r\n set animationDuration(value: NumberInput) {\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n ? value + 'ms'\r\n : (value as string);\r\n }\r\n\r\n private _animationDuration: string;\r\n\r\n /**\r\n * `tabindex` to be set on the inner element that wraps the tab content. Can be used for improved\r\n * accessibility when the tab does not have focusable elements or if it has scrollable content.\r\n * The `tabindex` will be removed automatically for inactive tabs.\r\n * Read more at https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-2/tabs.html\r\n */\r\n @Input()\r\n get contentTabIndex(): number | null {\r\n return this._contentTabIndex;\r\n }\r\n\r\n set contentTabIndex(value: NumberInput) {\r\n this._contentTabIndex = coerceNumberProperty(value, null);\r\n }\r\n\r\n private _contentTabIndex: number | null;\r\n\r\n /**\r\n * Whether pagination should be disabled. This can be used to avoid unnecessary\r\n * layout recalculations if it's known that pagination won't be required.\r\n */\r\n @Input()\r\n get disablePagination(): boolean {\r\n return this._disablePagination;\r\n }\r\n\r\n set disablePagination(value: BooleanInput) {\r\n this._disablePagination = coerceBooleanProperty(value);\r\n }\r\n\r\n private _disablePagination = false;\r\n\r\n /**\r\n * By default tabs remove their content from the DOM while it's off-screen.\r\n * Setting this to `true` will keep it in the DOM which will prevent elements\r\n * like iframes and videos from reloading next time it comes back into the view.\r\n */\r\n @Input()\r\n get preserveContent(): boolean {\r\n return this._preserveContent;\r\n }\r\n\r\n set preserveContent(value: BooleanInput) {\r\n this._preserveContent = coerceBooleanProperty(value);\r\n }\r\n\r\n private _preserveContent = false;\r\n\r\n /** Background color of the tab group. */\r\n @Input()\r\n get backgroundColor(): ThemePalette {\r\n return this._backgroundColor;\r\n }\r\n\r\n set backgroundColor(value: ThemePalette) {\r\n const classList: DOMTokenList = this._elementRef.nativeElement.classList;\r\n\r\n classList.remove(\r\n 'oui-tabs-with-background',\r\n `oui-background-${this.backgroundColor}`\r\n );\r\n\r\n if (value) {\r\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\r\n }\r\n\r\n this._backgroundColor = value;\r\n }\r\n\r\n private _backgroundColor: ThemePalette;\r\n\r\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\r\n @Output() readonly selectedIndexChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when focus has changed within a tab group. */\r\n @Output() readonly focusChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the body animation has completed */\r\n @Output() readonly animationDone: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the tab selection has changed. */\r\n @Output() readonly selectedTabChange: EventEmitter =\r\n new EventEmitter(true);\r\n\r\n private _groupId: number;\r\n getHTMLText: any;\r\n updatedTabHTML: any;\r\n\r\n constructor(\r\n elementRef: ElementRef,\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n @Inject(OUI_TABS_CONFIG) @Optional() defaultConfig?: OuiTabsConfig,\r\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string\r\n ) {\r\n super(elementRef);\r\n this._groupId = nextId++;\r\n this.animationDuration =\r\n defaultConfig && defaultConfig.animationDuration\r\n ? defaultConfig.animationDuration\r\n : '500ms';\r\n this.disablePagination =\r\n defaultConfig && defaultConfig.disablePagination != null\r\n ? defaultConfig.disablePagination\r\n : false;\r\n this.dynamicHeight =\r\n defaultConfig && defaultConfig.dynamicHeight != null\r\n ? defaultConfig.dynamicHeight\r\n : false;\r\n this.contentTabIndex = defaultConfig?.contentTabIndex ?? null;\r\n this.preserveContent = !!defaultConfig?.preserveContent;\r\n this.fitInkBarToContent =\r\n defaultConfig && defaultConfig.fitInkBarToContent != null\r\n ? defaultConfig.fitInkBarToContent\r\n : false;\r\n this.stretchTabs =\r\n defaultConfig && defaultConfig.stretchTabs != null\r\n ? defaultConfig.stretchTabs\r\n : true;\r\n }\r\n\r\n /**\r\n * After the content is checked, this component knows what tabs have been defined\r\n * and what the selected index should be. This is where we can know exactly what position\r\n * each tab should be in according to the new selected index, and additionally we know how\r\n * a new selected tab should transition in (from the left or right).\r\n */\r\n ngAfterContentChecked() {\r\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\r\n // the amount of tabs changes before the actual change detection runs.\r\n const indexToSelect = (this._indexToSelect = this._clampTabIndex(\r\n this._indexToSelect\r\n ));\r\n\r\n // If there is a change in selected index, emit a change event. Should not trigger if\r\n // the selected index has not yet been initialized.\r\n if (this._selectedIndex != indexToSelect) {\r\n const isFirstRun = this._selectedIndex == null;\r\n\r\n if (!isFirstRun) {\r\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\r\n // Preserve the height so page doesn't scroll up during tab change.\r\n // Fixes https://stackblitz.com/edit/mat-tabs-scroll-page-top-on-tab-change\r\n const wrapper = this._tabBodyWrapper.nativeElement;\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n wrapper.style.minHeight = wrapper.clientHeight + 'px';\r\n }\r\n\r\n // Changing these values after change detection has run\r\n // since the checked content may contain references to them.\r\n Promise.resolve().then(() => {\r\n this._tabs.forEach(\r\n (tab, index) => (tab.isActive = index === indexToSelect)\r\n );\r\n\r\n if (!isFirstRun) {\r\n this.selectedIndexChange.emit(indexToSelect);\r\n // Clear the min-height, this was needed during tab change to avoid\r\n // unnecessary scrolling.\r\n this._tabBodyWrapper.nativeElement.style.minHeight = '';\r\n }\r\n });\r\n }\r\n\r\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\r\n this._tabs.forEach((tab: OuiTab, index: number) => {\r\n tab.position = index - indexToSelect;\r\n\r\n // If there is already a selected tab, then set up an origin for the next selected tab\r\n // if it doesn't have one already.\r\n if (this._selectedIndex != null && tab.position == 0 && !tab.origin) {\r\n tab.origin = indexToSelect - this._selectedIndex;\r\n }\r\n });\r\n\r\n if (this._selectedIndex !== indexToSelect) {\r\n this._selectedIndex = indexToSelect;\r\n this._lastFocusedTabIndex = null;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._subscribeToAllTabChanges();\r\n this._subscribeToTabLabels();\r\n // Subscribe to changes in the amount of tabs, in order to be\r\n // able to re-render the content as new tabs are added or removed.\r\n this._tabsSubscription = this._tabs.changes.subscribe(() => {\r\n const indexToSelect = this._clampTabIndex(this._indexToSelect);\r\n\r\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\r\n // explicit change that selects a different tab.\r\n if (indexToSelect === this._selectedIndex) {\r\n const tabs = this._tabs.toArray();\r\n let selectedTab: OuiTab | undefined;\r\n\r\n for (let i = 0; i < tabs.length; i++) {\r\n if (tabs[i].isActive) {\r\n // Assign both to the `_indexToSelect` and `_selectedIndex` so we don't fire a changed\r\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\r\n // adding a tab within the `selectedIndexChange` event.\r\n this._indexToSelect = this._selectedIndex = i;\r\n this._lastFocusedTabIndex = null;\r\n selectedTab = tabs[i];\r\n break;\r\n }\r\n }\r\n\r\n // If we haven't found an active tab and a tab exists at the selected index, it means\r\n // that the active tab was swapped out. Since this won't be picked up by the rendering\r\n // loop in `ngAfterContentChecked`, we need to sync it up manually.\r\n if (!selectedTab && tabs[indexToSelect]) {\r\n Promise.resolve().then(() => {\r\n tabs[indexToSelect].isActive = true;\r\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\r\n });\r\n }\r\n }\r\n\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n /** Listens to changes in all of the tabs. */\r\n private _subscribeToAllTabChanges() {\r\n // Since we use a query with `descendants: true` to pick up the tabs, we may end up catching\r\n // some that are inside of nested tab groups. We filter them out manually by checking that\r\n // the closest group to the tab is the current one.\r\n this.getHTMLText = this._allTabs['_results'][0].givenText;\r\n this.updatedTabHTML = this.getHTMLText;\r\n this._allTabs.changes\r\n .pipe(startWith(this._allTabs))\r\n .subscribe((tabs: QueryList) => {\r\n this._tabs.reset(\r\n tabs.filter((tab) => {\r\n return tab._closestTabGroup === this || !tab._closestTabGroup;\r\n })\r\n );\r\n this._tabs.notifyOnChanges();\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this._tabs.destroy();\r\n this._tabsSubscription.unsubscribe();\r\n this._tabLabelSubscription.unsubscribe();\r\n }\r\n\r\n /** Re-aligns the ink bar to the selected tab element. */\r\n realignInkBar() {\r\n if (this._tabHeader) {\r\n this._tabHeader._alignInkBarToSelectedTab();\r\n }\r\n }\r\n\r\n /**\r\n * Recalculates the tab group's pagination dimensions.\r\n *\r\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\r\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\r\n * page.\r\n */\r\n updatePagination() {\r\n if (this._tabHeader) {\r\n this._tabHeader.updatePagination();\r\n }\r\n }\r\n\r\n /**\r\n * Sets focus to a particular tab.\r\n * @param index Index of the tab to be focused.\r\n */\r\n focusTab(index: number) {\r\n const header = this._tabHeader;\r\n\r\n if (header) {\r\n header.focusIndex = index;\r\n }\r\n }\r\n\r\n _focusChanged(index: number) {\r\n this._lastFocusedTabIndex = index;\r\n this.focusChange.emit(this._createChangeEvent(index));\r\n }\r\n\r\n private _createChangeEvent(index: number): OuiTabChangeEvent {\r\n const event = new OuiTabChangeEvent();\r\n event.index = index;\r\n if (this._tabs && this._tabs.length) {\r\n event.tab = this._tabs.toArray()[index];\r\n this.updatedTabHTML = event.tab.givenText;\r\n }\r\n return event;\r\n }\r\n\r\n _handleEnter() {\r\n this.getHTMLText = this.updatedTabHTML;\r\n }\r\n\r\n /**\r\n * Subscribes to changes in the tab labels. This is needed, because the @Input for the label is\r\n * on the OuiTab component, whereas the data binding is inside the ouiTabGroup. In order for the\r\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\r\n * manually.\r\n */\r\n private _subscribeToTabLabels() {\r\n if (this._tabLabelSubscription) {\r\n this._tabLabelSubscription.unsubscribe();\r\n }\r\n\r\n this._tabLabelSubscription = merge(\r\n ...this._tabs.map((tab) => tab._stateChanges)\r\n ).subscribe(() => this._changeDetectorRef.markForCheck());\r\n }\r\n\r\n /** Clamps the given index to the bounds of 0 and the tabs length. */\r\n private _clampTabIndex(index: number | null): number {\r\n // Note the `|| 0`, which ensures that values like NaN can't get through\r\n // and which would otherwise throw the component into an infinite loop\r\n // (since Math.max(NaN, 0) === NaN).\r\n return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));\r\n }\r\n\r\n /** Returns a unique id for each tab label element */\r\n _getTabLabelId(i: number): string {\r\n return `oui-tab-label-${this._groupId}-${i}`;\r\n }\r\n\r\n /** Returns a unique id for each tab content element */\r\n _getTabContentId(i: number): string {\r\n return `oui-tab-content-${this._groupId}-${i}`;\r\n }\r\n\r\n /**\r\n * Sets the height of the body wrapper to the height of the activating tab if dynamic\r\n * height property is true.\r\n */\r\n _setTabBodyWrapperHeight(tabHeight: number): void {\r\n if (!this._dynamicHeight || !this._tabBodyWrapperHeight) {\r\n return;\r\n }\r\n\r\n const wrapper: HTMLElement = this._tabBodyWrapper.nativeElement;\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n wrapper.style.height = this._tabBodyWrapperHeight + 'px';\r\n\r\n // This conditional forces the browser to paint the height so that\r\n // the animation to the new height can have an origin.\r\n if (this._tabBodyWrapper.nativeElement.offsetHeight) {\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n wrapper.style.height = tabHeight + 'px';\r\n }\r\n }\r\n\r\n /** Removes the height of the tab body wrapper. */\r\n _removeTabBodyWrapperHeight(): void {\r\n const wrapper = this._tabBodyWrapper.nativeElement;\r\n this._tabBodyWrapperHeight = wrapper.clientHeight;\r\n wrapper.style.height = '';\r\n this.animationDone.emit();\r\n }\r\n\r\n /** Handle click events, setting new selected index if appropriate. */\r\n _handleClick(tab: OuiTab, tabHeader: OuiTabGroupBaseHeader, index: number) {\r\n tabHeader.focusIndex = index;\r\n this.getHTMLText = this.updatedTabHTML;\r\n\r\n if (!tab.disabled) {\r\n this.selectedIndex = index;\r\n }\r\n }\r\n\r\n /** Retrieves the tabindex for the tab. */\r\n _getTabIndex(index: number): number {\r\n const targetIndex = this._lastFocusedTabIndex ?? this.selectedIndex;\r\n return index === targetIndex ? 0 : -1;\r\n }\r\n\r\n /** Callback for when the focused state of a tab has changed. */\r\n _tabFocusChanged(focusOrigin: FocusOrigin, index: number) {\r\n // Mouse/touch focus happens during the `mousedown`/`touchstart` phase which\r\n // can cause the tab to be moved out from under the pointer, interrupting the\r\n // click sequence (see #21898). We don't need to scroll the tab into view for\r\n // such cases anyway, because it will be done when the tab becomes selected.\r\n if (focusOrigin && focusOrigin !== 'mouse' && focusOrigin !== 'touch') {\r\n this._tabHeader.focusIndex = index;\r\n }\r\n }\r\n}\r\n\r\n/** A simple change event emitted on focus or selection changes. */\r\nexport class OuiTabChangeEvent {\r\n /** Index of the currently-selected tab. */\r\n index: number;\r\n /** Reference to the currently-selected tab. */\r\n tab: OuiTab;\r\n event: Event;\r\n}\r\n", + "sourceCode": "import {\n AfterContentChecked,\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { OUI_TAB_GROUP, OuiTab } from './tab';\nimport { OuiTabHeader } from './tab-header';\nimport {\n BooleanInput,\n coerceBooleanProperty,\n coerceNumberProperty,\n NumberInput,\n} from '@angular/cdk/coercion';\nimport {\n CanColor,\n CanDisableRipple,\n mixinColor,\n mixinDisableRipple,\n ThemePalette,\n} from '../core';\nimport { merge, Subscription } from 'rxjs';\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from './tab-config';\nimport { startWith } from 'rxjs/operators';\nimport { FocusOrigin } from '@angular/cdk/a11y';\n\n/** Used to generate unique ID's for each tab component */\nlet nextId = 0;\n\n// Boilerplate for applying mixins to ouiTabGroup.\n/** @docs-private */\nconst _OuiTabGroupMixinBase = mixinColor(\n mixinDisableRipple(\n class {\n constructor(public _elementRef: ElementRef) {}\n }\n ),\n 'primary'\n);\n\n/** @docs-private */\nexport interface OuiTabGroupBaseHeader {\n _alignInkBarToSelectedTab(): void;\n updatePagination(): void;\n focusIndex: number;\n}\n\n/** Possible positions for the tab header. */\nexport type OuiTabHeaderPosition = 'above' | 'below';\n\n/**\n * Material design tab-group component. Supports basic tab pairs (label + content) and includes\n * animated ink-bar, keyboard navigation, and screen reader.\n * See: https://material.io/design/components/tabs.html\n */\n@Component({\n selector: 'oui-tab-group',\n exportAs: 'ouiTabGroup',\n templateUrl: 'tab-group.html',\n styleUrls: ['tab-group.scss'],\n encapsulation: ViewEncapsulation.None,\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n // eslint-disable-next-line\n inputs: ['color', 'disableRipple'],\n providers: [\n {\n provide: OUI_TAB_GROUP,\n useExisting: ouiTabGroup,\n },\n ],\n // eslint-disable-next-line\n host: {\n ngSkipHydration: '',\n class: 'oui-mdc-tab-group oui-tab',\n '[class.oui-mdc-tab-group-dynamic-height]': 'dynamicHeight',\n '[class.oui-mdc-tab-group-inverted-header]': 'headerPosition === \"below\"',\n '[class.oui-mdc-tab-group-stretch-tabs]': 'stretchTabs',\n '[style.--oui-tab-animation-duration]': 'animationDuration',\n },\n})\nexport class ouiTabGroup\n extends _OuiTabGroupMixinBase\n implements\n AfterContentInit,\n AfterContentChecked,\n OnDestroy,\n CanColor,\n CanDisableRipple\n{\n /**\n * All tabs inside the tab group. This includes tabs that belong to groups that are nested\n * inside the current one. We filter out only the tabs that belong to this group in `_tabs`.\n */\n @ContentChildren(OuiTab, { descendants: true }) _allTabs: QueryList;\n @ViewChild('tabBodyWrapper') _tabBodyWrapper: ElementRef;\n @ViewChild('tabHeader') _tabHeader: OuiTabHeader;\n\n /** All of the tabs that belong to the group. */\n _tabs: QueryList = new QueryList();\n\n /** The tab index that should be selected after the content has been checked. */\n private _indexToSelect: number | null = 0;\n\n /** Index of the tab that was focused last. */\n private _lastFocusedTabIndex: number | null = null;\n\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\n private _tabBodyWrapperHeight = 0;\n\n /** Subscription to tabs being added/removed. */\n private _tabsSubscription = Subscription.EMPTY;\n\n /** Subscription to changes in the tab labels. */\n private _tabLabelSubscription = Subscription.EMPTY;\n\n /** Whether the ink bar should fit its width to the size of the tab label content. */\n @Input()\n get fitInkBarToContent(): boolean {\n return this._fitInkBarToContent;\n }\n set fitInkBarToContent(v: BooleanInput) {\n this._fitInkBarToContent = coerceBooleanProperty(v);\n this._changeDetectorRef.markForCheck();\n }\n private _fitInkBarToContent = false;\n\n /** Whether tabs should be stretched to fill the header. */\n @Input('oui-stretch-tabs')\n get stretchTabs(): boolean {\n return this._stretchTabs;\n }\n set stretchTabs(v: BooleanInput) {\n this._stretchTabs = coerceBooleanProperty(v);\n }\n private _stretchTabs = true;\n\n /** Whether the tab group should grow to the size of the active tab. */\n @Input()\n get dynamicHeight(): boolean {\n return this._dynamicHeight;\n }\n\n set dynamicHeight(value: BooleanInput) {\n this._dynamicHeight = coerceBooleanProperty(value);\n }\n\n private _dynamicHeight = false;\n\n /** The index of the active tab. */\n @Input()\n get selectedIndex(): number | null {\n return this._selectedIndex;\n }\n\n set selectedIndex(value: NumberInput) {\n this._indexToSelect = coerceNumberProperty(value, null);\n }\n\n private _selectedIndex: number | null = null;\n\n /** Position of the tab header. */\n @Input() headerPosition: OuiTabHeaderPosition = 'above';\n\n /** Duration for the tab animation. Will be normalized to milliseconds if no units are set. */\n @Input()\n get animationDuration(): string {\n return this._animationDuration;\n }\n\n set animationDuration(value: NumberInput) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n ? value + 'ms'\n : (value as string);\n }\n\n private _animationDuration: string;\n\n /**\n * `tabindex` to be set on the inner element that wraps the tab content. Can be used for improved\n * accessibility when the tab does not have focusable elements or if it has scrollable content.\n * The `tabindex` will be removed automatically for inactive tabs.\n * Read more at https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-2/tabs.html\n */\n @Input()\n get contentTabIndex(): number | null {\n return this._contentTabIndex;\n }\n\n set contentTabIndex(value: NumberInput) {\n this._contentTabIndex = coerceNumberProperty(value, null);\n }\n\n private _contentTabIndex: number | null;\n\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n */\n @Input()\n get disablePagination(): boolean {\n return this._disablePagination;\n }\n\n set disablePagination(value: BooleanInput) {\n this._disablePagination = coerceBooleanProperty(value);\n }\n\n private _disablePagination = false;\n\n /**\n * By default tabs remove their content from the DOM while it's off-screen.\n * Setting this to `true` will keep it in the DOM which will prevent elements\n * like iframes and videos from reloading next time it comes back into the view.\n */\n @Input()\n get preserveContent(): boolean {\n return this._preserveContent;\n }\n\n set preserveContent(value: BooleanInput) {\n this._preserveContent = coerceBooleanProperty(value);\n }\n\n private _preserveContent = false;\n\n /** Background color of the tab group. */\n @Input()\n get backgroundColor(): ThemePalette {\n return this._backgroundColor;\n }\n\n set backgroundColor(value: ThemePalette) {\n const classList: DOMTokenList = this._elementRef.nativeElement.classList;\n\n classList.remove(\n 'oui-tabs-with-background',\n `oui-background-${this.backgroundColor}`\n );\n\n if (value) {\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n\n private _backgroundColor: ThemePalette;\n\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\n @Output() readonly selectedIndexChange: EventEmitter =\n new EventEmitter();\n\n /** Event emitted when focus has changed within a tab group. */\n @Output() readonly focusChange: EventEmitter =\n new EventEmitter();\n\n /** Event emitted when the body animation has completed */\n @Output() readonly animationDone: EventEmitter =\n new EventEmitter();\n\n /** Event emitted when the tab selection has changed. */\n @Output() readonly selectedTabChange: EventEmitter =\n new EventEmitter(true);\n\n private _groupId: number;\n getHTMLText: any;\n updatedTabHTML: any;\n\n constructor(\n elementRef: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n @Inject(OUI_TABS_CONFIG) @Optional() defaultConfig?: OuiTabsConfig,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string\n ) {\n super(elementRef);\n this._groupId = nextId++;\n this.animationDuration =\n defaultConfig && defaultConfig.animationDuration\n ? defaultConfig.animationDuration\n : '500ms';\n this.disablePagination =\n defaultConfig && defaultConfig.disablePagination != null\n ? defaultConfig.disablePagination\n : false;\n this.dynamicHeight =\n defaultConfig && defaultConfig.dynamicHeight != null\n ? defaultConfig.dynamicHeight\n : false;\n this.contentTabIndex = defaultConfig?.contentTabIndex ?? null;\n this.preserveContent = !!defaultConfig?.preserveContent;\n this.fitInkBarToContent =\n defaultConfig && defaultConfig.fitInkBarToContent != null\n ? defaultConfig.fitInkBarToContent\n : false;\n this.stretchTabs =\n defaultConfig && defaultConfig.stretchTabs != null\n ? defaultConfig.stretchTabs\n : false;\n }\n\n /**\n * After the content is checked, this component knows what tabs have been defined\n * and what the selected index should be. This is where we can know exactly what position\n * each tab should be in according to the new selected index, and additionally we know how\n * a new selected tab should transition in (from the left or right).\n */\n ngAfterContentChecked() {\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\n // the amount of tabs changes before the actual change detection runs.\n const indexToSelect = (this._indexToSelect = this._clampTabIndex(\n this._indexToSelect\n ));\n\n // If there is a change in selected index, emit a change event. Should not trigger if\n // the selected index has not yet been initialized.\n if (this._selectedIndex != indexToSelect) {\n const isFirstRun = this._selectedIndex == null;\n\n if (!isFirstRun) {\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\n // Preserve the height so page doesn't scroll up during tab change.\n // Fixes https://stackblitz.com/edit/mat-tabs-scroll-page-top-on-tab-change\n const wrapper = this._tabBodyWrapper.nativeElement;\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n wrapper.style.minHeight = wrapper.clientHeight + 'px';\n }\n\n // Changing these values after change detection has run\n // since the checked content may contain references to them.\n Promise.resolve().then(() => {\n this._tabs.forEach(\n (tab, index) => (tab.isActive = index === indexToSelect)\n );\n\n if (!isFirstRun) {\n this.selectedIndexChange.emit(indexToSelect);\n // Clear the min-height, this was needed during tab change to avoid\n // unnecessary scrolling.\n this._tabBodyWrapper.nativeElement.style.minHeight = '';\n }\n });\n }\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\n this._tabs.forEach((tab: OuiTab, index: number) => {\n tab.position = index - indexToSelect;\n\n // If there is already a selected tab, then set up an origin for the next selected tab\n // if it doesn't have one already.\n if (this._selectedIndex != null && tab.position == 0 && !tab.origin) {\n tab.origin = indexToSelect - this._selectedIndex;\n }\n });\n\n if (this._selectedIndex !== indexToSelect) {\n this._selectedIndex = indexToSelect;\n this._lastFocusedTabIndex = null;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n ngAfterContentInit() {\n setTimeout(() => {\n this._subscribeToAllTabChanges();\n this._subscribeToTabLabels();\n });\n // Subscribe to changes in the amount of tabs, in order to be\n // able to re-render the content as new tabs are added or removed.\n this._tabsSubscription = this._tabs.changes.subscribe(() => {\n const indexToSelect = this._clampTabIndex(this._indexToSelect);\n\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\n // explicit change that selects a different tab.\n if (indexToSelect === this._selectedIndex) {\n const tabs = this._tabs.toArray();\n let selectedTab: OuiTab | undefined;\n\n for (let i = 0; i < tabs.length; i++) {\n if (tabs[i].isActive) {\n // Assign both to the `_indexToSelect` and `_selectedIndex` so we don't fire a changed\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\n // adding a tab within the `selectedIndexChange` event.\n this._indexToSelect = this._selectedIndex = i;\n this._lastFocusedTabIndex = null;\n selectedTab = tabs[i];\n break;\n }\n }\n\n // If we haven't found an active tab and a tab exists at the selected index, it means\n // that the active tab was swapped out. Since this won't be picked up by the rendering\n // loop in `ngAfterContentChecked`, we need to sync it up manually.\n if (!selectedTab && tabs[indexToSelect]) {\n Promise.resolve().then(() => {\n tabs[indexToSelect].isActive = true;\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\n });\n }\n }\n\n this._changeDetectorRef.markForCheck();\n });\n }\n\n /** Listens to changes in all of the tabs. */\n private _subscribeToAllTabChanges() {\n // Since we use a query with `descendants: true` to pick up the tabs, we may end up catching\n // some that are inside of nested tab groups. We filter them out manually by checking that\n // the closest group to the tab is the current one.\n this.getHTMLText = this._allTabs['_results'][0].contentWithin;\n this.updatedTabHTML = this.getHTMLText;\n this._allTabs.changes\n .pipe(startWith(this._allTabs))\n .subscribe((tabs: QueryList) => {\n this._tabs.reset(\n tabs.filter((tab) => {\n return tab._closestTabGroup === this || !tab._closestTabGroup;\n })\n );\n this._tabs.notifyOnChanges();\n });\n }\n\n ngOnDestroy() {\n this._tabs.destroy();\n this._tabsSubscription.unsubscribe();\n this._tabLabelSubscription.unsubscribe();\n }\n\n /** Re-aligns the ink bar to the selected tab element. */\n realignInkBar() {\n if (this._tabHeader) {\n this._tabHeader._alignInkBarToSelectedTab();\n }\n }\n\n /**\n * Recalculates the tab group's pagination dimensions.\n *\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\n * page.\n */\n updatePagination() {\n if (this._tabHeader) {\n this._tabHeader.updatePagination();\n }\n }\n\n /**\n * Sets focus to a particular tab.\n * @param index Index of the tab to be focused.\n */\n focusTab(index: number) {\n const header = this._tabHeader;\n\n if (header) {\n header.focusIndex = index;\n }\n }\n\n _focusChanged(index: number) {\n this._lastFocusedTabIndex = index;\n this.focusChange.emit(this._createChangeEvent(index));\n }\n\n private _createChangeEvent(index: number): OuiTabChangeEvent {\n const event = new OuiTabChangeEvent();\n event.index = index;\n if (this._tabs && this._tabs.length) {\n event.tab = this._tabs.toArray()[index];\n this.updatedTabHTML = event.tab.contentWithin;\n }\n return event;\n }\n\n _handleEnter() {\n this.getHTMLText = this.updatedTabHTML;\n }\n\n /**\n * Subscribes to changes in the tab labels. This is needed, because the @Input for the label is\n * on the OuiTab component, whereas the data binding is inside the ouiTabGroup. In order for the\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\n * manually.\n */\n private _subscribeToTabLabels() {\n if (this._tabLabelSubscription) {\n this._tabLabelSubscription.unsubscribe();\n }\n\n this._tabLabelSubscription = merge(\n ...this._tabs.map((tab) => tab._stateChanges)\n ).subscribe(() => this._changeDetectorRef.markForCheck());\n }\n\n /** Clamps the given index to the bounds of 0 and the tabs length. */\n private _clampTabIndex(index: number | null): number {\n // Note the `|| 0`, which ensures that values like NaN can't get through\n // and which would otherwise throw the component into an infinite loop\n // (since Math.max(NaN, 0) === NaN).\n return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));\n }\n\n /** Returns a unique id for each tab label element */\n _getTabLabelId(i: number): string {\n return `oui-tab-label-${this._groupId}-${i}`;\n }\n\n /** Returns a unique id for each tab content element */\n _getTabContentId(i: number): string {\n return `oui-tab-content-${this._groupId}-${i}`;\n }\n\n /**\n * Sets the height of the body wrapper to the height of the activating tab if dynamic\n * height property is true.\n */\n _setTabBodyWrapperHeight(tabHeight: number): void {\n if (!this._dynamicHeight || !this._tabBodyWrapperHeight) {\n return;\n }\n\n const wrapper: HTMLElement = this._tabBodyWrapper.nativeElement;\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n wrapper.style.height = this._tabBodyWrapperHeight + 'px';\n\n // This conditional forces the browser to paint the height so that\n // the animation to the new height can have an origin.\n if (this._tabBodyWrapper.nativeElement.offsetHeight) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n wrapper.style.height = tabHeight + 'px';\n }\n }\n\n /** Removes the height of the tab body wrapper. */\n _removeTabBodyWrapperHeight(): void {\n const wrapper = this._tabBodyWrapper.nativeElement;\n this._tabBodyWrapperHeight = wrapper.clientHeight;\n wrapper.style.height = '';\n this.animationDone.emit();\n }\n\n /** Handle click events, setting new selected index if appropriate. */\n _handleClick(tab: OuiTab, tabHeader: OuiTabGroupBaseHeader, index: number) {\n tabHeader.focusIndex = index;\n this.getHTMLText = this.updatedTabHTML;\n\n if (!tab.disabled) {\n this.selectedIndex = index;\n }\n }\n\n /** Retrieves the tabindex for the tab. */\n _getTabIndex(index: number): number {\n const targetIndex = this._lastFocusedTabIndex ?? this.selectedIndex;\n return index === targetIndex ? 0 : -1;\n }\n\n /** Callback for when the focused state of a tab has changed. */\n _tabFocusChanged(focusOrigin: FocusOrigin, index: number) {\n // Mouse/touch focus happens during the `mousedown`/`touchstart` phase which\n // can cause the tab to be moved out from under the pointer, interrupting the\n // click sequence (see #21898). We don't need to scroll the tab into view for\n // such cases anyway, because it will be done when the tab becomes selected.\n if (focusOrigin && focusOrigin !== 'mouse' && focusOrigin !== 'touch') {\n this._tabHeader.focusIndex = index;\n }\n }\n}\n\n/** A simple change event emitted on focus or selection changes. */\nexport class OuiTabChangeEvent {\n /** Index of the currently-selected tab. */\n index: number;\n /** Reference to the currently-selected tab. */\n tab: OuiTab;\n event: Event;\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "event", @@ -10366,7 +10413,7 @@ "type": "Event", "optional": false, "description": "", - "line": 599 + "line": 600 }, { "name": "index", @@ -10375,7 +10422,7 @@ "type": "number", "optional": false, "description": "

Index of the currently-selected tab.

\n", - "line": 596, + "line": 597, "rawdescription": "\nIndex of the currently-selected tab." }, { @@ -10385,7 +10432,7 @@ "type": "OuiTab", "optional": false, "description": "

Reference to the currently-selected tab.

\n", - "line": 598, + "line": 599, "rawdescription": "\nReference to the currently-selected tab." } ], @@ -10394,8 +10441,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -10435,6 +10480,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_data", @@ -11077,19 +11124,17 @@ } } }, - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, { "name": "OuiTabsBase", - "id": "class-OuiTabsBase-90101422686a726eb69c50499e9ec74197febce4088a5e86c3b704858597fd644e9b89a1b60a173f1983d03998f71c65913b11ac249b411b2c954bfd8a2e0b22", + "id": "class-OuiTabsBase-f9918c233e7d4293aa9e22879315bdb9ca8cc124f70f811141a4d9ef7c41743fe96d94824c5a2460821ce9304c7ec8ad7a143a68cda612a8c9620e183ee42e13", "file": "ui/src/components/tabs/tab.ts", "deprecated": false, "deprecationMessage": "", "type": "class", - "sourceCode": "import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ContentChild,\r\n ElementRef,\r\n Inject,\r\n InjectionToken,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n SimpleChanges,\r\n TemplateRef,\r\n ViewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { OuiTabContent } from './tab-content';\r\nimport { OUI_TAB, OuiTabLabel } from './tab-label';\r\nimport { CanDisable, mixinColor } from '../core';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport class OuiTabsBase {\r\n constructor(public _elementRef: ElementRef) {}\r\n}\r\n// Boilerplate for applying mixins to OuiTab.\r\n/** @docs-private */\r\nconst _OuiTabMixinBase: typeof OuiTabsBase = mixinColor(OuiTabsBase);\r\n\r\n/**\r\n * Used to provide a tab group to a tab without causing a circular dependency.\r\n * @docs-private\r\n */\r\nexport const OUI_TAB_GROUP = new InjectionToken('OUI_TAB_GROUP');\r\n\r\n/** Default color palette for the tab */\r\nconst DEFAULT_COLOR = 'primary';\r\n\r\n@Component({\r\n selector: 'oui-tab',\r\n\r\n // Note that usually we'd go through a bit more trouble and set up another class so that\r\n // the inlined template of `OuiTab` isn't duplicated, however the template is small enough\r\n // that creating the extra class will generate more code than just duplicating the template.\r\n templateUrl: 'tab.html',\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['disabled'],\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n encapsulation: ViewEncapsulation.None,\r\n exportAs: 'OuiTab',\r\n providers: [{ provide: OUI_TAB, useExisting: OuiTab }],\r\n})\r\nexport class OuiTab\r\n extends _OuiTabMixinBase\r\n implements CanDisable, OnInit, OnChanges, OnDestroy\r\n{\r\n /** Content for the tab label given by ``. */\r\n private _templateLabel: OuiTabLabel;\r\n disabled: any;\r\n @ContentChild(OuiTabLabel)\r\n get templateLabel(): OuiTabLabel {\r\n return this._templateLabel;\r\n }\r\n set templateLabel(value: OuiTabLabel) {\r\n this._setTemplateLabelInput(value);\r\n }\r\n\r\n /**\r\n * Template provided in the tab content that will be used if present, used to enable lazy-loading\r\n */\r\n @ContentChild(OuiTabContent, { read: TemplateRef, static: true })\r\n // We need an initializer here to avoid a TS error. The value will be set in `ngAfterViewInit`.\r\n private _explicitContent: TemplateRef = undefined!;\r\n\r\n /** Template inside the OuiTab view that contains an ``. */\r\n @ViewChild(TemplateRef, { static: true }) _implicitContent: TemplateRef;\r\n\r\n /** Plain text label for the tab, used when there is no template label. */\r\n @Input('label') textLabel = '';\r\n\r\n @Input('text') givenText = '';\r\n\r\n /** Aria label for the tab. */\r\n @Input('aria-label') ariaLabel: string;\r\n\r\n @Input() color = 'accent';\r\n\r\n /**\r\n * Reference to the element that the tab is labelled by.\r\n * Will be cleared if `aria-label` is set at the same time.\r\n */\r\n @Input('aria-labelledby') ariaLabelledby: string;\r\n\r\n /**\r\n * Classes to be passed to the tab label inside the oui-tab-header container.\r\n * Supports string and string array values, same as `ngClass`.\r\n */\r\n @Input() labelClass: string | string[];\r\n\r\n /**\r\n * Classes to be passed to the tab oui-tab-body container.\r\n * Supports string and string array values, same as `ngClass`.\r\n */\r\n @Input() bodyClass: string | string[];\r\n\r\n /** Portal that will be the hosted content of the tab */\r\n private _contentPortal: TemplatePortal | null = null;\r\n\r\n /** @docs-private */\r\n get content(): TemplatePortal | null {\r\n return this._contentPortal;\r\n }\r\n\r\n /** Emits whenever the internal state of the tab changes. */\r\n readonly _stateChanges = new Subject();\r\n\r\n /**\r\n * The relatively indexed position where 0 represents the center, negative is left, and positive\r\n * represents the right.\r\n */\r\n position: number | null = null;\r\n\r\n /**\r\n * The initial relatively index origin of the tab if it was created and selected after there\r\n * was already a selected tab. Provides context of what position the tab should originate from.\r\n */\r\n origin: number | null = null;\r\n\r\n /**\r\n * Whether the tab is currently active.\r\n */\r\n isActive = false;\r\n\r\n @ViewChild('tab1') _tab1: ElementRef;\r\n constructor(\r\n private _viewContainerRef: ViewContainerRef,\r\n @Inject(OUI_TAB_GROUP) @Optional() public _closestTabGroup: any,\r\n _elementRef: ElementRef\r\n ) {\r\n super(_elementRef);\r\n this.addThemeColor();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (\r\n Object.prototype.hasOwnProperty.call(changes, 'textLabel') ||\r\n Object.prototype.hasOwnProperty.call(changes, 'disabled')\r\n ) {\r\n this._stateChanges.next();\r\n }\r\n if (\r\n Object.prototype.hasOwnProperty.call(changes, '_tab2') ||\r\n Object.prototype.hasOwnProperty.call(changes, 'disabled')\r\n ) {\r\n this._stateChanges.next();\r\n }\r\n }\r\n\r\n addThemeColor() {\r\n if (!this.color) {\r\n this.color = DEFAULT_COLOR;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._stateChanges.complete();\r\n }\r\n\r\n ngOnInit(): void {\r\n this._contentPortal = new TemplatePortal(\r\n this._explicitContent || this._implicitContent,\r\n this._viewContainerRef,\r\n this._tab1\r\n );\r\n }\r\n\r\n /**\r\n * This has been extracted to a util because of TS 4 and VE.\r\n * View Engine doesn't support property rename inheritance.\r\n * TS 4.0 doesn't allow properties to override accessors or vice-versa.\r\n * @docs-private\r\n */\r\n private _setTemplateLabelInput(value: OuiTabLabel | undefined) {\r\n // Only update the label if the query managed to find one. This works around an issue where a\r\n // user may have manually set `templateLabel` during creation mode, which would then get\r\n // clobbered by `undefined` when the query resolves. Also note that we check that the closest\r\n // tab matches the current one so that we don't pick up labels from nested tabs.\r\n if (value && value._closestTab === this) {\r\n this._templateLabel = value;\r\n }\r\n }\r\n}\r\n", + "sourceCode": "import {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n ElementRef,\n Inject,\n InjectionToken,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { OuiTabContent } from './tab-content';\nimport { OUI_TAB, OuiTabLabel } from './tab-label';\nimport { CanDisable, mixinColor } from '../core';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { Subject } from 'rxjs';\nimport { DomSanitizer } from '@angular/platform-browser';\n\nexport class OuiTabsBase {\n constructor(public _elementRef: ElementRef) {}\n}\n// Boilerplate for applying mixins to OuiTab.\n/** @docs-private */\nconst _OuiTabMixinBase: typeof OuiTabsBase = mixinColor(OuiTabsBase);\n\n/**\n * Used to provide a tab group to a tab without causing a circular dependency.\n * @docs-private\n */\nexport const OUI_TAB_GROUP = new InjectionToken('OUI_TAB_GROUP');\n\n/** Default color palette for the tab */\nconst DEFAULT_COLOR = 'primary';\n\n@Component({\n selector: 'oui-tab',\n\n // Note that usually we'd go through a bit more trouble and set up another class so that\n // the inlined template of `OuiTab` isn't duplicated, however the template is small enough\n // that creating the extra class will generate more code than just duplicating the template.\n templateUrl: 'tab.html',\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled'],\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n changeDetection: ChangeDetectionStrategy.Default,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'OuiTab',\n providers: [{ provide: OUI_TAB, useExisting: OuiTab }],\n})\nexport class OuiTab\n extends _OuiTabMixinBase\n implements CanDisable, OnInit, OnChanges, OnDestroy\n{\n /** Content for the tab label given by ``. */\n private _templateLabel: OuiTabLabel;\n disabled: any;\n @ContentChild(OuiTabLabel)\n get templateLabel(): OuiTabLabel {\n return this._templateLabel;\n }\n set templateLabel(value: OuiTabLabel) {\n this._setTemplateLabelInput(value);\n }\n\n /**\n * Template provided in the tab content that will be used if present, used to enable lazy-loading\n */\n @ContentChild(OuiTabContent, { read: TemplateRef, static: true })\n // We need an initializer here to avoid a TS error. The value will be set in `ngAfterViewInit`.\n private _explicitContent: TemplateRef = undefined!;\n\n /** Template inside the OuiTab view that contains an ``. */\n @ViewChild(TemplateRef, { static: true }) _implicitContent: TemplateRef;\n\n /** Plain text label for the tab, used when there is no template label. */\n @Input('label') textLabel = '';\n\n contentWithin = '';\n\n /** Aria label for the tab. */\n @Input('aria-label') ariaLabel: string;\n\n @Input() color = 'accent';\n\n /**\n * Reference to the element that the tab is labelled by.\n * Will be cleared if `aria-label` is set at the same time.\n */\n @Input('aria-labelledby') ariaLabelledby: string;\n\n /**\n * Classes to be passed to the tab label inside the oui-tab-header container.\n * Supports string and string array values, same as `ngClass`.\n */\n @Input() labelClass: string | string[];\n\n /**\n * Classes to be passed to the tab oui-tab-body container.\n * Supports string and string array values, same as `ngClass`.\n */\n @Input() bodyClass: string | string[];\n\n /** Portal that will be the hosted content of the tab */\n private _contentPortal: TemplatePortal | null = null;\n\n /** @docs-private */\n get content(): TemplatePortal | null {\n return this._contentPortal;\n }\n\n /** Emits whenever the internal state of the tab changes. */\n readonly _stateChanges = new Subject();\n\n /**\n * The relatively indexed position where 0 represents the center, negative is left, and positive\n * represents the right.\n */\n position: number | null = null;\n\n /**\n * The initial relatively index origin of the tab if it was created and selected after there\n * was already a selected tab. Provides context of what position the tab should originate from.\n */\n origin: number | null = null;\n\n /**\n * Whether the tab is currently active.\n */\n isActive = false;\n\n @ViewChild('tab1') _tab1: ElementRef;\n constructor(\n private _viewContainerRef: ViewContainerRef,\n @Inject(OUI_TAB_GROUP) @Optional() public _closestTabGroup: any,\n private sanitized: DomSanitizer,\n _elementRef: ElementRef\n ) {\n super(_elementRef);\n this.addThemeColor();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n Object.prototype.hasOwnProperty.call(changes, 'textLabel') ||\n Object.prototype.hasOwnProperty.call(changes, 'disabled')\n ) {\n setTimeout(() => {\n this.contentWithin = this.sanitized.bypassSecurityTrustHtml(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this._elementRef.nativeElement.innerHTML\n )['changingThisBreaksApplicationSecurity'];\n });\n this._stateChanges.next();\n }\n if (\n Object.prototype.hasOwnProperty.call(changes, '_tab2') ||\n Object.prototype.hasOwnProperty.call(changes, 'disabled')\n ) {\n this._stateChanges.next();\n }\n }\n\n addThemeColor() {\n if (!this.color) {\n this.color = DEFAULT_COLOR;\n }\n }\n\n ngOnDestroy(): void {\n this._stateChanges.complete();\n }\n\n ngOnInit(): void {\n setTimeout(() => {\n this.contentWithin = this.sanitized.bypassSecurityTrustHtml(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this._elementRef.nativeElement.innerHTML\n )['changingThisBreaksApplicationSecurity'];\n });\n this._contentPortal = new TemplatePortal(\n this._explicitContent || this._implicitContent,\n this._viewContainerRef,\n this._tab1\n );\n }\n\n /**\n * This has been extracted to a util because of TS 4 and VE.\n * View Engine doesn't support property rename inheritance.\n * TS 4.0 doesn't allow properties to override accessors or vice-versa.\n * @docs-private\n */\n private _setTemplateLabelInput(value: OuiTabLabel | undefined) {\n // Only update the label if the query managed to find one. This works around an issue where a\n // user may have manually set `templateLabel` during creation mode, which would then get\n // clobbered by `undefined` when the query resolves. Also note that we check that the closest\n // tab matches the current one so that we don't pick up labels from nested tabs.\n if (value && value._closestTab === this) {\n this._templateLabel = value;\n }\n }\n}\n", "constructorObj": { "name": "constructor", "description": "", @@ -11103,7 +11148,7 @@ "deprecationMessage": "" } ], - "line": 33, + "line": 34, "jsdoctags": [ { "name": "_elementRef", @@ -11116,6 +11161,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_elementRef", @@ -11124,7 +11171,7 @@ "type": "ElementRef", "optional": false, "description": "", - "line": 34, + "line": 35, "modifierKind": [ 125 ] @@ -11133,8 +11180,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -11146,6 +11191,8 @@ "deprecationMessage": "", "type": "class", "sourceCode": "import {\n coerceNumberProperty,\n coerceBooleanProperty,\n} from '@angular/cdk/coercion';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ViewEncapsulation,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { OuiPaginatorIntl } from './paginator-intl';\nimport {\n HasInitialized,\n HasInitializedCtor,\n mixinInitialized,\n mixinDisabled,\n CanDisableCtor,\n CanDisable,\n} from '../core';\n\n/** The default page size if there is no page size and there are no provided page size options. */\nconst DEFAULT_PAGE_SIZE = 30;\n\n/**\n * Change event object that is emitted when the user selects a\n * different page size or navigates to another page.\n */\nexport class PageEvent {\n /** The current page index. */\n pageIndex: number;\n\n /**\n * Index of the page that was selected previously.\n *\n * @breaking-change 8.0.0 To be made into a required property.\n */\n previousPageIndex?: number;\n\n /** The current page size */\n pageSize: number;\n\n /** The current total number of items being paged */\n length: number;\n}\n\n// Boilerplate for applying mixins to OuiPaginator.\n/** @docs-private */\nexport class OuiPaginatorBase {}\nexport const _OuiPaginatorBase: CanDisableCtor &\n HasInitializedCtor &\n typeof OuiPaginatorBase = mixinDisabled(mixinInitialized(OuiPaginatorBase));\n\n/**\n * Component to provide navigation between paged information. Displays the size of the current\n * page, user-selectable options to change that size, what items are being shown, and\n * navigational button to go to the previous or next page.\n */\n@Component({\n selector: 'oui-paginator',\n exportAs: 'ouiPaginator',\n templateUrl: 'paginator.html',\n styleUrls: ['paginator.scss'],\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-paginator',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class OuiPaginator\n extends _OuiPaginatorBase\n implements OnInit, OnDestroy, CanDisable, HasInitialized\n{\n private _initialized: boolean;\n private _intlChanges: Subscription;\n\n /** The zero-based page index of the displayed list of items. Defaulted to 0. */\n @Input()\n get pageIndex(): number {\n return this._pageIndex;\n }\n set pageIndex(value: number) {\n this._pageIndex = Math.max(coerceNumberProperty(value), 0);\n this._changeDetectorRef.markForCheck();\n }\n _pageIndex = 0;\n\n /** The length of the total number of items that are being paginated. Defaulted to 0. */\n @Input()\n get length(): number {\n return this._length;\n }\n set length(value: number) {\n this._length = coerceNumberProperty(value);\n this._changeDetectorRef.markForCheck();\n }\n _length = 0;\n\n /** Number of items to display on a page. By default set to 50. */\n @Input()\n get pageSize(): number {\n return this._pageSize;\n }\n set pageSize(value: number) {\n this._pageSize = Math.max(coerceNumberProperty(value), 0);\n }\n private _pageSize: number = DEFAULT_PAGE_SIZE;\n\n /** Whether to hide the page size selection UI from the user. */\n @Input()\n get hidePageSize(): boolean {\n return this._hidePageSize;\n }\n set hidePageSize(value: boolean) {\n this._hidePageSize = coerceBooleanProperty(value);\n }\n private _hidePageSize = false;\n\n /** Event emitted when the paginator changes the page size or page index. */\n @Output()\n readonly page: EventEmitter = new EventEmitter();\n\n /** Displayed set of page size options. Will be sorted and include current page size. */\n _displayedPageSizeOptions: number;\n\n constructor(\n public _intl: OuiPaginatorIntl,\n private _changeDetectorRef: ChangeDetectorRef\n ) {\n super();\n this._intlChanges = _intl.changes.subscribe(() =>\n this._changeDetectorRef.markForCheck()\n );\n }\n\n ngOnInit() {\n this._initialized = true;\n this._markInitialized();\n }\n\n ngOnDestroy() {\n this._intlChanges.unsubscribe();\n }\n\n /** Advances to the next page if it exists. */\n nextPage(): void {\n if (!this.hasNextPage() || !this._initialized) {\n return;\n }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex++;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Move back to the previous page if it exists. */\n previousPage(): void {\n if (!this.hasPreviousPage()) {\n return;\n }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex--;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Move to the first page if not already there. */\n firstPage(): void {\n // hasPreviousPage being false implies at the start\n if (!this.hasPreviousPage()) {\n return;\n }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex = 0;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Move to the last page if not already there. */\n lastPage(): void {\n // hasNextPage being false implies at the end\n if (!this.hasNextPage()) {\n return;\n }\n\n const previousPageIndex = this.pageIndex;\n this.pageIndex = this.getNumberOfPages() - 1;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Whether there is a previous page. */\n hasPreviousPage(): boolean {\n return this.pageIndex >= 1 && this.pageSize !== 0;\n }\n\n /** Whether there is a next page. */\n hasNextPage(): boolean {\n const maxPageIndex = this.getNumberOfPages() - 1;\n return this.pageIndex < maxPageIndex && this.pageSize !== 0;\n }\n\n /** Calculate the number of pages */\n getNumberOfPages(): number {\n if (!this.pageSize || this.length < 0) {\n return 0;\n }\n\n return Math.ceil(this.length / this.pageSize);\n }\n\n /** Get current page */\n getCurrentPage(): number {\n if (!this.pageSize || this.length <= 0) {\n return 0;\n }\n\n return this.pageIndex + 1;\n }\n\n /**\n * Changes the page size so that the first item displayed on the page will still be\n * displayed using the new page size.\n *\n * For example, if the page size is 10 and on the second page (items indexed 10-19) then\n * switching so that the page size is 5 will set the third page as the current page so\n * that the 10th item will still be displayed.\n */\n _changePageSize(pageSize: number) {\n // Current page needs to be updated to reflect the new page size. Navigate to the page\n // containing the previous page's first item.\n const startIndex = this.pageIndex * this.pageSize;\n const previousPageIndex = this.pageIndex;\n\n this.pageIndex = Math.floor(startIndex / pageSize) || 0;\n this.pageSize = pageSize;\n this._emitPageEvent(previousPageIndex);\n }\n\n /** Checks whether the buttons for going forwards should be disabled. */\n _nextButtonsDisabled() {\n return this.disabled || !this.hasNextPage();\n }\n\n /** Checks whether the buttons for going backwards should be disabled. */\n _previousButtonsDisabled() {\n return this.disabled || !this.hasPreviousPage();\n }\n\n /** Emits an event notifying that a change of the paginator's properties has been triggered. */\n private _emitPageEvent(previousPageIndex: number) {\n this.page.emit({\n previousPageIndex,\n pageIndex: this.pageIndex,\n pageSize: this.pageSize,\n length: this.length,\n });\n }\n}\n", + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "length", @@ -11213,8 +11260,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -11267,6 +11312,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "_afterAbove", @@ -11359,8 +11406,6 @@ ], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] }, @@ -11398,6 +11443,8 @@ } ] }, + "inputsClass": [], + "outputsClass": [], "properties": [ { "name": "svgElement", @@ -11423,8 +11470,6 @@ "methods": [], "indexSignatures": [], "extends": [], - "inputsClass": [], - "outputsClass": [], "hostBindings": [], "hostListeners": [] } @@ -13904,12 +13949,12 @@ }, { "name": "OuiDialogClose", - "id": "directive-OuiDialogClose-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogClose-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "type": "directive", "description": "

directive for close the current dialog.

\n", "rawdescription": "\n\ndirective for close the current dialog.\n", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "selector": "[oui-dialog-close], [ouiDialogClose]", "providers": [], "exportAs": "ouiDialogClose", @@ -13923,7 +13968,7 @@ "deprecationMessage": "", "rawdescription": "\nScreenreader label for the button.", "description": "

Screenreader label for the button.

\n", - "line": 224, + "line": 225, "type": "string", "decorators": [] }, @@ -13933,7 +13978,7 @@ "deprecationMessage": "", "rawdescription": "\nDialog close input.", "description": "

Dialog close input.

\n", - "line": 228, + "line": 229, "type": "any", "decorators": [] }, @@ -13941,7 +13986,7 @@ "name": "ouiDialogClose", "deprecated": false, "deprecationMessage": "", - "line": 231, + "line": 232, "type": "any", "decorators": [] } @@ -13959,7 +14004,7 @@ "type": "OuiDialogRef", "optional": false, "description": "", - "line": 234, + "line": 235, "decorators": [ { "name": "Optional", @@ -13979,7 +14024,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 245, + "line": 246, "deprecated": false, "deprecationMessage": "" }, @@ -13996,7 +14041,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 240, + "line": 241, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nEnsures the option is selected when activated from the keyboard.", @@ -14026,7 +14071,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 265, + "line": 266, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -14047,7 +14092,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 251, + "line": 252, "deprecated": false, "deprecationMessage": "" } @@ -14082,7 +14127,7 @@ "deprecationMessage": "" } ], - "line": 231, + "line": 232, "jsdoctags": [ { "name": "dialogRef", @@ -14116,12 +14161,12 @@ }, { "name": "OuiDialogContent", - "id": "directive-OuiDialogContent-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogContent-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "type": "directive", "description": "

Content section of dialog.

\n", "rawdescription": "\n\nContent section of dialog.\n", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "selector": "[oui-dialog-content], [ouiDialogContent]", "providers": [], "exportAs": "ouiDialogContent", @@ -14141,7 +14186,7 @@ "type": "OuiDialogRef", "optional": false, "description": "", - "line": 287, + "line": 288, "decorators": [ { "name": "Optional", @@ -14161,7 +14206,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 307, + "line": 308, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -14174,7 +14219,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 292, + "line": 293, "deprecated": false, "deprecationMessage": "" } @@ -14208,7 +14253,7 @@ "deprecationMessage": "" } ], - "line": 285, + "line": 286, "jsdoctags": [ { "name": "dialogRef", @@ -14242,12 +14287,12 @@ }, { "name": "OuiDialogFooter", - "id": "directive-OuiDialogFooter-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogFooter-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "type": "directive", "description": "

Content section of dialog.

\n", "rawdescription": "\n\nContent section of dialog.\n", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "selector": "[oui-dialog-footer], [ouiDialogFooter]", "providers": [], "exportAs": "ouiDialogFooter", @@ -14259,7 +14304,7 @@ "defaultValue": "`oui-dialog-footer-${dialogElementUid++}`", "deprecated": false, "deprecationMessage": "", - "line": 328, + "line": 329, "type": "string", "decorators": [] } @@ -14278,17 +14323,17 @@ "deprecated": false, "deprecationMessage": "", "args": [], - "line": 328 + "line": 329 } }, { "name": "OuiDialogFooterActionLeft", - "id": "directive-OuiDialogFooterActionLeft-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogFooterActionLeft-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "type": "directive", "description": "

footer action left

\n", "rawdescription": "\n\nfooter action left\n", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "selector": "[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]", "providers": [], "exportAs": "ouiDialogFooterActionLeft", @@ -14309,17 +14354,17 @@ "deprecated": false, "deprecationMessage": "", "args": [], - "line": 343 + "line": 344 } }, { "name": "OuiDialogFooterActionRight", - "id": "directive-OuiDialogFooterActionRight-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogFooterActionRight-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "type": "directive", "description": "

footer action right

\n", "rawdescription": "\n\nfooter action right\n", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "selector": "[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]", "providers": [], "exportAs": "ouiDialogFooterActionRight", @@ -14340,17 +14385,17 @@ "deprecated": false, "deprecationMessage": "", "args": [], - "line": 358 + "line": 359 } }, { "name": "OuiDialogHeader", - "id": "directive-OuiDialogHeader-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogHeader-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "type": "directive", "description": "

Header section of ui.

\n", "rawdescription": "\n\nHeader section of ui.\n", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "selector": "[oui-dialog-header], [ouiDialogHeader]", "providers": [], "exportAs": "ouiDialogHeader", @@ -14376,12 +14421,12 @@ }, { "name": "OuiDialogHeaderAction", - "id": "directive-OuiDialogHeaderAction-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogHeaderAction-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "type": "directive", "description": "

Header action area of dialog.

\n", "rawdescription": "\n\nHeader action area of dialog.\n", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "selector": "[oui-dialog-header-action], [ouiDialogHeaderAction]", "providers": [], "exportAs": "ouiDialogHeaderAction", @@ -14407,12 +14452,12 @@ }, { "name": "OuiDialogHeaderImage", - "id": "directive-OuiDialogHeaderImage-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogHeaderImage-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "type": "directive", "description": "

Header Image of ui.

\n", "rawdescription": "\n\nHeader Image of ui.\n", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "selector": "[oui-dialog-header-image], [ouiDialogHeaderImage]", "providers": [], "exportAs": "ouiDialogHeaderImage", @@ -14438,12 +14483,12 @@ }, { "name": "OuiDialogHeaderSeparator", - "id": "directive-OuiDialogHeaderSeparator-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogHeaderSeparator-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "type": "directive", "description": "

header action separator close

\n", "rawdescription": "\n\nheader action separator close\n", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "selector": "[oui-dialog-header-separator], [ouiDialogHeaderSeparator]", "providers": [], "exportAs": "ouiDialogHeaderSeparator", @@ -14464,17 +14509,17 @@ "deprecated": false, "deprecationMessage": "", "args": [], - "line": 202 + "line": 203 } }, { "name": "OuiDialogHeaderTitle", - "id": "directive-OuiDialogHeaderTitle-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogHeaderTitle-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "type": "directive", "description": "

Header Title of ui.

\n", "rawdescription": "\n\nHeader Title of ui.\n", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "selector": "[oui-dialog-header-title], [ouiDialogHeaderTitle]", "providers": [], "exportAs": "ouiDialogHeaderTitle", @@ -16354,12 +16399,12 @@ }, { "name": "OuiMenuTrigger", - "id": "directive-OuiMenuTrigger-b701aed5b83b3d9da49e20f84c8385a6ceea3638c46cb0853810bb7e3f4aa5185f8c90274cd95bd5d89b75908f1e9b732e4227421e10bb732fdb4361ca6336d8", + "id": "directive-OuiMenuTrigger-d6423459edd7afbc81ce6835d201e32380b6ff3ebd4d42062e9fbc67b96bebeb49661374853a91272cd7f545a55c2ee4eaa1fcb80760713263bc2307ef852e7b", "file": "ui/src/components/menu/menu-trigger.ts", "type": "directive", "description": "

This directive is intended to be used in conjunction with an oui-menu tag. It is\nresponsible for toggling the display of the provided menu instance.

\n", "rawdescription": "\n\nThis directive is intended to be used in conjunction with an oui-menu tag. It is\nresponsible for toggling the display of the provided menu instance.\n", - "sourceCode": "import {\n FocusMonitor,\n FocusOrigin,\n isFakeMousedownFromScreenReader,\n} from '@angular/cdk/a11y';\nimport { RIGHT_ARROW, SPACE } from '@angular/cdk/keycodes';\nimport {\n FlexibleConnectedPositionStrategy,\n HorizontalConnectionPos,\n Overlay,\n OverlayConfig,\n OverlayRef,\n VerticalConnectionPos,\n ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n AfterContentInit,\n Directive,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n OnDestroy,\n Optional,\n Output,\n Self,\n ViewContainerRef,\n} from '@angular/core';\nimport { normalizePassiveListenerOptions } from '@angular/cdk/platform';\nimport {\n asapScheduler,\n merge,\n Observable,\n of as observableOf,\n Subscription,\n} from 'rxjs';\nimport { delay, filter } from 'rxjs/operators';\nimport { OuiMenu } from './menu-directive';\nimport { throwOuiMenuMissingError } from './menu-errors';\nimport { OuiMenuItem } from './menu-item';\nimport { OuiMenuPanel } from './menu-panel';\nimport { MenuPositionX, MenuPositionY } from './menu-positions';\n\n/** Injection token that determines the scroll handling while the menu is open. */\nexport const OUI_MENU_SCROLL_STRATEGY = new InjectionToken<\n () => ScrollStrategy\n>('oui-menu-scroll-strategy');\n\n/** @docs-private */\nexport function OUI_MENU_SCROLL_STRATEGY_FACTORY(\n overlay: Overlay\n): () => ScrollStrategy {\n return () => overlay.scrollStrategies.close();\n}\n\n/** @docs-private */\nexport const OUI_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: OUI_MENU_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_MENU_SCROLL_STRATEGY_FACTORY,\n};\n\n/** Default top padding of the menu panel. */\nexport const MENU_PANEL_TOP_PADDING = 11;\n\n/** Default left padding of the menu panel */\nexport const MENU_PANEL_LEFT_PADDING = 2;\n\n/** Options for binding a passive event listener. */\nconst passiveEventListenerOptions = normalizePassiveListenerOptions({\n passive: true,\n});\n\n// TODO(andrewseguin): Remove the kebab versions in favor of camelCased attribute selectors\n\n/**\n * This directive is intended to be used in conjunction with an oui-menu tag. It is\n * responsible for toggling the display of the provided menu instance.\n */\n@Directive({\n selector: `[oui-menu-trigger-for], [ouiMenuTriggerFor]`,\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n 'aria-haspopup': 'true',\n '[attr.aria-expanded]': 'menuOpen || null',\n '(mousedown)': '_handleMousedown($event)',\n '(keydown)': '_handleKeydown($event)',\n '(click)': '_handleClick($event)',\n },\n exportAs: 'ouiMenuTrigger',\n})\nexport class OuiMenuTrigger implements AfterContentInit, OnDestroy {\n private _portal: TemplatePortal;\n private _overlayRef: OverlayRef | null = null;\n private _menuOpen = false;\n private _closeSubscription = Subscription.EMPTY;\n private _hoverSubscription = Subscription.EMPTY;\n private _menuCloseSubscription = Subscription.EMPTY;\n private _scrollStrategy: () => ScrollStrategy;\n private _openViaFocus = false;\n\n // Tracking input type is necessary so it's possible to only auto-focus\n // the first item of the list when the menu is opened via the keyboard\n _openedBy: 'mouse' | 'touch' | null = null;\n\n /** References the menu instance that the trigger is associated with. */\n @Input('ouiMenuTriggerFor')\n get menu() {\n return this._menu;\n }\n set menu(menu: OuiMenuPanel) {\n if (menu === this._menu) {\n return;\n }\n this._menu = menu;\n this._menuCloseSubscription.unsubscribe();\n\n if (menu) {\n this._menuCloseSubscription = menu.close\n .asObservable()\n .subscribe((event) => {\n this._destroyMenu(event);\n // If a click closed the menu, we should close the entire chain of nested menus.\n if ((event === 'click' || event === 'tab') && this._parentMenu) {\n this._parentMenu.closed.emit(event);\n }\n });\n }\n }\n private _menu: OuiMenuPanel;\n\n /** Data to be passed along to any lazily-rendered content. */\n\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('ouiMenuTriggerData')\n menuData: any;\n\n /** Event emitted when the associated menu is opened. */\n @Output()\n readonly menuOpened: EventEmitter = new EventEmitter();\n\n /** Event emitted when the associated menu is closed. */\n @Output()\n readonly menuClosed: EventEmitter = new EventEmitter();\n\n /**\n * Handles touch start events on the trigger.\n * Needs to be an arrow function so we can easily use addEventListener and removeEventListener.\n */\n private _handleTouchStart = () => (this._openedBy = 'touch');\n\n constructor(\n private _overlay: Overlay,\n private _element: ElementRef,\n private _viewContainerRef: ViewContainerRef,\n @Inject(OUI_MENU_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _parentMenu: OuiMenu,\n @Optional()\n @Self()\n private _menuItemInstance: OuiMenuItem,\n // TODO(crisbeto): make the _focusMonitor required when doing breaking changes.\n // @breaking-change 8.0.0\n private _focusMonitor?: FocusMonitor\n ) {\n _element.nativeElement.addEventListener(\n 'touchstart',\n this._handleTouchStart,\n passiveEventListenerOptions\n );\n\n if (_menuItemInstance) {\n _menuItemInstance._triggersSubmenu = this.triggersSubmenu();\n }\n\n this._scrollStrategy = scrollStrategy;\n }\n\n ngAfterContentInit() {\n this._checkMenu();\n this._handleHover();\n }\n\n ngOnDestroy() {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._overlayRef = null;\n }\n\n this._element.nativeElement.removeEventListener(\n 'touchstart',\n this._handleTouchStart,\n passiveEventListenerOptions\n );\n\n this._cleanUpSubscriptions();\n }\n\n /** Whether the menu is open. */\n get menuOpen(): boolean {\n return this._menuOpen;\n }\n\n /** Whether the menu triggers a sub-menu or a top-level one. */\n triggersSubmenu(): boolean {\n return !!(this._menuItemInstance && this._parentMenu);\n }\n\n /** Toggles the menu between the open and closed states. */\n toggleMenu(): void {\n return this._menuOpen ? this.closeMenu() : this.openMenu();\n }\n\n /** Opens the menu. */\n openMenu(): void {\n if (this._menuOpen) {\n return;\n }\n\n this._checkMenu();\n\n const overlayRef = this._createOverlay();\n const overlayConfig = overlayRef.getConfig();\n\n this._setPosition(\n overlayConfig.positionStrategy as FlexibleConnectedPositionStrategy\n );\n overlayConfig.hasBackdrop =\n this.menu.hasBackdrop == null\n ? !this.triggersSubmenu()\n : this.menu.hasBackdrop;\n overlayRef.attach(this._getPortal());\n\n if (this.menu.lazyContent) {\n this.menu.lazyContent.attach(this.menuData);\n }\n\n this._closeSubscription = this._menuClosingActions().subscribe(() => {\n this.closeMenu();\n });\n this._initMenu();\n }\n\n /** Closes the menu. */\n closeMenu(event?: 'click' | 'keydown' | 'tab'): void {\n this.menu.close.emit(event);\n }\n\n /**\n * Focuses the menu trigger.\n *\n * @param origin Source of the menu trigger's focus.\n */\n focus(origin: FocusOrigin = 'program') {\n if (this._focusMonitor) {\n this._focusMonitor.focusVia(this._element.nativeElement, origin);\n } else {\n this._element.nativeElement.focus();\n }\n }\n\n /** Closes the menu and does the necessary cleanup. */\n private _destroyMenu(event) {\n // (TODO)\n if (!this._overlayRef || !this.menuOpen) {\n return;\n }\n\n const menu = this.menu;\n\n this._closeSubscription.unsubscribe();\n this._overlayRef.detach();\n this._resetMenu(event);\n\n if (!(menu instanceof OuiMenu) && menu.lazyContent) {\n menu.lazyContent.detach();\n }\n }\n\n /**\n * This method sets the menu state to open and focuses the first item if\n * the menu was opened via the keyboard.\n */\n private _initMenu(): void {\n this.menu.parentMenu = this.triggersSubmenu()\n ? this._parentMenu\n : undefined;\n this._setIsMenuOpen(true);\n this.menu.focusFirstItem(this._openedBy || 'program');\n }\n\n /**\n * This method resets the menu when it's closed, most importantly restoring\n * focus to the menu trigger if the menu was opened via the keyboard.\n */\n private _resetMenu(event): void {\n this._setIsMenuOpen(false);\n\n // We should reset focus if the user is navigating using a keyboard or\n // if we have a top-level trigger which might cause focus to be lost\n // when clicking on the backdrop.\n // Focus back to menu only when clicking outside of menu on window or ESC key pressed.\n if ((!event && !this.triggersSubmenu()) || event === 'keydown') {\n if (!this._openedBy) {\n // Note that the focus style will show up both for `program` and\n // `keyboard` so we don't have to specify which one it is.\n this.focus();\n } else if (!this.triggersSubmenu()) {\n this.focus(this._openedBy);\n }\n }\n this._openedBy = null;\n }\n\n // set state rather than toggle to support triggers sharing a menu\n private _setIsMenuOpen(isOpen: boolean): void {\n this._menuOpen = isOpen;\n this._menuOpen ? this.menuOpened.emit() : this.menuClosed.emit();\n\n if (this.triggersSubmenu()) {\n this._menuItemInstance._highlighted = isOpen;\n }\n }\n\n /**\n * This method checks that a valid instance of OuiMenu has been passed into\n * ouiMenuTriggerFor. If not, an exception is thrown.\n */\n private _checkMenu() {\n if (!this.menu) {\n throwOuiMenuMissingError();\n }\n }\n\n /**\n * This method creates the overlay from the provided menu's template and saves its\n * OverlayRef so that it can be attached to the DOM when openMenu is called.\n */\n private _createOverlay(): OverlayRef {\n if (!this._overlayRef) {\n const config = this._getOverlayConfig();\n this._subscribeToPositions(\n config.positionStrategy as FlexibleConnectedPositionStrategy\n );\n this._overlayRef = this._overlay.create(config);\n\n // Consume the `keydownEvents` in order to prevent them from going to another overlay.\n // Ideally we'd also have our keyboard event logic in here, however doing so will\n // break anybody that may have implemented the `OuiMenuPanel` themselves.\n this._overlayRef.keydownEvents().subscribe();\n }\n\n return this._overlayRef;\n }\n\n /**\n * This method builds the configuration object needed to create the overlay, the OverlayState.\n *\n * @returns OverlayConfig\n */\n private _getOverlayConfig(): OverlayConfig {\n return new OverlayConfig({\n positionStrategy: this._overlay\n .position()\n .flexibleConnectedTo(this._element)\n .withLockedPosition()\n .withTransformOriginOn('.oui-menu-panel'),\n backdropClass:\n this.menu.backdropClass || 'cdk-overlay-transparent-backdrop',\n scrollStrategy: this._scrollStrategy(),\n direction: 'ltr',\n });\n }\n\n /**\n * Listens to changes in the position of the overlay and sets the correct classes\n * on the menu based on the new position. This ensures the animation origin is always\n * correct, even if a fallback position is used for the overlay.\n */\n private _subscribeToPositions(\n position: FlexibleConnectedPositionStrategy\n ): void {\n if (this.menu.setPositionClasses) {\n position.positionChanges.subscribe((change) => {\n const posX: MenuPositionX =\n change.connectionPair.overlayX === 'start' ? 'after' : 'before';\n const posY: MenuPositionY =\n change.connectionPair.overlayY === 'top' ? 'below' : 'above';\n\n this.menu.setPositionClasses!(posX, posY);\n });\n }\n }\n\n /**\n * Sets the appropriate positions on a position strategy\n * so the overlay connects with the trigger correctly.\n *\n * @param positionStrategy Strategy whose position to update.\n */\n private _setPosition(positionStrategy: FlexibleConnectedPositionStrategy) {\n let [originX, originFallbackX]: HorizontalConnectionPos[] =\n this.menu.xPosition === 'before' ? ['end', 'start'] : ['start', 'end'];\n\n const [overlayY, overlayFallbackY]: VerticalConnectionPos[] =\n this.menu.yPosition === 'above' ? ['bottom', 'top'] : ['top', 'bottom'];\n\n let [originY, originFallbackY] = [overlayY, overlayFallbackY];\n let [overlayX, overlayFallbackX] = [originX, originFallbackX];\n let offsetY = 0;\n let offsetX = 0;\n\n if (this.triggersSubmenu()) {\n // When the menu is a sub-menu, it should always align itself\n // to the edges of the trigger, instead of overlapping it.\n overlayFallbackX = originX =\n this.menu.xPosition === 'before' ? 'start' : 'end';\n originFallbackX = overlayX = originX === 'end' ? 'start' : 'end';\n offsetY =\n overlayY === 'bottom'\n ? MENU_PANEL_TOP_PADDING\n : -MENU_PANEL_TOP_PADDING;\n\n offsetX =\n overlayX === 'start'\n ? MENU_PANEL_LEFT_PADDING\n : -MENU_PANEL_LEFT_PADDING;\n } else if (!this.menu.overlapTrigger) {\n originY = overlayY === 'top' ? 'bottom' : 'top';\n originFallbackY = overlayFallbackY === 'top' ? 'bottom' : 'top';\n }\n\n positionStrategy.withPositions([\n { originX, originY, overlayX, overlayY, offsetY, offsetX },\n {\n originX: originFallbackX,\n originY,\n overlayX: overlayFallbackX,\n overlayY,\n offsetY,\n offsetX,\n },\n {\n originX,\n originY: originFallbackY,\n overlayX,\n overlayY: overlayFallbackY,\n offsetY: -offsetY,\n offsetX,\n },\n {\n originX: originFallbackX,\n originY: originFallbackY,\n overlayX: overlayFallbackX,\n overlayY: overlayFallbackY,\n offsetY: -offsetY,\n offsetX: -offsetX,\n },\n ]);\n }\n\n /** Cleans up the active subscriptions. */\n private _cleanUpSubscriptions(): void {\n this._closeSubscription.unsubscribe();\n this._hoverSubscription.unsubscribe();\n }\n\n /** Returns a stream that emits whenever an action that should close the menu occurs. */\n private _menuClosingActions() {\n const backdrop = this._overlayRef!.backdropClick();\n const detachments = this._overlayRef!.detachments();\n const parentClose = this._parentMenu\n ? this._parentMenu.closed\n : observableOf();\n const hover = this._parentMenu\n ? this._parentMenu._hovered().pipe(\n filter((active) => active !== this._menuItemInstance),\n filter(() => this._menuOpen)\n )\n : observableOf();\n\n return merge(backdrop, parentClose as Observable, hover, detachments);\n }\n\n /** Handles mouse presses on the trigger. */\n _handleMousedown(event: MouseEvent): void {\n if (!isFakeMousedownFromScreenReader(event)) {\n // Since right or middle button clicks won't trigger the `click` event,\n // we shouldn't consider the menu as opened by mouse in those cases.\n this._openedBy = event.button === 0 ? 'mouse' : null;\n\n // Since clicking on the trigger won't close the menu if it opens a sub-menu,\n // we should prevent focus from moving onto it via click to avoid the\n // highlight from lingering on the menu item.\n if (this.triggersSubmenu()) {\n event.preventDefault();\n }\n }\n }\n\n /** Handles key presses on the trigger. */\n _handleKeydown(event: KeyboardEvent): void {\n const keyCode = event.keyCode;\n if (this.triggersSubmenu() && keyCode === RIGHT_ARROW) {\n this.openMenu();\n } else if (keyCode === SPACE) {\n this.openMenu();\n }\n }\n\n /** Handles click events on the trigger. */\n _handleClick(event: MouseEvent): void {\n if (this.triggersSubmenu()) {\n // Stop event propagation to avoid closing the parent menu.\n event.stopPropagation();\n this.openMenu();\n } else {\n this.toggleMenu();\n }\n }\n\n _handleFocus(): void {\n if (!this._openViaFocus) {\n this.toggleMenu();\n }\n this._openViaFocus = !this._openViaFocus;\n }\n\n /** Handles the cases where the user hovers over the trigger. */\n private _handleHover() {\n // Subscribe to changes in the hovered item in order to toggle the panel.\n if (!this.triggersSubmenu()) {\n return;\n }\n\n this._hoverSubscription = this._parentMenu\n ._hovered()\n // Since we might have multiple competing triggers for the same menu (e.g. a sub-menu\n // with different data and triggers), we have to delay it by a tick to ensure that\n // it won't be closed immediately after it is opened.\n .pipe(\n filter(\n (active) => active === this._menuItemInstance && !active.disabled\n ),\n delay(0, asapScheduler)\n )\n .subscribe(() => {\n this._openedBy = 'mouse';\n\n // If the same menu is used between multiple triggers, it might still be animating\n // while the new trigger tries to re-open it. Wait for the animation to finish\n // before doing so. Also interrupt if the user moves to another item.\n // (TODO)\n this.openMenu();\n });\n }\n\n /** Gets the portal that should be attached to the overlay. */\n private _getPortal(): TemplatePortal {\n // Note that we can avoid this check by keeping the portal on the menu panel.\n // While it would be cleaner, we'd have to introduce another required method on\n // `OuiMenuPanel`, making it harder to consume.\n if (!this._portal || this._portal.templateRef !== this.menu.templateRef) {\n this._portal = new TemplatePortal(\n this.menu.templateRef,\n this._viewContainerRef\n );\n }\n\n return this._portal;\n }\n}\n", + "sourceCode": "import {\r\n FocusMonitor,\r\n FocusOrigin,\r\n isFakeMousedownFromScreenReader,\r\n} from '@angular/cdk/a11y';\r\nimport { RIGHT_ARROW, SPACE } from '@angular/cdk/keycodes';\r\nimport {\r\n FlexibleConnectedPositionStrategy,\r\n HorizontalConnectionPos,\r\n Overlay,\r\n OverlayConfig,\r\n OverlayRef,\r\n VerticalConnectionPos,\r\n ScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport {\r\n AfterContentInit,\r\n Directive,\r\n ElementRef,\r\n EventEmitter,\r\n Inject,\r\n InjectionToken,\r\n Input,\r\n OnDestroy,\r\n Optional,\r\n Output,\r\n Self,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { normalizePassiveListenerOptions } from '@angular/cdk/platform';\r\nimport {\r\n asapScheduler,\r\n merge,\r\n Observable,\r\n of as observableOf,\r\n Subscription,\r\n} from 'rxjs';\r\nimport { delay, filter } from 'rxjs/operators';\r\nimport { OuiMenu } from './menu-directive';\r\nimport { throwOuiMenuMissingError } from './menu-errors';\r\nimport { OuiMenuItem } from './menu-item';\r\nimport { OuiMenuPanel } from './menu-panel';\r\nimport { MenuPositionX, MenuPositionY } from './menu-positions';\r\n\r\n/** Injection token that determines the scroll handling while the menu is open. */\r\nexport const OUI_MENU_SCROLL_STRATEGY = new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-menu-scroll-strategy');\r\n\r\n/** @docs-private */\r\nexport function OUI_MENU_SCROLL_STRATEGY_FACTORY(\r\n overlay: Overlay\r\n): () => ScrollStrategy {\r\n return () => overlay.scrollStrategies.close();\r\n}\r\n\r\n/** @docs-private */\r\nexport const OUI_MENU_SCROLL_STRATEGY_FACTORY_PROVIDER = {\r\n provide: OUI_MENU_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_MENU_SCROLL_STRATEGY_FACTORY,\r\n};\r\n\r\n/** Default top padding of the menu panel. */\r\nexport const MENU_PANEL_TOP_PADDING = 11;\r\n\r\n/** Default left padding of the menu panel */\r\nexport const MENU_PANEL_LEFT_PADDING = 2;\r\n\r\n/** Options for binding a passive event listener. */\r\nconst passiveEventListenerOptions = normalizePassiveListenerOptions({\r\n passive: true,\r\n});\r\n\r\n// TODO(andrewseguin): Remove the kebab versions in favor of camelCased attribute selectors\r\n\r\n/**\r\n * This directive is intended to be used in conjunction with an oui-menu tag. It is\r\n * responsible for toggling the display of the provided menu instance.\r\n */\r\n@Directive({\r\n selector: `[oui-menu-trigger-for], [ouiMenuTriggerFor]`,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n 'aria-haspopup': 'true',\r\n '[attr.aria-expanded]': 'menuOpen || null',\r\n '(mousedown)': '_handleMousedown($event)',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(click)': '_handleClick($event)',\r\n },\r\n exportAs: 'ouiMenuTrigger',\r\n})\r\nexport class OuiMenuTrigger implements AfterContentInit, OnDestroy {\r\n private _portal: TemplatePortal;\r\n private _overlayRef: OverlayRef | null = null;\r\n private _menuOpen = false;\r\n private _closeSubscription = Subscription.EMPTY;\r\n private _hoverSubscription = Subscription.EMPTY;\r\n private _menuCloseSubscription = Subscription.EMPTY;\r\n private _scrollStrategy: () => ScrollStrategy;\r\n private _openViaFocus = false;\r\n\r\n // Tracking input type is necessary so it's possible to only auto-focus\r\n // the first item of the list when the menu is opened via the keyboard\r\n _openedBy: 'mouse' | 'touch' | null = null;\r\n\r\n /** References the menu instance that the trigger is associated with. */\r\n @Input('ouiMenuTriggerFor')\r\n get menu() {\r\n return this._menu;\r\n }\r\n set menu(menu: OuiMenuPanel) {\r\n if (menu === this._menu) {\r\n return;\r\n }\r\n this._menu = menu;\r\n this._menuCloseSubscription.unsubscribe();\r\n\r\n if (menu) {\r\n this._menuCloseSubscription = menu.close\r\n .asObservable()\r\n .subscribe((event) => {\r\n this._destroyMenu(event);\r\n // If a click closed the menu, we should close the entire chain of nested menus.\r\n if ((event === 'click' || event === 'tab') && this._parentMenu) {\r\n this._parentMenu.closed.emit(event);\r\n }\r\n });\r\n }\r\n }\r\n private _menu: OuiMenuPanel;\r\n\r\n /** Data to be passed along to any lazily-rendered content. */\r\n\r\n // eslint-disable-next-line @angular-eslint/no-input-rename\r\n @Input('ouiMenuTriggerData')\r\n menuData: any;\r\n\r\n /** Event emitted when the associated menu is opened. */\r\n @Output()\r\n readonly menuOpened: EventEmitter = new EventEmitter();\r\n\r\n /** Event emitted when the associated menu is closed. */\r\n @Output()\r\n readonly menuClosed: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Handles touch start events on the trigger.\r\n * Needs to be an arrow function so we can easily use addEventListener and removeEventListener.\r\n */\r\n private _handleTouchStart = () => (this._openedBy = 'touch');\r\n\r\n constructor(\r\n private _overlay: Overlay,\r\n private _element: ElementRef,\r\n private _viewContainerRef: ViewContainerRef,\r\n @Inject(OUI_MENU_SCROLL_STRATEGY) scrollStrategy: any,\r\n @Optional() private _parentMenu: OuiMenu,\r\n @Optional()\r\n @Self()\r\n private _menuItemInstance: OuiMenuItem,\r\n // TODO(crisbeto): make the _focusMonitor required when doing breaking changes.\r\n // @breaking-change 8.0.0\r\n private _focusMonitor?: FocusMonitor\r\n ) {\r\n _element.nativeElement.addEventListener(\r\n 'touchstart',\r\n this._handleTouchStart,\r\n passiveEventListenerOptions\r\n );\r\n\r\n if (_menuItemInstance) {\r\n _menuItemInstance._triggersSubmenu = this.triggersSubmenu();\r\n }\r\n\r\n this._scrollStrategy = scrollStrategy;\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._checkMenu();\r\n this._handleHover();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n\r\n this._element.nativeElement.removeEventListener(\r\n 'touchstart',\r\n this._handleTouchStart,\r\n passiveEventListenerOptions\r\n );\r\n\r\n this._cleanUpSubscriptions();\r\n }\r\n\r\n /** Whether the menu is open. */\r\n get menuOpen(): boolean {\r\n return this._menuOpen;\r\n }\r\n\r\n /** Whether the menu triggers a sub-menu or a top-level one. */\r\n triggersSubmenu(): boolean {\r\n return !!(this._menuItemInstance && this._parentMenu);\r\n }\r\n\r\n /** Toggles the menu between the open and closed states. */\r\n toggleMenu(): void {\r\n return this._menuOpen ? this.closeMenu() : this.openMenu();\r\n }\r\n\r\n /** Opens the menu. */\r\n openMenu(): void {\r\n if (this._menuOpen) {\r\n return;\r\n }\r\n\r\n this._checkMenu();\r\n\r\n const overlayRef = this._createOverlay();\r\n const overlayConfig = overlayRef.getConfig();\r\n\r\n this._setPosition(\r\n overlayConfig.positionStrategy as FlexibleConnectedPositionStrategy\r\n );\r\n overlayConfig.hasBackdrop =\r\n this.menu.hasBackdrop == null\r\n ? !this.triggersSubmenu()\r\n : this.menu.hasBackdrop;\r\n overlayRef.attach(this._getPortal());\r\n\r\n if (this.menu.lazyContent) {\r\n this.menu.lazyContent.attach(this.menuData);\r\n }\r\n\r\n this._closeSubscription = this._menuClosingActions().subscribe(() => {\r\n this.closeMenu();\r\n });\r\n this._initMenu();\r\n }\r\n\r\n /** Closes the menu. */\r\n closeMenu(event?: 'click' | 'keydown' | 'tab'): void {\r\n this.menu.close.emit(event);\r\n }\r\n\r\n /**\r\n * Focuses the menu trigger.\r\n *\r\n * @param origin Source of the menu trigger's focus.\r\n */\r\n focus(origin: FocusOrigin = 'program') {\r\n if (this._focusMonitor) {\r\n this._focusMonitor.focusVia(this._element.nativeElement, origin);\r\n } else {\r\n this._element.nativeElement.focus();\r\n }\r\n }\r\n\r\n /** Closes the menu and does the necessary cleanup. */\r\n private _destroyMenu(event) {\r\n // (TODO)\r\n if (!this._overlayRef || !this.menuOpen) {\r\n return;\r\n }\r\n\r\n const menu = this.menu;\r\n\r\n this._closeSubscription.unsubscribe();\r\n this._overlayRef.detach();\r\n this._resetMenu(event);\r\n\r\n if (!(menu instanceof OuiMenu) && menu.lazyContent) {\r\n menu.lazyContent.detach();\r\n }\r\n }\r\n\r\n /**\r\n * This method sets the menu state to open and focuses the first item if\r\n * the menu was opened via the keyboard.\r\n */\r\n private _initMenu(): void {\r\n this.menu.parentMenu = this.triggersSubmenu()\r\n ? this._parentMenu\r\n : undefined;\r\n this._setIsMenuOpen(true);\r\n this.menu.focusFirstItem(this._openedBy || 'program');\r\n }\r\n\r\n /**\r\n * This method resets the menu when it's closed, most importantly restoring\r\n * focus to the menu trigger if the menu was opened via the keyboard.\r\n */\r\n private _resetMenu(event): void {\r\n this._setIsMenuOpen(false);\r\n\r\n // We should reset focus if the user is navigating using a keyboard or\r\n // if we have a top-level trigger which might cause focus to be lost\r\n // when clicking on the backdrop.\r\n // Focus back to menu only when clicking outside of menu on window or ESC key pressed.\r\n if ((!event && !this.triggersSubmenu()) || event === 'keydown') {\r\n if (!this._openedBy) {\r\n // Note that the focus style will show up both for `program` and\r\n // `keyboard` so we don't have to specify which one it is.\r\n this.focus();\r\n } else if (!this.triggersSubmenu()) {\r\n this.focus(this._openedBy);\r\n }\r\n }\r\n this._openedBy = null;\r\n }\r\n\r\n // set state rather than toggle to support triggers sharing a menu\r\n private _setIsMenuOpen(isOpen: boolean): void {\r\n this._menuOpen = isOpen;\r\n if (this._menuOpen) {\r\n this.menuOpened.emit();\r\n } else {\r\n this.menuClosed.emit();\r\n }\r\n\r\n if (this.triggersSubmenu()) {\r\n this._menuItemInstance._highlighted = isOpen;\r\n }\r\n }\r\n\r\n /**\r\n * This method checks that a valid instance of OuiMenu has been passed into\r\n * ouiMenuTriggerFor. If not, an exception is thrown.\r\n */\r\n private _checkMenu() {\r\n if (!this.menu) {\r\n throwOuiMenuMissingError();\r\n }\r\n }\r\n\r\n /**\r\n * This method creates the overlay from the provided menu's template and saves its\r\n * OverlayRef so that it can be attached to the DOM when openMenu is called.\r\n */\r\n private _createOverlay(): OverlayRef {\r\n if (!this._overlayRef) {\r\n const config = this._getOverlayConfig();\r\n this._subscribeToPositions(\r\n config.positionStrategy as FlexibleConnectedPositionStrategy\r\n );\r\n this._overlayRef = this._overlay.create(config);\r\n\r\n // Consume the `keydownEvents` in order to prevent them from going to another overlay.\r\n // Ideally we'd also have our keyboard event logic in here, however doing so will\r\n // break anybody that may have implemented the `OuiMenuPanel` themselves.\r\n this._overlayRef.keydownEvents().subscribe();\r\n }\r\n\r\n return this._overlayRef;\r\n }\r\n\r\n /**\r\n * This method builds the configuration object needed to create the overlay, the OverlayState.\r\n *\r\n * @returns OverlayConfig\r\n */\r\n private _getOverlayConfig(): OverlayConfig {\r\n return new OverlayConfig({\r\n positionStrategy: this._overlay\r\n .position()\r\n .flexibleConnectedTo(this._element)\r\n .withLockedPosition()\r\n .withTransformOriginOn('.oui-menu-panel'),\r\n backdropClass:\r\n this.menu.backdropClass || 'cdk-overlay-transparent-backdrop',\r\n scrollStrategy: this._scrollStrategy(),\r\n direction: 'ltr',\r\n });\r\n }\r\n\r\n /**\r\n * Listens to changes in the position of the overlay and sets the correct classes\r\n * on the menu based on the new position. This ensures the animation origin is always\r\n * correct, even if a fallback position is used for the overlay.\r\n */\r\n private _subscribeToPositions(\r\n position: FlexibleConnectedPositionStrategy\r\n ): void {\r\n if (this.menu.setPositionClasses) {\r\n position.positionChanges.subscribe((change) => {\r\n const posX: MenuPositionX =\r\n change.connectionPair.overlayX === 'start' ? 'after' : 'before';\r\n const posY: MenuPositionY =\r\n change.connectionPair.overlayY === 'top' ? 'below' : 'above';\r\n\r\n this.menu.setPositionClasses!(posX, posY);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Sets the appropriate positions on a position strategy\r\n * so the overlay connects with the trigger correctly.\r\n *\r\n * @param positionStrategy Strategy whose position to update.\r\n */\r\n private _setPosition(positionStrategy: FlexibleConnectedPositionStrategy) {\r\n let [originX, originFallbackX]: HorizontalConnectionPos[] =\r\n this.menu.xPosition === 'before' ? ['end', 'start'] : ['start', 'end'];\r\n\r\n const [overlayY, overlayFallbackY]: VerticalConnectionPos[] =\r\n this.menu.yPosition === 'above' ? ['bottom', 'top'] : ['top', 'bottom'];\r\n\r\n let [originY, originFallbackY] = [overlayY, overlayFallbackY];\r\n let [overlayX, overlayFallbackX] = [originX, originFallbackX];\r\n let offsetY = 0;\r\n let offsetX = 0;\r\n\r\n if (this.triggersSubmenu()) {\r\n // When the menu is a sub-menu, it should always align itself\r\n // to the edges of the trigger, instead of overlapping it.\r\n overlayFallbackX = originX =\r\n this.menu.xPosition === 'before' ? 'start' : 'end';\r\n originFallbackX = overlayX = originX === 'end' ? 'start' : 'end';\r\n offsetY =\r\n overlayY === 'bottom'\r\n ? MENU_PANEL_TOP_PADDING\r\n : -MENU_PANEL_TOP_PADDING;\r\n\r\n offsetX =\r\n overlayX === 'start'\r\n ? MENU_PANEL_LEFT_PADDING\r\n : -MENU_PANEL_LEFT_PADDING;\r\n } else if (!this.menu.overlapTrigger) {\r\n originY = overlayY === 'top' ? 'bottom' : 'top';\r\n originFallbackY = overlayFallbackY === 'top' ? 'bottom' : 'top';\r\n }\r\n\r\n positionStrategy.withPositions([\r\n { originX, originY, overlayX, overlayY, offsetY, offsetX },\r\n {\r\n originX: originFallbackX,\r\n originY,\r\n overlayX: overlayFallbackX,\r\n overlayY,\r\n offsetY,\r\n offsetX,\r\n },\r\n {\r\n originX,\r\n originY: originFallbackY,\r\n overlayX,\r\n overlayY: overlayFallbackY,\r\n offsetY: -offsetY,\r\n offsetX,\r\n },\r\n {\r\n originX: originFallbackX,\r\n originY: originFallbackY,\r\n overlayX: overlayFallbackX,\r\n overlayY: overlayFallbackY,\r\n offsetY: -offsetY,\r\n offsetX: -offsetX,\r\n },\r\n ]);\r\n }\r\n\r\n /** Cleans up the active subscriptions. */\r\n private _cleanUpSubscriptions(): void {\r\n this._closeSubscription.unsubscribe();\r\n this._hoverSubscription.unsubscribe();\r\n }\r\n\r\n /** Returns a stream that emits whenever an action that should close the menu occurs. */\r\n private _menuClosingActions() {\r\n const backdrop = this._overlayRef!.backdropClick();\r\n const detachments = this._overlayRef!.detachments();\r\n const parentClose = this._parentMenu\r\n ? this._parentMenu.closed\r\n : observableOf();\r\n const hover = this._parentMenu\r\n ? this._parentMenu._hovered().pipe(\r\n filter((active) => active !== this._menuItemInstance),\r\n filter(() => this._menuOpen)\r\n )\r\n : observableOf();\r\n\r\n return merge(backdrop, parentClose as Observable, hover, detachments);\r\n }\r\n\r\n /** Handles mouse presses on the trigger. */\r\n _handleMousedown(event: MouseEvent): void {\r\n if (!isFakeMousedownFromScreenReader(event)) {\r\n // Since right or middle button clicks won't trigger the `click` event,\r\n // we shouldn't consider the menu as opened by mouse in those cases.\r\n this._openedBy = event.button === 0 ? 'mouse' : null;\r\n\r\n // Since clicking on the trigger won't close the menu if it opens a sub-menu,\r\n // we should prevent focus from moving onto it via click to avoid the\r\n // highlight from lingering on the menu item.\r\n if (this.triggersSubmenu()) {\r\n event.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n /** Handles key presses on the trigger. */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n const keyCode = event.keyCode;\r\n if (this.triggersSubmenu() && keyCode === RIGHT_ARROW) {\r\n this.openMenu();\r\n } else if (keyCode === SPACE) {\r\n this.openMenu();\r\n }\r\n }\r\n\r\n /** Handles click events on the trigger. */\r\n _handleClick(event: MouseEvent): void {\r\n if (this.triggersSubmenu()) {\r\n // Stop event propagation to avoid closing the parent menu.\r\n event.stopPropagation();\r\n this.openMenu();\r\n } else {\r\n this.toggleMenu();\r\n }\r\n }\r\n\r\n _handleFocus(): void {\r\n if (!this._openViaFocus) {\r\n this.toggleMenu();\r\n }\r\n this._openViaFocus = !this._openViaFocus;\r\n }\r\n\r\n /** Handles the cases where the user hovers over the trigger. */\r\n private _handleHover() {\r\n // Subscribe to changes in the hovered item in order to toggle the panel.\r\n if (!this.triggersSubmenu()) {\r\n return;\r\n }\r\n\r\n this._hoverSubscription = this._parentMenu\r\n ._hovered()\r\n // Since we might have multiple competing triggers for the same menu (e.g. a sub-menu\r\n // with different data and triggers), we have to delay it by a tick to ensure that\r\n // it won't be closed immediately after it is opened.\r\n .pipe(\r\n filter(\r\n (active) => active === this._menuItemInstance && !active.disabled\r\n ),\r\n delay(0, asapScheduler)\r\n )\r\n .subscribe(() => {\r\n this._openedBy = 'mouse';\r\n\r\n // If the same menu is used between multiple triggers, it might still be animating\r\n // while the new trigger tries to re-open it. Wait for the animation to finish\r\n // before doing so. Also interrupt if the user moves to another item.\r\n // (TODO)\r\n this.openMenu();\r\n });\r\n }\r\n\r\n /** Gets the portal that should be attached to the overlay. */\r\n private _getPortal(): TemplatePortal {\r\n // Note that we can avoid this check by keeping the portal on the menu panel.\r\n // While it would be cleaner, we'd have to introduce another required method on\r\n // `OuiMenuPanel`, making it harder to consume.\r\n if (!this._portal || this._portal.templateRef !== this.menu.templateRef) {\r\n this._portal = new TemplatePortal(\r\n this.menu.templateRef,\r\n this._viewContainerRef\r\n );\r\n }\r\n\r\n return this._portal;\r\n }\r\n}\r\n", "selector": "[oui-menu-trigger-for], [ouiMenuTriggerFor]", "providers": [], "exportAs": "ouiMenuTrigger", @@ -16560,7 +16605,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 330, + "line": 334, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nThis method checks that a valid instance of OuiMenu has been passed into\nouiMenuTriggerFor. If not, an exception is thrown.\n", @@ -16575,7 +16620,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 464, + "line": 468, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nCleans up the active subscriptions.", @@ -16590,7 +16635,7 @@ "optional": false, "returnType": "OverlayRef", "typeParameters": [], - "line": 340, + "line": 344, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nThis method creates the overlay from the provided menu's template and saves its\nOverlayRef so that it can be attached to the DOM when openMenu is called.\n", @@ -16638,7 +16683,7 @@ "optional": false, "returnType": "OverlayConfig", "typeParameters": [], - "line": 362, + "line": 366, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nThis method builds the configuration object needed to create the overlay, the OverlayState.\n\n", @@ -16649,8 +16694,8 @@ "jsdoctags": [ { "tagName": { - "pos": 10499, - "end": 10506, + "pos": 10897, + "end": 10904, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -16667,7 +16712,7 @@ "optional": false, "returnType": "TemplatePortal", "typeParameters": [], - "line": 560, + "line": 564, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nGets the portal that should be attached to the overlay.", @@ -16689,7 +16734,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 513, + "line": 517, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHandles click events on the trigger.", @@ -16712,7 +16757,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 523, + "line": 527, "deprecated": false, "deprecationMessage": "" }, @@ -16722,7 +16767,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 531, + "line": 535, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHandles the cases where the user hovers over the trigger.", @@ -16744,7 +16789,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 503, + "line": 507, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHandles key presses on the trigger.", @@ -16774,7 +16819,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 487, + "line": 491, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHandles mouse presses on the trigger.", @@ -16812,7 +16857,7 @@ "optional": false, "returnType": "any", "typeParameters": [], - "line": 470, + "line": 474, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReturns a stream that emits whenever an action that should close the menu occurs.", @@ -16898,7 +16943,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 402, + "line": 406, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nSets the appropriate positions on a position strategy\nso the overlay connects with the trigger correctly.\n\n", @@ -16909,8 +16954,8 @@ "jsdoctags": [ { "name": { - "pos": 11833, - "end": 11849, + "pos": 12271, + "end": 12287, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -16921,8 +16966,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 11827, - "end": 11832, + "pos": 12265, + "end": 12270, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -16946,7 +16991,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 381, + "line": 385, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nListens to changes in the position of the overlay and sets the correct classes\non the menu based on the new position. This ensures the animation origin is always\ncorrect, even if a fallback position is used for the overlay.\n", @@ -17020,8 +17065,8 @@ "jsdoctags": [ { "name": { - "pos": 7106, - "end": 7112, + "pos": 7358, + "end": 7364, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -17033,8 +17078,8 @@ "deprecationMessage": "", "defaultValue": "'program'", "tagName": { - "pos": 7100, - "end": 7105, + "pos": 7352, + "end": 7357, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -17279,12 +17324,12 @@ }, { "name": "OuiPaginatedTabHeader", - "id": "directive-OuiPaginatedTabHeader-215a951b97ba6dbc96bfb7df7a5fe507c4d67e32ac9ddb70f0ff477d7438f05881d5b603a1a3e7a9c78d1a658a254ca8fc9aa0f1282d867ad923d534f716177f", + "id": "directive-OuiPaginatedTabHeader-243c2e04b569d5d305f92edec5d594922284a23fceec2d0d450e045571c53603ac34bdd32451c1fc5544bbbbfe6e2a0264043f07f4b1a67543e2ae7c2f067c02", "file": "ui/src/components/tabs/paginated-tab-header.ts", "type": "directive", "description": "

Base class for a tab header that supported pagination.

\n", "rawdescription": "\n\nBase class for a tab header that supported pagination.\n", - "sourceCode": "import {\r\n ChangeDetectorRef,\r\n ElementRef,\r\n NgZone,\r\n Optional,\r\n QueryList,\r\n EventEmitter,\r\n AfterContentChecked,\r\n AfterContentInit,\r\n AfterViewInit,\r\n OnDestroy,\r\n Directive,\r\n Inject,\r\n Input,\r\n} from '@angular/core';\r\nimport { Direction, Directionality } from '@angular/cdk/bidi';\r\nimport {\r\n BooleanInput,\r\n coerceBooleanProperty,\r\n coerceNumberProperty,\r\n NumberInput,\r\n} from '@angular/cdk/coercion';\r\nimport { ViewportRuler } from '@angular/cdk/scrolling';\r\nimport { FocusKeyManager, FocusableOption } from '@angular/cdk/a11y';\r\nimport { ENTER, SPACE, hasModifierKey } from '@angular/cdk/keycodes';\r\nimport {\r\n merge,\r\n of as observableOf,\r\n Subject,\r\n EMPTY,\r\n Observer,\r\n Observable,\r\n timer,\r\n fromEvent,\r\n} from 'rxjs';\r\nimport {\r\n take,\r\n switchMap,\r\n startWith,\r\n skip,\r\n takeUntil,\r\n filter,\r\n} from 'rxjs/operators';\r\nimport {\r\n Platform,\r\n normalizePassiveListenerOptions,\r\n} from '@angular/cdk/platform';\r\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\r\n\r\n/** Config used to bind passive event listeners */\r\nconst passiveEventListenerOptions = normalizePassiveListenerOptions({\r\n passive: true,\r\n}) as EventListenerOptions;\r\n\r\n/**\r\n * The directions that scrolling can go in when the header's tabs exceed the header width. 'After'\r\n * will scroll the header towards the end of the tabs list and 'before' will scroll towards the\r\n * beginning of the list.\r\n */\r\nexport type ScrollDirection = 'after' | 'before';\r\n\r\n/**\r\n * Amount of milliseconds to wait before starting to scroll the header automatically.\r\n * Set a little conservatively in order to handle fake events dispatched on touch devices.\r\n */\r\nconst HEADER_SCROLL_DELAY = 650;\r\n\r\n/**\r\n * Interval in milliseconds at which to scroll the header\r\n * while the user is holding their pointer.\r\n */\r\nconst HEADER_SCROLL_INTERVAL = 100;\r\n\r\n/** Item inside a paginated tab header. */\r\nexport type MatPaginatedTabHeaderItem = FocusableOption & {\r\n elementRef: ElementRef;\r\n};\r\n\r\n/**\r\n * Base class for a tab header that supported pagination.\r\n * @docs-private\r\n */\r\n@Directive()\r\nexport abstract class OuiPaginatedTabHeader\r\n implements AfterContentChecked, AfterContentInit, AfterViewInit, OnDestroy\r\n{\r\n abstract _items: QueryList;\r\n abstract _inkBar: {\r\n hide: () => void;\r\n alignToElement: (element: HTMLElement) => void;\r\n };\r\n abstract _tabListContainer: ElementRef;\r\n abstract _tabList: ElementRef;\r\n abstract _tabListInner: ElementRef;\r\n abstract _nextPaginator: ElementRef;\r\n abstract _previousPaginator: ElementRef;\r\n\r\n /** The distance in pixels that the tab labels should be translated to the left. */\r\n private _scrollDistance = 0;\r\n\r\n /** Whether the header should scroll to the selected index after the view has been checked. */\r\n private _selectedIndexChanged = false;\r\n\r\n /** Emits when the component is destroyed. */\r\n protected readonly _destroyed = new Subject();\r\n\r\n /** Whether the controls for pagination should be displayed */\r\n _showPaginationControls = false;\r\n\r\n /** Whether the tab list can be scrolled more towards the end of the tab label list. */\r\n _disableScrollAfter = true;\r\n\r\n /** Whether the tab list can be scrolled more towards the beginning of the tab label list. */\r\n _disableScrollBefore = true;\r\n\r\n /**\r\n * The number of tab labels that are displayed on the header. When this changes, the header\r\n * should re-evaluate the scroll position.\r\n */\r\n private _tabLabelCount: number;\r\n\r\n /** Whether the scroll distance has changed and should be applied after the view is checked. */\r\n private _scrollDistanceChanged: boolean;\r\n\r\n /** Used to manage focus between the tabs. */\r\n private _keyManager: FocusKeyManager;\r\n\r\n /** Cached text content of the header. */\r\n private _currentTextContent: string;\r\n\r\n /** Stream that will stop the automated scrolling. */\r\n private _stopScrolling = new Subject();\r\n\r\n /**\r\n * Whether pagination should be disabled. This can be used to avoid unnecessary\r\n * layout recalculations if it's known that pagination won't be required.\r\n */\r\n @Input()\r\n get disablePagination(): boolean {\r\n return this._disablePagination;\r\n }\r\n set disablePagination(value: BooleanInput) {\r\n this._disablePagination = coerceBooleanProperty(value);\r\n }\r\n private _disablePagination = false;\r\n\r\n /** The index of the active tab. */\r\n get selectedIndex(): number {\r\n return this._selectedIndex;\r\n }\r\n set selectedIndex(value: NumberInput) {\r\n value = coerceNumberProperty(value);\r\n\r\n if (this._selectedIndex != value) {\r\n this._selectedIndexChanged = true;\r\n this._selectedIndex = value;\r\n\r\n if (this._keyManager) {\r\n this._keyManager.updateActiveItem(value);\r\n }\r\n }\r\n }\r\n private _selectedIndex = 0;\r\n\r\n /** Event emitted when the option is selected. */\r\n readonly selectFocusedIndex: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when a label is focused. */\r\n readonly indexFocused: EventEmitter = new EventEmitter();\r\n\r\n constructor(\r\n protected _elementRef: ElementRef,\r\n protected _changeDetectorRef: ChangeDetectorRef,\r\n private _viewportRuler: ViewportRuler,\r\n @Optional() private _dir: Directionality,\r\n private _ngZone: NgZone,\r\n private _platform: Platform,\r\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string\r\n ) {\r\n // Bind the `mouseleave` event on the outside since it doesn't change anything in the view.\r\n _ngZone.runOutsideAngular(() => {\r\n fromEvent(_elementRef.nativeElement, 'mouseleave')\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => {\r\n this._stopInterval();\r\n });\r\n });\r\n }\r\n\r\n /** Called when the user has selected an item via the keyboard. */\r\n protected abstract _itemSelected(event: KeyboardEvent): void;\r\n\r\n ngAfterViewInit() {\r\n // We need to handle these events manually, because we want to bind passive event listeners.\r\n fromEvent(\r\n this._previousPaginator.nativeElement,\r\n 'touchstart',\r\n passiveEventListenerOptions\r\n )\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => {\r\n this._handlePaginatorPress('before');\r\n });\r\n\r\n fromEvent(\r\n this._nextPaginator.nativeElement,\r\n 'touchstart',\r\n passiveEventListenerOptions\r\n )\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => {\r\n this._handlePaginatorPress('after');\r\n });\r\n }\r\n\r\n ngAfterContentInit() {\r\n const dirChange = this._dir ? this._dir.change : observableOf('ltr');\r\n const resize = this._viewportRuler.change(150);\r\n const realign = () => {\r\n this.updatePagination();\r\n this._alignInkBarToSelectedTab();\r\n };\r\n\r\n this._keyManager = new FocusKeyManager(\r\n this._items\r\n )\r\n .withHorizontalOrientation(this._getLayoutDirection())\r\n .withHomeAndEnd()\r\n .withWrap()\r\n // Allow focus to land on disabled tabs, as per https://w3c.github.io/aria-practices/#kbd_disabled_controls\r\n .skipPredicate(() => false);\r\n\r\n this._keyManager.updateActiveItem(this._selectedIndex);\r\n\r\n // Defer the first call in order to allow for slower browsers to lay out the elements.\r\n // This helps in cases where the user lands directly on a page with paginated tabs.\r\n // Note that we use `onStable` instead of `requestAnimationFrame`, because the latter\r\n // can hold up tests that are in a background tab.\r\n this._ngZone.onStable.pipe(take(1)).subscribe(realign);\r\n\r\n // On dir change or window resize, realign the ink bar and update the orientation of\r\n // the key manager if the direction has changed.\r\n merge(dirChange, resize, this._items.changes, this._itemsResized())\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => {\r\n // We need to defer this to give the browser some time to recalculate\r\n // the element dimensions. The call has to be wrapped in `NgZone.run`,\r\n // because the viewport change handler runs outside of Angular.\r\n this._ngZone.run(() => {\r\n Promise.resolve().then(() => {\r\n // Clamp the scroll distance, because it can change with the number of tabs.\r\n this._scrollDistance = Math.max(\r\n 0,\r\n Math.min(this._getMaxScrollDistance(), this._scrollDistance)\r\n );\r\n realign();\r\n });\r\n });\r\n this._keyManager.withHorizontalOrientation(this._getLayoutDirection());\r\n });\r\n\r\n // If there is a change in the focus key manager we need to emit the `indexFocused`\r\n // event in order to provide a public event that notifies about focus changes. Also we realign\r\n // the tabs container by scrolling the new focused tab into the visible section.\r\n this._keyManager.change.subscribe((newFocusIndex) => {\r\n this.indexFocused.emit(newFocusIndex);\r\n this._setTabFocus(newFocusIndex);\r\n });\r\n }\r\n\r\n /** Sends any changes that could affect the layout of the items. */\r\n private _itemsResized(): Observable {\r\n if (typeof ResizeObserver !== 'function') {\r\n return EMPTY;\r\n }\r\n\r\n return this._items.changes.pipe(\r\n startWith(this._items),\r\n switchMap(\r\n (tabItems: QueryList) =>\r\n new Observable((observer: Observer) =>\r\n this._ngZone.runOutsideAngular(() => {\r\n const resizeObserver = new ResizeObserver((entries) =>\r\n observer.next(entries)\r\n );\r\n tabItems.forEach(\r\n (\r\n item // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n ) => resizeObserver.observe(item.elementRef.nativeElement)\r\n );\r\n return () => {\r\n resizeObserver.disconnect();\r\n };\r\n })\r\n )\r\n ),\r\n // Skip the first emit since the resize observer emits when an item\r\n // is observed for new items when the tab is already inserted\r\n skip(1),\r\n // Skip emissions where all the elements are invisible since we don't want\r\n // the header to try and re-render with invalid measurements. See #25574.\r\n filter((entries) =>\r\n entries.some((e) => e.contentRect.width > 0 && e.contentRect.height > 0)\r\n )\r\n );\r\n }\r\n\r\n ngAfterContentChecked(): void {\r\n // If the number of tab labels have changed, check if scrolling should be enabled\r\n if (this._tabLabelCount != this._items.length) {\r\n this.updatePagination();\r\n this._tabLabelCount = this._items.length;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n // If the selected index has changed, scroll to the label and check if the scrolling controls\r\n // should be disabled.\r\n if (this._selectedIndexChanged) {\r\n this._scrollToLabel(this._selectedIndex);\r\n this._checkScrollingControls();\r\n this._alignInkBarToSelectedTab();\r\n this._selectedIndexChanged = false;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n // If the scroll distance has been changed (tab selected, focused, scroll controls activated),\r\n // then translate the header to reflect this.\r\n if (this._scrollDistanceChanged) {\r\n this._updateTabScrollPosition();\r\n this._scrollDistanceChanged = false;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n // this._keyManager?.destroy();\r\n this._destroyed.next();\r\n this._destroyed.complete();\r\n this._stopScrolling.complete();\r\n }\r\n\r\n /** Handles keyboard events on the header. */\r\n _handleKeydown(event: KeyboardEvent) {\r\n // We don't handle any key bindings with a modifier key.\r\n if (hasModifierKey(event)) {\r\n return;\r\n }\r\n\r\n switch (event.keyCode) {\r\n case ENTER:\r\n case SPACE:\r\n if (this.focusIndex !== this.selectedIndex) {\r\n const item = this._items.get(this.focusIndex);\r\n\r\n if (item && !item.disabled) {\r\n this.selectFocusedIndex.emit(this.focusIndex);\r\n this._itemSelected(event);\r\n }\r\n }\r\n break;\r\n default:\r\n this._keyManager.onKeydown(event);\r\n }\r\n }\r\n\r\n /**\r\n * Callback for when the MutationObserver detects that the content has changed.\r\n */\r\n _onContentChanges() {\r\n const textContent = this._elementRef.nativeElement.textContent;\r\n\r\n // We need to diff the text content of the header, because the MutationObserver callback\r\n // will fire even if the text content didn't change which is inefficient and is prone\r\n // to infinite loops if a poorly constructed expression is passed in (see #14249).\r\n if (textContent !== this._currentTextContent) {\r\n this._currentTextContent = textContent || '';\r\n\r\n // The content observer runs outside the `NgZone` by default, which\r\n // means that we need to bring the callback back in ourselves.\r\n this._ngZone.run(() => {\r\n this.updatePagination();\r\n this._alignInkBarToSelectedTab();\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Updates the view whether pagination should be enabled or not.\r\n *\r\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\r\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\r\n * page.\r\n */\r\n updatePagination() {\r\n this._checkPaginationEnabled();\r\n this._checkScrollingControls();\r\n this._updateTabScrollPosition();\r\n }\r\n\r\n /** Tracks which element has focus; used for keyboard navigation */\r\n get focusIndex(): number {\r\n return this._keyManager ? this._keyManager.activeItemIndex! : 0;\r\n }\r\n\r\n /** When the focus index is set, we must manually send focus to the correct label */\r\n set focusIndex(value: number) {\r\n if (\r\n !this._isValidIndex(value) ||\r\n this.focusIndex === value ||\r\n !this._keyManager\r\n ) {\r\n return;\r\n }\r\n\r\n this._keyManager.setActiveItem(value);\r\n }\r\n\r\n /**\r\n * Determines if an index is valid. If the tabs are not ready yet, we assume that the user is\r\n * providing a valid index and return true.\r\n */\r\n _isValidIndex(index: number): boolean {\r\n return this._items ? !!this._items.toArray()[index] : true;\r\n }\r\n\r\n /**\r\n * Sets focus on the HTML element for the label wrapper and scrolls it into the view if\r\n * scrolling is enabled.\r\n */\r\n _setTabFocus(tabIndex: number) {\r\n if (this._showPaginationControls) {\r\n this._scrollToLabel(tabIndex);\r\n }\r\n\r\n if (this._items && this._items.length) {\r\n this._items.toArray()[tabIndex].focus();\r\n\r\n // Do not let the browser manage scrolling to focus the element, this will be handled\r\n // by using translation. In LTR, the scroll left should be 0. In RTL, the scroll width\r\n // should be the full width minus the offset width.\r\n const containerEl = this._tabListContainer.nativeElement;\r\n const dir = this._getLayoutDirection();\r\n\r\n if (dir == 'ltr') {\r\n containerEl.scrollLeft = 0;\r\n } else {\r\n containerEl.scrollLeft =\r\n containerEl.scrollWidth - containerEl.offsetWidth;\r\n }\r\n }\r\n }\r\n\r\n /** The layout direction of the containing app. */\r\n _getLayoutDirection(): Direction {\r\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\r\n }\r\n\r\n /** Performs the CSS transformation on the tab list that will cause the list to scroll. */\r\n _updateTabScrollPosition() {\r\n if (this.disablePagination) {\r\n return;\r\n }\r\n\r\n const scrollDistance = this.scrollDistance;\r\n const translateX =\r\n this._getLayoutDirection() === 'ltr' ? -scrollDistance : scrollDistance;\r\n\r\n // Don't use `translate3d` here because we don't want to create a new layer. A new layer\r\n // seems to cause flickering and overflow in Internet Explorer. For example, the ink bar\r\n // and ripples will exceed the boundaries of the visible tab bar.\r\n // See: https://github.com/angular/components/issues/10276\r\n // We round the `transform` here, because transforms with sub-pixel precision cause some\r\n // browsers to blur the content of the element.\r\n this._tabList.nativeElement.style.transform = `translateX(${Math.round(\r\n translateX\r\n )}px)`;\r\n\r\n // Setting the `transform` on IE will change the scroll offset of the parent, causing the\r\n // position to be thrown off in some cases. We have to reset it ourselves to ensure that\r\n // it doesn't get thrown off. Note that we scope it only to IE and Edge, because messing\r\n // with the scroll position throws off Chrome 71+ in RTL mode (see #14689).\r\n if (this._platform.TRIDENT || this._platform.EDGE) {\r\n this._tabListContainer.nativeElement.scrollLeft = 0;\r\n }\r\n }\r\n\r\n /** Sets the distance in pixels that the tab header should be transformed in the X-axis. */\r\n get scrollDistance(): number {\r\n return this._scrollDistance;\r\n }\r\n set scrollDistance(value: number) {\r\n this._scrollTo(value);\r\n }\r\n\r\n /**\r\n * Moves the tab list in the 'before' or 'after' direction (towards the beginning of the list or\r\n * the end of the list, respectively). The distance to scroll is computed to be a third of the\r\n * length of the tab list view window.\r\n *\r\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\r\n * should be called sparingly.\r\n */\r\n _scrollHeader(direction: ScrollDirection) {\r\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\r\n\r\n // Move the scroll distance one-third the length of the tab list's viewport.\r\n const scrollAmount = ((direction == 'before' ? -1 : 1) * viewLength) / 3;\r\n\r\n return this._scrollTo(this._scrollDistance + scrollAmount);\r\n }\r\n\r\n /** Handles click events on the pagination arrows. */\r\n _handlePaginatorClick(direction: ScrollDirection) {\r\n this._stopInterval();\r\n this._scrollHeader(direction);\r\n }\r\n\r\n /**\r\n * Moves the tab list such that the desired tab label (marked by index) is moved into view.\r\n *\r\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\r\n * should be called sparingly.\r\n */\r\n _scrollToLabel(labelIndex: number) {\r\n if (this.disablePagination) {\r\n return;\r\n }\r\n\r\n const selectedLabel = this._items\r\n ? this._items.toArray()[labelIndex]\r\n : null;\r\n\r\n if (!selectedLabel) {\r\n return;\r\n }\r\n\r\n // The view length is the visible width of the tab labels.\r\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\r\n const { offsetLeft, offsetWidth } = selectedLabel.elementRef.nativeElement;\r\n\r\n let labelBeforePos: number, labelAfterPos: number;\r\n if (this._getLayoutDirection() == 'ltr') {\r\n labelBeforePos = offsetLeft;\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n labelAfterPos = labelBeforePos + offsetWidth;\r\n } else {\r\n labelAfterPos = this._tabListInner.nativeElement.offsetWidth - offsetLeft;\r\n labelBeforePos = labelAfterPos - offsetWidth;\r\n }\r\n\r\n const beforeVisiblePos = this.scrollDistance;\r\n const afterVisiblePos = this.scrollDistance + viewLength;\r\n\r\n if (labelBeforePos < beforeVisiblePos) {\r\n // Scroll header to move label to the before direction\r\n this.scrollDistance -= beforeVisiblePos - labelBeforePos;\r\n } else if (labelAfterPos > afterVisiblePos) {\r\n // Scroll header to move label to the after direction\r\n this.scrollDistance += Math.min(\r\n labelAfterPos - afterVisiblePos,\r\n labelBeforePos - beforeVisiblePos\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Evaluate whether the pagination controls should be displayed. If the scroll width of the\r\n * tab list is wider than the size of the header container, then the pagination controls should\r\n * be shown.\r\n *\r\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\r\n * should be called sparingly.\r\n */\r\n _checkPaginationEnabled() {\r\n if (this.disablePagination) {\r\n this._showPaginationControls = false;\r\n } else {\r\n const isEnabled =\r\n this._tabListInner.nativeElement.scrollWidth >\r\n this._elementRef.nativeElement.offsetWidth;\r\n\r\n if (!isEnabled) {\r\n this.scrollDistance = 0;\r\n }\r\n\r\n if (isEnabled !== this._showPaginationControls) {\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n this._showPaginationControls = isEnabled;\r\n }\r\n }\r\n\r\n /**\r\n * Evaluate whether the before and after controls should be enabled or disabled.\r\n * If the header is at the beginning of the list (scroll distance is equal to 0) then disable the\r\n * before button. If the header is at the end of the list (scroll distance is equal to the\r\n * maximum distance we can scroll), then disable the after button.\r\n *\r\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\r\n * should be called sparingly.\r\n */\r\n _checkScrollingControls() {\r\n if (this.disablePagination) {\r\n this._disableScrollAfter = this._disableScrollBefore = true;\r\n } else {\r\n // Check if the pagination arrows should be activated.\r\n this._disableScrollBefore = this.scrollDistance == 0;\r\n this._disableScrollAfter =\r\n this.scrollDistance == this._getMaxScrollDistance();\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Determines what is the maximum length in pixels that can be set for the scroll distance. This\r\n * is equal to the difference in width between the tab list container and tab header container.\r\n *\r\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\r\n * should be called sparingly.\r\n */\r\n _getMaxScrollDistance(): number {\r\n const lengthOfTabList = this._tabListInner.nativeElement.scrollWidth;\r\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\r\n return lengthOfTabList - viewLength || 0;\r\n }\r\n\r\n /** Tells the ink-bar to align itself to the current label wrapper */\r\n _alignInkBarToSelectedTab(): void {\r\n const selectedItem =\r\n this._items && this._items.length\r\n ? this._items.toArray()[this.selectedIndex]\r\n : null;\r\n const selectedLabelWrapper = selectedItem\r\n ? selectedItem.elementRef.nativeElement\r\n : null;\r\n\r\n if (selectedLabelWrapper) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n this._inkBar.alignToElement(selectedLabelWrapper);\r\n } else {\r\n this._inkBar.hide();\r\n }\r\n }\r\n\r\n /** Stops the currently-running paginator interval. */\r\n _stopInterval() {\r\n this._stopScrolling.next();\r\n }\r\n\r\n /**\r\n * Handles the user pressing down on one of the paginators.\r\n * Starts scrolling the header after a certain amount of time.\r\n * @param direction In which direction the paginator should be scrolled.\r\n */\r\n _handlePaginatorPress(direction: ScrollDirection, mouseEvent?: MouseEvent) {\r\n // Don't start auto scrolling for right mouse button clicks. Note that we shouldn't have to\r\n // null check the `button`, but we do it so we don't break tests that use fake events.\r\n if (mouseEvent && mouseEvent.button != null && mouseEvent.button !== 0) {\r\n return;\r\n }\r\n\r\n // Avoid overlapping timers.\r\n this._stopInterval();\r\n\r\n // Start a timer after the delay and keep firing based on the interval.\r\n timer(HEADER_SCROLL_DELAY, HEADER_SCROLL_INTERVAL)\r\n // Keep the timer going until something tells it to stop or the component is destroyed.\r\n .pipe(takeUntil(merge(this._stopScrolling, this._destroyed)))\r\n .subscribe(() => {\r\n const { maxScrollDistance, distance } = this._scrollHeader(direction);\r\n\r\n // Stop the timer if we've reached the start or the end.\r\n if (distance === 0 || distance >= maxScrollDistance) {\r\n this._stopInterval();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Scrolls the header to a given position.\r\n * @param position Position to which to scroll.\r\n * @returns Information on the current scroll distance and the maximum.\r\n */\r\n private _scrollTo(position: number) {\r\n if (this.disablePagination) {\r\n return { maxScrollDistance: 0, distance: 0 };\r\n }\r\n\r\n const maxScrollDistance = this._getMaxScrollDistance();\r\n this._scrollDistance = Math.max(0, Math.min(maxScrollDistance, position));\r\n\r\n // Mark that the scroll distance has changed so that after the view is checked, the CSS\r\n // transformation can move the header.\r\n this._scrollDistanceChanged = true;\r\n this._checkScrollingControls();\r\n\r\n return { maxScrollDistance, distance: this._scrollDistance };\r\n }\r\n}\r\n", + "sourceCode": "import {\n ChangeDetectorRef,\n ElementRef,\n NgZone,\n Optional,\n QueryList,\n EventEmitter,\n AfterContentChecked,\n AfterContentInit,\n AfterViewInit,\n OnDestroy,\n Directive,\n Inject,\n Input,\n} from '@angular/core';\nimport { Direction, Directionality } from '@angular/cdk/bidi';\nimport {\n BooleanInput,\n coerceBooleanProperty,\n coerceNumberProperty,\n NumberInput,\n} from '@angular/cdk/coercion';\nimport { ViewportRuler } from '@angular/cdk/scrolling';\nimport { FocusKeyManager, FocusableOption } from '@angular/cdk/a11y';\nimport { ENTER, SPACE, hasModifierKey } from '@angular/cdk/keycodes';\nimport {\n merge,\n of as observableOf,\n Subject,\n EMPTY,\n Observer,\n Observable,\n timer,\n fromEvent,\n} from 'rxjs';\nimport {\n take,\n switchMap,\n startWith,\n skip,\n takeUntil,\n filter,\n} from 'rxjs/operators';\nimport {\n Platform,\n normalizePassiveListenerOptions,\n} from '@angular/cdk/platform';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\n\n/** Config used to bind passive event listeners */\nconst passiveEventListenerOptions = normalizePassiveListenerOptions({\n passive: true,\n}) as EventListenerOptions;\n\n/**\n * The directions that scrolling can go in when the header's tabs exceed the header width. 'After'\n * will scroll the header towards the end of the tabs list and 'before' will scroll towards the\n * beginning of the list.\n */\nexport type ScrollDirection = 'after' | 'before';\n\n/**\n * Amount of milliseconds to wait before starting to scroll the header automatically.\n * Set a little conservatively in order to handle fake events dispatched on touch devices.\n */\nconst HEADER_SCROLL_DELAY = 650;\n\n/**\n * Interval in milliseconds at which to scroll the header\n * while the user is holding their pointer.\n */\nconst HEADER_SCROLL_INTERVAL = 100;\n\n/** Item inside a paginated tab header. */\nexport type MatPaginatedTabHeaderItem = FocusableOption & {\n elementRef: ElementRef;\n};\n\n/**\n * Base class for a tab header that supported pagination.\n * @docs-private\n */\n@Directive()\nexport abstract class OuiPaginatedTabHeader\n implements AfterContentChecked, AfterContentInit, AfterViewInit, OnDestroy\n{\n abstract _items: QueryList;\n abstract _inkBar: {\n hide: () => void;\n alignToElement: (element: HTMLElement) => void;\n };\n abstract _tabListContainer: ElementRef;\n abstract _tabList: ElementRef;\n abstract _tabListInner: ElementRef;\n abstract _nextPaginator: ElementRef;\n abstract _previousPaginator: ElementRef;\n\n /** The distance in pixels that the tab labels should be translated to the left. */\n private _scrollDistance = 0;\n\n /** Whether the header should scroll to the selected index after the view has been checked. */\n private _selectedIndexChanged = false;\n\n /** Emits when the component is destroyed. */\n protected readonly _destroyed = new Subject();\n\n /** Whether the controls for pagination should be displayed */\n _showPaginationControls = false;\n\n /** Whether the tab list can be scrolled more towards the end of the tab label list. */\n _disableScrollAfter = true;\n\n /** Whether the tab list can be scrolled more towards the beginning of the tab label list. */\n _disableScrollBefore = true;\n\n /**\n * The number of tab labels that are displayed on the header. When this changes, the header\n * should re-evaluate the scroll position.\n */\n private _tabLabelCount: number;\n\n /** Whether the scroll distance has changed and should be applied after the view is checked. */\n private _scrollDistanceChanged: boolean;\n\n /** Used to manage focus between the tabs. */\n private _keyManager: FocusKeyManager;\n\n /** Cached text content of the header. */\n private _currentTextContent: string;\n\n /** Stream that will stop the automated scrolling. */\n private _stopScrolling = new Subject();\n\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n */\n @Input()\n get disablePagination(): boolean {\n return this._disablePagination;\n }\n set disablePagination(value: BooleanInput) {\n this._disablePagination = coerceBooleanProperty(value);\n }\n private _disablePagination = false;\n\n /** The index of the active tab. */\n get selectedIndex(): number {\n return this._selectedIndex;\n }\n set selectedIndex(value: NumberInput) {\n value = coerceNumberProperty(value);\n\n if (this._selectedIndex != value) {\n this._selectedIndexChanged = true;\n this._selectedIndex = value;\n\n if (this._keyManager) {\n this._keyManager.updateActiveItem(value);\n }\n }\n }\n private _selectedIndex = 0;\n\n /** Event emitted when the option is selected. */\n readonly selectFocusedIndex: EventEmitter =\n new EventEmitter();\n\n /** Event emitted when a label is focused. */\n readonly indexFocused: EventEmitter = new EventEmitter();\n\n constructor(\n protected _elementRef: ElementRef,\n protected _changeDetectorRef: ChangeDetectorRef,\n private _viewportRuler: ViewportRuler,\n @Optional() private _dir: Directionality,\n private _ngZone: NgZone,\n private _platform: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string\n ) {\n // Bind the `mouseleave` event on the outside since it doesn't change anything in the view.\n _ngZone.runOutsideAngular(() => {\n fromEvent(_elementRef.nativeElement, 'mouseleave')\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._stopInterval();\n });\n });\n }\n\n /** Called when the user has selected an item via the keyboard. */\n protected abstract _itemSelected(event: KeyboardEvent): void;\n\n ngAfterViewInit() {\n // We need to handle these events manually, because we want to bind passive event listeners.\n fromEvent(\n this._previousPaginator.nativeElement,\n 'touchstart',\n passiveEventListenerOptions\n )\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._handlePaginatorPress('before');\n });\n\n fromEvent(\n this._nextPaginator.nativeElement,\n 'touchstart',\n passiveEventListenerOptions\n )\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._handlePaginatorPress('after');\n });\n }\n\n ngAfterContentInit() {\n const dirChange = this._dir ? this._dir.change : observableOf('ltr');\n const resize = this._viewportRuler.change(150);\n const realign = () => {\n this.updatePagination();\n this._alignInkBarToSelectedTab();\n };\n\n this._keyManager = new FocusKeyManager(\n this._items\n )\n .withHorizontalOrientation(this._getLayoutDirection())\n .withHomeAndEnd()\n .withWrap()\n // Allow focus to land on disabled tabs, as per https://w3c.github.io/aria-practices/#kbd_disabled_controls\n .skipPredicate(() => false);\n\n this._keyManager.updateActiveItem(this._selectedIndex);\n\n // Defer the first call in order to allow for slower browsers to lay out the elements.\n // This helps in cases where the user lands directly on a page with paginated tabs.\n // Note that we use `onStable` instead of `requestAnimationFrame`, because the latter\n // can hold up tests that are in a background tab.\n this._ngZone.onStable.pipe(take(1)).subscribe(realign);\n\n // On dir change or window resize, realign the ink bar and update the orientation of\n // the key manager if the direction has changed.\n merge(dirChange, resize, this._items.changes, this._itemsResized())\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n // We need to defer this to give the browser some time to recalculate\n // the element dimensions. The call has to be wrapped in `NgZone.run`,\n // because the viewport change handler runs outside of Angular.\n this._ngZone.run(() => {\n Promise.resolve().then(() => {\n // Clamp the scroll distance, because it can change with the number of tabs.\n this._scrollDistance = Math.max(\n 0,\n Math.min(this._getMaxScrollDistance(), this._scrollDistance)\n );\n realign();\n });\n });\n this._keyManager.withHorizontalOrientation(this._getLayoutDirection());\n });\n\n // If there is a change in the focus key manager we need to emit the `indexFocused`\n // event in order to provide a public event that notifies about focus changes. Also we realign\n // the tabs container by scrolling the new focused tab into the visible section.\n this._keyManager.change.subscribe((newFocusIndex) => {\n this.indexFocused.emit(newFocusIndex);\n this._setTabFocus(newFocusIndex);\n });\n }\n\n /** Sends any changes that could affect the layout of the items. */\n private _itemsResized(): Observable {\n if (typeof ResizeObserver !== 'function') {\n return EMPTY;\n }\n\n return this._items.changes.pipe(\n startWith(this._items),\n switchMap(\n (tabItems: QueryList) =>\n new Observable((observer: Observer) =>\n this._ngZone.runOutsideAngular(() => {\n const resizeObserver = new ResizeObserver((entries) =>\n observer.next(entries)\n );\n tabItems.forEach(\n (\n item // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n ) => resizeObserver.observe(item.elementRef.nativeElement)\n );\n return () => {\n resizeObserver.disconnect();\n };\n })\n )\n ),\n // Skip the first emit since the resize observer emits when an item\n // is observed for new items when the tab is already inserted\n skip(1),\n // Skip emissions where all the elements are invisible since we don't want\n // the header to try and re-render with invalid measurements. See #25574.\n filter((entries) =>\n entries.some((e) => e.contentRect.width > 0 && e.contentRect.height > 0)\n )\n );\n }\n\n ngAfterContentChecked(): void {\n // If the number of tab labels have changed, check if scrolling should be enabled\n if (this._tabLabelCount != this._items.length) {\n this.updatePagination();\n this._tabLabelCount = this._items.length;\n this._changeDetectorRef.markForCheck();\n }\n\n // If the selected index has changed, scroll to the label and check if the scrolling controls\n // should be disabled.\n if (this._selectedIndexChanged) {\n this._scrollToLabel(this._selectedIndex);\n this._checkScrollingControls();\n this._alignInkBarToSelectedTab();\n this._selectedIndexChanged = false;\n this._changeDetectorRef.markForCheck();\n }\n\n // If the scroll distance has been changed (tab selected, focused, scroll controls activated),\n // then translate the header to reflect this.\n if (this._scrollDistanceChanged) {\n this._updateTabScrollPosition();\n this._scrollDistanceChanged = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n ngOnDestroy() {\n // this._keyManager?.destroy();\n this._destroyed.next();\n this._destroyed.complete();\n this._stopScrolling.complete();\n }\n\n /** Handles keyboard events on the header. */\n _handleKeydown(event: KeyboardEvent) {\n // We don't handle any key bindings with a modifier key.\n if (hasModifierKey(event)) {\n return;\n }\n\n switch (event.keyCode) {\n case ENTER:\n case SPACE:\n if (this.focusIndex !== this.selectedIndex) {\n const item = this._items.get(this.focusIndex);\n\n if (item && !item.disabled) {\n this.selectFocusedIndex.emit(this.focusIndex);\n this._itemSelected(event);\n }\n }\n break;\n default:\n this._keyManager.onKeydown(event);\n }\n }\n\n /**\n * Callback for when the MutationObserver detects that the content has changed.\n */\n _onContentChanges() {\n const textContent = this._elementRef.nativeElement.textContent;\n\n // We need to diff the text content of the header, because the MutationObserver callback\n // will fire even if the text content didn't change which is inefficient and is prone\n // to infinite loops if a poorly constructed expression is passed in (see #14249).\n if (textContent !== this._currentTextContent) {\n this._currentTextContent = textContent || '';\n\n // The content observer runs outside the `NgZone` by default, which\n // means that we need to bring the callback back in ourselves.\n this._ngZone.run(() => {\n this.updatePagination();\n this._alignInkBarToSelectedTab();\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n\n /**\n * Updates the view whether pagination should be enabled or not.\n *\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\n * page.\n */\n updatePagination() {\n this._checkPaginationEnabled();\n this._checkScrollingControls();\n this._updateTabScrollPosition();\n }\n\n /** Tracks which element has focus; used for keyboard navigation */\n get focusIndex(): number {\n return this._keyManager ? this._keyManager.activeItemIndex! : 0;\n }\n\n /** When the focus index is set, we must manually send focus to the correct label */\n set focusIndex(value: number) {\n if (\n !this._isValidIndex(value) ||\n this.focusIndex === value ||\n !this._keyManager\n ) {\n return;\n }\n\n this._keyManager.setActiveItem(value);\n }\n\n /**\n * Determines if an index is valid. If the tabs are not ready yet, we assume that the user is\n * providing a valid index and return true.\n */\n _isValidIndex(index: number): boolean {\n return this._items ? !!this._items.toArray()[index] : true;\n }\n\n /**\n * Sets focus on the HTML element for the label wrapper and scrolls it into the view if\n * scrolling is enabled.\n */\n _setTabFocus(tabIndex: number) {\n if (this._showPaginationControls) {\n this._scrollToLabel(tabIndex);\n }\n\n if (this._items && this._items.length) {\n this._items.toArray()[tabIndex].focus();\n\n // Do not let the browser manage scrolling to focus the element, this will be handled\n // by using translation. In LTR, the scroll left should be 0. In RTL, the scroll width\n // should be the full width minus the offset width.\n const containerEl = this._tabListContainer.nativeElement;\n const dir = this._getLayoutDirection();\n\n if (dir == 'ltr') {\n containerEl.scrollLeft = 0;\n } else {\n containerEl.scrollLeft =\n containerEl.scrollWidth - containerEl.offsetWidth;\n }\n }\n }\n\n /** The layout direction of the containing app. */\n _getLayoutDirection(): Direction {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /** Performs the CSS transformation on the tab list that will cause the list to scroll. */\n _updateTabScrollPosition() {\n if (this.disablePagination) {\n return;\n }\n\n const scrollDistance = this.scrollDistance;\n const translateX =\n this._getLayoutDirection() === 'ltr' ? -scrollDistance : scrollDistance;\n\n // Don't use `translate3d` here because we don't want to create a new layer. A new layer\n // seems to cause flickering and overflow in Internet Explorer. For example, the ink bar\n // and ripples will exceed the boundaries of the visible tab bar.\n // See: https://github.com/angular/components/issues/10276\n // We round the `transform` here, because transforms with sub-pixel precision cause some\n // browsers to blur the content of the element.\n this._tabList.nativeElement.style.transform = `translateX(${Math.round(\n translateX\n )}px)`;\n\n // Setting the `transform` on IE will change the scroll offset of the parent, causing the\n // position to be thrown off in some cases. We have to reset it ourselves to ensure that\n // it doesn't get thrown off. Note that we scope it only to IE and Edge, because messing\n // with the scroll position throws off Chrome 71+ in RTL mode (see #14689).\n if (this._platform.TRIDENT || this._platform.EDGE) {\n this._tabListContainer.nativeElement.scrollLeft = 0;\n }\n }\n\n /** Sets the distance in pixels that the tab header should be transformed in the X-axis. */\n get scrollDistance(): number {\n return this._scrollDistance;\n }\n set scrollDistance(value: number) {\n this._scrollTo(value);\n }\n\n /**\n * Moves the tab list in the 'before' or 'after' direction (towards the beginning of the list or\n * the end of the list, respectively). The distance to scroll is computed to be a third of the\n * length of the tab list view window.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _scrollHeader(direction: ScrollDirection) {\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n\n // Move the scroll distance one-third the length of the tab list's viewport.\n const scrollAmount = ((direction == 'before' ? -1 : 1) * viewLength) / 3;\n\n return this._scrollTo(this._scrollDistance + scrollAmount);\n }\n\n /** Handles click events on the pagination arrows. */\n _handlePaginatorClick(direction: ScrollDirection) {\n this._stopInterval();\n this._scrollHeader(direction);\n }\n\n /**\n * Moves the tab list such that the desired tab label (marked by index) is moved into view.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _scrollToLabel(labelIndex: number) {\n if (this.disablePagination) {\n return;\n }\n\n const selectedLabel = this._items\n ? this._items.toArray()[labelIndex]\n : null;\n\n if (!selectedLabel) {\n return;\n }\n\n // The view length is the visible width of the tab labels.\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n const { offsetLeft, offsetWidth } = selectedLabel.elementRef.nativeElement;\n\n let labelBeforePos: number, labelAfterPos: number;\n if (this._getLayoutDirection() == 'ltr') {\n labelBeforePos = offsetLeft;\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n labelAfterPos = labelBeforePos + offsetWidth;\n } else {\n labelAfterPos = this._tabListInner.nativeElement.offsetWidth - offsetLeft;\n labelBeforePos = labelAfterPos - offsetWidth;\n }\n\n const beforeVisiblePos = this.scrollDistance;\n const afterVisiblePos = this.scrollDistance + viewLength;\n\n if (labelBeforePos < beforeVisiblePos) {\n // Scroll header to move label to the before direction\n this.scrollDistance -= beforeVisiblePos - labelBeforePos;\n } else if (labelAfterPos > afterVisiblePos) {\n // Scroll header to move label to the after direction\n this.scrollDistance += Math.min(\n labelAfterPos - afterVisiblePos,\n labelBeforePos - beforeVisiblePos\n );\n }\n }\n\n /**\n * Evaluate whether the pagination controls should be displayed. If the scroll width of the\n * tab list is wider than the size of the header container, then the pagination controls should\n * be shown.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _checkPaginationEnabled() {\n if (this.disablePagination) {\n this._showPaginationControls = false;\n } else {\n const isEnabled =\n this._tabListInner.nativeElement.scrollWidth >\n this._elementRef.nativeElement.offsetWidth;\n\n if (!isEnabled) {\n this.scrollDistance = 0;\n }\n\n if (isEnabled !== this._showPaginationControls) {\n this._changeDetectorRef.markForCheck();\n }\n\n this._showPaginationControls = isEnabled;\n }\n }\n\n /**\n * Evaluate whether the before and after controls should be enabled or disabled.\n * If the header is at the beginning of the list (scroll distance is equal to 0) then disable the\n * before button. If the header is at the end of the list (scroll distance is equal to the\n * maximum distance we can scroll), then disable the after button.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _checkScrollingControls() {\n if (this.disablePagination) {\n this._disableScrollAfter = this._disableScrollBefore = true;\n } else {\n // Check if the pagination arrows should be activated.\n this._disableScrollBefore = this.scrollDistance == 0;\n this._disableScrollAfter =\n this.scrollDistance == this._getMaxScrollDistance();\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * Determines what is the maximum length in pixels that can be set for the scroll distance. This\n * is equal to the difference in width between the tab list container and tab header container.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _getMaxScrollDistance(): number {\n const lengthOfTabList = this._tabListInner.nativeElement.scrollWidth;\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n return lengthOfTabList - viewLength || 0;\n }\n\n /** Tells the ink-bar to align itself to the current label wrapper */\n _alignInkBarToSelectedTab(): void {\n const selectedItem =\n this._items && this._items.length\n ? this._items.toArray()[this.selectedIndex]\n : null;\n const selectedLabelWrapper = selectedItem\n ? selectedItem.elementRef.nativeElement\n : null;\n\n if (selectedLabelWrapper) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this._inkBar.alignToElement(selectedLabelWrapper);\n } else {\n this._inkBar.hide();\n }\n }\n\n /** Stops the currently-running paginator interval. */\n _stopInterval() {\n this._stopScrolling.next();\n }\n\n /**\n * Handles the user pressing down on one of the paginators.\n * Starts scrolling the header after a certain amount of time.\n * @param direction In which direction the paginator should be scrolled.\n */\n _handlePaginatorPress(direction: ScrollDirection, mouseEvent?: MouseEvent) {\n // Don't start auto scrolling for right mouse button clicks. Note that we shouldn't have to\n // null check the `button`, but we do it so we don't break tests that use fake events.\n if (mouseEvent && mouseEvent.button != null && mouseEvent.button !== 0) {\n return;\n }\n\n // Avoid overlapping timers.\n this._stopInterval();\n\n // Start a timer after the delay and keep firing based on the interval.\n timer(HEADER_SCROLL_DELAY, HEADER_SCROLL_INTERVAL)\n // Keep the timer going until something tells it to stop or the component is destroyed.\n .pipe(takeUntil(merge(this._stopScrolling, this._destroyed)))\n .subscribe(() => {\n const { maxScrollDistance, distance } = this._scrollHeader(direction);\n\n // Stop the timer if we've reached the start or the end.\n if (distance === 0 || distance >= maxScrollDistance) {\n this._stopInterval();\n }\n });\n }\n\n /**\n * Scrolls the header to a given position.\n * @param position Position to which to scroll.\n * @returns Information on the current scroll distance and the maximum.\n */\n private _scrollTo(position: number) {\n if (this.disablePagination) {\n return { maxScrollDistance: 0, distance: 0 };\n }\n\n const maxScrollDistance = this._getMaxScrollDistance();\n this._scrollDistance = Math.max(0, Math.min(maxScrollDistance, position));\n\n // Mark that the scroll distance has changed so that after the view is checked, the CSS\n // transformation can move the header.\n this._scrollDistanceChanged = true;\n this._checkScrollingControls();\n\n return { maxScrollDistance, distance: this._scrollDistance };\n }\n}\n", "providers": [], "hostDirectives": [], "standalone": false, @@ -17760,8 +17805,8 @@ "jsdoctags": [ { "name": { - "pos": 23371, - "end": 23380, + "pos": 22708, + "end": 22717, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -17772,8 +17817,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 23365, - "end": 23370, + "pos": 22702, + "end": 22707, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -17939,8 +17984,8 @@ "jsdoctags": [ { "name": { - "pos": 24539, - "end": 24547, + "pos": 23848, + "end": 23856, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -17951,8 +17996,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 24533, - "end": 24538, + "pos": 23842, + "end": 23847, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -17963,8 +18008,8 @@ }, { "tagName": { - "pos": 24584, - "end": 24591, + "pos": 23892, + "end": 23899, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -18613,12 +18658,12 @@ }, { "name": "OuiPanelTrigger", - "id": "directive-OuiPanelTrigger-6f1fb3e0e0bb5b386c23c6c8cf2d965fbc76f5026dbd9ec534e8ce7279c52941431b43316d79f4428028b9392eaf96907b1a0359547ac852d83c5a69a7e68e95", + "id": "directive-OuiPanelTrigger-8517705330a017cb0c5dabf6600e4bc909c2047a201f827801432a4e2228c83c24d43b2d7b101cb7b86c418db5c3163eff61231e221263d8da99712e2b15235c", "file": "ui/src/components/panel/panel-trigger.ts", "type": "directive", "description": "

This directive is intended to be used in conjunction with an oui-panel tag. It is\nresponsible for toggling the display of the provided panel instance.

\n", "rawdescription": "\n\nThis directive is intended to be used in conjunction with an oui-panel tag. It is\nresponsible for toggling the display of the provided panel instance.\n", - "sourceCode": "import {\r\n InjectionToken,\r\n Directive,\r\n OnDestroy,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ElementRef,\r\n ViewContainerRef,\r\n Inject,\r\n} from '@angular/core';\r\nimport {\r\n ScrollStrategy,\r\n Overlay,\r\n OverlayRef,\r\n FlexibleConnectedPositionStrategy,\r\n OverlayConfig,\r\n} from '@angular/cdk/overlay';\r\nimport { Subscription, Observable, Subject } from 'rxjs';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { OuiPanelOverlay } from './panel-overlay';\r\nimport {\r\n PanelPositionY,\r\n PanelPositionX,\r\n PanelFlexiblePosition,\r\n} from './panel-positions';\r\nimport { merge } from 'rxjs';\r\nimport { debounceTime, filter } from 'rxjs/operators';\r\nimport { SPACE } from '@angular/cdk/keycodes';\r\nimport { FocusTrap, ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';\r\n\r\n/** Injection token that determines the scroll handling while the panel-overlay is open. */\r\nexport const OUI_PANEL_SCROLL_STRATEGY = new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-panel-scroll-strategy');\r\n\r\n/** @docs-private */\r\nexport function OUI_PANEL_SCROLL_STRATEGY_FACTORY(\r\n overlay: Overlay\r\n): () => ScrollStrategy {\r\n return () => overlay.scrollStrategies.close();\r\n}\r\n\r\n/** @docs-private */\r\nexport const OUI_PANEL_SCROLL_STRATEGY_FACTORY_PROVIDER = {\r\n provide: OUI_PANEL_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_PANEL_SCROLL_STRATEGY_FACTORY,\r\n};\r\n\r\n/**\r\n * This directive is intended to be used in conjunction with an oui-panel tag. It is\r\n * responsible for toggling the display of the provided panel instance.\r\n */\r\n@Directive({\r\n selector: `[oui-panel-trigger-for], [ouiPanelTriggerFor]`,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n 'aria-haspopup': 'true',\r\n '[attr.aria-expanded]': 'panelOpen || null',\r\n '(mouseenter)': '_handleMouseEnter($event)',\r\n '(mouseleave)': '_handelMouseLeave($event)',\r\n '(keydown)': '_handleKeydown($event)',\r\n },\r\n exportAs: 'ouiPanelTrigger',\r\n})\r\nexport class OuiPanelTrigger implements OnDestroy {\r\n private _portal: TemplatePortal;\r\n private _overlayRef: OverlayRef | null = null;\r\n private _panelOpen = false;\r\n private _closeSubscription = Subscription.EMPTY;\r\n private _hoverSubscription = Subscription.EMPTY;\r\n private _keyboardEventSubscription: Subscription = Subscription.EMPTY;\r\n private _escapeEventSubscription: Subscription = Subscription.EMPTY;\r\n private _panelCloseSubscription = Subscription.EMPTY;\r\n private _mouseLeave: Subject = new Subject();\r\n private _mouseEnter: Subject = new Subject();\r\n private _scrollStrategy: () => ScrollStrategy;\r\n\r\n /** The class that traps and manages focus within the panel. */\r\n private _focusTrap: FocusTrap;\r\n\r\n /** Element that was focused before the panel was opened. Save this to restore upon close. */\r\n private _currentFocusElement: HTMLElement = null;\r\n\r\n /** References the panel instance that the trigger is associated with. */\r\n @Input('ouiPanelTriggerFor')\r\n get panel() {\r\n return this._panel;\r\n }\r\n set panel(panel: OuiPanelOverlay) {\r\n if (panel === this._panel) {\r\n return;\r\n }\r\n this._panel = panel;\r\n this._panelCloseSubscription.unsubscribe();\r\n\r\n if (panel) {\r\n this._panelCloseSubscription = panel.closed\r\n .asObservable()\r\n .subscribe(() => {\r\n this._destroyPanel();\r\n });\r\n this._escapeEventSubscription = this.panel.escapeEvent.subscribe(() => {\r\n this.closePanel();\r\n });\r\n }\r\n }\r\n private _panel: OuiPanelOverlay;\r\n\r\n /** Event emitted when the associated panel is opened. */\r\n @Output()\r\n readonly panelOpened: EventEmitter = new EventEmitter();\r\n\r\n /** Event emitted when the associated panel is closed. */\r\n @Output()\r\n readonly panelClosed: EventEmitter = new EventEmitter();\r\n\r\n constructor(\r\n private _overlay: Overlay,\r\n private _element: ElementRef,\r\n private _viewContainerRef: ViewContainerRef,\r\n private _focusTrapFactory: ConfigurableFocusTrapFactory,\r\n @Inject(OUI_PANEL_SCROLL_STRATEGY) scrollStrategy: any\r\n ) {\r\n this._scrollStrategy = scrollStrategy;\r\n }\r\n\r\n /** Whether the panel is open. */\r\n get panelOpen(): boolean {\r\n return this._panelOpen;\r\n }\r\n\r\n /** Toggles the panel between the open and closed states. */\r\n togglePanel(): void {\r\n return this._panelOpen ? this.closePanel() : this.openPanel();\r\n }\r\n\r\n /** Ensures the option is selected when activated from the keyboard. */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n const keyCode = event.keyCode;\r\n if (keyCode === SPACE) {\r\n this.openPanel();\r\n this._trapFocus();\r\n event.preventDefault();\r\n // On tab it will focus on the element itself\r\n this._currentFocusElement = event.target as HTMLElement;\r\n }\r\n }\r\n\r\n /** Opens The Panel */\r\n openPanel(): void {\r\n if (this._panelOpen) {\r\n return;\r\n }\r\n const overlayRef = this._createOverlay();\r\n const overlayConfig = overlayRef.getConfig();\r\n\r\n this._setPosition(\r\n overlayConfig.positionStrategy as FlexibleConnectedPositionStrategy\r\n );\r\n // overlayConfig.hasBackdrop = true;\r\n overlayRef.attach(this._getPortal());\r\n this._setLargeWidth();\r\n this._closeSubscription = this._panelClosingActions().subscribe(() => {\r\n this.closePanel('mouserHover');\r\n });\r\n this._setIsPanelOpen(true);\r\n }\r\n\r\n // set state rather than toggle to support triggers sharing a panel\r\n private _setIsPanelOpen(isOpen: boolean): void {\r\n this._panelOpen = isOpen;\r\n this._panelOpen ? this.panelOpened.emit() : this.panelClosed.emit();\r\n }\r\n\r\n /**\r\n * This method creates the overlay from the provided panel's template and saves its\r\n * OverlayRef so that it can be attached to the DOM when openPanel is called.\r\n */\r\n private _createOverlay(): OverlayRef {\r\n if (document.querySelector('.oui-panel')) {\r\n document.querySelector('.oui-panel').remove();\r\n }\r\n if (!this._overlayRef) {\r\n const config = this._getOverlayConfig();\r\n this._subscribeToPositions(\r\n config.positionStrategy as FlexibleConnectedPositionStrategy\r\n );\r\n this._overlayRef = this._overlay.create(config);\r\n\r\n // Consume the `keydownEvents` in order to prevent them from going to another overlay.\r\n // Ideally we'd also have our keyboard event logic in here, however doing so will\r\n // break anybody that may have implemented the `OuiPanelOverlay` themselves.\r\n this._keyboardEventSubscription = this._overlayRef\r\n .keydownEvents()\r\n .pipe(filter((event) => event.key === 'Escape'))\r\n .subscribe(() => this.closePanel());\r\n }\r\n return this._overlayRef;\r\n }\r\n\r\n /**\r\n * This method builds the configuration object needed to create the overlay, the OverlayState.\r\n *\r\n * @returns OverlayConfig\r\n */\r\n private _getOverlayConfig(): OverlayConfig {\r\n return new OverlayConfig({\r\n positionStrategy: this._overlay\r\n .position()\r\n .flexibleConnectedTo(this._element)\r\n .withLockedPosition()\r\n .withTransformOriginOn('.oui-panel-overlay'),\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n scrollStrategy: this._scrollStrategy(),\r\n direction: 'ltr',\r\n });\r\n }\r\n\r\n /**\r\n * Listens to changes in the position of the overlay and sets the correct classes\r\n * on the menu based on the new position. This ensures the animation origin is always\r\n * correct, even if a fallback position is used for the overlay.\r\n */\r\n private _subscribeToPositions(\r\n position: FlexibleConnectedPositionStrategy\r\n ): void {\r\n if (this.panel.setPositionClasses) {\r\n position.positionChanges.subscribe((change) => {\r\n const posX: PanelPositionX =\r\n change.connectionPair.overlayX === 'start' ? 'after' : 'before';\r\n const posY: PanelPositionY =\r\n change.connectionPair.overlayY === 'top' ? 'below' : 'above';\r\n\r\n this.panel.setPositionClasses!(posX, posY);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Sets the appropriate positions on a position strategy\r\n * so the overlay connects with the trigger correctly.\r\n *\r\n * @param positionStrategy Strategy whose position to update.\r\n */\r\n private _setPosition(positionStrategy: FlexibleConnectedPositionStrategy) {\r\n const panelPositions = new PanelFlexiblePosition(\r\n this.panel.xPosition,\r\n this.panel.yPosition\r\n );\r\n positionStrategy.withPositions(panelPositions.getPosition());\r\n }\r\n /** assign large width if overlay element contains img tag */\r\n private _setLargeWidth() {\r\n const imageTag = this._overlayRef.overlayElement.querySelector('img');\r\n if (imageTag) {\r\n const content: HTMLDivElement =\r\n this._overlayRef.overlayElement.querySelector('.oui-panel-content');\r\n content.classList.add('oui-panel-content-large');\r\n }\r\n }\r\n\r\n /** Cleans up the active subscriptions. */\r\n private _cleanUpSubscriptions(): void {\r\n this._closeSubscription.unsubscribe();\r\n this._hoverSubscription.unsubscribe();\r\n this._escapeEventSubscription.unsubscribe();\r\n this._keyboardEventSubscription.unsubscribe();\r\n }\r\n\r\n /** Closes the menu and does the necessary cleanup. */\r\n private _destroyPanel() {\r\n if (!this._overlayRef || !this.panelOpen) {\r\n return;\r\n }\r\n this._setIsPanelOpen(false);\r\n const panel = this.panel;\r\n\r\n this._closeSubscription.unsubscribe();\r\n this._overlayRef.detach();\r\n\r\n if (panel.lazyContent) {\r\n panel.lazyContent.detach();\r\n }\r\n }\r\n\r\n /** Closes The Panel */\r\n closePanel(hoverType?) {\r\n this.panel.closed.emit();\r\n if (!hoverType) {\r\n this._restoreFocus();\r\n }\r\n }\r\n\r\n /** Moves the focus inside the focus trap. */\r\n public _trapFocus() {\r\n const element: HTMLDivElement =\r\n this._overlayRef.overlayElement.querySelector('.oui-panel-content');\r\n\r\n if (!this._focusTrap) {\r\n this._focusTrap = this._focusTrapFactory.create(element);\r\n }\r\n element.focus();\r\n }\r\n\r\n /** Restores focus to the element that was focused before the panel opened. */\r\n public _restoreFocus() {\r\n const toFocus = this._currentFocusElement;\r\n // We need the extra check, because IE can set the `activeElement` to null in some cases.\r\n if (toFocus && typeof toFocus.focus === 'function') {\r\n toFocus.focus();\r\n }\r\n\r\n if (this._focusTrap) {\r\n this._focusTrap = null;\r\n }\r\n }\r\n\r\n /** Gets the portal that should be attached to the overlay. */\r\n private _getPortal(): TemplatePortal {\r\n // Note that we can avoid this check by keeping the portal on the menu panel.\r\n // While it would be cleaner, we'd have to introduce another required method on\r\n // `OuiPanelOverlay`, making it harder to consume.\r\n if (!this._portal || this._portal.templateRef !== this.panel.templateRef) {\r\n this._portal = new TemplatePortal(\r\n this.panel.templateRef,\r\n this._viewContainerRef\r\n );\r\n }\r\n return this._portal;\r\n }\r\n\r\n public _handleMouseEnter(event: MouseEvent): void {\r\n // On hover it will focus on the element itself\r\n const focusElement = event.target as HTMLElement;\r\n this._currentFocusElement = focusElement.querySelector('oui-icon');\r\n this._mouseEnter.next(event);\r\n this.openPanel();\r\n event.stopImmediatePropagation();\r\n }\r\n\r\n public _handelMouseLeave(event: MouseEvent): void {\r\n this._mouseLeave.next(event);\r\n event.stopImmediatePropagation();\r\n }\r\n\r\n /** Returns a stream that emits whenever an action that should close the panel occurs. */\r\n private _panelClosingActions(): Observable {\r\n const detachments = this._overlayRef!.detachments();\r\n const mouseLeave = merge(\r\n this._mouseLeave.asObservable(),\r\n this._mouseEnter.asObservable(),\r\n this.panel.mouseLeave,\r\n this.panel.mouseEnter\r\n ).pipe(\r\n debounceTime(200),\r\n filter((event) => event.type === 'mouseleave')\r\n );\r\n return merge(detachments, mouseLeave);\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n this._cleanUpSubscriptions();\r\n }\r\n}\r\n", + "sourceCode": "import {\r\n InjectionToken,\r\n Directive,\r\n OnDestroy,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ElementRef,\r\n ViewContainerRef,\r\n Inject,\r\n} from '@angular/core';\r\nimport {\r\n ScrollStrategy,\r\n Overlay,\r\n OverlayRef,\r\n FlexibleConnectedPositionStrategy,\r\n OverlayConfig,\r\n} from '@angular/cdk/overlay';\r\nimport { Subscription, Observable, Subject } from 'rxjs';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { OuiPanelOverlay } from './panel-overlay';\r\nimport {\r\n PanelPositionY,\r\n PanelPositionX,\r\n PanelFlexiblePosition,\r\n} from './panel-positions';\r\nimport { merge } from 'rxjs';\r\nimport { debounceTime, filter } from 'rxjs/operators';\r\nimport { SPACE } from '@angular/cdk/keycodes';\r\nimport { FocusTrap, ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';\r\n\r\n/** Injection token that determines the scroll handling while the panel-overlay is open. */\r\nexport const OUI_PANEL_SCROLL_STRATEGY = new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-panel-scroll-strategy');\r\n\r\n/** @docs-private */\r\nexport function OUI_PANEL_SCROLL_STRATEGY_FACTORY(\r\n overlay: Overlay\r\n): () => ScrollStrategy {\r\n return () => overlay.scrollStrategies.close();\r\n}\r\n\r\n/** @docs-private */\r\nexport const OUI_PANEL_SCROLL_STRATEGY_FACTORY_PROVIDER = {\r\n provide: OUI_PANEL_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_PANEL_SCROLL_STRATEGY_FACTORY,\r\n};\r\n\r\n/**\r\n * This directive is intended to be used in conjunction with an oui-panel tag. It is\r\n * responsible for toggling the display of the provided panel instance.\r\n */\r\n@Directive({\r\n selector: `[oui-panel-trigger-for], [ouiPanelTriggerFor]`,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n 'aria-haspopup': 'true',\r\n '[attr.aria-expanded]': 'panelOpen || null',\r\n '(mouseenter)': '_handleMouseEnter($event)',\r\n '(mouseleave)': '_handelMouseLeave($event)',\r\n '(keydown)': '_handleKeydown($event)',\r\n },\r\n exportAs: 'ouiPanelTrigger',\r\n})\r\nexport class OuiPanelTrigger implements OnDestroy {\r\n private _portal: TemplatePortal;\r\n private _overlayRef: OverlayRef | null = null;\r\n private _panelOpen = false;\r\n private _closeSubscription = Subscription.EMPTY;\r\n private _hoverSubscription = Subscription.EMPTY;\r\n private _keyboardEventSubscription: Subscription = Subscription.EMPTY;\r\n private _escapeEventSubscription: Subscription = Subscription.EMPTY;\r\n private _panelCloseSubscription = Subscription.EMPTY;\r\n private _mouseLeave: Subject = new Subject();\r\n private _mouseEnter: Subject = new Subject();\r\n private _scrollStrategy: () => ScrollStrategy;\r\n\r\n /** The class that traps and manages focus within the panel. */\r\n private _focusTrap: FocusTrap;\r\n\r\n /** Element that was focused before the panel was opened. Save this to restore upon close. */\r\n private _currentFocusElement: HTMLElement = null;\r\n\r\n /** References the panel instance that the trigger is associated with. */\r\n @Input('ouiPanelTriggerFor')\r\n get panel() {\r\n return this._panel;\r\n }\r\n set panel(panel: OuiPanelOverlay) {\r\n if (panel === this._panel) {\r\n return;\r\n }\r\n this._panel = panel;\r\n this._panelCloseSubscription.unsubscribe();\r\n\r\n if (panel) {\r\n this._panelCloseSubscription = panel.closed\r\n .asObservable()\r\n .subscribe(() => {\r\n this._destroyPanel();\r\n });\r\n this._escapeEventSubscription = this.panel.escapeEvent.subscribe(() => {\r\n this.closePanel();\r\n });\r\n }\r\n }\r\n private _panel: OuiPanelOverlay;\r\n\r\n /** Event emitted when the associated panel is opened. */\r\n @Output()\r\n readonly panelOpened: EventEmitter = new EventEmitter();\r\n\r\n /** Event emitted when the associated panel is closed. */\r\n @Output()\r\n readonly panelClosed: EventEmitter = new EventEmitter();\r\n\r\n constructor(\r\n private _overlay: Overlay,\r\n private _element: ElementRef,\r\n private _viewContainerRef: ViewContainerRef,\r\n private _focusTrapFactory: ConfigurableFocusTrapFactory,\r\n @Inject(OUI_PANEL_SCROLL_STRATEGY) scrollStrategy: any\r\n ) {\r\n this._scrollStrategy = scrollStrategy;\r\n }\r\n\r\n /** Whether the panel is open. */\r\n get panelOpen(): boolean {\r\n return this._panelOpen;\r\n }\r\n\r\n /** Toggles the panel between the open and closed states. */\r\n togglePanel(): void {\r\n return this._panelOpen ? this.closePanel() : this.openPanel();\r\n }\r\n\r\n /** Ensures the option is selected when activated from the keyboard. */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n const keyCode = event.keyCode;\r\n if (keyCode === SPACE) {\r\n this.openPanel();\r\n this._trapFocus();\r\n event.preventDefault();\r\n // On tab it will focus on the element itself\r\n this._currentFocusElement = event.target as HTMLElement;\r\n }\r\n }\r\n\r\n /** Opens The Panel */\r\n openPanel(): void {\r\n if (this._panelOpen) {\r\n return;\r\n }\r\n const overlayRef = this._createOverlay();\r\n const overlayConfig = overlayRef.getConfig();\r\n\r\n this._setPosition(\r\n overlayConfig.positionStrategy as FlexibleConnectedPositionStrategy\r\n );\r\n // overlayConfig.hasBackdrop = true;\r\n overlayRef.attach(this._getPortal());\r\n this._setLargeWidth();\r\n this._closeSubscription = this._panelClosingActions().subscribe(() => {\r\n this.closePanel('mouserHover');\r\n });\r\n this._setIsPanelOpen(true);\r\n }\r\n\r\n // set state rather than toggle to support triggers sharing a panel\r\n private _setIsPanelOpen(isOpen: boolean): void {\r\n this._panelOpen = isOpen;\r\n if (this._panelOpen) {\r\n this.panelOpened.emit();\r\n } else {\r\n this.panelClosed.emit();\r\n }\r\n }\r\n\r\n /**\r\n * This method creates the overlay from the provided panel's template and saves its\r\n * OverlayRef so that it can be attached to the DOM when openPanel is called.\r\n */\r\n private _createOverlay(): OverlayRef {\r\n if (document.querySelector('.oui-panel')) {\r\n document.querySelector('.oui-panel').remove();\r\n }\r\n if (!this._overlayRef) {\r\n const config = this._getOverlayConfig();\r\n this._subscribeToPositions(\r\n config.positionStrategy as FlexibleConnectedPositionStrategy\r\n );\r\n this._overlayRef = this._overlay.create(config);\r\n\r\n // Consume the `keydownEvents` in order to prevent them from going to another overlay.\r\n // Ideally we'd also have our keyboard event logic in here, however doing so will\r\n // break anybody that may have implemented the `OuiPanelOverlay` themselves.\r\n this._keyboardEventSubscription = this._overlayRef\r\n .keydownEvents()\r\n .pipe(filter((event) => event.key === 'Escape'))\r\n .subscribe(() => this.closePanel());\r\n }\r\n return this._overlayRef;\r\n }\r\n\r\n /**\r\n * This method builds the configuration object needed to create the overlay, the OverlayState.\r\n *\r\n * @returns OverlayConfig\r\n */\r\n private _getOverlayConfig(): OverlayConfig {\r\n return new OverlayConfig({\r\n positionStrategy: this._overlay\r\n .position()\r\n .flexibleConnectedTo(this._element)\r\n .withLockedPosition()\r\n .withTransformOriginOn('.oui-panel-overlay'),\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n scrollStrategy: this._scrollStrategy(),\r\n direction: 'ltr',\r\n });\r\n }\r\n\r\n /**\r\n * Listens to changes in the position of the overlay and sets the correct classes\r\n * on the menu based on the new position. This ensures the animation origin is always\r\n * correct, even if a fallback position is used for the overlay.\r\n */\r\n private _subscribeToPositions(\r\n position: FlexibleConnectedPositionStrategy\r\n ): void {\r\n if (this.panel.setPositionClasses) {\r\n position.positionChanges.subscribe((change) => {\r\n const posX: PanelPositionX =\r\n change.connectionPair.overlayX === 'start' ? 'after' : 'before';\r\n const posY: PanelPositionY =\r\n change.connectionPair.overlayY === 'top' ? 'below' : 'above';\r\n\r\n this.panel.setPositionClasses!(posX, posY);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Sets the appropriate positions on a position strategy\r\n * so the overlay connects with the trigger correctly.\r\n *\r\n * @param positionStrategy Strategy whose position to update.\r\n */\r\n private _setPosition(positionStrategy: FlexibleConnectedPositionStrategy) {\r\n const panelPositions = new PanelFlexiblePosition(\r\n this.panel.xPosition,\r\n this.panel.yPosition\r\n );\r\n positionStrategy.withPositions(panelPositions.getPosition());\r\n }\r\n /** assign large width if overlay element contains img tag */\r\n private _setLargeWidth() {\r\n const imageTag = this._overlayRef.overlayElement.querySelector('img');\r\n if (imageTag) {\r\n const content: HTMLDivElement =\r\n this._overlayRef.overlayElement.querySelector('.oui-panel-content');\r\n content.classList.add('oui-panel-content-large');\r\n }\r\n }\r\n\r\n /** Cleans up the active subscriptions. */\r\n private _cleanUpSubscriptions(): void {\r\n this._closeSubscription.unsubscribe();\r\n this._hoverSubscription.unsubscribe();\r\n this._escapeEventSubscription.unsubscribe();\r\n this._keyboardEventSubscription.unsubscribe();\r\n }\r\n\r\n /** Closes the menu and does the necessary cleanup. */\r\n private _destroyPanel() {\r\n if (!this._overlayRef || !this.panelOpen) {\r\n return;\r\n }\r\n this._setIsPanelOpen(false);\r\n const panel = this.panel;\r\n\r\n this._closeSubscription.unsubscribe();\r\n this._overlayRef.detach();\r\n\r\n if (panel.lazyContent) {\r\n panel.lazyContent.detach();\r\n }\r\n }\r\n\r\n /** Closes The Panel */\r\n closePanel(hoverType?) {\r\n this.panel.closed.emit();\r\n if (!hoverType) {\r\n this._restoreFocus();\r\n }\r\n }\r\n\r\n /** Moves the focus inside the focus trap. */\r\n public _trapFocus() {\r\n const element: HTMLDivElement =\r\n this._overlayRef.overlayElement.querySelector('.oui-panel-content');\r\n\r\n if (!this._focusTrap) {\r\n this._focusTrap = this._focusTrapFactory.create(element);\r\n }\r\n element.focus();\r\n }\r\n\r\n /** Restores focus to the element that was focused before the panel opened. */\r\n public _restoreFocus() {\r\n const toFocus = this._currentFocusElement;\r\n // We need the extra check, because IE can set the `activeElement` to null in some cases.\r\n if (toFocus && typeof toFocus.focus === 'function') {\r\n toFocus.focus();\r\n }\r\n\r\n if (this._focusTrap) {\r\n this._focusTrap = null;\r\n }\r\n }\r\n\r\n /** Gets the portal that should be attached to the overlay. */\r\n private _getPortal(): TemplatePortal {\r\n // Note that we can avoid this check by keeping the portal on the menu panel.\r\n // While it would be cleaner, we'd have to introduce another required method on\r\n // `OuiPanelOverlay`, making it harder to consume.\r\n if (!this._portal || this._portal.templateRef !== this.panel.templateRef) {\r\n this._portal = new TemplatePortal(\r\n this.panel.templateRef,\r\n this._viewContainerRef\r\n );\r\n }\r\n return this._portal;\r\n }\r\n\r\n public _handleMouseEnter(event: MouseEvent): void {\r\n // On hover it will focus on the element itself\r\n const focusElement = event.target as HTMLElement;\r\n this._currentFocusElement = focusElement.querySelector('oui-icon');\r\n this._mouseEnter.next(event);\r\n this.openPanel();\r\n event.stopImmediatePropagation();\r\n }\r\n\r\n public _handelMouseLeave(event: MouseEvent): void {\r\n this._mouseLeave.next(event);\r\n event.stopImmediatePropagation();\r\n }\r\n\r\n /** Returns a stream that emits whenever an action that should close the panel occurs. */\r\n private _panelClosingActions(): Observable {\r\n const detachments = this._overlayRef!.detachments();\r\n const mouseLeave = merge(\r\n this._mouseLeave.asObservable(),\r\n this._mouseEnter.asObservable(),\r\n this.panel.mouseLeave,\r\n this.panel.mouseEnter\r\n ).pipe(\r\n debounceTime(200),\r\n filter((event) => event.type === 'mouseleave')\r\n );\r\n return merge(detachments, mouseLeave);\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n this._cleanUpSubscriptions();\r\n }\r\n}\r\n", "selector": "[oui-panel-trigger-for], [ouiPanelTriggerFor]", "providers": [], "exportAs": "ouiPanelTrigger", @@ -18851,7 +18896,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 265, + "line": 269, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nCleans up the active subscriptions.", @@ -18866,7 +18911,7 @@ "optional": false, "returnType": "OverlayRef", "typeParameters": [], - "line": 181, + "line": 185, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nThis method creates the overlay from the provided panel's template and saves its\nOverlayRef so that it can be attached to the DOM when openPanel is called.\n", @@ -18881,7 +18926,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 273, + "line": 277, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nCloses the menu and does the necessary cleanup.", @@ -18896,7 +18941,7 @@ "optional": false, "returnType": "OverlayConfig", "typeParameters": [], - "line": 208, + "line": 212, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nThis method builds the configuration object needed to create the overlay, the OverlayState.\n\n", @@ -18907,8 +18952,8 @@ "jsdoctags": [ { "tagName": { - "pos": 6885, - "end": 6892, + "pos": 6924, + "end": 6931, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -18925,7 +18970,7 @@ "optional": false, "returnType": "TemplatePortal", "typeParameters": [], - "line": 321, + "line": 325, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nGets the portal that should be attached to the overlay.", @@ -18947,7 +18992,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 343, + "line": 347, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -19008,7 +19053,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 334, + "line": 338, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -19032,7 +19077,7 @@ "optional": false, "returnType": "Observable", "typeParameters": [], - "line": 349, + "line": 353, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReturns a stream that emits whenever an action that should close the panel occurs.", @@ -19047,7 +19092,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 308, + "line": 312, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nRestores focus to the element that was focused before the panel opened.", @@ -19093,7 +19138,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 255, + "line": 259, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nassign large width if overlay element contains img tag", @@ -19115,7 +19160,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 247, + "line": 251, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nSets the appropriate positions on a position strategy\nso the overlay connects with the trigger correctly.\n\n", @@ -19126,8 +19171,8 @@ "jsdoctags": [ { "name": { - "pos": 8230, - "end": 8246, + "pos": 8269, + "end": 8285, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -19138,8 +19183,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 8224, - "end": 8229, + "pos": 8263, + "end": 8268, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -19163,7 +19208,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 226, + "line": 230, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nListens to changes in the position of the overlay and sets the correct classes\non the menu based on the new position. This ensures the animation origin is always\ncorrect, even if a fallback position is used for the overlay.\n", @@ -19189,7 +19234,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 297, + "line": 301, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nMoves the focus inside the focus trap.", @@ -19212,7 +19257,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 289, + "line": 293, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nCloses The Panel", @@ -19236,7 +19281,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 363, + "line": 367, "deprecated": false, "deprecationMessage": "" }, @@ -19437,12 +19482,12 @@ }, { "name": "OuiSelectTrigger", - "id": "directive-OuiSelectTrigger-69627b742fec8101b0c412f353bb903b4d499f0f8291080ef1d6ac0c418484f2235fec3981e84104b948fe2f242b0a29fea2c39687b9ed9b01e6aa4fcda7ba37", + "id": "directive-OuiSelectTrigger-08d5ca0d9e57fe0b53fd1a332196d178df30100ca9fb0087259f4b8a1ae16a1016170481f04d33ecca5ee382a48196b5a882bb369fc5cad3a4a4f2d289256b1b", "file": "ui/src/components/select/select.component.ts", "type": "directive", "description": "

Allows the user to customize the trigger that is displayed when the select has a value.

\n", "rawdescription": "\n\nAllows the user to customize the trigger that is displayed when the select has a value.\n", - "sourceCode": "import { ActiveDescendantKeyManager, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { SelectionModel } from '@angular/cdk/collections';\r\nimport {\r\n A,\r\n DOWN_ARROW,\r\n END,\r\n ENTER,\r\n HOME,\r\n LEFT_ARROW,\r\n RIGHT_ARROW,\r\n SPACE,\r\n UP_ARROW,\r\n hasModifierKey,\r\n TAB,\r\n} from '@angular/cdk/keycodes';\r\nimport { CdkConnectedOverlay } from '@angular/cdk/overlay';\r\nimport {\r\n AfterContentInit,\r\n Attribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n ContentChildren,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n isDevMode,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n QueryList,\r\n Self,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n Inject,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n} from '@angular/forms';\r\nimport {\r\n _countGroupLabelsBeforeOption,\r\n _getOptionScrollPosition,\r\n CanDisable,\r\n CanDisableCtor,\r\n CanUpdateErrorState,\r\n CanUpdateErrorStateCtor,\r\n HasTabIndex,\r\n HasTabIndexCtor,\r\n OuiOptionSelectionChange,\r\n mixinErrorState,\r\n mixinTabIndex,\r\n mixinDisabled,\r\n} from '../core';\r\nimport { OuiFormField, OuiFormFieldControl } from '../form-field/public-api';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { OUI_OPTION_PARENT_COMPONENT, OuiOption } from '../core/option/option';\r\nimport { OuiOptgroup } from '../core/option/optgroup';\r\nimport { ErrorStateMatcher } from '../core/error/error-options';\r\nimport { defer, merge, Observable, Subject } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n filter,\r\n map,\r\n startWith,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n} from 'rxjs/operators';\r\nimport {\r\n getOuiSelectDynamicMultipleError,\r\n getOuiSelectNonArrayValueError,\r\n getOuiSelectNonFunctionValueError,\r\n} from './select-errors';\r\nimport { OuiIconRegistry } from '../icon/icon-registery';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ICONS } from '../core/shared/icons';\r\n\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * The following style constants are necessary to save here in order\r\n * to properly calculate the alignment of the selected option over\r\n * the trigger element.\r\n */\r\n\r\n/** The height of each select option. */\r\nexport const SELECT_OPTION_HEIGHT = 40;\r\n\r\n/** The panel's padding on the x-axis */\r\nexport const SELECT_PANEL_PADDING_X = 16;\r\n\r\n/** The panel's x axis padding if it is indented (e.g. there is an option group). */\r\nexport const SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;\r\n\r\n/** The height of the select items in `em` units. */\r\nexport const SELECT_ITEM_HEIGHT_EM = 3;\r\n\r\n/** The total height of the select panel. */\r\nexport const SELECT_PANEL_HEIGHT = 200;\r\n\r\n// TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.\r\n/**\r\n * Distance between the panel edge and the option text in\r\n * multi-selection mode.\r\n *\r\n * Calculated as:\r\n * (SELECT_PANEL_PADDING_X * 1.5) + 20 = 44\r\n * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.\r\n * The checkbox width is 16px.\r\n */\r\nexport let SELECT_MULTIPLE_PANEL_PADDING_X = 0;\r\n\r\n/**\r\n * The select panel will only \"fit\" inside the viewport if it is positioned at\r\n * this value or more away from the viewport boundary.\r\n */\r\nexport const SELECT_PANEL_VIEWPORT_PADDING = 8;\r\n\r\n/** Change event object that is emitted when the select value has changed. */\r\nexport class OuiSelectChange {\r\n constructor(\r\n /** Reference to the select that emitted the change event. */\r\n public source: OuiSelect,\r\n /** Current value of the select that emitted the event. */\r\n public value: any\r\n ) {}\r\n}\r\n\r\n// Boilerplate for applying mixins to OuiSelect.\r\n/** @docs-private */\r\nexport class OuiSelectBase {\r\n constructor(\r\n public _elementRef: ElementRef,\r\n public _defaultErrorStateMatcher: ErrorStateMatcher,\r\n public _parentForm: NgForm,\r\n public _parentFormGroup: FormGroupDirective,\r\n public ngControl: NgControl\r\n ) {}\r\n}\r\n\r\nexport const _OuiSelectMixinBase: CanDisableCtor &\r\n HasTabIndexCtor &\r\n CanUpdateErrorStateCtor &\r\n typeof OuiSelectBase = mixinTabIndex(\r\n mixinDisabled(mixinErrorState(OuiSelectBase))\r\n);\r\n\r\n/**\r\n * Allows the user to customize the trigger that is displayed when the select has a value.\r\n */\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: 'oui-select-trigger',\r\n})\r\nexport class OuiSelectTrigger {}\r\n\r\n@Component({\r\n selector: 'oui-select',\r\n exportAs: 'ouiSelect',\r\n templateUrl: 'select.html',\r\n styleUrls: ['select.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['disabled', 'tabIndex'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n role: 'listbox',\r\n '[attr.id]': 'id',\r\n '[attr.tabindex]': 'tabIndex',\r\n '[attr.aria-label]': '_getAriaLabel()',\r\n '[attr.aria-labelledby]': '_getAriaLabelledby()',\r\n '[attr.aria-required]': 'required.toString()',\r\n '[attr.aria-disabled]': 'disabled.toString()',\r\n '[attr.aria-invalid]': 'errorState',\r\n '[attr.aria-owns]': 'panelOpen ? _optionIds : null',\r\n '[attr.aria-multiselectable]': 'multiple',\r\n '[attr.aria-describedby]': '_ariaDescribedby || null',\r\n '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\r\n '[class.oui-select-disabled]': 'disabled',\r\n '[class.oui-select-invalid]': 'errorState',\r\n '[class.oui-select-required]': 'required',\r\n '[class.oui-select-empty]': 'empty',\r\n class: 'oui-select oui-input',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(focus)': '_onFocus()',\r\n '(blur)': '_onBlur()',\r\n },\r\n providers: [\r\n { provide: OuiFormFieldControl, useExisting: OuiSelect },\r\n { provide: OUI_OPTION_PARENT_COMPONENT, useExisting: OuiSelect },\r\n ],\r\n})\r\nexport class OuiSelect\r\n extends _OuiSelectMixinBase\r\n implements\r\n AfterContentInit,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n DoCheck,\r\n ControlValueAccessor,\r\n CanDisable,\r\n HasTabIndex,\r\n OuiFormFieldControl,\r\n CanUpdateErrorState\r\n{\r\n /**Holds selected values after done */\r\n @Input() savedValues = [];\r\n /**Done button disabled until dropdown is dirty */\r\n disableDoneButton = true;\r\n /** Whether or not the overlay panel is open. */\r\n private _panelOpen = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _required = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _actionItems = false;\r\n\r\n /** The scroll position of the overlay panel, calculated to center the selected option. */\r\n private _scrollTop = 0;\r\n\r\n /** The placeholder displayed in the trigger of the select. */\r\n private _placeholder: string;\r\n\r\n /** Whether the component is in multiple selection mode. */\r\n private _multiple = false;\r\n\r\n /** Search input field **/\r\n isSearchFieldPresent: boolean;\r\n\r\n /** Unique id for this input. */\r\n private _uid = `oui-select-${nextUniqueId++}`;\r\n\r\n /** The last measured value for the trigger's client bounding rect. */\r\n _triggerRect: ClientRect;\r\n\r\n /** The aria-describedby attribute on the select for improved a11y. */\r\n _ariaDescribedby: string;\r\n\r\n /** The cached font-size of the trigger element. */\r\n _triggerFontSize = 0;\r\n\r\n /** Deals with the selection logic. */\r\n _selectionModel: SelectionModel;\r\n\r\n /** Manages keyboard events for options in the panel. */\r\n _keyManager: ActiveDescendantKeyManager;\r\n\r\n /** The IDs of child options to be passed to the aria-owns attribute. */\r\n _optionIds = '';\r\n\r\n /** The value of the select panel's transform-origin property. */\r\n _transformOrigin = 'top';\r\n\r\n /** If there is search input field a class is added dynamically to the perfect scrollbar **/\r\n ouiSelectInputOuterClassName: string;\r\n\r\n /** Adding top class to overlay panel */\r\n cdkConnectionOverlayPanel = '';\r\n\r\n /**\r\n * The y-offset of the overlay panel in relation to the trigger's top start corner.\r\n * This must be adjusted to align the selected option text over the trigger text.\r\n * when the panel opens. Will change based on the y-position of the selected option.\r\n */\r\n _offsetY = 0;\r\n\r\n /**\r\n * This position config ensures that the top \"start\" corner of the overlay\r\n * is aligned with with the top \"start\" of the origin by default (overlapping\r\n * the trigger completely). If the panel cannot fit below the trigger, it\r\n * will fall back to a position above the trigger.\r\n */\r\n _positions = [\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n },\r\n ];\r\n /** Emits whenever the component is destroyed. */\r\n private readonly _destroy = new Subject();\r\n\r\n /** Whether the component is disabling centering of the active option over the trigger. */\r\n private _disableOptionCentering = false;\r\n\r\n private _focused = false;\r\n\r\n /** A name for this control that can be used by `oui-form-field`. */\r\n controlType = 'oui-select';\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('trigger') trigger: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddCancelButton', { read: ElementRef }) ddCancelButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddDoneButton', { read: ElementRef }) ddDoneButton: ElementRef;\r\n\r\n /** Panel containing the select options. */\r\n @ViewChild('panel', { read: ElementRef }) panel: ElementRef;\r\n\r\n private _value: any;\r\n\r\n /**\r\n * Function used to sort the values in a select in multiple mode.\r\n * Follows the same logic as `Array.prototype.sort`.\r\n */\r\n @Input() sortComparator: (\r\n a: OuiOption,\r\n b: OuiOption,\r\n options: OuiOption[]\r\n ) => number;\r\n\r\n /** Aria label of the select. If not specified, the placeholder will be used as label. */\r\n @Input('aria-label') ariaLabel = '';\r\n\r\n /** Input that can be used to specify the `aria-labelledby` attribute. */\r\n @Input('aria-labelledby') ariaLabelledby: string;\r\n private _large = false;\r\n _monitorSubscription: any;\r\n\r\n /** Whether the oui-select is of large size. */\r\n @Input()\r\n get large(): boolean {\r\n return this._large;\r\n }\r\n set large(value) {\r\n this._large = coerceBooleanProperty(value);\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n private _id: string;\r\n\r\n /** Event emitted when the select panel has been toggled. */\r\n @Output()\r\n readonly openedChange: EventEmitter = new EventEmitter();\r\n\r\n /** Combined stream of all of the child options' change events. */\r\n readonly optionSelectionChanges: Observable = defer(\r\n (): Observable => {\r\n if (this.options) {\r\n return merge(...this.options.map((option) => option.onSelectionChange));\r\n }\r\n\r\n return this._ngZone.onStable.asObservable().pipe(\r\n take(1),\r\n switchMap(() => this.optionSelectionChanges)\r\n );\r\n }\r\n );\r\n\r\n /**\r\n * Event that emits whenever the raw value of the select changes. This is here primarily\r\n * to facilitate the two-way binding for the `value` input.\r\n *\r\n * @docs-private\r\n */\r\n @Output() readonly valueChange: EventEmitter = new EventEmitter();\r\n\r\n /** Object used to control when error messages are shown. */\r\n @Input() errorStateMatcher: ErrorStateMatcher;\r\n\r\n /** All of the defined select options. */\r\n @ContentChildren(OuiOption, { descendants: true })\r\n options: QueryList;\r\n\r\n /** Event emitted when the select has been opened. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('opened')\r\n readonly _openedStream: Observable = this.openedChange.pipe(\r\n filter((o) => o),\r\n map(() => {})\r\n );\r\n\r\n /** Event emitted when the select has been closed. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('closed')\r\n readonly _closedStream: Observable = this.openedChange.pipe(\r\n filter((o) => !o),\r\n map(() => {\r\n this.isSearchFieldPresent = false;\r\n })\r\n );\r\n\r\n /** Event emitted when the selected value has been changed by the user. */\r\n @Output()\r\n readonly selectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the selected value has been changed and saved by the user. */\r\n @Output()\r\n readonly saveSelectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** All of the defined groups of options. */\r\n @ContentChildren(OuiOptgroup) optionGroups: QueryList;\r\n\r\n /** User-supplied override of the trigger element. */\r\n @ContentChild(OuiSelectTrigger)\r\n customTrigger: OuiSelectTrigger;\r\n\r\n /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */\r\n @Input() panelClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** Overlay pane containing the options. */\r\n @ViewChild(CdkConnectedOverlay)\r\n overlayDir: CdkConnectedOverlay;\r\n\r\n /** Emits when the panel element is finished transforming in. */\r\n _panelDoneAnimatingStream = new Subject();\r\n\r\n /** Comparison function to specify which option is displayed. Defaults to object equality. */\r\n private _compareWith = (o1: any, o2: any) => o1 === o2;\r\n\r\n /** Whether the select is focused. */\r\n get focused(): boolean {\r\n return this._focused || this._panelOpen;\r\n }\r\n /**\r\n * @deprecated Setter to be removed as this property is intended to be readonly.\r\n */\r\n set focused(value: boolean) {\r\n this._focused = value;\r\n }\r\n /** `View -> model callback called when value changes` */\r\n _onChange: (value: any) => void = () => {};\r\n\r\n /** `View -> model callback called when select has been touched` */\r\n _onTouched = () => {};\r\n\r\n /** Placeholder to be shown if no value has been selected. */\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the component is required. */\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the user should be allowed to select multiple options. */\r\n @Input()\r\n get multiple(): boolean {\r\n return this._multiple;\r\n }\r\n set multiple(value: boolean) {\r\n if (this._selectionModel) {\r\n throw getOuiSelectDynamicMultipleError();\r\n }\r\n\r\n this._multiple = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the action items are required and use saveSelectionChange instead of selectionChange. */\r\n @Input()\r\n get actionItems(): boolean {\r\n return this._actionItems;\r\n }\r\n set actionItems(value: boolean) {\r\n if (this._multiple) {\r\n this._actionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Whether to center the active option over the trigger. */\r\n @Input()\r\n get disableOptionCentering(): boolean {\r\n return this._disableOptionCentering;\r\n }\r\n set disableOptionCentering(value: boolean) {\r\n this._disableOptionCentering = coerceBooleanProperty(value);\r\n }\r\n\r\n /**\r\n * Function to compare the option values with the selected values. The first argument\r\n * is a value from an option. The second is a value from the selection. A boolean\r\n * should be returned.\r\n */\r\n @Input()\r\n get compareWith() {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (o1: any, o2: any) => boolean) {\r\n if (typeof fn !== 'function') {\r\n throw getOuiSelectNonFunctionValueError();\r\n }\r\n this._compareWith = fn;\r\n if (this._selectionModel) {\r\n // A different comparator means the selection could change.\r\n this._initializeSelection();\r\n }\r\n }\r\n\r\n /** Value of the select control. */\r\n @Input()\r\n get value(): any {\r\n return this._value;\r\n }\r\n set value(newValue: any) {\r\n if (newValue !== this._value) {\r\n this.writeValue(newValue);\r\n this._value = newValue;\r\n }\r\n }\r\n\r\n /** Unique id of the element. */\r\n @Input()\r\n get id(): string {\r\n return this._id;\r\n }\r\n set id(value: string) {\r\n this._id = value || this._uid;\r\n this.stateChanges.next();\r\n }\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _ngZone: NgZone,\r\n _defaultErrorStateMatcher: ErrorStateMatcher,\r\n elementRef: ElementRef,\r\n private _focusMonitor: FocusMonitor,\r\n @Optional() private _dir: Directionality,\r\n @Optional() _parentForm: NgForm,\r\n @Optional() _parentFormGroup: FormGroupDirective,\r\n @Optional() private _parentFormField: OuiFormField,\r\n @Self() @Optional() public ngControl: NgControl,\r\n @Attribute('tabindex') tabIndex: string,\r\n @Optional() @Inject(DOCUMENT) private _document: any,\r\n public _elementRef: ElementRef,\r\n public _ouiIconRegistry: OuiIconRegistry,\r\n private _domSanitizer: DomSanitizer\r\n ) {\r\n super(\r\n elementRef,\r\n _defaultErrorStateMatcher,\r\n _parentForm,\r\n _parentFormGroup,\r\n ngControl\r\n );\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this._elementRef, true)\r\n .subscribe(() => this._ngZone.run(() => {}));\r\n this._ouiIconRegistry.addSvgIconLiteral(\r\n `select-arrow-icon`,\r\n this._domSanitizer.bypassSecurityTrustHtml(ICONS.SELECT_ARROW_ICON)\r\n );\r\n\r\n if (this.ngControl) {\r\n // Note: we provide the value accessor through here, instead of\r\n // the `providers` to avoid running into a circular import.\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n this.tabIndex = parseInt(tabIndex, 10) || 0;\r\n\r\n // Force setter to be called in case id was not specified.\r\n this.id = this.id;\r\n }\r\n\r\n ngOnInit() {\r\n this._selectionModel = new SelectionModel(this.multiple);\r\n this.stateChanges.next();\r\n\r\n // We need `distinctUntilChanged` here, because some browsers will\r\n // fire the animation end event twice for the same animation. See:\r\n // https://github.com/angular/angular/issues/24084\r\n this._panelDoneAnimatingStream\r\n .pipe(distinctUntilChanged(), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n if (this.panelOpen) {\r\n this._scrollTop = 0;\r\n this.openedChange.emit(true);\r\n } else {\r\n this.openedChange.emit(false);\r\n this.overlayDir.offsetX = 0;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._initKeyManager();\r\n\r\n this._selectionModel.changed\r\n .pipe(takeUntil(this._destroy))\r\n .subscribe((event) => {\r\n event.added.forEach((option) => option.select());\r\n event.removed.forEach((option) => option.deselect());\r\n });\r\n\r\n this.options.changes\r\n .pipe(startWith(null), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n this._resetOptions();\r\n this._initializeSelection();\r\n });\r\n }\r\n\r\n ngDoCheck() {\r\n if (this.ngControl) {\r\n this.updateErrorState();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let\r\n // the parent form field know to run change detection when the disabled state changes.\r\n if (changes.disabled) {\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._monitorSubscription.unsubscribe();\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n this._destroy.next();\r\n this._destroy.complete();\r\n this.stateChanges.complete();\r\n }\r\n\r\n /** Toggles the overlay panel open or closed. */\r\n toggle(): void {\r\n this.panelOpen ? this.close() : this.open();\r\n }\r\n\r\n /** Opens the overlay panel. */\r\n open(): void {\r\n if (\r\n this.disabled ||\r\n !this.options ||\r\n !this.options.length ||\r\n this._panelOpen\r\n ) {\r\n return;\r\n }\r\n\r\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\r\n\r\n this._panelOpen = true;\r\n this._keyManager.withHorizontalOrientation(null);\r\n\r\n this._highlightCorrectOption();\r\n this._changeDetectorRef.markForCheck();\r\n this.openedChange.emit(true);\r\n this._elementRef.nativeElement.classList.add(\r\n 'oui-select-list-options-opened'\r\n );\r\n }\r\n\r\n /** Closes the overlay panel and focuses the host element. */\r\n close(): void {\r\n if (this._panelOpen) {\r\n this._panelOpen = false;\r\n this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');\r\n this._changeDetectorRef.markForCheck();\r\n this._onTouched();\r\n this.openedChange.emit(false);\r\n this._elementRef.nativeElement.classList.remove(\r\n 'oui-select-list-options-opened'\r\n );\r\n setTimeout((_) => this._document.activeElement.blur());\r\n }\r\n }\r\n\r\n /**\r\n * Sets the select's value. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param value New value to be written to the model.\r\n */\r\n writeValue(value: any): void {\r\n if (this.options) {\r\n this._setSelectionByValue(value);\r\n }\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select's value\r\n * changes from user input. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the value changes.\r\n */\r\n registerOnChange(fn: (value: any) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select is blurred\r\n * by the user. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the component has been touched.\r\n */\r\n registerOnTouched(fn: () => {}): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n /**\r\n * Disables the select. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param isDisabled Sets whether the component is disabled.\r\n */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether or not the overlay panel is open. */\r\n get panelOpen(): boolean {\r\n return this._panelOpen;\r\n }\r\n\r\n /** The currently selected option. */\r\n get selected(): OuiOption | OuiOption[] {\r\n return this.multiple\r\n ? this._selectionModel.selected\r\n : this._selectionModel.selected[0];\r\n }\r\n\r\n /** The value displayed in the trigger. */\r\n get triggerValue(): string {\r\n if (this.empty) {\r\n return '';\r\n }\r\n if (this._multiple) {\r\n const selectedOptions = this._selectionModel.selected.map(\r\n (option) => option.viewValueForSelect\r\n );\r\n\r\n if (this._isRtl()) {\r\n selectedOptions.reverse();\r\n }\r\n return selectedOptions.join(', ');\r\n }\r\n return this._selectionModel.selected[0].viewValueForSelect;\r\n }\r\n\r\n /** Whether the element is in RTL mode. */\r\n _isRtl(): boolean {\r\n return this._dir ? this._dir.value === 'rtl' : false;\r\n }\r\n\r\n /** Handles all keydown events on the select. */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (!this.disabled) {\r\n this.panelOpen\r\n ? this._handleOpenKeydown(event)\r\n : this._handleClosedKeydown(event);\r\n }\r\n }\r\n\r\n /** Handles keyboard events while the select is closed. */\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const keyCode = event.keyCode;\r\n const isArrowKey =\r\n keyCode === DOWN_ARROW ||\r\n keyCode === UP_ARROW ||\r\n keyCode === LEFT_ARROW ||\r\n keyCode === RIGHT_ARROW;\r\n const isOpenKey = keyCode === ENTER || keyCode === SPACE;\r\n const manager = this._keyManager;\r\n\r\n // Open the select on ALT + arrow key to match the native \r\n event.preventDefault();\r\n this.close();\r\n } else if (\r\n (keyCode === ENTER || keyCode === SPACE) &&\r\n manager.activeItem &&\r\n !hasModifierKey(event)\r\n ) {\r\n event.preventDefault();\r\n manager.activeItem._selectViaInteraction();\r\n } else if (this._multiple && keyCode === A && event.ctrlKey) {\r\n event.preventDefault();\r\n this.handleCtrlKey();\r\n } else if (normalNavigationCheck) {\r\n // Check for non multiple select dropdown that the key pressed is not Tab, Space, Enter\r\n if (!this.isSearchFieldPresent) this.focus();\r\n this.handleScrolling(manager, event, isArrowKey, keyCode);\r\n }\r\n }\r\n\r\n /**\r\n * Handle ctrl key\r\n */\r\n private handleCtrlKey() {\r\n const hasDeselectedOptions = this.options.some(\r\n (opt) => !opt.disabled && !opt.selected\r\n );\r\n\r\n this.options.forEach((option) => {\r\n if (!option.disabled) {\r\n hasDeselectedOptions ? option.select() : option.deselect();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @param manager\r\n * @param event\r\n * @param isArrowKey\r\n * @param keyCode\r\n */\r\n private handleScrolling(\r\n manager: ActiveDescendantKeyManager,\r\n event: KeyboardEvent,\r\n isArrowKey: boolean,\r\n keyCode: number\r\n ) {\r\n const previouslyFocusedIndex = manager.activeItemIndex;\r\n\r\n manager.onKeydown(event);\r\n\r\n if (\r\n this._multiple &&\r\n isArrowKey &&\r\n event.shiftKey &&\r\n manager.activeItem &&\r\n manager.activeItemIndex !== previouslyFocusedIndex\r\n ) {\r\n manager.activeItem._selectViaInteraction();\r\n }\r\n if (isArrowKey && manager.activeItemIndex !== previouslyFocusedIndex) {\r\n this._scrollToOption();\r\n } else {\r\n // First or last\r\n if (keyCode === DOWN_ARROW) {\r\n manager.setFirstItemActive();\r\n this._setScrollTop(0);\r\n }\r\n if (keyCode === UP_ARROW) {\r\n manager.setLastItemActive();\r\n this._scrollToOption();\r\n }\r\n }\r\n }\r\n\r\n _onFocus() {\r\n if (!this.disabled) {\r\n this._focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\r\n * \"blur\" to the panel when it opens, causing a false positive.\r\n */\r\n _onBlur() {\r\n this._focused = false;\r\n // this.isSearchFieldPresent = false;\r\n\r\n if (!this.disabled && !this.panelOpen) {\r\n this._onTouched();\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Callback that is invoked when the overlay panel has been attached.\r\n */\r\n _onAttached(): void {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {\r\n this._setPseudoCheckboxPaddingSize();\r\n this._changeDetectorRef.detectChanges();\r\n this.panel.nativeElement.scrollTop = this._scrollTop;\r\n });\r\n }\r\n\r\n /** Returns the theme to be used on the panel. */\r\n _getPanelTheme(): string {\r\n return this._parentFormField ? `oui-${this._parentFormField.color}` : '';\r\n }\r\n\r\n // TODO(josephperrott): Remove after 2018 spec updates are fully merged.\r\n /** Sets the pseudo checkbox padding size based on the width of the pseudo checkbox. */\r\n private _setPseudoCheckboxPaddingSize() {\r\n if (!SELECT_MULTIPLE_PANEL_PADDING_X && this.multiple) {\r\n const pseudoCheckbox = this.panel.nativeElement.querySelector(\r\n '.oui-pseudo-checkbox'\r\n );\r\n if (pseudoCheckbox) {\r\n SELECT_MULTIPLE_PANEL_PADDING_X =\r\n SELECT_PANEL_PADDING_X * 1.5 + pseudoCheckbox.offsetWidth;\r\n }\r\n }\r\n }\r\n\r\n /** Whether the select has a value. */\r\n get empty(): boolean {\r\n return !this._selectionModel || this._selectionModel.isEmpty();\r\n }\r\n\r\n private _initializeSelection(): void {\r\n // Defer setting the value in order to avoid the \"Expression\r\n // has changed after it was checked\" errors from Angular.\r\n Promise.resolve().then(() => {\r\n this._setSelectionByValue(\r\n this.ngControl ? this.ngControl.value : this._value\r\n );\r\n this.savedValues = this.ngControl ? this.ngControl.value : this._value;\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the selected option based on a value. If no option can be\r\n * found with the designated value, the select trigger is cleared.\r\n */\r\n private _setSelectionByValue(value: any | any[]): void {\r\n if (this.multiple && value) {\r\n if (!Array.isArray(value)) {\r\n throw getOuiSelectNonArrayValueError();\r\n }\r\n\r\n this._selectionModel.clear();\r\n value.forEach((currentValue: any) => this._selectValue(currentValue));\r\n this._sortValues();\r\n } else {\r\n this._selectionModel.clear();\r\n const correspondingOption = this._selectValue(value);\r\n // Shift focus to the active item. Note that we shouldn't do this in multiple\r\n // mode, because we don't know what option the user interacted with last.\r\n if (correspondingOption) {\r\n this._keyManager.setActiveItem(correspondingOption);\r\n }\r\n }\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /**\r\n * Finds and selects and option based on its value.\r\n *\r\n * @returns Option that has the corresponding value.\r\n */\r\n private _selectValue(value: any): OuiOption | undefined {\r\n const correspondingOption = this.options.find((option: OuiOption) => {\r\n try {\r\n // Treat null as a special reset value.\r\n return option.value != null && this._compareWith(option.value, value);\r\n } catch (error) {\r\n if (isDevMode()) {\r\n // Notify developers of errors in their comparator.\r\n console.warn(error);\r\n }\r\n return false;\r\n }\r\n });\r\n\r\n if (correspondingOption) {\r\n this._selectionModel.select(correspondingOption);\r\n }\r\n\r\n return correspondingOption;\r\n }\r\n\r\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\r\n private _initKeyManager() {\r\n this._keyManager = new ActiveDescendantKeyManager(this.options)\r\n .withTypeAhead()\r\n .withVerticalOrientation()\r\n .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')\r\n .withAllowedModifierKeys(['shiftKey']);\r\n\r\n this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n // Restore focus to the trigger before closing. Ensures that the focus\r\n // position won't be lost if the user got focus into the overlay.\r\n this.focus();\r\n this.close();\r\n });\r\n\r\n this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n if (this._panelOpen && this.panel) {\r\n // Panel is opened\r\n // Need not to scroll\r\n } else if (\r\n !this._panelOpen &&\r\n !this.multiple &&\r\n this._keyManager.activeItem\r\n ) {\r\n this._keyManager.activeItem._selectViaInteraction();\r\n }\r\n });\r\n }\r\n\r\n /** Drops current option subscriptions and IDs and resets from scratch. */\r\n private _resetOptions(): void {\r\n const changedOrDestroyed = merge(this.options.changes, this._destroy);\r\n\r\n this.optionSelectionChanges\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe((event) => {\r\n this._onSelect(event.source, event.isUserInput);\r\n\r\n if (event.isUserInput && !this.multiple && this._panelOpen) {\r\n this.close();\r\n this.focus();\r\n }\r\n });\r\n\r\n // Listen to changes in the internal state of the options and react accordingly.\r\n // Handles cases like the labels of the selected options changing.\r\n merge(...this.options.map((option) => option._stateChanges))\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe(() => {\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n });\r\n\r\n this._setOptionIds();\r\n }\r\n\r\n /** Invoked when an option is clicked. */\r\n private _onSelect(option: OuiOption, isUserInput: boolean): void {\r\n const wasSelected = this._selectionModel.isSelected(option);\r\n\r\n if (option.value == null && !this._multiple) {\r\n option.deselect();\r\n this._selectionModel.clear();\r\n this._propagateChanges(option.value);\r\n } else {\r\n option.selected\r\n ? this._selectionModel.select(option)\r\n : this._selectionModel.deselect(option);\r\n\r\n if (isUserInput) {\r\n this._keyManager.setActiveItem(option);\r\n }\r\n\r\n if (this.multiple) {\r\n this._sortValues();\r\n\r\n if (isUserInput) {\r\n // In case the user selected the option with their mouse, we\r\n // want to restore focus back to the trigger, in order to\r\n // prevent the select keyboard controls from clashing with\r\n // the ones from `oui-option`.\r\n this.focus();\r\n }\r\n }\r\n }\r\n\r\n if (wasSelected !== this._selectionModel.isSelected(option)) {\r\n this._propagateChanges();\r\n }\r\n this.disableDoneButton = false;\r\n this.stateChanges.next();\r\n }\r\n discardRecentChanges() {\r\n this.value = this.savedValues;\r\n this._setSelectionByValue(this.value);\r\n this.disableDoneButton = true;\r\n this.close();\r\n }\r\n doneRecentChanges() {\r\n this.savedValues = this.value;\r\n this.disableDoneButton = true;\r\n this.saveSelectionChange.emit(new OuiSelectChange(this, this.value));\r\n this.close();\r\n }\r\n /** Sorts the selected values in the selected based on their order in the panel. */\r\n private _sortValues() {\r\n if (this.multiple) {\r\n const options = this.options.toArray();\r\n\r\n this._selectionModel.sort((a, b) =>\r\n this.sortComparator\r\n ? this.sortComparator(a, b, options)\r\n : options.indexOf(a) - options.indexOf(b)\r\n );\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Emits change event to set the model value. */\r\n private _propagateChanges(fallbackValue?: any): void {\r\n let valueToEmit: any = null;\r\n\r\n if (this.multiple) {\r\n valueToEmit = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n } else {\r\n valueToEmit = this.selected\r\n ? (this.selected as OuiOption).value\r\n : fallbackValue;\r\n }\r\n\r\n this._value = valueToEmit;\r\n this.valueChange.emit(valueToEmit);\r\n this._onChange(valueToEmit);\r\n this.selectionChange.emit(new OuiSelectChange(this, valueToEmit));\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /** Records option IDs to pass to the aria-owns property. */\r\n private _setOptionIds() {\r\n this._optionIds = this.options.map((option) => option.id).join(' ');\r\n }\r\n\r\n /**\r\n * Highlights the selected item. If no option is selected, it will highlight\r\n * the first item instead.\r\n */\r\n private _highlightCorrectOption(): void {\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n } else if (this._keyManager) {\r\n if (this.empty) {\r\n this._keyManager.setFirstItemActive();\r\n } else {\r\n this._keyManager.setActiveItem(this._selectionModel.selected[0]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Highlights the first of the filtered options if no element is currently highlighted\r\n */\r\n private _highlightFirstFilteredOption(): void {\r\n if (this._keyManager) {\r\n const activeElement = this._keyManager.activeItem?._getHostElement();\r\n // activeElement is not part of DOM if there is no parent element\r\n if (!activeElement || !activeElement.parentElement) {\r\n // highlight first element if there is no active element or active element is not part of DOM\r\n this._keyManager.setFirstItemActive();\r\n }\r\n }\r\n }\r\n\r\n /** Focuses the select element. */\r\n focus(): void {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n\r\n /** Returns the aria-label of the select component. */\r\n _getAriaLabel(): string | null {\r\n // If an ariaLabelledby value has been set by the consumer, the select should not overwrite the\r\n // `aria-labelledby` value by setting the ariaLabel to the placeholder.\r\n return this.ariaLabelledby ? null : this.ariaLabel || this.placeholder;\r\n }\r\n\r\n /** Returns the aria-labelledby of the select component. */\r\n _getAriaLabelledby(): string | null {\r\n if (this.ariaLabelledby) {\r\n return this.ariaLabelledby;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Determines the `aria-activedescendant` to be set on the host. */\r\n _getAriaActiveDescendant(): string | null {\r\n if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\r\n return this._keyManager.activeItem.id;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n setDescribedByIds(ids: string[]) {\r\n this._ariaDescribedby = ids.join(' ');\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n onContainerClick() {\r\n this.focus();\r\n this.open();\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n get shouldLabelFloat(): boolean {\r\n return this._panelOpen || !this.empty;\r\n }\r\n\r\n /**\r\n * Add outer class to perfect scrollbar\r\n * This is added only when there is a search field\r\n */\r\n ouiSelectInputOuter() {\r\n this.ouiSelectInputOuterClassName = 'oui-select-input-outer';\r\n }\r\n\r\n /**\r\n * Custom overlay class for cdk overlay container\r\n */\r\n openCdk() {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe((e) => {\r\n this.cdkConnectionOverlayPanel = '';\r\n if (e.connectionPair.originY === 'top') {\r\n this.cdkConnectionOverlayPanel = 'select-overlay-top';\r\n }\r\n this._changeDetectorRef.detectChanges();\r\n setTimeout((_) => this._scrollToOption());\r\n });\r\n\r\n const cdkOverLayContainer = this._document.querySelector(\r\n '.cdk-overlay-container'\r\n );\r\n const ouiSelectPanel = this._document.querySelector('.oui-select-panel');\r\n cdkOverLayContainer.classList.add('oui-select-overlay-container');\r\n const containerWidth = this._elementRef.nativeElement.offsetWidth;\r\n ouiSelectPanel.style.width = `${containerWidth}px`;\r\n const searchQueryString = '.oui-select-search-inner';\r\n if (this._document.querySelector(searchQueryString)) {\r\n this.scrollCalc(searchQueryString);\r\n }\r\n const actionItemsQueryString = '.oui-select-action-items';\r\n if (this._document.querySelector(actionItemsQueryString)) {\r\n this.scrollCalc(actionItemsQueryString);\r\n }\r\n }\r\n scrollCalc(selectQueryString: string) {\r\n const searchInput = this._document.querySelector(selectQueryString);\r\n const outter = this._document.querySelector('.oui-select-panel');\r\n let inner = this._document.querySelector('.oui-option');\r\n if (inner === null) {\r\n inner = 0;\r\n }\r\n const scrollbarWidth = outter.offsetWidth - inner.offsetWidth;\r\n if (scrollbarWidth > 5) {\r\n searchInput.style.width = `${inner.offsetWidth}px`;\r\n } else {\r\n searchInput.style.width = `calc(100% + 8px)`;\r\n }\r\n }\r\n\r\n /**\r\n * Given that we are not actually focusing active options, we must manually adjust scroll\r\n * to reveal options below the fold. First, we find the offset of the option from the top\r\n * of the panel. If that offset is below the fold, the new scrollTop will be the offset -\r\n * the panel height + the option height, so the active option will be just visible at the\r\n * bottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\r\n * will become the offset. If that offset is visible within the panel already, the scrollTop is\r\n * not adjusted.\r\n */\r\n private _scrollToOption(): void {\r\n const manager = this._keyManager;\r\n const index = manager.activeItemIndex || 0;\r\n const labelCount = _countGroupLabelsBeforeOption(\r\n index,\r\n this.options,\r\n this.optionGroups\r\n );\r\n const scrollTop = this._getScrollTop();\r\n const newScrollPosition = _getOptionScrollPosition(\r\n index + labelCount,\r\n SELECT_OPTION_HEIGHT,\r\n scrollTop,\r\n SELECT_PANEL_HEIGHT\r\n );\r\n this._setScrollTop(newScrollPosition);\r\n }\r\n\r\n /**\r\n * Sets the panel scrollTop. This allows us to manually scroll to display options\r\n * above or below the fold, as they are not actually being focused when active.\r\n */\r\n _setScrollTop(scrollTop: number): void {\r\n if (this.panel) {\r\n this.panel.nativeElement.scrollTop = scrollTop;\r\n }\r\n }\r\n\r\n /** Returns the panel's scrollTop. */\r\n _getScrollTop(): number {\r\n return this.panel ? this.panel.nativeElement.scrollTop : 0;\r\n }\r\n}\r\n", + "sourceCode": "import { ActiveDescendantKeyManager, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { SelectionModel } from '@angular/cdk/collections';\r\nimport {\r\n A,\r\n DOWN_ARROW,\r\n END,\r\n ENTER,\r\n HOME,\r\n LEFT_ARROW,\r\n RIGHT_ARROW,\r\n SPACE,\r\n UP_ARROW,\r\n hasModifierKey,\r\n TAB,\r\n} from '@angular/cdk/keycodes';\r\nimport { CdkConnectedOverlay } from '@angular/cdk/overlay';\r\nimport {\r\n AfterContentInit,\r\n Attribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n ContentChildren,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n isDevMode,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n QueryList,\r\n Self,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n Inject,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n} from '@angular/forms';\r\nimport {\r\n _countGroupLabelsBeforeOption,\r\n _getOptionScrollPosition,\r\n CanDisable,\r\n CanDisableCtor,\r\n CanUpdateErrorState,\r\n CanUpdateErrorStateCtor,\r\n HasTabIndex,\r\n HasTabIndexCtor,\r\n OuiOptionSelectionChange,\r\n mixinErrorState,\r\n mixinTabIndex,\r\n mixinDisabled,\r\n} from '../core';\r\nimport { OuiFormField, OuiFormFieldControl } from '../form-field/public-api';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { OUI_OPTION_PARENT_COMPONENT, OuiOption } from '../core/option/option';\r\nimport { OuiOptgroup } from '../core/option/optgroup';\r\nimport { ErrorStateMatcher } from '../core/error/error-options';\r\nimport { defer, merge, Observable, Subject } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n filter,\r\n map,\r\n startWith,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n} from 'rxjs/operators';\r\nimport {\r\n getOuiSelectDynamicMultipleError,\r\n getOuiSelectNonArrayValueError,\r\n getOuiSelectNonFunctionValueError,\r\n} from './select-errors';\r\nimport { OuiIconRegistry } from '../icon/icon-registery';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ICONS } from '../core/shared/icons';\r\n\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * The following style constants are necessary to save here in order\r\n * to properly calculate the alignment of the selected option over\r\n * the trigger element.\r\n */\r\n\r\n/** The height of each select option. */\r\nexport const SELECT_OPTION_HEIGHT = 40;\r\n\r\n/** The panel's padding on the x-axis */\r\nexport const SELECT_PANEL_PADDING_X = 16;\r\n\r\n/** The panel's x axis padding if it is indented (e.g. there is an option group). */\r\nexport const SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;\r\n\r\n/** The height of the select items in `em` units. */\r\nexport const SELECT_ITEM_HEIGHT_EM = 3;\r\n\r\n/** The total height of the select panel. */\r\nexport const SELECT_PANEL_HEIGHT = 200;\r\n\r\n// TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.\r\n/**\r\n * Distance between the panel edge and the option text in\r\n * multi-selection mode.\r\n *\r\n * Calculated as:\r\n * (SELECT_PANEL_PADDING_X * 1.5) + 20 = 44\r\n * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.\r\n * The checkbox width is 16px.\r\n */\r\nexport let SELECT_MULTIPLE_PANEL_PADDING_X = 0;\r\n\r\n/**\r\n * The select panel will only \"fit\" inside the viewport if it is positioned at\r\n * this value or more away from the viewport boundary.\r\n */\r\nexport const SELECT_PANEL_VIEWPORT_PADDING = 8;\r\n\r\n/** Change event object that is emitted when the select value has changed. */\r\nexport class OuiSelectChange {\r\n constructor(\r\n /** Reference to the select that emitted the change event. */\r\n public source: OuiSelect,\r\n /** Current value of the select that emitted the event. */\r\n public value: any\r\n ) {}\r\n}\r\n\r\n// Boilerplate for applying mixins to OuiSelect.\r\n/** @docs-private */\r\nexport class OuiSelectBase {\r\n constructor(\r\n public _elementRef: ElementRef,\r\n public _defaultErrorStateMatcher: ErrorStateMatcher,\r\n public _parentForm: NgForm,\r\n public _parentFormGroup: FormGroupDirective,\r\n public ngControl: NgControl\r\n ) {}\r\n}\r\n\r\nexport const _OuiSelectMixinBase: CanDisableCtor &\r\n HasTabIndexCtor &\r\n CanUpdateErrorStateCtor &\r\n typeof OuiSelectBase = mixinTabIndex(\r\n mixinDisabled(mixinErrorState(OuiSelectBase))\r\n);\r\n\r\n/**\r\n * Allows the user to customize the trigger that is displayed when the select has a value.\r\n */\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: 'oui-select-trigger',\r\n})\r\nexport class OuiSelectTrigger {}\r\n\r\n@Component({\r\n selector: 'oui-select',\r\n exportAs: 'ouiSelect',\r\n templateUrl: 'select.html',\r\n styleUrls: ['select.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['disabled', 'tabIndex'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n role: 'listbox',\r\n '[attr.id]': 'id',\r\n '[attr.tabindex]': 'tabIndex',\r\n '[attr.aria-label]': '_getAriaLabel()',\r\n '[attr.aria-labelledby]': '_getAriaLabelledby()',\r\n '[attr.aria-required]': 'required.toString()',\r\n '[attr.aria-disabled]': 'disabled.toString()',\r\n '[attr.aria-invalid]': 'errorState',\r\n '[attr.aria-owns]': 'panelOpen ? _optionIds : null',\r\n '[attr.aria-multiselectable]': 'multiple',\r\n '[attr.aria-describedby]': '_ariaDescribedby || null',\r\n '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\r\n '[class.oui-select-disabled]': 'disabled',\r\n '[class.oui-select-invalid]': 'errorState',\r\n '[class.oui-select-required]': 'required',\r\n '[class.oui-select-empty]': 'empty',\r\n class: 'oui-select oui-input',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(focus)': '_onFocus()',\r\n '(blur)': '_onBlur()',\r\n },\r\n providers: [\r\n { provide: OuiFormFieldControl, useExisting: OuiSelect },\r\n { provide: OUI_OPTION_PARENT_COMPONENT, useExisting: OuiSelect },\r\n ],\r\n})\r\nexport class OuiSelect\r\n extends _OuiSelectMixinBase\r\n implements\r\n AfterContentInit,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n DoCheck,\r\n ControlValueAccessor,\r\n CanDisable,\r\n HasTabIndex,\r\n OuiFormFieldControl,\r\n CanUpdateErrorState\r\n{\r\n /**Holds selected values after done */\r\n @Input() savedValues = [];\r\n /**Done button disabled until dropdown is dirty */\r\n disableDoneButton = true;\r\n /** Whether or not the overlay panel is open. */\r\n private _panelOpen = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _required = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _actionItems = false;\r\n private _singleActionItems = false;\r\n\r\n /** The scroll position of the overlay panel, calculated to center the selected option. */\r\n private _scrollTop = 0;\r\n\r\n /** The placeholder displayed in the trigger of the select. */\r\n private _placeholder: string;\r\n\r\n /** The label displayed on the cancel button of the select in case of multi-select. */\r\n private _cancelLabel = 'Cancel';\r\n\r\n /** The label displayed on the done button of the select in case of multi-select. */\r\n private _doneLabel = 'Done';\r\n\r\n /** The label displayed on the singleSelect and multiSelect of the select as a actionItem. */\r\n private _singleActionLabel = 'New action button';\r\n\r\n /** Whether the component is in multiple selection mode. */\r\n private _multiple = false;\r\n\r\n /** In multiple selection mode, enable Done button even in case of no option selected */\r\n private _allowNoSelection = false;\r\n\r\n /** Search input field **/\r\n isSearchFieldPresent: boolean;\r\n\r\n /** Unique id for this input. */\r\n private _uid = `oui-select-${nextUniqueId++}`;\r\n\r\n /** The last measured value for the trigger's client bounding rect. */\r\n _triggerRect: ClientRect;\r\n\r\n /** The aria-describedby attribute on the select for improved a11y. */\r\n _ariaDescribedby: string;\r\n\r\n /** The cached font-size of the trigger element. */\r\n _triggerFontSize = 0;\r\n\r\n /** Deals with the selection logic. */\r\n _selectionModel: SelectionModel;\r\n\r\n /** Manages keyboard events for options in the panel. */\r\n _keyManager: ActiveDescendantKeyManager;\r\n\r\n /** The IDs of child options to be passed to the aria-owns attribute. */\r\n _optionIds = '';\r\n\r\n /** The value of the select panel's transform-origin property. */\r\n _transformOrigin = 'top';\r\n\r\n /** If there is search input field a class is added dynamically to the perfect scrollbar **/\r\n ouiSelectInputOuterClassName: string;\r\n\r\n /** Adding top class to overlay panel */\r\n cdkConnectionOverlayPanel = '';\r\n\r\n /**\r\n * The y-offset of the overlay panel in relation to the trigger's top start corner.\r\n * This must be adjusted to align the selected option text over the trigger text.\r\n * when the panel opens. Will change based on the y-position of the selected option.\r\n */\r\n _offsetY = 0;\r\n\r\n /**\r\n * This position config ensures that the top \"start\" corner of the overlay\r\n * is aligned with with the top \"start\" of the origin by default (overlapping\r\n * the trigger completely). If the panel cannot fit below the trigger, it\r\n * will fall back to a position above the trigger.\r\n */\r\n _positions = [\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n },\r\n ];\r\n /** Emits whenever the component is destroyed. */\r\n private readonly _destroy = new Subject();\r\n\r\n /** Whether the component is disabling centering of the active option over the trigger. */\r\n private _disableOptionCentering = false;\r\n\r\n private _focused = false;\r\n\r\n /** A name for this control that can be used by `oui-form-field`. */\r\n controlType = 'oui-select';\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('trigger') trigger: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddCancelButton', { read: ElementRef }) ddCancelButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddDoneButton', { read: ElementRef }) ddDoneButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('singleButton', { read: ElementRef }) singleButton: ElementRef;\r\n\r\n /** Panel containing the select options. */\r\n @ViewChild('panel', { read: ElementRef }) panel: ElementRef;\r\n\r\n private _value: any;\r\n\r\n /**\r\n * Function used to sort the values in a select in multiple mode.\r\n * Follows the same logic as `Array.prototype.sort`.\r\n */\r\n @Input() sortComparator: (\r\n a: OuiOption,\r\n b: OuiOption,\r\n options: OuiOption[]\r\n ) => number;\r\n\r\n /** Aria label of the select. If not specified, the placeholder will be used as label. */\r\n @Input('aria-label') ariaLabel = '';\r\n\r\n /** Input that can be used to specify the `aria-labelledby` attribute. */\r\n @Input('aria-labelledby') ariaLabelledby: string;\r\n private _large = false;\r\n _monitorSubscription: any;\r\n\r\n /** Whether the oui-select is of large size. */\r\n @Input()\r\n get large(): boolean {\r\n return this._large;\r\n }\r\n set large(value) {\r\n this._large = coerceBooleanProperty(value);\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n private _id: string;\r\n\r\n /** Event emitted when the select panel has been toggled. */\r\n @Output()\r\n readonly openedChange: EventEmitter = new EventEmitter();\r\n\r\n /** Combined stream of all of the child options' change events. */\r\n readonly optionSelectionChanges: Observable = defer(\r\n (): Observable => {\r\n if (this.options) {\r\n return merge(...this.options.map((option) => option.onSelectionChange));\r\n }\r\n\r\n return this._ngZone.onStable.asObservable().pipe(\r\n take(1),\r\n switchMap(() => this.optionSelectionChanges)\r\n );\r\n }\r\n );\r\n\r\n /**\r\n * Event that emits whenever the raw value of the select changes. This is here primarily\r\n * to facilitate the two-way binding for the `value` input.\r\n *\r\n * @docs-private\r\n */\r\n @Output() readonly valueChange: EventEmitter = new EventEmitter();\r\n\r\n /** Object used to control when error messages are shown. */\r\n @Input() errorStateMatcher: ErrorStateMatcher;\r\n\r\n /** All of the defined select options. */\r\n @ContentChildren(OuiOption, { descendants: true })\r\n options: QueryList;\r\n\r\n /** Event emitted when the select has been opened. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('opened')\r\n readonly _openedStream: Observable = this.openedChange.pipe(\r\n filter((o) => o),\r\n map(() => {})\r\n );\r\n\r\n /** Event emitted when the select has been closed. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('closed')\r\n readonly _closedStream: Observable = this.openedChange.pipe(\r\n filter((o) => !o),\r\n map(() => {\r\n this.isSearchFieldPresent = false;\r\n })\r\n );\r\n\r\n /** Event emitted when the selected value has been changed by the user. */\r\n @Output()\r\n readonly selectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the selected value has been changed and saved by the user. */\r\n @Output()\r\n readonly saveSelectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Can pass any method to be triggered on singleActionItem click. */\r\n @Output()\r\n readonly singleSelectionChange = new EventEmitter();\r\n\r\n /** All of the defined groups of options. */\r\n @ContentChildren(OuiOptgroup) optionGroups: QueryList;\r\n\r\n /** User-supplied override of the trigger element. */\r\n @ContentChild(OuiSelectTrigger)\r\n customTrigger: OuiSelectTrigger;\r\n\r\n /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */\r\n @Input() panelClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** Overlay pane containing the options. */\r\n @ViewChild(CdkConnectedOverlay)\r\n overlayDir: CdkConnectedOverlay;\r\n\r\n /** Emits when the panel element is finished transforming in. */\r\n _panelDoneAnimatingStream = new Subject();\r\n\r\n /** Comparison function to specify which option is displayed. Defaults to object equality. */\r\n private _compareWith = (o1: any, o2: any) => o1 === o2;\r\n\r\n /** Whether the select is focused. */\r\n get focused(): boolean {\r\n return this._focused || this._panelOpen;\r\n }\r\n /**\r\n * @deprecated Setter to be removed as this property is intended to be readonly.\r\n */\r\n set focused(value: boolean) {\r\n this._focused = value;\r\n }\r\n /** `View -> model callback called when value changes` */\r\n _onChange: (value: any) => void = () => {};\r\n\r\n /** `View -> model callback called when select has been touched` */\r\n _onTouched = () => {};\r\n\r\n /** Placeholder to be shown if no value has been selected. */\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of multiple the cancelLabel to be shown on cancel action button. */\r\n @Input()\r\n get cancelLabel(): string {\r\n return this._cancelLabel;\r\n }\r\n set cancelLabel(value: string) {\r\n this._cancelLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of multiple the doneLabel to be shown on apply action button. */\r\n @Input()\r\n get doneLabel(): string {\r\n return this._doneLabel;\r\n }\r\n set doneLabel(value: string) {\r\n this._doneLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of singleSelect and multiSelect the singleActionLabel to be shown on actionItem. */\r\n @Input()\r\n get singleActionLabel(): string {\r\n return this._singleActionLabel;\r\n }\r\n set singleActionLabel(value: string) {\r\n this._singleActionLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the component is required. */\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the user should be allowed to select multiple options. */\r\n @Input()\r\n get multiple(): boolean {\r\n return this._multiple;\r\n }\r\n set multiple(value: boolean) {\r\n if (this._selectionModel) {\r\n throw getOuiSelectDynamicMultipleError();\r\n }\r\n\r\n this._multiple = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the user should be allowed to select no option in case of multiple options. */\r\n @Input()\r\n get allowNoSelection(): boolean {\r\n return this._allowNoSelection;\r\n }\r\n set allowNoSelection(value: boolean) {\r\n this._allowNoSelection = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the action items are required and use saveSelectionChange instead of selectionChange. */\r\n @Input()\r\n get actionItems(): boolean {\r\n return this._actionItems;\r\n }\r\n set actionItems(value: boolean) {\r\n if (this._multiple) {\r\n this._actionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n @Input()\r\n get singleActionItem(): boolean {\r\n return this._singleActionItems;\r\n }\r\n set singleActionItem(value: boolean) {\r\n this._singleActionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether to center the active option over the trigger. */\r\n @Input()\r\n get disableOptionCentering(): boolean {\r\n return this._disableOptionCentering;\r\n }\r\n set disableOptionCentering(value: boolean) {\r\n this._disableOptionCentering = coerceBooleanProperty(value);\r\n }\r\n\r\n /**\r\n * Function to compare the option values with the selected values. The first argument\r\n * is a value from an option. The second is a value from the selection. A boolean\r\n * should be returned.\r\n */\r\n @Input()\r\n get compareWith() {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (o1: any, o2: any) => boolean) {\r\n if (typeof fn !== 'function') {\r\n throw getOuiSelectNonFunctionValueError();\r\n }\r\n this._compareWith = fn;\r\n if (this._selectionModel) {\r\n // A different comparator means the selection could change.\r\n this._initializeSelection();\r\n }\r\n }\r\n\r\n /** Value of the select control. */\r\n @Input()\r\n get value(): any {\r\n return this._value;\r\n }\r\n set value(newValue: any) {\r\n if (newValue !== this._value) {\r\n this.writeValue(newValue);\r\n this._value = newValue;\r\n }\r\n }\r\n\r\n /** Unique id of the element. */\r\n @Input()\r\n get id(): string {\r\n return this._id;\r\n }\r\n set id(value: string) {\r\n this._id = value || this._uid;\r\n this.stateChanges.next();\r\n }\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _ngZone: NgZone,\r\n _defaultErrorStateMatcher: ErrorStateMatcher,\r\n elementRef: ElementRef,\r\n private _focusMonitor: FocusMonitor,\r\n @Optional() private _dir: Directionality,\r\n @Optional() _parentForm: NgForm,\r\n @Optional() _parentFormGroup: FormGroupDirective,\r\n @Optional() private _parentFormField: OuiFormField,\r\n @Self() @Optional() public ngControl: NgControl,\r\n @Attribute('tabindex') tabIndex: string,\r\n @Optional() @Inject(DOCUMENT) private _document: any,\r\n public _elementRef: ElementRef,\r\n public _ouiIconRegistry: OuiIconRegistry,\r\n private _domSanitizer: DomSanitizer\r\n ) {\r\n super(\r\n elementRef,\r\n _defaultErrorStateMatcher,\r\n _parentForm,\r\n _parentFormGroup,\r\n ngControl\r\n );\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this._elementRef, true)\r\n .subscribe(() => this._ngZone.run(() => {}));\r\n this._ouiIconRegistry.addSvgIconLiteral(\r\n `select-arrow-icon`,\r\n this._domSanitizer.bypassSecurityTrustHtml(ICONS.SELECT_ARROW_ICON)\r\n );\r\n\r\n if (this.ngControl) {\r\n // Note: we provide the value accessor through here, instead of\r\n // the `providers` to avoid running into a circular import.\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n this.tabIndex = parseInt(tabIndex, 10) || 0;\r\n\r\n // Force setter to be called in case id was not specified.\r\n this.id = this.id;\r\n }\r\n\r\n ngOnInit() {\r\n this._selectionModel = new SelectionModel(this.multiple);\r\n this.stateChanges.next();\r\n\r\n // We need `distinctUntilChanged` here, because some browsers will\r\n // fire the animation end event twice for the same animation. See:\r\n // https://github.com/angular/angular/issues/24084\r\n this._panelDoneAnimatingStream\r\n .pipe(distinctUntilChanged(), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n if (this.panelOpen) {\r\n this._scrollTop = 0;\r\n this.openedChange.emit(true);\r\n } else {\r\n this.openedChange.emit(false);\r\n this.overlayDir.offsetX = 0;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._initKeyManager();\r\n\r\n this._selectionModel.changed\r\n .pipe(takeUntil(this._destroy))\r\n .subscribe((event) => {\r\n event.added.forEach((option) => option.select());\r\n event.removed.forEach((option) => option.deselect());\r\n });\r\n\r\n this.options.changes\r\n .pipe(startWith(null), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n this._resetOptions();\r\n this._initializeSelection();\r\n });\r\n }\r\n\r\n ngDoCheck() {\r\n if (this.ngControl) {\r\n this.updateErrorState();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let\r\n // the parent form field know to run change detection when the disabled state changes.\r\n if (changes.disabled) {\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._monitorSubscription.unsubscribe();\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n this._destroy.next();\r\n this._destroy.complete();\r\n this.stateChanges.complete();\r\n }\r\n\r\n /** Toggles the overlay panel open or closed. */\r\n toggle(): void {\r\n if (this.panelOpen) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /** Opens the overlay panel. */\r\n open(): void {\r\n if (\r\n this.disabled ||\r\n !this.options ||\r\n !this.options.length ||\r\n this._panelOpen\r\n ) {\r\n return;\r\n }\r\n\r\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\r\n\r\n this._panelOpen = true;\r\n this._keyManager.withHorizontalOrientation(null);\r\n\r\n this._highlightCorrectOption();\r\n this._changeDetectorRef.markForCheck();\r\n this.openedChange.emit(true);\r\n this._elementRef.nativeElement.classList.add(\r\n 'oui-select-list-options-opened'\r\n );\r\n }\r\n\r\n /** Closes the overlay panel and focuses the host element. */\r\n close(): void {\r\n if (this._panelOpen) {\r\n this._panelOpen = false;\r\n this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');\r\n this._changeDetectorRef.markForCheck();\r\n this._onTouched();\r\n this.openedChange.emit(false);\r\n this._elementRef.nativeElement.classList.remove(\r\n 'oui-select-list-options-opened'\r\n );\r\n setTimeout((_) => this._document.activeElement.blur());\r\n }\r\n }\r\n\r\n /**\r\n * Sets the select's value. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param value New value to be written to the model.\r\n */\r\n writeValue(value: any): void {\r\n if (this.options) {\r\n this._setSelectionByValue(value);\r\n }\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select's value\r\n * changes from user input. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the value changes.\r\n */\r\n registerOnChange(fn: (value: any) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select is blurred\r\n * by the user. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the component has been touched.\r\n */\r\n registerOnTouched(fn: () => {}): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n /**\r\n * Disables the select. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param isDisabled Sets whether the component is disabled.\r\n */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether or not the overlay panel is open. */\r\n get panelOpen(): boolean {\r\n return this._panelOpen;\r\n }\r\n\r\n /** The currently selected option. */\r\n get selected(): OuiOption | OuiOption[] {\r\n return this.multiple\r\n ? this._selectionModel.selected\r\n : this._selectionModel.selected[0];\r\n }\r\n\r\n /** The value displayed in the trigger. */\r\n get triggerValue(): string {\r\n if (this.empty) {\r\n return '';\r\n }\r\n if (this._multiple) {\r\n const selectedOptions = this._selectionModel.selected.map(\r\n (option) => option.viewValueForSelect\r\n );\r\n\r\n if (this._isRtl()) {\r\n selectedOptions.reverse();\r\n }\r\n return selectedOptions.join(', ');\r\n }\r\n return this._selectionModel.selected[0].viewValueForSelect;\r\n }\r\n\r\n /** Whether the element is in RTL mode. */\r\n _isRtl(): boolean {\r\n return this._dir ? this._dir.value === 'rtl' : false;\r\n }\r\n\r\n /** Handles all keydown events on the select. */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (!this.disabled) {\r\n if (this.panelOpen) {\r\n this._handleOpenKeydown(event);\r\n } else {\r\n this._handleClosedKeydown(event);\r\n }\r\n }\r\n }\r\n\r\n /** Handles keyboard events while the select is closed. */\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const keyCode = event.keyCode;\r\n const isArrowKey =\r\n keyCode === DOWN_ARROW ||\r\n keyCode === UP_ARROW ||\r\n keyCode === LEFT_ARROW ||\r\n keyCode === RIGHT_ARROW;\r\n const isOpenKey = keyCode === ENTER || keyCode === SPACE;\r\n const manager = this._keyManager;\r\n\r\n // Open the select on ALT + arrow key to match the native \r\n event.preventDefault();\r\n this.close();\r\n } else if (\r\n (keyCode === ENTER || keyCode === SPACE) &&\r\n manager.activeItem &&\r\n !hasModifierKey(event)\r\n ) {\r\n event.preventDefault();\r\n manager.activeItem._selectViaInteraction();\r\n } else if (this._multiple && keyCode === A && event.ctrlKey) {\r\n event.preventDefault();\r\n this.handleCtrlKey();\r\n } else if (normalNavigationCheck) {\r\n // Check for non multiple select dropdown that the key pressed is not Tab, Space, Enter\r\n if (!this.isSearchFieldPresent) this.focus();\r\n this.handleScrolling(manager, event, isArrowKey, keyCode);\r\n }\r\n }\r\n\r\n /**\r\n * Handle ctrl key\r\n */\r\n private handleCtrlKey() {\r\n const hasDeselectedOptions = this.options.some(\r\n (opt) => !opt.disabled && !opt.selected\r\n );\r\n\r\n this.options.forEach((option) => {\r\n if (!option.disabled) {\r\n if (hasDeselectedOptions) {\r\n option.select();\r\n } else {\r\n option.deselect();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @param manager\r\n * @param event\r\n * @param isArrowKey\r\n * @param keyCode\r\n */\r\n private handleScrolling(\r\n manager: ActiveDescendantKeyManager,\r\n event: KeyboardEvent,\r\n isArrowKey: boolean,\r\n keyCode: number\r\n ) {\r\n const previouslyFocusedIndex = manager.activeItemIndex;\r\n\r\n manager.onKeydown(event);\r\n\r\n if (\r\n this._multiple &&\r\n isArrowKey &&\r\n event.shiftKey &&\r\n manager.activeItem &&\r\n manager.activeItemIndex !== previouslyFocusedIndex\r\n ) {\r\n manager.activeItem._selectViaInteraction();\r\n }\r\n if (isArrowKey && manager.activeItemIndex !== previouslyFocusedIndex) {\r\n this._scrollToOption();\r\n } else {\r\n // First or last\r\n if (keyCode === DOWN_ARROW) {\r\n manager.setFirstItemActive();\r\n this._setScrollTop(0);\r\n }\r\n if (keyCode === UP_ARROW) {\r\n manager.setLastItemActive();\r\n this._scrollToOption();\r\n }\r\n }\r\n }\r\n\r\n _onFocus() {\r\n if (!this.disabled) {\r\n this._focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\r\n * \"blur\" to the panel when it opens, causing a false positive.\r\n */\r\n _onBlur() {\r\n this._focused = false;\r\n // this.isSearchFieldPresent = false;\r\n\r\n if (!this.disabled && !this.panelOpen) {\r\n this._onTouched();\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Callback that is invoked when the overlay panel has been attached.\r\n */\r\n _onAttached(): void {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {\r\n this._setPseudoCheckboxPaddingSize();\r\n this._changeDetectorRef.detectChanges();\r\n this.panel.nativeElement.scrollTop = this._scrollTop;\r\n });\r\n }\r\n\r\n /** Returns the theme to be used on the panel. */\r\n _getPanelTheme(): string {\r\n return this._parentFormField ? `oui-${this._parentFormField.color}` : '';\r\n }\r\n\r\n // TODO(josephperrott): Remove after 2018 spec updates are fully merged.\r\n /** Sets the pseudo checkbox padding size based on the width of the pseudo checkbox. */\r\n private _setPseudoCheckboxPaddingSize() {\r\n if (!SELECT_MULTIPLE_PANEL_PADDING_X && this.multiple) {\r\n const pseudoCheckbox = this.panel.nativeElement.querySelector(\r\n '.oui-pseudo-checkbox'\r\n );\r\n if (pseudoCheckbox) {\r\n SELECT_MULTIPLE_PANEL_PADDING_X =\r\n SELECT_PANEL_PADDING_X * 1.5 + pseudoCheckbox.offsetWidth;\r\n }\r\n }\r\n }\r\n\r\n /** Whether the select has a value. */\r\n get empty(): boolean {\r\n return !this._selectionModel || this._selectionModel.isEmpty();\r\n }\r\n\r\n private _initializeSelection(): void {\r\n // Defer setting the value in order to avoid the \"Expression\r\n // has changed after it was checked\" errors from Angular.\r\n Promise.resolve().then(() => {\r\n this._setSelectionByValue(\r\n this.ngControl ? this.ngControl.value : this._value\r\n );\r\n this.savedValues = this.ngControl ? this.ngControl.value : this._value;\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the selected option based on a value. If no option can be\r\n * found with the designated value, the select trigger is cleared.\r\n */\r\n private _setSelectionByValue(value: any): void {\r\n if (this.multiple && value) {\r\n if (!Array.isArray(value)) {\r\n throw getOuiSelectNonArrayValueError();\r\n }\r\n\r\n this._selectionModel.clear();\r\n value.forEach((currentValue: any) => this._selectValue(currentValue));\r\n this._sortValues();\r\n } else {\r\n this._selectionModel.clear();\r\n const correspondingOption = this._selectValue(value);\r\n // Shift focus to the active item. Note that we shouldn't do this in multiple\r\n // mode, because we don't know what option the user interacted with last.\r\n if (correspondingOption) {\r\n this._keyManager.setActiveItem(correspondingOption);\r\n }\r\n }\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /**\r\n * Finds and selects and option based on its value.\r\n *\r\n * @returns Option that has the corresponding value.\r\n */\r\n private _selectValue(value: any): OuiOption | undefined {\r\n const correspondingOption = this.options.find((option: OuiOption) => {\r\n try {\r\n // Treat null as a special reset value.\r\n return option.value != null && this._compareWith(option.value, value);\r\n } catch (error) {\r\n if (isDevMode()) {\r\n // Notify developers of errors in their comparator.\r\n console.warn(error);\r\n }\r\n return false;\r\n }\r\n });\r\n\r\n if (correspondingOption) {\r\n this._selectionModel.select(correspondingOption);\r\n }\r\n\r\n return correspondingOption;\r\n }\r\n\r\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\r\n private _initKeyManager() {\r\n this._keyManager = new ActiveDescendantKeyManager(this.options)\r\n .withTypeAhead()\r\n .withVerticalOrientation()\r\n .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')\r\n .withAllowedModifierKeys(['shiftKey']);\r\n\r\n this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n // Restore focus to the trigger before closing. Ensures that the focus\r\n // position won't be lost if the user got focus into the overlay.\r\n if (!this.singleActionItem) {\r\n this.focus();\r\n this.close();\r\n }\r\n });\r\n\r\n this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n if (this._panelOpen && this.panel) {\r\n // Panel is opened\r\n // Need not to scroll\r\n } else if (\r\n !this._panelOpen &&\r\n !this.multiple &&\r\n this._keyManager.activeItem\r\n ) {\r\n this._keyManager.activeItem._selectViaInteraction();\r\n }\r\n });\r\n }\r\n\r\n /** Drops current option subscriptions and IDs and resets from scratch. */\r\n private _resetOptions(): void {\r\n const changedOrDestroyed = merge(this.options.changes, this._destroy);\r\n\r\n this.optionSelectionChanges\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe((event) => {\r\n this._onSelect(event.source, event.isUserInput);\r\n\r\n if (event.isUserInput && !this.multiple && this._panelOpen) {\r\n this.close();\r\n this.focus();\r\n }\r\n });\r\n\r\n // Listen to changes in the internal state of the options and react accordingly.\r\n // Handles cases like the labels of the selected options changing.\r\n merge(...this.options.map((option) => option._stateChanges))\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe(() => {\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n });\r\n\r\n this._setOptionIds();\r\n }\r\n\r\n /** Invoked when an option is clicked. */\r\n private _onSelect(option: OuiOption, isUserInput: boolean): void {\r\n const wasSelected = this._selectionModel.isSelected(option);\r\n\r\n if (option.value == null && !this._multiple) {\r\n option.deselect();\r\n this._selectionModel.clear();\r\n this._propagateChanges(option.value);\r\n } else {\r\n if (option.selected) {\r\n this._selectionModel.select(option);\r\n } else {\r\n this._selectionModel.deselect(option);\r\n }\r\n\r\n if (isUserInput) {\r\n this._keyManager.setActiveItem(option);\r\n }\r\n\r\n if (this.multiple) {\r\n this._sortValues();\r\n\r\n if (isUserInput) {\r\n // In case the user selected the option with their mouse, we\r\n // want to restore focus back to the trigger, in order to\r\n // prevent the select keyboard controls from clashing with\r\n // the ones from `oui-option`.\r\n this.focus();\r\n }\r\n }\r\n }\r\n\r\n if (wasSelected !== this._selectionModel.isSelected(option)) {\r\n this._propagateChanges();\r\n }\r\n if (this.multiple) {\r\n this.disableDoneButton = this._isDoneButtonDisabled();\r\n }\r\n this.stateChanges.next();\r\n }\r\n discardRecentChanges() {\r\n this.value = this.savedValues;\r\n this._setSelectionByValue(this.value);\r\n this.disableDoneButton = true;\r\n this.close();\r\n }\r\n doneRecentChanges() {\r\n this.savedValues = this.value;\r\n this.disableDoneButton = true;\r\n this.saveSelectionChange.emit(new OuiSelectChange(this, this.value));\r\n this.close();\r\n }\r\n\r\n handleSingleActionItemClick() {\r\n this.singleSelectionChange.emit();\r\n this.close();\r\n }\r\n\r\n /** Determine whether the \"Done\" button should be enabled or disabled based on the selection state */\r\n private _isDoneButtonDisabled(): boolean {\r\n const selectedItems = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n if (this.allowNoSelection) {\r\n return false;\r\n }\r\n return selectedItems.length === 0;\r\n }\r\n\r\n /** Sorts the selected values in the selected based on their order in the panel. */\r\n private _sortValues() {\r\n if (this.multiple) {\r\n const options = this.options.toArray();\r\n\r\n this._selectionModel.sort((a, b) =>\r\n this.sortComparator\r\n ? this.sortComparator(a, b, options)\r\n : options.indexOf(a) - options.indexOf(b)\r\n );\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Emits change event to set the model value. */\r\n private _propagateChanges(fallbackValue?: any): void {\r\n let valueToEmit: any = null;\r\n\r\n if (this.multiple) {\r\n valueToEmit = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n } else {\r\n valueToEmit = this.selected\r\n ? (this.selected as OuiOption).value\r\n : fallbackValue;\r\n }\r\n\r\n this._value = valueToEmit;\r\n this.valueChange.emit(valueToEmit);\r\n this._onChange(valueToEmit);\r\n this.selectionChange.emit(new OuiSelectChange(this, valueToEmit));\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /** Records option IDs to pass to the aria-owns property. */\r\n private _setOptionIds() {\r\n this._optionIds = this.options.map((option) => option.id).join(' ');\r\n }\r\n\r\n /**\r\n * Highlights the selected item. If no option is selected, it will highlight\r\n * the first item instead.\r\n */\r\n private _highlightCorrectOption(): void {\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n } else if (this._keyManager) {\r\n if (this.empty) {\r\n this._keyManager.setFirstItemActive();\r\n } else {\r\n this._keyManager.setActiveItem(this._selectionModel.selected[0]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Highlights the first of the filtered options if no element is currently highlighted\r\n */\r\n private _highlightFirstFilteredOption(): void {\r\n if (this._keyManager) {\r\n const activeElement = this._keyManager.activeItem?._getHostElement();\r\n // activeElement is not part of DOM if there is no parent element\r\n if (!activeElement || !activeElement.parentElement) {\r\n // highlight first element if there is no active element or active element is not part of DOM\r\n this._keyManager.setFirstItemActive();\r\n }\r\n }\r\n }\r\n\r\n /** Focuses the select element. */\r\n focus(): void {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n\r\n /** Returns the aria-label of the select component. */\r\n _getAriaLabel(): string | null {\r\n // If an ariaLabelledby value has been set by the consumer, the select should not overwrite the\r\n // `aria-labelledby` value by setting the ariaLabel to the placeholder.\r\n return this.ariaLabelledby ? null : this.ariaLabel || this.placeholder;\r\n }\r\n\r\n /** Returns the aria-labelledby of the select component. */\r\n _getAriaLabelledby(): string | null {\r\n if (this.ariaLabelledby) {\r\n return this.ariaLabelledby;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Determines the `aria-activedescendant` to be set on the host. */\r\n _getAriaActiveDescendant(): string | null {\r\n if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\r\n return this._keyManager.activeItem.id;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n setDescribedByIds(ids: string[]) {\r\n this._ariaDescribedby = ids.join(' ');\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n onContainerClick() {\r\n this.focus();\r\n this.open();\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n get shouldLabelFloat(): boolean {\r\n return this._panelOpen || !this.empty;\r\n }\r\n\r\n /**\r\n * Add outer class to perfect scrollbar\r\n * This is added only when there is a search field\r\n */\r\n ouiSelectInputOuter() {\r\n this.ouiSelectInputOuterClassName = 'oui-select-input-outer';\r\n }\r\n\r\n /**\r\n * Custom overlay class for cdk overlay container\r\n */\r\n openCdk() {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe((e) => {\r\n this.cdkConnectionOverlayPanel = '';\r\n if (e.connectionPair.originY === 'top') {\r\n this.cdkConnectionOverlayPanel = 'select-overlay-top';\r\n }\r\n this._changeDetectorRef.detectChanges();\r\n setTimeout((_) => this._scrollToOption());\r\n });\r\n\r\n const cdkOverLayContainer = this._document.querySelector(\r\n '.cdk-overlay-container'\r\n );\r\n const ouiSelectPanel = this._document.querySelector('.oui-select-panel');\r\n cdkOverLayContainer.classList.add('oui-select-overlay-container');\r\n const containerWidth = this._elementRef.nativeElement.offsetWidth;\r\n ouiSelectPanel.style.width = `${containerWidth}px`;\r\n const searchQueryString = '.oui-select-search-inner';\r\n if (this._document.querySelector(searchQueryString)) {\r\n this.scrollCalc(searchQueryString);\r\n }\r\n }\r\n scrollCalc(selectQueryString: string) {\r\n const searchInput = this._document.querySelector(selectQueryString);\r\n const outter = this._document.querySelector('.oui-select-panel');\r\n let inner = this._document.querySelector('.oui-option');\r\n if (inner === null) {\r\n inner = 0;\r\n }\r\n const scrollbarWidth = outter.offsetWidth - inner.offsetWidth;\r\n if (scrollbarWidth > 5) {\r\n searchInput.style.width = `${inner.offsetWidth}px`;\r\n } else {\r\n searchInput.style.width = '100%';\r\n }\r\n }\r\n\r\n /**\r\n * Given that we are not actually focusing active options, we must manually adjust scroll\r\n * to reveal options below the fold. First, we find the offset of the option from the top\r\n * of the panel. If that offset is below the fold, the new scrollTop will be the offset -\r\n * the panel height + the option height, so the active option will be just visible at the\r\n * bottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\r\n * will become the offset. If that offset is visible within the panel already, the scrollTop is\r\n * not adjusted.\r\n */\r\n private _scrollToOption(): void {\r\n const manager = this._keyManager;\r\n const index = manager.activeItemIndex || 0;\r\n const labelCount = _countGroupLabelsBeforeOption(\r\n index,\r\n this.options,\r\n this.optionGroups\r\n );\r\n const selectedOption = manager.activeItem?._getHostElement();\r\n const selectActionWrapperElement = this._document.querySelector(\r\n '.oui-select-action-wrapper'\r\n ) as HTMLElement;\r\n const selectPanelElement = this._document.querySelector(\r\n '.oui-select-panel'\r\n ) as HTMLElement;\r\n const selectSearchBox = this._document.querySelector(\r\n '.oui-select-search-inner'\r\n ) as HTMLElement;\r\n const selectOptionsWrapper = this._document.querySelector(\r\n '.oui-select-options-wrapper'\r\n ) as HTMLElement;\r\n const labelHeight = labelCount ? (labelCount - 1) * 10 : 0;\r\n const optionHeight = selectedOption?.clientHeight || SELECT_OPTION_HEIGHT;\r\n const ouiSelectActionWrapperHeight =\r\n selectActionWrapperElement?.clientHeight ?? 0;\r\n const selectSearchBoxheight = selectSearchBox?.clientHeight - 10 || 0;\r\n const selectPanelHeight =\r\n selectPanelElement?.clientHeight -\r\n ouiSelectActionWrapperHeight -\r\n selectSearchBoxheight -\r\n 20 -\r\n labelHeight || SELECT_PANEL_HEIGHT;\r\n const selectOptionsWrapperRect =\r\n selectOptionsWrapper?.getBoundingClientRect();\r\n const selectedOptionRect = selectedOption?.getBoundingClientRect();\r\n const selectedOptionOffset =\r\n selectedOptionRect?.top -\r\n selectSearchBoxheight -\r\n selectOptionsWrapperRect?.top -\r\n 10;\r\n const scrollTop = this._getScrollTop();\r\n const newScrollPosition = _getOptionScrollPosition(\r\n index + labelCount,\r\n optionHeight,\r\n scrollTop,\r\n selectPanelHeight,\r\n selectedOptionOffset\r\n );\r\n this._setScrollTop(newScrollPosition);\r\n }\r\n\r\n /**\r\n * Sets the panel scrollTop. This allows us to manually scroll to display options\r\n * above or below the fold, as they are not actually being focused when active.\r\n */\r\n _setScrollTop(scrollTop: number): void {\r\n if (this.panel) {\r\n this.panel.nativeElement.querySelector('.oui-select-options').scrollTop =\r\n scrollTop;\r\n }\r\n }\r\n\r\n /** Returns the panel's scrollTop. */\r\n _getScrollTop(): number {\r\n return this.panel\r\n ? this.panel.nativeElement.querySelector('.oui-select-options').scrollTop\r\n : 0;\r\n }\r\n}\r\n", "selector": "oui-select-trigger", "providers": [], "hostDirectives": [], @@ -19824,12 +19869,12 @@ }, { "name": "OuiTabBodyPortal", - "id": "directive-OuiTabBodyPortal-35910442aae2ae956d9d640aaca92c9ecb135a5b0cac0d799979fba8976ff19c4489f5f438564beb0bb143fbe9b12783c9ba692171c5c13d4e4497c1d052be96", + "id": "directive-OuiTabBodyPortal-32c87b78cf2c723eb2f95bd15f8bdb35ebacacaef0d3b741592a3c2275f3ccebe4a8cba5a9d4c7fe78b26d90070c8a2aaa473301285701466fc87e26dcfe69ec", "file": "ui/src/components/tabs/tab-body.ts", "type": "directive", "description": "

The portal host directive for the contents of the tab.

\n", "rawdescription": "\n\nThe portal host directive for the contents of the tab.\n", - "sourceCode": "import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ComponentFactoryResolver,\r\n Directive,\r\n ElementRef,\r\n EventEmitter,\r\n // forwardRef,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n ViewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\r\nimport { Direction, Directionality } from '@angular/cdk/bidi';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n // startWith\r\n} from 'rxjs/operators';\r\nimport { AnimationEvent } from '@angular/animations';\r\nimport { ouiTabsAnimations } from './tabs-animations';\r\n\r\n/**\r\n * The portal host directive for the contents of the tab.\r\n * @docs-private\r\n */\r\n\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: `OuiTabBodyHost`,\r\n})\r\nexport class OuiTabBodyPortal\r\n extends CdkPortalOutlet\r\n implements OnInit, OnDestroy\r\n{\r\n /** Subscription to events for when the tab body begins centering. */\r\n private _centeringSub = Subscription.EMPTY;\r\n /** Subscription to events for when the tab body finishes leaving from center position. */\r\n private _leavingSub = Subscription.EMPTY;\r\n\r\n constructor(\r\n componentFactoryResolver: ComponentFactoryResolver,\r\n viewContainerRef: ViewContainerRef,\r\n // @Inject(forwardRef(() => OuiTabBody)) private _host: OuiTabBody,\r\n @Inject(DOCUMENT) _document: any\r\n ) {\r\n super(componentFactoryResolver, viewContainerRef, _document);\r\n }\r\n\r\n /** Set initial visibility or set up subscription for changing visibility. */\r\n override ngOnInit(): void {\r\n super.ngOnInit();\r\n }\r\n\r\n /** Clean up centering subscription. */\r\n override ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n this._centeringSub.unsubscribe();\r\n this._leavingSub.unsubscribe();\r\n }\r\n}\r\n\r\n/**\r\n * These position states are used internally as animation states for the tab body. Setting the\r\n * position state to left, right, or center will transition the tab body from its current\r\n * position to its respective state. If there is not current position (void, in the case of a new\r\n * tab body), then there will be no transition animation to its state.\r\n *\r\n * In the case of a new tab body that should immediately be centered with an animating transition,\r\n * then left-origin-center or right-origin-center can be used, which will use left or right as its\r\n * pseudo-prior state.\r\n */\r\nexport type OuiTabBodyPositionState =\r\n | 'left'\r\n | 'center'\r\n | 'right'\r\n | 'left-origin-center'\r\n | 'right-origin-center';\r\n\r\n/**\r\n * Wrapper for the contents of a tab.\r\n * @docs-private\r\n */\r\n@Component({\r\n selector: 'oui-tab-body',\r\n templateUrl: 'tab-body.html',\r\n // styleUrls: ['tab-body.css'],\r\n encapsulation: ViewEncapsulation.None,\r\n // tslint:disable-next-line:validate-decorators\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n animations: [ouiTabsAnimations.translateTab],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n class: 'oui-mdc-tab-body',\r\n },\r\n})\r\nexport class OuiTabBody implements OnInit, OnDestroy {\r\n /** Current position of the tab-body in the tab-group. Zero means that the tab is visible. */\r\n private _positionIndex: number;\r\n\r\n /** Subscription to the directionality change observable. */\r\n private _dirChangeSubscription = Subscription.EMPTY;\r\n\r\n /** Tab body position state. Used by the animation trigger for the current state. */\r\n _position: OuiTabBodyPositionState;\r\n\r\n /** Emits when an animation on the tab is complete. */\r\n readonly _translateTabComplete = new Subject();\r\n\r\n /** Event emitted when the tab begins to animate towards the center as the active tab. */\r\n @Output() readonly _onCentering: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted before the centering of the tab begins. */\r\n @Output() readonly _beforeCentering: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted before the centering of the tab begins. */\r\n @Output() readonly _afterLeavingCenter: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the tab completes its animation towards the center. */\r\n @Output() readonly _onCentered: EventEmitter = new EventEmitter(\r\n true\r\n );\r\n\r\n /** The portal host inside of this container into which the tab body content will be loaded. */\r\n @ViewChild(CdkPortalOutlet) _portalHost: CdkPortalOutlet;\r\n\r\n /** The tab body content to display. */\r\n @Input('content') _content: any;\r\n\r\n /** Position that will be used when the tab is immediately becoming visible after creation. */\r\n @Input() origin: number | null;\r\n\r\n // Note that the default value will always be overwritten by `OuiTabBody`, but we need one\r\n // anyway to prevent the animations module from throwing an error if the body is used on its own.\r\n /** Duration for the tab's animation. */\r\n @Input() animationDuration = '0';\r\n\r\n /** Whether the tab's content should be kept in the DOM while it's off-screen. */\r\n @Input() preserveContent = false;\r\n _innerContent: any;\r\n\r\n /** The shifted index position of the tab body, where zero represents the active center tab. */\r\n @Input()\r\n set position(position: number) {\r\n this._positionIndex = position;\r\n this._computePositionAnimationState();\r\n }\r\n\r\n constructor(\r\n private _elementRef: ElementRef,\r\n @Optional() private _dir: Directionality,\r\n changeDetectorRef: ChangeDetectorRef\r\n ) {\r\n if (_dir) {\r\n this._dirChangeSubscription = _dir.change.subscribe((dir: Direction) => {\r\n this._computePositionAnimationState(dir);\r\n changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n // Ensure that we get unique animation events, because the `.done` callback can get\r\n // invoked twice in some browsers. See https://github.com/angular/angular/issues/24084.\r\n this._translateTabComplete\r\n .pipe(\r\n distinctUntilChanged((x, y) => {\r\n return x.fromState === y.fromState && x.toState === y.toState;\r\n })\r\n )\r\n .subscribe((event) => {\r\n // If the transition to the center is complete, emit an event.\r\n if (\r\n this._isCenterPosition(event.toState) &&\r\n this._isCenterPosition(this._position)\r\n ) {\r\n this._onCentered.emit();\r\n }\r\n\r\n if (\r\n this._isCenterPosition(event.fromState) &&\r\n !this._isCenterPosition(this._position)\r\n ) {\r\n this._afterLeavingCenter.emit();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * After initialized, check if the content is centered and has an origin. If so, set the\r\n * special position states that transition the tab from the left or right before centering.\r\n */\r\n ngOnInit() {\r\n if (this._position == 'center' && this.origin != null) {\r\n this._position = this._computePositionFromOrigin(this.origin);\r\n }\r\n this._innerContent = this._content ? this._content : '';\r\n }\r\n\r\n ngOnDestroy() {\r\n this._dirChangeSubscription.unsubscribe();\r\n this._translateTabComplete.complete();\r\n }\r\n\r\n _onTranslateTabStarted(event: AnimationEvent): void {\r\n const isCentering = this._isCenterPosition(event.toState);\r\n this._beforeCentering.emit(isCentering);\r\n if (isCentering) {\r\n this._onCentering.emit(this._elementRef.nativeElement.clientHeight);\r\n }\r\n }\r\n\r\n /** The text direction of the containing app. */\r\n _getLayoutDirection(): Direction {\r\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\r\n }\r\n\r\n /** Whether the provided position state is considered center, regardless of origin. */\r\n _isCenterPosition(position: OuiTabBodyPositionState | string): boolean {\r\n return (\r\n position == 'center' ||\r\n position == 'left-origin-center' ||\r\n position == 'right-origin-center'\r\n );\r\n }\r\n\r\n /** Computes the position state that will be used for the tab-body animation trigger. */\r\n private _computePositionAnimationState(\r\n dir: Direction = this._getLayoutDirection()\r\n ) {\r\n if (this._positionIndex < 0) {\r\n this._position = dir == 'ltr' ? 'left' : 'right';\r\n } else if (this._positionIndex > 0) {\r\n this._position = dir == 'ltr' ? 'right' : 'left';\r\n } else {\r\n this._position = 'center';\r\n }\r\n }\r\n\r\n /**\r\n * Computes the position state based on the specified origin position. This is used if the\r\n * tab is becoming visible immediately after creation.\r\n */\r\n private _computePositionFromOrigin(origin: number): OuiTabBodyPositionState {\r\n const dir = this._getLayoutDirection();\r\n\r\n if ((dir == 'ltr' && origin <= 0) || (dir == 'rtl' && origin > 0)) {\r\n return 'left-origin-center';\r\n }\r\n\r\n return 'right-origin-center';\r\n }\r\n}\r\n\r\n/**\r\n * The origin state is an internally used state that is set on a new tab body indicating if it\r\n * began to the left or right of the prior selected index. For example, if the selected index was\r\n * set to 1, and a new tab is created and selected at index 2, then the tab body would have an\r\n * origin of right because its index was greater than the prior selected index.\r\n */\r\nexport type OuiTabBodyOriginState = 'left' | 'right';\r\n", + "sourceCode": "import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ComponentFactoryResolver,\r\n Directive,\r\n ElementRef,\r\n EventEmitter,\r\n // forwardRef,\r\n Inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\r\nimport { Direction, Directionality } from '@angular/cdk/bidi';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n // startWith\r\n} from 'rxjs/operators';\r\nimport { AnimationEvent } from '@angular/animations';\r\nimport { ouiTabsAnimations } from './tabs-animations';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n/**\r\n * The portal host directive for the contents of the tab.\r\n * @docs-private\r\n */\r\n\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: `OuiTabBodyHost`,\r\n})\r\nexport class OuiTabBodyPortal\r\n extends CdkPortalOutlet\r\n implements OnInit, OnDestroy\r\n{\r\n /** Subscription to events for when the tab body begins centering. */\r\n private _centeringSub = Subscription.EMPTY;\r\n /** Subscription to events for when the tab body finishes leaving from center position. */\r\n private _leavingSub = Subscription.EMPTY;\r\n\r\n constructor(\r\n componentFactoryResolver: ComponentFactoryResolver,\r\n viewContainerRef: ViewContainerRef,\r\n // @Inject(forwardRef(() => OuiTabBody)) private _host: OuiTabBody,\r\n @Inject(DOCUMENT) _document: any\r\n ) {\r\n super(componentFactoryResolver, viewContainerRef, _document);\r\n }\r\n\r\n /** Set initial visibility or set up subscription for changing visibility. */\r\n override ngOnInit(): void {\r\n super.ngOnInit();\r\n }\r\n\r\n /** Clean up centering subscription. */\r\n override ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n this._centeringSub.unsubscribe();\r\n this._leavingSub.unsubscribe();\r\n }\r\n}\r\n\r\n/**\r\n * These position states are used internally as animation states for the tab body. Setting the\r\n * position state to left, right, or center will transition the tab body from its current\r\n * position to its respective state. If there is not current position (void, in the case of a new\r\n * tab body), then there will be no transition animation to its state.\r\n *\r\n * In the case of a new tab body that should immediately be centered with an animating transition,\r\n * then left-origin-center or right-origin-center can be used, which will use left or right as its\r\n * pseudo-prior state.\r\n */\r\nexport type OuiTabBodyPositionState =\r\n | 'left'\r\n | 'center'\r\n | 'right'\r\n | 'left-origin-center'\r\n | 'right-origin-center';\r\n\r\n/**\r\n * Wrapper for the contents of a tab.\r\n * @docs-private\r\n */\r\n@Component({\r\n selector: 'oui-tab-body',\r\n templateUrl: 'tab-body.html',\r\n // styleUrls: ['tab-body.css'],\r\n encapsulation: ViewEncapsulation.None,\r\n // tslint:disable-next-line:validate-decorators\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n animations: [ouiTabsAnimations.translateTab],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n class: 'oui-mdc-tab-body',\r\n },\r\n})\r\nexport class OuiTabBody implements OnInit, OnDestroy, OnChanges {\r\n /** Current position of the tab-body in the tab-group. Zero means that the tab is visible. */\r\n private _positionIndex: number;\r\n\r\n /** Subscription to the directionality change observable. */\r\n private _dirChangeSubscription = Subscription.EMPTY;\r\n\r\n /** Tab body position state. Used by the animation trigger for the current state. */\r\n _position: OuiTabBodyPositionState;\r\n\r\n /** Emits when an animation on the tab is complete. */\r\n readonly _translateTabComplete = new Subject();\r\n\r\n /** Event emitted when the tab begins to animate towards the center as the active tab. */\r\n @Output() readonly _onCentering: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted before the centering of the tab begins. */\r\n @Output() readonly _beforeCentering: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted before the centering of the tab begins. */\r\n @Output() readonly _afterLeavingCenter: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the tab completes its animation towards the center. */\r\n @Output() readonly _onCentered: EventEmitter = new EventEmitter(\r\n true\r\n );\r\n\r\n /** The portal host inside of this container into which the tab body content will be loaded. */\r\n @ViewChild(CdkPortalOutlet) _portalHost: CdkPortalOutlet;\r\n\r\n /** The tab body content to display. */\r\n @Input('content') _content: string;\r\n\r\n /** Position that will be used when the tab is immediately becoming visible after creation. */\r\n @Input() origin: number | null;\r\n\r\n // Note that the default value will always be overwritten by `OuiTabBody`, but we need one\r\n // anyway to prevent the animations module from throwing an error if the body is used on its own.\r\n /** Duration for the tab's animation. */\r\n @Input() animationDuration = '0';\r\n\r\n /** Whether the tab's content should be kept in the DOM while it's off-screen. */\r\n @Input() preserveContent = false;\r\n _innerContent: any;\r\n\r\n /** The shifted index position of the tab body, where zero represents the active center tab. */\r\n @Input()\r\n set position(position: number) {\r\n this._positionIndex = position;\r\n this._computePositionAnimationState();\r\n }\r\n\r\n constructor(\r\n private _elementRef: ElementRef,\r\n @Optional() private _dir: Directionality,\r\n changeDetectorRef: ChangeDetectorRef,\r\n private sanitized: DomSanitizer\r\n ) {\r\n if (_dir) {\r\n this._dirChangeSubscription = _dir.change.subscribe((dir: Direction) => {\r\n this._computePositionAnimationState(dir);\r\n changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n // Ensure that we get unique animation events, because the `.done` callback can get\r\n // invoked twice in some browsers. See https://github.com/angular/angular/issues/24084.\r\n this._translateTabComplete\r\n .pipe(\r\n distinctUntilChanged((x, y) => {\r\n return x.fromState === y.fromState && x.toState === y.toState;\r\n })\r\n )\r\n .subscribe((event) => {\r\n // If the transition to the center is complete, emit an event.\r\n if (\r\n this._isCenterPosition(event.toState) &&\r\n this._isCenterPosition(this._position)\r\n ) {\r\n this._onCentered.emit();\r\n }\r\n\r\n if (\r\n this._isCenterPosition(event.fromState) &&\r\n !this._isCenterPosition(this._position)\r\n ) {\r\n this._afterLeavingCenter.emit();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * After initialized, check if the content is centered and has an origin. If so, set the\r\n * special position states that transition the tab from the left or right before centering.\r\n */\r\n ngOnInit() {\r\n if (this._position == 'center' && this.origin != null) {\r\n this._position = this._computePositionFromOrigin(this.origin);\r\n }\r\n this._innerContent = this.sanitized.bypassSecurityTrustHtml(\r\n this._content ? this._content : ''\r\n );\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes._content && changes._content.currentValue) {\r\n this._innerContent = this.sanitized.bypassSecurityTrustHtml(\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n changes._content.currentValue ? changes._content.currentValue : ''\r\n );\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._dirChangeSubscription.unsubscribe();\r\n this._translateTabComplete.complete();\r\n }\r\n\r\n _onTranslateTabStarted(event: AnimationEvent): void {\r\n const isCentering = this._isCenterPosition(event.toState);\r\n this._beforeCentering.emit(isCentering);\r\n if (isCentering) {\r\n this._onCentering.emit(this._elementRef.nativeElement.clientHeight);\r\n }\r\n }\r\n\r\n /** The text direction of the containing app. */\r\n _getLayoutDirection(): Direction {\r\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\r\n }\r\n\r\n /** Whether the provided position state is considered center, regardless of origin. */\r\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\r\n _isCenterPosition(position: OuiTabBodyPositionState | string): boolean {\r\n return (\r\n position == 'center' ||\r\n position == 'left-origin-center' ||\r\n position == 'right-origin-center'\r\n );\r\n }\r\n\r\n /** Computes the position state that will be used for the tab-body animation trigger. */\r\n private _computePositionAnimationState(\r\n dir: Direction = this._getLayoutDirection()\r\n ) {\r\n if (this._positionIndex < 0) {\r\n this._position = dir == 'ltr' ? 'left' : 'right';\r\n } else if (this._positionIndex > 0) {\r\n this._position = dir == 'ltr' ? 'right' : 'left';\r\n } else {\r\n this._position = 'center';\r\n }\r\n }\r\n\r\n /**\r\n * Computes the position state based on the specified origin position. This is used if the\r\n * tab is becoming visible immediately after creation.\r\n */\r\n private _computePositionFromOrigin(origin: number): OuiTabBodyPositionState {\r\n const dir = this._getLayoutDirection();\r\n\r\n if ((dir == 'ltr' && origin <= 0) || (dir == 'rtl' && origin > 0)) {\r\n return 'left-origin-center';\r\n }\r\n\r\n return 'right-origin-center';\r\n }\r\n}\r\n\r\n/**\r\n * The origin state is an internally used state that is set on a new tab body indicating if it\r\n * began to the left or right of the prior selected index. For example, if the selected index was\r\n * set to 1, and a new tab is created and selected at index 2, then the tab body would have an\r\n * origin of right because its index was greater than the prior selected index.\r\n */\r\nexport type OuiTabBodyOriginState = 'left' | 'right';\r\n", "selector": "OuiTabBodyHost", "providers": [], "hostDirectives": [], @@ -19849,7 +19894,7 @@ "type": "", "optional": false, "description": "

Subscription to events for when the tab body begins centering.

\n", - "line": 53, + "line": 56, "rawdescription": "\nSubscription to events for when the tab body begins centering.", "modifierKind": [ 123 @@ -19863,7 +19908,7 @@ "type": "", "optional": false, "description": "

Subscription to events for when the tab body finishes leaving from center position.

\n", - "line": 55, + "line": 58, "rawdescription": "\nSubscription to events for when the tab body finishes leaving from center position.", "modifierKind": [ 123 @@ -19877,7 +19922,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 72, + "line": 75, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nClean up centering subscription.", @@ -19892,7 +19937,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 67, + "line": 70, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nSet initial visibility or set up subscription for changing visibility.", @@ -19934,7 +19979,7 @@ "deprecationMessage": "" } ], - "line": 55, + "line": 58, "jsdoctags": [ { "name": "componentFactoryResolver", @@ -19968,12 +20013,12 @@ }, { "name": "OuiTabContent", - "id": "directive-OuiTabContent-b65da5c32e4f035a7b8d83f50cd7b6ff20be1b4708c0961689a65bebcbdc20d0b042047289ddf9884062cf425e1d05cb48a95e891417153373ea260a1a1e2604", + "id": "directive-OuiTabContent-e3691c333f63b4c362db06374f029c5706f6d523069071c3b7d33a0504cc699f5efedfb762e924b8ee679cda55eb3d5b6c40939fba7c7c796d8e7fbe6e59c779", "file": "ui/src/components/tabs/tab-content.ts", "type": "directive", "description": "

Decorates the ng-template tags and reads out the template from it.

\n", "rawdescription": "\nDecorates the `ng-template` tags and reads out the template from it.", - "sourceCode": "import { Directive, InjectionToken, TemplateRef } from '@angular/core';\r\n\r\n/**\r\n * Injection token that can be used to reference instances of `OuiTabContent`. It serves as\r\n * alternative token to the actual `OuiTabContent` class which could cause unnecessary\r\n * retention of the class and its directive metadata.\r\n */\r\nexport const OUI_TAB_CONTENT = new InjectionToken(\r\n 'OuiTabContent'\r\n);\r\n\r\n/** Decorates the `ng-template` tags and reads out the template from it. */\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: '[OuiTabContent]',\r\n providers: [{ provide: OUI_TAB_CONTENT, useExisting: OuiTabContent }],\r\n})\r\nexport class OuiTabContent {\r\n constructor(/** Content for the tab. */ public template: TemplateRef) {}\r\n}\r\n", + "sourceCode": "import { Directive, InjectionToken, TemplateRef } from '@angular/core';\n\n/**\n * Injection token that can be used to reference instances of `OuiTabContent`. It serves as\n * alternative token to the actual `OuiTabContent` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nexport const OUI_TAB_CONTENT = new InjectionToken(\n 'OuiTabContent'\n);\n\n/** Decorates the `ng-template` tags and reads out the template from it. */\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[OuiTabContent]',\n providers: [{ provide: OUI_TAB_CONTENT, useExisting: OuiTabContent }],\n})\nexport class OuiTabContent {\n constructor(/** Content for the tab. */ public template: TemplateRef) {}\n}\n", "selector": "[OuiTabContent]", "providers": [ { @@ -20034,12 +20079,12 @@ }, { "name": "OuiTabLabel", - "id": "directive-OuiTabLabel-dccf6d94f02aac877fee777437c9fe03332635546d4e6d487228c5d45cc3aafe7c681d53c345ba635d51fad7d85a6672dfd69a6f7e5898924e8ed0be80ccb5e4", + "id": "directive-OuiTabLabel-cebb207555e4a38e6ea726f0d32c6698784059e11bba685a8fa9cd2171e4ef12b91d8284e5d780bfa1a0312c7507722587390be5e68c8331ccb842f699d20e19", "file": "ui/src/components/tabs/tab-label.ts", "type": "directive", "description": "

Used to flag tab labels for use with the portal directive

\n", "rawdescription": "\nUsed to flag tab labels for use with the portal directive", - "sourceCode": "import {\r\n Directive,\r\n Inject,\r\n InjectionToken,\r\n Optional,\r\n TemplateRef,\r\n ViewContainerRef,\r\n} from '@angular/core';\r\nimport { CdkPortal } from '@angular/cdk/portal';\r\n\r\n/**\r\n * Injection token that can be used to reference instances of `OuiTabLabel`. It serves as\r\n * alternative token to the actual `OuiTabLabel` class which could cause unnecessary\r\n * retention of the class and its directive metadata.\r\n */\r\nexport const OUI_TAB_LABEL = new InjectionToken('OuiTabLabel');\r\n\r\n/**\r\n * Used to provide a tab label to a tab without causing a circular dependency.\r\n * @docs-private\r\n */\r\nexport const OUI_TAB = new InjectionToken('OUI_TAB');\r\n\r\n/** Used to flag tab labels for use with the portal directive */\r\n@Directive({\r\n selector: '[oui-tab-label], [OuiTabLabel]',\r\n providers: [{ provide: OUI_TAB_LABEL, useExisting: OuiTabLabel }],\r\n})\r\nexport class OuiTabLabel extends CdkPortal {\r\n constructor(\r\n templateRef: TemplateRef,\r\n viewContainerRef: ViewContainerRef,\r\n @Inject(OUI_TAB) @Optional() public _closestTab: any\r\n ) {\r\n super(templateRef, viewContainerRef);\r\n }\r\n}\r\n", + "sourceCode": "import {\n Directive,\n Inject,\n InjectionToken,\n Optional,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { CdkPortal } from '@angular/cdk/portal';\n\n/**\n * Injection token that can be used to reference instances of `OuiTabLabel`. It serves as\n * alternative token to the actual `OuiTabLabel` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nexport const OUI_TAB_LABEL = new InjectionToken('OuiTabLabel');\n\n/**\n * Used to provide a tab label to a tab without causing a circular dependency.\n * @docs-private\n */\nexport const OUI_TAB = new InjectionToken('OUI_TAB');\n\n/** Used to flag tab labels for use with the portal directive */\n@Directive({\n selector: '[oui-tab-label], [OuiTabLabel]',\n providers: [{ provide: OUI_TAB_LABEL, useExisting: OuiTabLabel }],\n})\nexport class OuiTabLabel extends CdkPortal {\n constructor(\n templateRef: TemplateRef,\n viewContainerRef: ViewContainerRef,\n @Inject(OUI_TAB) @Optional() public _closestTab: any\n ) {\n super(templateRef, viewContainerRef);\n }\n}\n", "selector": "[oui-tab-label], [OuiTabLabel]", "providers": [ { @@ -20143,12 +20188,12 @@ }, { "name": "ouiTabLabelWrapper", - "id": "directive-ouiTabLabelWrapper-7e5d80ee640d0ea8999c77f7abcf384cf88e8e4e67e791d0966c3609d1ff326d98422cc0dafafc97745258d5d98bc78d166bed692c9aa7340871a5cfec7ea12b", + "id": "directive-ouiTabLabelWrapper-39eb023c2112987017621fbbab375ce632805d98b8060632114adbea3034f30a90ad85fea34756375ba235f08f50eb3af92f8d077e147c1eecc3dcb2759e9a28", "file": "ui/src/components/tabs/tab-label-wrapper.ts", "type": "directive", "description": "

Used in the oui-tab-group view to display tab labels.

\n", "rawdescription": "\n\nUsed in the `oui-tab-group` view to display tab labels.\n", - "sourceCode": "import { Directive, ElementRef } from '@angular/core';\r\nimport { mixinInkBarItem } from './ink-bar';\r\nimport { CanDisable, mixinDisabled } from '../core';\r\n\r\n// Boilerplate for applying mixins to ouiTabLabelWrapper.\r\n/** @docs-private */\r\nconst _OuiTabLabelWrapperMixinBase = mixinInkBarItem(\r\n mixinDisabled(\r\n class {\r\n elementRef: ElementRef;\r\n }\r\n )\r\n);\r\n\r\n/**\r\n * Used in the `oui-tab-group` view to display tab labels.\r\n * @docs-private\r\n */\r\n@Directive({\r\n selector: '[ouiTabLabelWrapper]',\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['disabled', 'fitInkBarToContent'],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '[class.oui-mdc-tab-disabled]': 'disabled',\r\n '[attr.aria-disabled]': '!!disabled',\r\n },\r\n})\r\nexport class ouiTabLabelWrapper\r\n extends _OuiTabLabelWrapperMixinBase\r\n implements CanDisable\r\n{\r\n constructor(override elementRef: ElementRef) {\r\n super();\r\n }\r\n\r\n /** Sets focus on the wrapper element */\r\n focus(): void {\r\n this.elementRef.nativeElement.focus();\r\n }\r\n\r\n getOffsetLeft(): number {\r\n return this.elementRef.nativeElement.offsetLeft;\r\n }\r\n\r\n getOffsetWidth(): number {\r\n return this.elementRef.nativeElement.offsetWidth;\r\n }\r\n}\r\n", + "sourceCode": "import { Directive, ElementRef } from '@angular/core';\nimport { mixinInkBarItem } from './ink-bar';\nimport { CanDisable, mixinDisabled } from '../core';\n\n// Boilerplate for applying mixins to ouiTabLabelWrapper.\n/** @docs-private */\nconst _OuiTabLabelWrapperMixinBase = mixinInkBarItem(\n mixinDisabled(\n class {\n elementRef: ElementRef;\n }\n )\n);\n\n/**\n * Used in the `oui-tab-group` view to display tab labels.\n * @docs-private\n */\n@Directive({\n selector: '[ouiTabLabelWrapper]',\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'fitInkBarToContent'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.oui-mdc-tab-disabled]': 'disabled',\n '[attr.aria-disabled]': '!!disabled',\n },\n})\nexport class ouiTabLabelWrapper\n extends _OuiTabLabelWrapperMixinBase\n implements CanDisable\n{\n constructor(override elementRef: ElementRef) {\n super();\n }\n\n /** Sets focus on the wrapper element */\n focus(): void {\n this.elementRef.nativeElement.focus();\n }\n\n getOffsetLeft(): number {\n return this.elementRef.nativeElement.offsetLeft;\n }\n\n getOffsetWidth(): number {\n return this.elementRef.nativeElement.offsetWidth;\n }\n}\n", "selector": "[ouiTabLabelWrapper]", "providers": [], "hostDirectives": [], @@ -20229,12 +20274,12 @@ }, { "name": "OuiTooltip", - "id": "directive-OuiTooltip-ffb93a0366a6db45703111c4fe658119cf87b8d44e269ec2926a30e8ecd94bebfb4adcfd399aeca78af8a2424610392ab8cece9c0abb63c2a560ad78706daebd", + "id": "directive-OuiTooltip-e9697def10890f47a95cf9f3bc5b2f98679be923c51d88410413d049b9f0d1aa747f42f5904aa817dc83a1c560c44b1ca4996f4759598c8e0196872f3ec3df70", "file": "ui/src/components/tooltip/tooltip.ts", "type": "directive", "description": "

Directive that attaches a tooltip to the host element. Animates the showing and\nhiding of a tooltip provided position (defaults to below the element).

\n", "rawdescription": "\n\nDirective that attaches a tooltip to the host element. Animates the showing and\nhiding of a tooltip provided position (defaults to below the element).\n", - "sourceCode": "import { AnimationEvent } from '@angular/animations';\nimport { AriaDescriber, FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n BreakpointObserver,\n Breakpoints,\n BreakpointState,\n} from '@angular/cdk/layout';\nimport {\n FlexibleConnectedPositionStrategy,\n HorizontalConnectionPos,\n OriginConnectionPosition,\n Overlay,\n OverlayConnectionPosition,\n OverlayRef,\n VerticalConnectionPos,\n ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport { ScrollDispatcher } from '@angular/cdk/scrolling';\nimport { Platform } from '@angular/cdk/platform';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { take, takeUntil } from 'rxjs/operators';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Directive,\n ElementRef,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { Subject, Observable } from 'rxjs';\nimport { ouiTooltipAnimations } from './tooltip-animations';\nimport { CanDisable } from '../core';\n\nexport type TooltipPosition = 'left' | 'right' | 'above' | 'below';\n\n/** Time in ms to throttle repositioning after scroll events. */\nexport const SCROLL_THROTTLE_MS = 20;\n\n/** CSS class that will be attached to the overlay panel. */\nexport const TOOLTIP_PANEL_CLASS = 'oui-tooltip-panel';\n\n/**\n * Creates an error to be thrown if the user supplied an invalid tooltip position.\n *\n * @docs-private\n */\nexport function getOuiTooltipInvalidPositionError(position: string) {\n return Error(`Tooltip position \"${position}\" is invalid.`);\n}\n\n/** Injection token that determines the scroll handling while a tooltip is visible. */\nexport const OUI_TOOLTIP_SCROLL_STRATEGY = new InjectionToken<\n () => ScrollStrategy\n>('oui-tooltip-scroll-strategy');\n\n/** @docs-private */\nexport function OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY(\n overlay: Overlay\n): () => ScrollStrategy {\n return () =>\n overlay.scrollStrategies.reposition({ scrollThrottle: SCROLL_THROTTLE_MS });\n}\n\n/** @docs-private */\nexport const OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\n};\n\n/** Default `ouiTooltip` options that can be overridden. */\nexport interface OuiTooltipDefaultOptions {\n showDelay: number;\n hideDelay: number;\n touchendHideDelay: number;\n}\n\nexport interface NewCSSStyleDeclaration extends CSSStyleDeclaration {\n msUserSelect: string;\n}\n\n/** Injection token to be used to override the default options for `ouiTooltip`. */\nexport const OUI_TOOLTIP_DEFAULT_OPTIONS =\n new InjectionToken('oui-tooltip-default-options', {\n providedIn: 'root',\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY(): OuiTooltipDefaultOptions {\n return {\n showDelay: 0,\n hideDelay: 0,\n touchendHideDelay: 1500,\n };\n}\n\nexport type TooltipVisibility = 'initial' | 'visible' | 'hidden';\n\n/**\n * Internal component that wraps the tooltip's content.\n *\n * @docs-private\n */\n@Component({\n selector: 'oui-tooltip-component',\n templateUrl: 'tooltip.html',\n styleUrls: ['tooltip.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [ouiTooltipAnimations.tooltipState],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n // Forces the element to have a layout in IE and Edge. This fixes issues where the element\n // won't be rendered if the animations are disabled or there is no web animations polyfill.\n '[style.zoom]': '_visibility === \"visible\" ? 1 : null',\n '(body:click)': 'this._handleBodyInteraction()',\n 'aria-hidden': 'true',\n },\n})\nexport class TooltipComponent {\n /** Message to display in the tooltip */\n message: string;\n /** Classes to be added to the tooltip. Supports the same syntax as `ngClass`. */\n tooltipClass: string | string[] | Set | { [key: string]: any };\n\n /** The timeout ID of any current timer set to show the tooltip */\n _showTimeoutId: number | null;\n\n /** The timeout ID of any current timer set to hide the tooltip */\n _hideTimeoutId: number | null;\n\n /** Property watched by the animation framework to show or hide the tooltip */\n _visibility: TooltipVisibility = 'initial';\n\n /** Whether interactions on the page should close the tooltip */\n private _closeOnInteraction = false;\n\n /** Subject for notifying that the tooltip has been hidden from the view */\n private readonly _onHide: Subject = new Subject();\n\n /** Stream that emits whether the user has a handset-sized display. */\n _isHandset: Observable = this._breakpointObserver.observe(\n Breakpoints.Handset\n );\n\n constructor(\n private _changeDetectorRef: ChangeDetectorRef,\n private _breakpointObserver: BreakpointObserver\n ) {}\n\n /**\n * Shows the tooltip with an animation originating from the provided origin\n *\n * @param delay Amount of milliseconds to the delay showing the tooltip.\n */\n show(): void {\n // Cancel the delayed hide if it is scheduled\n if (this._hideTimeoutId) {\n clearTimeout(this._hideTimeoutId);\n this._hideTimeoutId = null;\n }\n\n // Body interactions should cancel the tooltip if there is a delay in showing.\n this._closeOnInteraction = true;\n setTimeout(() => {\n this._visibility = 'visible';\n this._showTimeoutId = null;\n\n // Mark for check so if any parent component has set the\n // ChangeDetectionStrategy to OnPush it will be checked anyways\n this._markForCheck();\n }, 0);\n }\n\n /**\n * Begins the animation to hide the tooltip after the provided delay in ms.\n *\n * @param delay Amount of milliseconds to delay showing the tooltip.\n */\n hide(): void {\n // Cancel the delayed show if it is scheduled\n if (this._showTimeoutId) {\n clearTimeout(this._showTimeoutId);\n this._showTimeoutId = null;\n }\n setTimeout(() => {\n this._visibility = 'hidden';\n this._hideTimeoutId = null;\n // Mark for check so if any parent component has set the\n // ChangeDetectionStrategy to OnPush it will be checked anyways\n this._markForCheck();\n }, 0);\n }\n\n /** Returns an observable that notifies when the tooltip has been hidden from view. */\n afterHidden(): Observable {\n return this._onHide.asObservable();\n }\n\n /** Whether the tooltip is being displayed. */\n isVisible(): boolean {\n return this._visibility === 'visible';\n }\n\n _animationStart() {\n this._closeOnInteraction = false;\n }\n\n _animationDone(event: AnimationEvent): void {\n const toState = event.toState as TooltipVisibility;\n\n if (toState === 'hidden' && !this.isVisible()) {\n this._onHide.next();\n }\n\n if (toState === 'visible' || toState === 'hidden') {\n this._closeOnInteraction = true;\n }\n }\n\n /**\n * Interactions on the HTML body should close the tooltip immediately\n */\n _handleBodyInteraction(): void {\n if (this._closeOnInteraction) {\n this.hide();\n }\n }\n\n /**\n * Marks that the tooltip needs to be checked in the next change detection run.\n * Mainly used for rendering the initial text before positioning a tooltip, which\n * can be problematic in components with OnPush change detection.\n */\n _markForCheck(): void {\n this._changeDetectorRef.markForCheck();\n }\n}\n\n/**\n * Directive that attaches a tooltip to the host element. Animates the showing and\n * hiding of a tooltip provided position (defaults to below the element).\n */\n@Directive({\n selector: '[ouiTooltip]',\n exportAs: 'ouiTooltip',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '(longpress)': 'show()',\n '(keydown)': '_handleKeydown($event)',\n '(touchend)': '_handleTouchend()',\n '[attr.tabindex]': 'disabled ? -1 : 0',\n '[attr.aria-hidden]': 'false',\n },\n})\nexport class OuiTooltip implements OnDestroy, CanDisable {\n _overlayRef: OverlayRef | null;\n _tooltipInstance: TooltipComponent | null;\n\n private _portal: ComponentPortal;\n private _position: TooltipPosition = 'below';\n private _disabled = false;\n private _tooltipClass:\n | string\n | string[]\n | Set\n | { [key: string]: any };\n private _scrollStrategy: () => ScrollStrategy;\n\n /** Allows the user to define the position of the tooltip relative to the parent element */\n @Input('ouiTooltipPosition')\n get position(): TooltipPosition {\n return this._position;\n }\n set position(value: TooltipPosition) {\n if (value !== this._position) {\n this._position = value;\n if (this._overlayRef) {\n this._updatePosition();\n\n if (this._tooltipInstance) {\n this._tooltipInstance!.show();\n }\n\n this._overlayRef.updatePosition();\n }\n }\n }\n\n /** Disables the display of the tooltip. */\n @Input('ouiTooltipDisabled')\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n\n // If tooltip is disabled, hide immediately.\n if (this._disabled) {\n this.hide();\n }\n }\n\n private _message = '';\n\n /** The message to be displayed in the tooltip */\n @Input('ouiTooltip')\n get message() {\n return this._message;\n }\n set message(value: string) {\n this._ariaDescriber.removeDescription(\n this._elementRef.nativeElement,\n this._message\n );\n\n // If the message is not a string (e.g. number), convert it to a string and trim it.\n this._message = value != null ? `${value}`.trim() : '';\n\n if (!this._message && this._isTooltipVisible()) {\n this.hide();\n } else {\n this._updateTooltipMessage();\n this._ariaDescriber.describe(\n this._elementRef.nativeElement,\n this.message\n );\n }\n }\n\n /** Classes to be passed to the tooltip. Supports the same syntax as `ngClass`. */\n @Input('ouiTooltipClass')\n get tooltipClass() {\n return this._tooltipClass;\n }\n set tooltipClass(\n value: string | string[] | Set | { [key: string]: any }\n ) {\n this._tooltipClass = value;\n if (this._tooltipInstance) {\n this._tooltipInstance._markForCheck();\n this._setTooltipClass(this._tooltipClass);\n }\n }\n\n private _manualListeners = new Map<\n string,\n EventListenerOrEventListenerObject\n >();\n\n /** Emits when the component is destroyed. */\n private readonly _destroyed = new Subject();\n\n constructor(\n private _overlay: Overlay,\n private _elementRef: ElementRef,\n private _scrollDispatcher: ScrollDispatcher,\n private _viewContainerRef: ViewContainerRef,\n private _ngZone: NgZone,\n platform: Platform,\n private _ariaDescriber: AriaDescriber,\n private _focusMonitor: FocusMonitor,\n @Inject(OUI_TOOLTIP_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _dir: Directionality\n ) {\n this._scrollStrategy = scrollStrategy;\n const element: HTMLElement = _elementRef.nativeElement;\n const elementStyle = element.style as NewCSSStyleDeclaration & {\n webkitUserDrag: string;\n };\n const hasGestures = typeof window === 'undefined' || (window as any).Hammer;\n\n // The mouse events shouldn't be bound on mobile devices, because they can prevent the\n // first tap from firing its click event or can cause the tooltip to open for clicks.\n if (!platform.IOS && !platform.ANDROID) {\n this._manualListeners\n .set('mouseenter', () => this.show())\n .set('mouseleave', () => this.hide());\n } else if (!hasGestures) {\n // there's no way for the user to trigger the tooltip on a touch device.\n this._manualListeners.set('touchstart', () => this.show());\n }\n\n this._manualListeners.forEach((listener, event) =>\n element.addEventListener(event, listener)\n );\n\n if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n elementStyle.webkitUserSelect =\n elementStyle.userSelect =\n elementStyle.msUserSelect =\n '';\n }\n\n // Hammer applies `-webkit-user-drag: none` on all elements by default,\n // which breaks the native drag&drop. If the consumer explicitly made\n // the element draggable, clear the `-webkit-user-drag`.\n if (element.draggable && elementStyle.webkitUserDrag === 'none') {\n elementStyle.webkitUserDrag = '';\n }\n\n _focusMonitor\n .monitor(_elementRef)\n .pipe(takeUntil(this._destroyed))\n .subscribe((origin) => {\n // Note that the focus monitor runs outside the Angular zone.\n if (!origin) {\n _ngZone.run(() => this.hide());\n } else if (origin === 'keyboard') {\n _ngZone.run(() => this.show());\n }\n });\n }\n\n /**\n * Dispose the tooltip when destroyed.\n */\n ngOnDestroy() {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._tooltipInstance = null;\n }\n\n // Clean up the event listeners set in the constructor\n this._manualListeners.forEach((listener, event) => {\n this._elementRef.nativeElement.removeEventListener(event, listener);\n });\n this._manualListeners.clear();\n\n this._destroyed.next();\n this._destroyed.complete();\n\n this._ariaDescriber.removeDescription(\n this._elementRef.nativeElement,\n this.message\n );\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n /** Shows the tooltip after the delay in ms, defaults to tooltip-delay-show or 0ms if no input */\n show(): void {\n if (\n this.disabled ||\n !this.message ||\n (this._isTooltipVisible() &&\n !this._tooltipInstance!._showTimeoutId &&\n !this._tooltipInstance!._hideTimeoutId)\n ) {\n return;\n }\n\n const overlayRef = this._createOverlay();\n\n this._detach();\n this._portal =\n this._portal ||\n new ComponentPortal(TooltipComponent, this._viewContainerRef);\n this._tooltipInstance = overlayRef.attach(this._portal).instance;\n this._tooltipInstance\n .afterHidden()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._detach());\n this._setTooltipClass(this._tooltipClass);\n this._updateTooltipMessage();\n this._tooltipInstance!.show();\n }\n\n /** Hides the tooltip after the delay in ms, defaults to tooltip-delay-hide or 0ms if no input */\n hide(): void {\n if (this._tooltipInstance) {\n this._tooltipInstance.hide();\n }\n }\n\n /** Shows/hides the tooltip */\n toggle(): void {\n this._isTooltipVisible() ? this.hide() : this.show();\n }\n\n /** Returns true if the tooltip is currently visible to the user */\n _isTooltipVisible(): boolean {\n return !!this._tooltipInstance && this._tooltipInstance.isVisible();\n }\n\n /** Handles the keydown events on the host element. */\n _handleKeydown(e: KeyboardEvent) {\n if (this._isTooltipVisible() && e.key === 'Escape') {\n e.stopPropagation();\n this.hide();\n }\n }\n\n /** Handles the touchend events on the host element. */\n _handleTouchend() {\n this.hide();\n }\n\n /** Create the overlay config and position strategy */\n private _createOverlay(): OverlayRef {\n if (this._overlayRef) {\n return this._overlayRef;\n }\n\n // Create connected position strategy that listens for scroll events to reposition.\n const strategy = this._overlay\n .position()\n .flexibleConnectedTo(this._elementRef)\n .withTransformOriginOn('.oui-tooltip')\n .withFlexibleDimensions(false)\n .withViewportMargin(8);\n\n const scrollableAncestors =\n this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);\n\n strategy.withScrollableContainers(scrollableAncestors);\n\n strategy.positionChanges\n .pipe(takeUntil(this._destroyed))\n .subscribe((change) => {\n if (this._tooltipInstance) {\n if (\n change.scrollableViewProperties.isOverlayClipped &&\n this._tooltipInstance.isVisible()\n ) {\n // After position changes occur and the overlay is clipped by\n // a parent scrollable then close the tooltip.\n this._ngZone.run(() => this.hide());\n }\n }\n });\n\n this._overlayRef = this._overlay.create({\n direction: this._dir,\n positionStrategy: strategy,\n panelClass: TOOLTIP_PANEL_CLASS,\n scrollStrategy: this._scrollStrategy(),\n });\n\n this._updatePosition();\n\n this._overlayRef\n .detachments()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._detach());\n\n return this._overlayRef;\n }\n\n /** Detaches the currently-attached tooltip. */\n private _detach() {\n if (this._overlayRef && this._overlayRef.hasAttached()) {\n this._overlayRef.detach();\n }\n\n this._tooltipInstance = null;\n }\n\n /** Updates the position of the current tooltip. */\n private _updatePosition() {\n const position = this._overlayRef!.getConfig()\n .positionStrategy as FlexibleConnectedPositionStrategy;\n const origin = this._getOrigin();\n const overlay = this._getOverlayPosition();\n\n position.withPositions([\n { ...origin.main, ...overlay.main },\n { ...origin.fallback, ...overlay.fallback },\n ]);\n }\n\n /**\n * Returns the origin position and a fallback position based on the user's position preference.\n * The fallback position is the inverse of the origin (e.g. `'below' -> 'above'`).\n */\n _getOrigin(): {\n main: OriginConnectionPosition;\n fallback: OriginConnectionPosition;\n } {\n const isLtr = !this._dir || this._dir.value === 'ltr';\n const position = this.position;\n let originPosition: OriginConnectionPosition;\n\n if (position === 'above' || position === 'below') {\n originPosition = {\n originX: 'center',\n originY: position === 'above' ? 'top' : 'bottom',\n };\n } else if (\n (position === 'left' && isLtr) ||\n (position === 'right' && !isLtr)\n ) {\n originPosition = { originX: 'start', originY: 'center' };\n } else if (\n (position === 'right' && isLtr) ||\n (position === 'left' && !isLtr)\n ) {\n originPosition = { originX: 'end', originY: 'center' };\n } else {\n throw getOuiTooltipInvalidPositionError(position);\n }\n\n const { x, y } = this._invertPosition(\n originPosition.originX,\n originPosition.originY\n );\n\n return {\n main: originPosition,\n fallback: { originX: x, originY: y },\n };\n }\n\n /** Returns the overlay position and a fallback position based on the user's preference */\n _getOverlayPosition(): {\n main: OverlayConnectionPosition;\n fallback: OverlayConnectionPosition;\n } {\n const isLtr = !this._dir || this._dir.value === 'ltr';\n const position = this.position;\n let overlayPosition: OverlayConnectionPosition;\n\n if (position === 'above') {\n overlayPosition = { overlayX: 'center', overlayY: 'bottom' };\n } else if (position === 'below') {\n overlayPosition = { overlayX: 'center', overlayY: 'top' };\n } else if (\n (position === 'left' && isLtr) ||\n (position === 'right' && !isLtr)\n ) {\n overlayPosition = { overlayX: 'end', overlayY: 'center' };\n } else if (\n (position === 'right' && isLtr) ||\n (position === 'left' && !isLtr)\n ) {\n overlayPosition = { overlayX: 'start', overlayY: 'center' };\n } else {\n throw getOuiTooltipInvalidPositionError(position);\n }\n\n const { x, y } = this._invertPosition(\n overlayPosition.overlayX,\n overlayPosition.overlayY\n );\n\n return {\n main: overlayPosition,\n fallback: { overlayX: x, overlayY: y },\n };\n }\n\n /** Updates the tooltip message and repositions the overlay according to the new message length */\n private _updateTooltipMessage() {\n // Must wait for the message to be painted to the tooltip so that the overlay can properly\n // calculate the correct positioning based on the size of the text.\n if (this._tooltipInstance) {\n this._tooltipInstance.message = this.message;\n this._tooltipInstance._markForCheck();\n\n this._ngZone.onMicrotaskEmpty\n .asObservable()\n .pipe(take(1), takeUntil(this._destroyed))\n .subscribe(() => {\n if (this._tooltipInstance) {\n this._overlayRef!.updatePosition();\n }\n });\n }\n }\n\n /** Updates the tooltip class */\n private _setTooltipClass(\n tooltipClass: string | string[] | Set | { [key: string]: any }\n ) {\n if (this._tooltipInstance) {\n this._tooltipInstance.tooltipClass = tooltipClass;\n this._tooltipInstance._markForCheck();\n }\n }\n\n /** Inverts an overlay position. */\n private _invertPosition(\n x: HorizontalConnectionPos,\n y: VerticalConnectionPos\n ) {\n if (this.position === 'above' || this.position === 'below') {\n if (y === 'top') {\n y = 'bottom';\n } else if (y === 'bottom') {\n y = 'top';\n }\n } else {\n if (x === 'end') {\n x = 'start';\n } else if (x === 'start') {\n x = 'end';\n }\n }\n\n return { x, y };\n }\n}\n", + "sourceCode": "import { AnimationEvent } from '@angular/animations';\r\nimport { AriaDescriber, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport {\r\n BreakpointObserver,\r\n Breakpoints,\r\n BreakpointState,\r\n} from '@angular/cdk/layout';\r\nimport {\r\n FlexibleConnectedPositionStrategy,\r\n HorizontalConnectionPos,\r\n OriginConnectionPosition,\r\n Overlay,\r\n OverlayConnectionPosition,\r\n OverlayRef,\r\n VerticalConnectionPos,\r\n ScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { ScrollDispatcher } from '@angular/cdk/scrolling';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { take, takeUntil } from 'rxjs/operators';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Directive,\r\n ElementRef,\r\n Inject,\r\n InjectionToken,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Optional,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ouiTooltipAnimations } from './tooltip-animations';\r\nimport { CanDisable } from '../core';\r\n\r\nexport type TooltipPosition = 'left' | 'right' | 'above' | 'below';\r\n\r\n/** Time in ms to throttle repositioning after scroll events. */\r\nexport const SCROLL_THROTTLE_MS = 20;\r\n\r\n/** CSS class that will be attached to the overlay panel. */\r\nexport const TOOLTIP_PANEL_CLASS = 'oui-tooltip-panel';\r\n\r\n/**\r\n * Creates an error to be thrown if the user supplied an invalid tooltip position.\r\n *\r\n * @docs-private\r\n */\r\nexport function getOuiTooltipInvalidPositionError(position: string) {\r\n return Error(`Tooltip position \"${position}\" is invalid.`);\r\n}\r\n\r\n/** Injection token that determines the scroll handling while a tooltip is visible. */\r\nexport const OUI_TOOLTIP_SCROLL_STRATEGY = new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-tooltip-scroll-strategy');\r\n\r\n/** @docs-private */\r\nexport function OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY(\r\n overlay: Overlay\r\n): () => ScrollStrategy {\r\n return () =>\r\n overlay.scrollStrategies.reposition({ scrollThrottle: SCROLL_THROTTLE_MS });\r\n}\r\n\r\n/** @docs-private */\r\nexport const OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER = {\r\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\r\n};\r\n\r\n/** Default `ouiTooltip` options that can be overridden. */\r\nexport interface OuiTooltipDefaultOptions {\r\n showDelay: number;\r\n hideDelay: number;\r\n touchendHideDelay: number;\r\n}\r\n\r\nexport interface NewCSSStyleDeclaration extends CSSStyleDeclaration {\r\n msUserSelect: string;\r\n}\r\n\r\n/** Injection token to be used to override the default options for `ouiTooltip`. */\r\nexport const OUI_TOOLTIP_DEFAULT_OPTIONS =\r\n new InjectionToken('oui-tooltip-default-options', {\r\n providedIn: 'root',\r\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\r\n });\r\n\r\n/** @docs-private */\r\nexport function OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY(): OuiTooltipDefaultOptions {\r\n return {\r\n showDelay: 0,\r\n hideDelay: 0,\r\n touchendHideDelay: 1500,\r\n };\r\n}\r\n\r\nexport type TooltipVisibility = 'initial' | 'visible' | 'hidden';\r\n\r\n/**\r\n * Internal component that wraps the tooltip's content.\r\n *\r\n * @docs-private\r\n */\r\n@Component({\r\n selector: 'oui-tooltip-component',\r\n templateUrl: 'tooltip.html',\r\n styleUrls: ['tooltip.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [ouiTooltipAnimations.tooltipState],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n // Forces the element to have a layout in IE and Edge. This fixes issues where the element\r\n // won't be rendered if the animations are disabled or there is no web animations polyfill.\r\n '[style.zoom]': '_visibility === \"visible\" ? 1 : null',\r\n '(body:click)': 'this._handleBodyInteraction()',\r\n 'aria-hidden': 'true',\r\n },\r\n})\r\nexport class TooltipComponent {\r\n /** Message to display in the tooltip */\r\n message: string;\r\n /** Classes to be added to the tooltip. Supports the same syntax as `ngClass`. */\r\n tooltipClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** The timeout ID of any current timer set to show the tooltip */\r\n _showTimeoutId: number | null;\r\n\r\n /** The timeout ID of any current timer set to hide the tooltip */\r\n _hideTimeoutId: number | null;\r\n\r\n /** Property watched by the animation framework to show or hide the tooltip */\r\n _visibility: TooltipVisibility = 'initial';\r\n\r\n /** Whether interactions on the page should close the tooltip */\r\n private _closeOnInteraction = false;\r\n\r\n /** Subject for notifying that the tooltip has been hidden from the view */\r\n private readonly _onHide: Subject = new Subject();\r\n\r\n /** Stream that emits whether the user has a handset-sized display. */\r\n _isHandset: Observable = this._breakpointObserver.observe(\r\n Breakpoints.Handset\r\n );\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _breakpointObserver: BreakpointObserver\r\n ) {}\r\n\r\n /**\r\n * Shows the tooltip with an animation originating from the provided origin\r\n *\r\n * @param delay Amount of milliseconds to the delay showing the tooltip.\r\n */\r\n show(): void {\r\n // Cancel the delayed hide if it is scheduled\r\n if (this._hideTimeoutId) {\r\n clearTimeout(this._hideTimeoutId);\r\n this._hideTimeoutId = null;\r\n }\r\n\r\n // Body interactions should cancel the tooltip if there is a delay in showing.\r\n this._closeOnInteraction = true;\r\n setTimeout(() => {\r\n this._visibility = 'visible';\r\n this._showTimeoutId = null;\r\n\r\n // Mark for check so if any parent component has set the\r\n // ChangeDetectionStrategy to OnPush it will be checked anyways\r\n this._markForCheck();\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Begins the animation to hide the tooltip after the provided delay in ms.\r\n *\r\n * @param delay Amount of milliseconds to delay showing the tooltip.\r\n */\r\n hide(): void {\r\n // Cancel the delayed show if it is scheduled\r\n if (this._showTimeoutId) {\r\n clearTimeout(this._showTimeoutId);\r\n this._showTimeoutId = null;\r\n }\r\n setTimeout(() => {\r\n this._visibility = 'hidden';\r\n this._hideTimeoutId = null;\r\n // Mark for check so if any parent component has set the\r\n // ChangeDetectionStrategy to OnPush it will be checked anyways\r\n this._markForCheck();\r\n }, 0);\r\n }\r\n\r\n /** Returns an observable that notifies when the tooltip has been hidden from view. */\r\n afterHidden(): Observable {\r\n return this._onHide.asObservable();\r\n }\r\n\r\n /** Whether the tooltip is being displayed. */\r\n isVisible(): boolean {\r\n return this._visibility === 'visible';\r\n }\r\n\r\n _animationStart() {\r\n this._closeOnInteraction = false;\r\n }\r\n\r\n _animationDone(event: AnimationEvent): void {\r\n const toState = event.toState as TooltipVisibility;\r\n\r\n if (toState === 'hidden' && !this.isVisible()) {\r\n this._onHide.next();\r\n }\r\n\r\n if (toState === 'visible' || toState === 'hidden') {\r\n this._closeOnInteraction = true;\r\n }\r\n }\r\n\r\n /**\r\n * Interactions on the HTML body should close the tooltip immediately\r\n */\r\n _handleBodyInteraction(): void {\r\n if (this._closeOnInteraction) {\r\n this.hide();\r\n }\r\n }\r\n\r\n /**\r\n * Marks that the tooltip needs to be checked in the next change detection run.\r\n * Mainly used for rendering the initial text before positioning a tooltip, which\r\n * can be problematic in components with OnPush change detection.\r\n */\r\n _markForCheck(): void {\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n}\r\n\r\n/**\r\n * Directive that attaches a tooltip to the host element. Animates the showing and\r\n * hiding of a tooltip provided position (defaults to below the element).\r\n */\r\n@Directive({\r\n selector: '[ouiTooltip]',\r\n exportAs: 'ouiTooltip',\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '(longpress)': 'show()',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(touchend)': '_handleTouchend()',\r\n '[attr.tabindex]': 'disabled ? -1 : 0',\r\n '[attr.aria-hidden]': 'false',\r\n },\r\n})\r\nexport class OuiTooltip implements OnDestroy, CanDisable {\r\n _overlayRef: OverlayRef | null;\r\n _tooltipInstance: TooltipComponent | null;\r\n\r\n private _portal: ComponentPortal;\r\n private _position: TooltipPosition = 'below';\r\n private _disabled = false;\r\n private _tooltipClass:\r\n | string\r\n | string[]\r\n | Set\r\n | { [key: string]: any };\r\n private _scrollStrategy: () => ScrollStrategy;\r\n\r\n /** Allows the user to define the position of the tooltip relative to the parent element */\r\n @Input('ouiTooltipPosition')\r\n get position(): TooltipPosition {\r\n return this._position;\r\n }\r\n set position(value: TooltipPosition) {\r\n if (value !== this._position) {\r\n this._position = value;\r\n if (this._overlayRef) {\r\n this._updatePosition();\r\n\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance!.show();\r\n }\r\n\r\n this._overlayRef.updatePosition();\r\n }\r\n }\r\n }\r\n\r\n /** Disables the display of the tooltip. */\r\n @Input('ouiTooltipDisabled')\r\n get disabled(): boolean {\r\n return this._disabled;\r\n }\r\n set disabled(value) {\r\n this._disabled = coerceBooleanProperty(value);\r\n\r\n // If tooltip is disabled, hide immediately.\r\n if (this._disabled) {\r\n this.hide();\r\n }\r\n }\r\n\r\n private _message = '';\r\n\r\n /** The message to be displayed in the tooltip */\r\n @Input('ouiTooltip')\r\n get message() {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._ariaDescriber.removeDescription(\r\n this._elementRef.nativeElement,\r\n this._message\r\n );\r\n\r\n // If the message is not a string (e.g. number), convert it to a string and trim it.\r\n this._message = value != null ? `${value}`.trim() : '';\r\n\r\n if (!this._message && this._isTooltipVisible()) {\r\n this.hide();\r\n } else {\r\n this._updateTooltipMessage();\r\n this._ariaDescriber.describe(\r\n this._elementRef.nativeElement,\r\n this.message\r\n );\r\n }\r\n }\r\n\r\n /** Classes to be passed to the tooltip. Supports the same syntax as `ngClass`. */\r\n @Input('ouiTooltipClass')\r\n get tooltipClass() {\r\n return this._tooltipClass;\r\n }\r\n set tooltipClass(\r\n value: string | string[] | Set | { [key: string]: any }\r\n ) {\r\n this._tooltipClass = value;\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance._markForCheck();\r\n this._setTooltipClass(this._tooltipClass);\r\n }\r\n }\r\n\r\n private _manualListeners = new Map<\r\n string,\r\n EventListenerOrEventListenerObject\r\n >();\r\n\r\n /** Emits when the component is destroyed. */\r\n private readonly _destroyed = new Subject();\r\n\r\n constructor(\r\n private _overlay: Overlay,\r\n private _elementRef: ElementRef,\r\n private _scrollDispatcher: ScrollDispatcher,\r\n private _viewContainerRef: ViewContainerRef,\r\n private _ngZone: NgZone,\r\n platform: Platform,\r\n private _ariaDescriber: AriaDescriber,\r\n private _focusMonitor: FocusMonitor,\r\n @Inject(OUI_TOOLTIP_SCROLL_STRATEGY) scrollStrategy: any,\r\n @Optional() private _dir: Directionality\r\n ) {\r\n this._scrollStrategy = scrollStrategy;\r\n const element: HTMLElement = _elementRef.nativeElement;\r\n const elementStyle = element.style as NewCSSStyleDeclaration & {\r\n webkitUserDrag: string;\r\n };\r\n const hasGestures = typeof window === 'undefined' || (window as any).Hammer;\r\n\r\n // The mouse events shouldn't be bound on mobile devices, because they can prevent the\r\n // first tap from firing its click event or can cause the tooltip to open for clicks.\r\n if (!platform.IOS && !platform.ANDROID) {\r\n this._manualListeners\r\n .set('mouseenter', () => this.show())\r\n .set('mouseleave', () => this.hide());\r\n } else if (!hasGestures) {\r\n // there's no way for the user to trigger the tooltip on a touch device.\r\n this._manualListeners.set('touchstart', () => this.show());\r\n }\r\n\r\n this._manualListeners.forEach((listener, event) =>\r\n element.addEventListener(event, listener)\r\n );\r\n\r\n if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\r\n elementStyle.webkitUserSelect =\r\n elementStyle.userSelect =\r\n elementStyle.msUserSelect =\r\n '';\r\n }\r\n\r\n // Hammer applies `-webkit-user-drag: none` on all elements by default,\r\n // which breaks the native drag&drop. If the consumer explicitly made\r\n // the element draggable, clear the `-webkit-user-drag`.\r\n if (element.draggable && elementStyle.webkitUserDrag === 'none') {\r\n elementStyle.webkitUserDrag = '';\r\n }\r\n\r\n _focusMonitor\r\n .monitor(_elementRef)\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe((origin) => {\r\n // Note that the focus monitor runs outside the Angular zone.\r\n if (!origin) {\r\n _ngZone.run(() => this.hide());\r\n } else if (origin === 'keyboard') {\r\n _ngZone.run(() => this.show());\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Dispose the tooltip when destroyed.\r\n */\r\n ngOnDestroy() {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._tooltipInstance = null;\r\n }\r\n\r\n // Clean up the event listeners set in the constructor\r\n this._manualListeners.forEach((listener, event) => {\r\n this._elementRef.nativeElement.removeEventListener(event, listener);\r\n });\r\n this._manualListeners.clear();\r\n\r\n this._destroyed.next();\r\n this._destroyed.complete();\r\n\r\n this._ariaDescriber.removeDescription(\r\n this._elementRef.nativeElement,\r\n this.message\r\n );\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n }\r\n\r\n /** Shows the tooltip after the delay in ms, defaults to tooltip-delay-show or 0ms if no input */\r\n show(): void {\r\n if (\r\n this.disabled ||\r\n !this.message ||\r\n (this._isTooltipVisible() &&\r\n !this._tooltipInstance!._showTimeoutId &&\r\n !this._tooltipInstance!._hideTimeoutId)\r\n ) {\r\n return;\r\n }\r\n\r\n const overlayRef = this._createOverlay();\r\n\r\n this._detach();\r\n this._portal =\r\n this._portal ||\r\n new ComponentPortal(TooltipComponent, this._viewContainerRef);\r\n this._tooltipInstance = overlayRef.attach(this._portal).instance;\r\n this._tooltipInstance\r\n .afterHidden()\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => this._detach());\r\n this._setTooltipClass(this._tooltipClass);\r\n this._updateTooltipMessage();\r\n this._tooltipInstance!.show();\r\n }\r\n\r\n /** Hides the tooltip after the delay in ms, defaults to tooltip-delay-hide or 0ms if no input */\r\n hide(): void {\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.hide();\r\n } else {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n }\r\n }\r\n\r\n /** Shows/hides the tooltip */\r\n toggle(): void {\r\n if (this._isTooltipVisible()) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n /** Returns true if the tooltip is currently visible to the user */\r\n _isTooltipVisible(): boolean {\r\n return !!this._tooltipInstance && this._tooltipInstance.isVisible();\r\n }\r\n\r\n /** Handles the keydown events on the host element. */\r\n _handleKeydown(e: KeyboardEvent) {\r\n if (this._isTooltipVisible() && e.key === 'Escape') {\r\n e.stopPropagation();\r\n this.hide();\r\n }\r\n }\r\n\r\n /** Handles the touchend events on the host element. */\r\n _handleTouchend() {\r\n this.hide();\r\n }\r\n\r\n /** Create the overlay config and position strategy */\r\n private _createOverlay(): OverlayRef {\r\n if (this._overlayRef) {\r\n return this._overlayRef;\r\n }\r\n\r\n // Create connected position strategy that listens for scroll events to reposition.\r\n const strategy = this._overlay\r\n .position()\r\n .flexibleConnectedTo(this._elementRef)\r\n .withTransformOriginOn('.oui-tooltip')\r\n .withFlexibleDimensions(false)\r\n .withViewportMargin(8);\r\n\r\n const scrollableAncestors =\r\n this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);\r\n\r\n strategy.withScrollableContainers(scrollableAncestors);\r\n\r\n strategy.positionChanges\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe((change) => {\r\n if (this._tooltipInstance) {\r\n if (\r\n change.scrollableViewProperties.isOverlayClipped &&\r\n this._tooltipInstance.isVisible()\r\n ) {\r\n // After position changes occur and the overlay is clipped by\r\n // a parent scrollable then close the tooltip.\r\n this._ngZone.run(() => this.hide());\r\n }\r\n }\r\n });\r\n\r\n this._overlayRef = this._overlay.create({\r\n direction: this._dir,\r\n positionStrategy: strategy,\r\n panelClass: TOOLTIP_PANEL_CLASS,\r\n scrollStrategy: this._scrollStrategy(),\r\n });\r\n\r\n this._updatePosition();\r\n\r\n this._overlayRef\r\n .detachments()\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => this._detach());\r\n\r\n return this._overlayRef;\r\n }\r\n\r\n /** Detaches the currently-attached tooltip. */\r\n private _detach() {\r\n if (this._overlayRef && this._overlayRef.hasAttached()) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n\r\n this._tooltipInstance = null;\r\n }\r\n\r\n /** Updates the position of the current tooltip. */\r\n private _updatePosition() {\r\n const position = this._overlayRef!.getConfig()\r\n .positionStrategy as FlexibleConnectedPositionStrategy;\r\n const origin = this._getOrigin();\r\n const overlay = this._getOverlayPosition();\r\n\r\n position.withPositions([\r\n { ...origin.main, ...overlay.main },\r\n { ...origin.fallback, ...overlay.fallback },\r\n ]);\r\n }\r\n\r\n /**\r\n * Returns the origin position and a fallback position based on the user's position preference.\r\n * The fallback position is the inverse of the origin (e.g. `'below' -> 'above'`).\r\n */\r\n _getOrigin(): {\r\n main: OriginConnectionPosition;\r\n fallback: OriginConnectionPosition;\r\n } {\r\n const isLtr = !this._dir || this._dir.value === 'ltr';\r\n const position = this.position;\r\n let originPosition: OriginConnectionPosition;\r\n\r\n if (position === 'above' || position === 'below') {\r\n originPosition = {\r\n originX: 'center',\r\n originY: position === 'above' ? 'top' : 'bottom',\r\n };\r\n } else if (\r\n (position === 'left' && isLtr) ||\r\n (position === 'right' && !isLtr)\r\n ) {\r\n originPosition = { originX: 'start', originY: 'center' };\r\n } else if (\r\n (position === 'right' && isLtr) ||\r\n (position === 'left' && !isLtr)\r\n ) {\r\n originPosition = { originX: 'end', originY: 'center' };\r\n } else {\r\n throw getOuiTooltipInvalidPositionError(position);\r\n }\r\n\r\n const { x, y } = this._invertPosition(\r\n originPosition.originX,\r\n originPosition.originY\r\n );\r\n\r\n return {\r\n main: originPosition,\r\n fallback: { originX: x, originY: y },\r\n };\r\n }\r\n\r\n /** Returns the overlay position and a fallback position based on the user's preference */\r\n _getOverlayPosition(): {\r\n main: OverlayConnectionPosition;\r\n fallback: OverlayConnectionPosition;\r\n } {\r\n const isLtr = !this._dir || this._dir.value === 'ltr';\r\n const position = this.position;\r\n let overlayPosition: OverlayConnectionPosition;\r\n\r\n if (position === 'above') {\r\n overlayPosition = { overlayX: 'center', overlayY: 'bottom' };\r\n } else if (position === 'below') {\r\n overlayPosition = { overlayX: 'center', overlayY: 'top' };\r\n } else if (\r\n (position === 'left' && isLtr) ||\r\n (position === 'right' && !isLtr)\r\n ) {\r\n overlayPosition = { overlayX: 'end', overlayY: 'center' };\r\n } else if (\r\n (position === 'right' && isLtr) ||\r\n (position === 'left' && !isLtr)\r\n ) {\r\n overlayPosition = { overlayX: 'start', overlayY: 'center' };\r\n } else {\r\n throw getOuiTooltipInvalidPositionError(position);\r\n }\r\n\r\n const { x, y } = this._invertPosition(\r\n overlayPosition.overlayX,\r\n overlayPosition.overlayY\r\n );\r\n\r\n return {\r\n main: overlayPosition,\r\n fallback: { overlayX: x, overlayY: y },\r\n };\r\n }\r\n\r\n /** Updates the tooltip message and repositions the overlay according to the new message length */\r\n private _updateTooltipMessage() {\r\n // Must wait for the message to be painted to the tooltip so that the overlay can properly\r\n // calculate the correct positioning based on the size of the text.\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.message = this.message;\r\n this._tooltipInstance._markForCheck();\r\n\r\n this._ngZone.onMicrotaskEmpty\r\n .asObservable()\r\n .pipe(take(1), takeUntil(this._destroyed))\r\n .subscribe(() => {\r\n if (this._tooltipInstance) {\r\n this._overlayRef!.updatePosition();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Updates the tooltip class */\r\n private _setTooltipClass(\r\n tooltipClass: string | string[] | Set | { [key: string]: any }\r\n ) {\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.tooltipClass = tooltipClass;\r\n this._tooltipInstance._markForCheck();\r\n }\r\n }\r\n\r\n /** Inverts an overlay position. */\r\n private _invertPosition(\r\n x: HorizontalConnectionPos,\r\n y: VerticalConnectionPos\r\n ) {\r\n if (this.position === 'above' || this.position === 'below') {\r\n if (y === 'top') {\r\n y = 'bottom';\r\n } else if (y === 'bottom') {\r\n y = 'top';\r\n }\r\n } else {\r\n if (x === 'end') {\r\n x = 'start';\r\n } else if (x === 'start') {\r\n x = 'end';\r\n }\r\n }\r\n\r\n return { x, y };\r\n }\r\n}\r\n", "selector": "[ouiTooltip]", "providers": [], "exportAs": "ouiTooltip", @@ -20318,7 +20363,7 @@ }, { "name": "_manualListeners", - "defaultValue": "new Map<\n string,\n EventListenerOrEventListenerObject\n >()", + "defaultValue": "new Map<\r\n string,\r\n EventListenerOrEventListenerObject\r\n >()", "deprecated": false, "deprecationMessage": "", "type": "", @@ -20417,7 +20462,7 @@ "optional": false, "returnType": "OverlayRef", "typeParameters": [], - "line": 509, + "line": 518, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nCreate the overlay config and position strategy", @@ -20432,7 +20477,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 560, + "line": 569, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nDetaches the currently-attached tooltip.", @@ -20447,7 +20492,7 @@ "optional": false, "returnType": "literal type", "typeParameters": [], - "line": 585, + "line": 595, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nReturns the origin position and a fallback position based on the user's position preference.\nThe fallback position is the inverse of the origin (e.g. `'below' -> 'above'`).\n", @@ -20459,7 +20504,7 @@ "optional": false, "returnType": "literal type", "typeParameters": [], - "line": 624, + "line": 634, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReturns the overlay position and a fallback position based on the user's preference", @@ -20478,7 +20523,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 496, + "line": 505, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHandles the keydown events on the host element.", @@ -20501,7 +20546,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 504, + "line": 513, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHandles the touchend events on the host element.", @@ -20526,7 +20571,7 @@ "optional": false, "returnType": "{ x: HorizontalConnectionPos; y: VerticalConnectionPos; }", "typeParameters": [], - "line": 691, + "line": 701, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nInverts an overlay position.", @@ -20561,7 +20606,7 @@ "optional": false, "returnType": "boolean", "typeParameters": [], - "line": 491, + "line": 500, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReturns true if the tooltip is currently visible to the user", @@ -20580,7 +20625,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 681, + "line": 691, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nUpdates the tooltip class", @@ -20606,7 +20651,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 569, + "line": 579, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nUpdates the position of the current tooltip.", @@ -20621,7 +20666,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 662, + "line": 672, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nUpdates the tooltip message and repositions the overlay according to the new message length", @@ -20672,7 +20717,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 486, + "line": 491, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nShows/hides the tooltip", @@ -21004,7 +21049,7 @@ "components": [ { "name": "Checkbox", - "id": "component-Checkbox-3f6cb79eae7dd4114475fddbea16ffc92a51d23162b97d0d54f7e02d674d5c66575ad9e8e9f7607f423d1c3c1ba33abfd9ffc3c40294186f728ffb2bd241ca42", + "id": "component-Checkbox-01361bfeba73f4136114042a2dc1708c0fd8c7edc272687f3f86de4fd37e15c12ab7baf9e178f3362a46d3c1b27d1e899175193388faeecb0a51f49614dd1ee2", "file": "ui/src/components/checkbox/checkbox.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -21051,7 +21096,7 @@ "rawdescription": "\n\nUsers can specify the `aria-labelledby` attribute which will be forwarded to the input element\n", "description": "

Users can specify the aria-labelledby attribute which will be forwarded to the input element

\n", "line": 107, - "type": "any | null", + "type": "any", "decorators": [] }, { @@ -21261,15 +21306,15 @@ "rawdescription": "\n\nCalled when the checkbox is blurred. Needed to properly implement ControlValueAccessor.\n\n", "jsdoctags": [ { - "pos": 9868, - "end": 9885, + "pos": 10189, + "end": 10207, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, "kind": 334, "tagName": { - "pos": 9869, - "end": 9881, + "pos": 10190, + "end": 10202, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -21418,8 +21463,8 @@ "jsdoctags": [ { "name": { - "pos": 6607, - "end": 6612, + "pos": 6833, + "end": 6838, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -21430,8 +21475,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 6601, - "end": 6606, + "pos": 6827, + "end": 6832, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -21673,7 +21718,7 @@ "description": "

Supports all of the functionality of an HTML5 checkbox,\nand exposes a similar API. A MatCheckbox can be either checked, unchecked, or\ndisabled. Note that all additional accessibility attributes are taken care of by the component,\nso there is no need to provide them yourself. However, if you want to omit a label and still\nhave the checkbox be accessible, you may supply an [aria-label] input.\nSee: https://github.com/scheduleonce/once-ui/tree/master/ui/src/components/checkbox/README.md

\n", "rawdescription": "\n\nSupports all of the functionality of an HTML5 checkbox,\nand exposes a similar API. A MatCheckbox can be either checked, unchecked, or\ndisabled. Note that all additional accessibility attributes are taken care of by the component,\nso there is no need to provide them yourself. However, if you want to omit a label and still\nhave the checkbox be accessible, you may supply an [aria-label] input.\nSee: https://github.com/scheduleonce/once-ui/tree/master/ui/src/components/checkbox/README.md\n", "type": "component", - "sourceCode": "import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n Input,\n EventEmitter,\n Output,\n NgZone,\n ChangeDetectorRef,\n forwardRef,\n ElementRef,\n Attribute,\n ViewChild,\n OnDestroy,\n} from '@angular/core';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { HasTabIndex } from '../core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { mixinColor } from '../core';\nimport { Subscription } from 'rxjs';\n// Increasing integer for generating unique ids for checkbox components.\nlet nextUniqueId = 0;\n\n/** Change event object emitted by MatCheckbox. */\nexport class OuiCheckboxChange {\n /** The source MatCheckbox of the event. */\n source: Checkbox;\n /** The new `checked` value of the checkbox. */\n checked: boolean;\n}\n\nexport class OuiCheckboxBase {\n constructor(public _elementRef: ElementRef) {}\n}\n\nexport const OuiCheckboxMixinBase: typeof OuiCheckboxBase =\n mixinColor(OuiCheckboxBase);\n\n/**\n * Represents the different states that require custom transitions between them.\n *\n * @docs-private\n */\nexport enum TransitionCheckState {\n Init,\n /** The state representing the component when it's becoming checked. */\n Checked,\n /** The state representing the component when it's becoming unchecked. */\n Unchecked,\n}\n\n/**\n * Supports all of the functionality of an HTML5 checkbox,\n * and exposes a similar API. A MatCheckbox can be either checked, unchecked, or\n * disabled. Note that all additional accessibility attributes are taken care of by the component,\n * so there is no need to provide them yourself. However, if you want to omit a label and still\n * have the checkbox be accessible, you may supply an [aria-label] input.\n * See: https://github.com/scheduleonce/once-ui/tree/master/ui/src/components/checkbox/README.md\n */\n@Component({\n selector: 'oui-checkbox',\n templateUrl: './checkbox.html',\n styleUrls: ['./checkbox.scss'],\n exportAs: 'ouiCheckbox',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-checkbox',\n '[id]': 'id',\n '[attr.tabindex]': 'null',\n '[class.oui-checkbox-checked]': 'checked',\n '[class.oui-checkbox-disabled]': 'disabled',\n '[class.oui-checkbox-label-before]': 'labelPosition == \"before\"',\n },\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['tabIndex', 'color'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => Checkbox),\n multi: true,\n },\n ],\n})\nexport class Checkbox\n extends OuiCheckboxMixinBase\n implements ControlValueAccessor, HasTabIndex, OnDestroy\n{\n /**\n * Attached to the aria-label attribute of the host element. In most cases, arial-labelledby will\n * take precedence so this may be omitted.\n */\n /**\n * Implemented as part of CanColor.\n */\n color = 'primary';\n\n @Input('aria-label')\n ariaLabel: any = '';\n\n /**\n * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\n */\n @Input('aria-labelledby')\n ariaLabelledby: any | null = null;\n\n private _uniqueId: any = `oui-checkbox-${++nextUniqueId}`;\n\n /** A unique id for the checkbox input. If none is supplied, it will be auto-generated. */\n\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n @Input()\n id: string = this._uniqueId;\n\n /** Returns the unique id for the visual hidden input. */\n get inputId(): string {\n return `${this.id || this._uniqueId}-input`;\n }\n\n /** Whether the checkbox is required. */\n @Input()\n get required(): boolean {\n return this._required;\n }\n\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n }\n\n private _required: boolean;\n\n /** Whether the label should appear after or before the checkbox. Defaults to 'after' */\n @Input()\n labelPosition: 'before' | 'after' = 'after';\n\n /** Name value will be applied to the input element if present */\n @Input()\n name: string | null = null;\n\n /** Event emitted when the checkbox's `checked` value changes. */\n @Output()\n readonly change: EventEmitter =\n new EventEmitter();\n\n /** The native `` element */\n @ViewChild('input') _inputElement: ElementRef;\n\n /** The value attribute of the native input element */\n @Input()\n value: string;\n\n /**\n * Whether the checkbox is checked.\n */\n @Input()\n get checked(): boolean {\n return this._checked;\n }\n\n set checked(value: boolean) {\n if (value !== this.checked) {\n this._checked = value;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n private _checked: any = false;\n\n /**\n * Whether the checkbox is disabled. This fully overrides the implementation provided by\n * mixinDisabled, but the mixin is still required because mixinTabIndex requires it.\n */\n @Input()\n get disabled() {\n return this._disabled;\n }\n\n set disabled(value: any) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this.disabled) {\n this._disabled = newValue;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n private _disabled = false;\n private _currentCheckState: TransitionCheckState = TransitionCheckState.Init;\n private _currentAnimationClass = '';\n\n /**\n * Implemented as part of HasTabIndex.\n */\n tabIndex: any;\n constructor(\n private _changeDetectorRef: ChangeDetectorRef,\n public _elementRef: ElementRef,\n private _ngZone: NgZone,\n private _focusMonitor: FocusMonitor,\n @Attribute('tabindex') tabIndex: string\n ) {\n super(_elementRef);\n this.tabIndex = parseInt(tabIndex, 10) || 0;\n this._monitorSubscription = this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(() =>\n this._ngZone.run(() => {\n this._changeDetectorRef.markForCheck();\n })\n );\n }\n\n _getAriaChecked(): 'true' | 'false' {\n return this.checked ? 'true' : 'false';\n }\n\n /** Focuses the checkbox. */\n focus(): void {\n this._focusMonitor.focusVia(this._inputElement, 'keyboard');\n }\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef);\n this._monitorSubscription.unsubscribe();\n }\n /**\n * Event handler for checkbox input element.\n * Toggles checked state if element is not disabled.\n * Do not toggle on (change) event since IE doesn't fire change event when\n * indeterminate checkbox is clicked.\n *\n * @param event\n */\n _onInputClick(event: Event) {\n // We have to stop propagation for click events on the visual hidden input element.\n // By default, when a user clicks on a label element, a generated click event will be\n // dispatched on the associated input element. Since we are using a label element as our\n // root container, the click event on the `checkbox` will be executed twice.\n // The real click event will bubble up, and the generated click event also tries to bubble up.\n // This will lead to multiple click events.\n // Preventing bubbling for the second event will solve that issue.\n event.stopPropagation();\n\n // If resetIndeterminate is false, and the current state is indeterminate, do nothing on click\n if (!this.disabled) {\n this.toggle();\n this._transitionCheckState(\n this._checked\n ? TransitionCheckState.Checked\n : TransitionCheckState.Unchecked\n );\n\n // Emit our custom change event if the native input emitted one.\n // It is important to only emit it, if the native input triggered one, because\n // we don't want to trigger a change event, when the `checked` variable changes for example.\n this._emitChangeEvent();\n }\n }\n\n private _transitionCheckState(newState: TransitionCheckState) {\n const oldState = this._currentCheckState;\n const element: HTMLElement = this._elementRef.nativeElement;\n\n if (oldState === newState) {\n return;\n }\n if (this._currentAnimationClass.length > 0) {\n element.classList.remove(this._currentAnimationClass);\n }\n\n this._currentAnimationClass =\n this._getAnimationClassForCheckStateTransition(oldState, newState);\n this._currentCheckState = newState;\n\n if (this._currentAnimationClass.length > 0) {\n element.classList.add(this._currentAnimationClass);\n\n // Remove the animation class to avoid animation when the checkbox is moved between containers\n const animationClass = this._currentAnimationClass;\n\n this._ngZone.runOutsideAngular(() => {\n setTimeout(() => {\n element.classList.remove(animationClass);\n }, 1000);\n });\n }\n }\n\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled: boolean) {\n this.disabled = isDisabled;\n }\n\n private _emitChangeEvent() {\n const event = new OuiCheckboxChange();\n event.source = this;\n event.checked = this.checked;\n this._controlValueAccessorChangeFn(this.checked);\n this.change.emit(event);\n }\n\n /** Toggles the `checked` state of the checkbox. */\n toggle(): void {\n this.checked = !this.checked;\n }\n\n _onInteractionEvent(event: Event) {\n // We always have to stop propagation on the change event.\n // Otherwise the change event, from the input element, will bubble up and\n // emit its event object to the `change` output.\n event.stopPropagation();\n }\n\n // Implemented as part of ControlValueAccessor.\n writeValue(value: any) {\n this.checked = !!value;\n }\n\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn: (value: any) => void) {\n this._controlValueAccessorChangeFn = fn;\n }\n\n /**\n * Called when the checkbox is blurred. Needed to properly implement ControlValueAccessor.\n *\n * @docs-private\n */\n _onTouched: () => any = () => {};\n\n private _controlValueAccessorChangeFn: (value: any) => void = () => {};\n\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn: any) {\n this._onTouched = fn;\n }\n\n private _getAnimationClassForCheckStateTransition(\n oldState: TransitionCheckState,\n newState: TransitionCheckState\n ): string {\n let animSuffix: any = '';\n\n switch (oldState) {\n case TransitionCheckState.Init:\n // Handle edge case where user interacts with checkbox that does not have [(ngModel)] or\n // [checked] bound to it.\n if (newState === TransitionCheckState.Checked) {\n animSuffix = 'unchecked-checked';\n } else if (newState === TransitionCheckState.Unchecked) {\n animSuffix = 'unchecked-unchecked';\n } else {\n return '';\n }\n break;\n case TransitionCheckState.Unchecked:\n animSuffix =\n newState === TransitionCheckState.Checked ? 'unchecked-checked' : '';\n break;\n case TransitionCheckState.Checked:\n animSuffix =\n newState === TransitionCheckState.Unchecked\n ? 'checked-unchecked'\n : '';\n break;\n }\n\n return `oui-checkbox-anim-${animSuffix}`;\n }\n}\n", + "sourceCode": "import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n Input,\r\n EventEmitter,\r\n Output,\r\n NgZone,\r\n ChangeDetectorRef,\r\n forwardRef,\r\n ElementRef,\r\n Attribute,\r\n ViewChild,\r\n OnDestroy,\r\n} from '@angular/core';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { HasTabIndex } from '../core';\r\nimport { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { mixinColor } from '../core';\r\nimport { Subscription } from 'rxjs';\r\n// Increasing integer for generating unique ids for checkbox components.\r\nlet nextUniqueId = 0;\r\n\r\n/** Change event object emitted by MatCheckbox. */\r\nexport class OuiCheckboxChange {\r\n /** The source MatCheckbox of the event. */\r\n source: Checkbox;\r\n /** The new `checked` value of the checkbox. */\r\n checked: boolean;\r\n}\r\n\r\nexport class OuiCheckboxBase {\r\n constructor(public _elementRef: ElementRef) {}\r\n}\r\n\r\nexport const OuiCheckboxMixinBase: typeof OuiCheckboxBase =\r\n mixinColor(OuiCheckboxBase);\r\n\r\n/**\r\n * Represents the different states that require custom transitions between them.\r\n *\r\n * @docs-private\r\n */\r\nexport enum TransitionCheckState {\r\n Init,\r\n /** The state representing the component when it's becoming checked. */\r\n Checked,\r\n /** The state representing the component when it's becoming unchecked. */\r\n Unchecked,\r\n}\r\n\r\n/**\r\n * Supports all of the functionality of an HTML5 checkbox,\r\n * and exposes a similar API. A MatCheckbox can be either checked, unchecked, or\r\n * disabled. Note that all additional accessibility attributes are taken care of by the component,\r\n * so there is no need to provide them yourself. However, if you want to omit a label and still\r\n * have the checkbox be accessible, you may supply an [aria-label] input.\r\n * See: https://github.com/scheduleonce/once-ui/tree/master/ui/src/components/checkbox/README.md\r\n */\r\n@Component({\r\n selector: 'oui-checkbox',\r\n templateUrl: './checkbox.html',\r\n styleUrls: ['./checkbox.scss'],\r\n exportAs: 'ouiCheckbox',\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n class: 'oui-checkbox',\r\n '[id]': 'id',\r\n '[attr.tabindex]': 'null',\r\n '[class.oui-checkbox-checked]': 'checked',\r\n '[class.oui-checkbox-disabled]': 'disabled',\r\n '[class.oui-checkbox-label-before]': 'labelPosition == \"before\"',\r\n },\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['tabIndex', 'color'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => Checkbox),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class Checkbox\r\n extends OuiCheckboxMixinBase\r\n implements ControlValueAccessor, HasTabIndex, OnDestroy\r\n{\r\n /**\r\n * Attached to the aria-label attribute of the host element. In most cases, arial-labelledby will\r\n * take precedence so this may be omitted.\r\n */\r\n /**\r\n * Implemented as part of CanColor.\r\n */\r\n color = 'primary';\r\n\r\n @Input('aria-label')\r\n ariaLabel: any = '';\r\n\r\n /**\r\n * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element\r\n */\r\n @Input('aria-labelledby')\r\n ariaLabelledby: any = null;\r\n\r\n private _uniqueId: any = `oui-checkbox-${++nextUniqueId}`;\r\n\r\n /** A unique id for the checkbox input. If none is supplied, it will be auto-generated. */\r\n\r\n private _monitorSubscription: Subscription = Subscription.EMPTY;\r\n\r\n @Input()\r\n id: string = this._uniqueId;\r\n\r\n /** Returns the unique id for the visual hidden input. */\r\n get inputId(): string {\r\n return `${this.id || this._uniqueId}-input`;\r\n }\r\n\r\n /** Whether the checkbox is required. */\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n }\r\n\r\n private _required: boolean;\r\n\r\n /** Whether the label should appear after or before the checkbox. Defaults to 'after' */\r\n @Input()\r\n labelPosition: 'before' | 'after' = 'after';\r\n\r\n /** Name value will be applied to the input element if present */\r\n @Input()\r\n name: string | null = null;\r\n\r\n /** Event emitted when the checkbox's `checked` value changes. */\r\n @Output()\r\n readonly change: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** The native `` element */\r\n @ViewChild('input') _inputElement: ElementRef;\r\n\r\n /** The value attribute of the native input element */\r\n @Input()\r\n value: string;\r\n\r\n /**\r\n * Whether the checkbox is checked.\r\n */\r\n @Input()\r\n get checked(): boolean {\r\n return this._checked;\r\n }\r\n\r\n set checked(value: boolean) {\r\n if (value !== this.checked) {\r\n this._checked = value;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n private _checked: any = false;\r\n\r\n /**\r\n * Whether the checkbox is disabled. This fully overrides the implementation provided by\r\n * mixinDisabled, but the mixin is still required because mixinTabIndex requires it.\r\n */\r\n @Input()\r\n get disabled() {\r\n return this._disabled;\r\n }\r\n\r\n set disabled(value: any) {\r\n const newValue = coerceBooleanProperty(value);\r\n\r\n if (newValue !== this.disabled) {\r\n this._disabled = newValue;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n private _disabled = false;\r\n private _currentCheckState: TransitionCheckState = TransitionCheckState.Init;\r\n private _currentAnimationClass = '';\r\n\r\n /**\r\n * Implemented as part of HasTabIndex.\r\n */\r\n tabIndex: any;\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n public _elementRef: ElementRef,\r\n private _ngZone: NgZone,\r\n private _focusMonitor: FocusMonitor,\r\n @Attribute('tabindex') tabIndex: string\r\n ) {\r\n super(_elementRef);\r\n this.tabIndex = parseInt(tabIndex, 10) || 0;\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this._elementRef, true)\r\n .subscribe(() =>\r\n this._ngZone.run(() => {\r\n this._changeDetectorRef.markForCheck();\r\n })\r\n );\r\n }\r\n\r\n _getAriaChecked(): 'true' | 'false' {\r\n return this.checked ? 'true' : 'false';\r\n }\r\n\r\n /** Focuses the checkbox. */\r\n focus(): void {\r\n this._focusMonitor.focusVia(this._inputElement, 'keyboard');\r\n }\r\n ngOnDestroy() {\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n this._monitorSubscription.unsubscribe();\r\n }\r\n /**\r\n * Event handler for checkbox input element.\r\n * Toggles checked state if element is not disabled.\r\n * Do not toggle on (change) event since IE doesn't fire change event when\r\n * indeterminate checkbox is clicked.\r\n *\r\n * @param event\r\n */\r\n _onInputClick(event: Event) {\r\n // We have to stop propagation for click events on the visual hidden input element.\r\n // By default, when a user clicks on a label element, a generated click event will be\r\n // dispatched on the associated input element. Since we are using a label element as our\r\n // root container, the click event on the `checkbox` will be executed twice.\r\n // The real click event will bubble up, and the generated click event also tries to bubble up.\r\n // This will lead to multiple click events.\r\n // Preventing bubbling for the second event will solve that issue.\r\n event.stopPropagation();\r\n\r\n // If resetIndeterminate is false, and the current state is indeterminate, do nothing on click\r\n if (!this.disabled) {\r\n this.toggle();\r\n this._transitionCheckState(\r\n this._checked\r\n ? TransitionCheckState.Checked\r\n : TransitionCheckState.Unchecked\r\n );\r\n\r\n // Emit our custom change event if the native input emitted one.\r\n // It is important to only emit it, if the native input triggered one, because\r\n // we don't want to trigger a change event, when the `checked` variable changes for example.\r\n this._emitChangeEvent();\r\n }\r\n }\r\n\r\n private _transitionCheckState(newState: TransitionCheckState) {\r\n const oldState = this._currentCheckState;\r\n const element: HTMLElement = this._elementRef.nativeElement;\r\n\r\n if (oldState === newState) {\r\n return;\r\n }\r\n if (this._currentAnimationClass.length > 0) {\r\n element.classList.remove(this._currentAnimationClass);\r\n }\r\n\r\n this._currentAnimationClass =\r\n this._getAnimationClassForCheckStateTransition(oldState, newState);\r\n this._currentCheckState = newState;\r\n\r\n if (this._currentAnimationClass.length > 0) {\r\n element.classList.add(this._currentAnimationClass);\r\n\r\n // Remove the animation class to avoid animation when the checkbox is moved between containers\r\n const animationClass = this._currentAnimationClass;\r\n\r\n this._ngZone.runOutsideAngular(() => {\r\n setTimeout(() => {\r\n element.classList.remove(animationClass);\r\n }, 1000);\r\n });\r\n }\r\n }\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n setDisabledState(isDisabled: boolean) {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n private _emitChangeEvent() {\r\n const event = new OuiCheckboxChange();\r\n event.source = this;\r\n event.checked = this.checked;\r\n this._controlValueAccessorChangeFn(this.checked);\r\n this.change.emit(event);\r\n }\r\n\r\n /** Toggles the `checked` state of the checkbox. */\r\n toggle(): void {\r\n this.checked = !this.checked;\r\n }\r\n\r\n _onInteractionEvent(event: Event) {\r\n // We always have to stop propagation on the change event.\r\n // Otherwise the change event, from the input element, will bubble up and\r\n // emit its event object to the `change` output.\r\n event.stopPropagation();\r\n }\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n writeValue(value: any) {\r\n this.checked = !!value;\r\n }\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n registerOnChange(fn: (value: any) => void) {\r\n this._controlValueAccessorChangeFn = fn;\r\n }\r\n\r\n /**\r\n * Called when the checkbox is blurred. Needed to properly implement ControlValueAccessor.\r\n *\r\n * @docs-private\r\n */\r\n _onTouched: () => any = () => {};\r\n\r\n private _controlValueAccessorChangeFn: (value: any) => void = () => {};\r\n\r\n // Implemented as part of ControlValueAccessor.\r\n registerOnTouched(fn: any) {\r\n this._onTouched = fn;\r\n }\r\n\r\n private _getAnimationClassForCheckStateTransition(\r\n oldState: TransitionCheckState,\r\n newState: TransitionCheckState\r\n ): string {\r\n let animSuffix: any = '';\r\n\r\n switch (oldState) {\r\n case TransitionCheckState.Init:\r\n // Handle edge case where user interacts with checkbox that does not have [(ngModel)] or\r\n // [checked] bound to it.\r\n if (newState === TransitionCheckState.Checked) {\r\n animSuffix = 'unchecked-checked';\r\n } else if (newState === TransitionCheckState.Unchecked) {\r\n animSuffix = 'unchecked-unchecked';\r\n } else {\r\n return '';\r\n }\r\n break;\r\n case TransitionCheckState.Unchecked:\r\n animSuffix =\r\n newState === TransitionCheckState.Checked ? 'unchecked-checked' : '';\r\n break;\r\n case TransitionCheckState.Checked:\r\n animSuffix =\r\n newState === TransitionCheckState.Unchecked\r\n ? 'checked-unchecked'\r\n : '';\r\n break;\r\n }\r\n\r\n return `oui-checkbox-anim-${animSuffix}`;\r\n }\r\n}\r\n", "assetsDirs": [], "styleUrlsData": [ { @@ -22207,7 +22252,7 @@ }, { "name": "OuiAnchor", - "id": "component-OuiAnchor-0d7d7fa85ca575eff44ea16216e0b4e33534845e4ea90e975cbffa14d598d4392f2620b0e45183fa30e446ad5dfa4283ef721d2475ff2f880c1047553f88955f", + "id": "component-OuiAnchor-cd4d61dce3765d9a6e05591c78f5cba9cd5afb8c73b9e49619e9c1e784c62b00d55c1556f8363d57992e5141a8f4f160312c20c4378256befbfae3dcd72508c6", "file": "ui/src/components/button/button.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -22239,7 +22284,7 @@ "deprecationMessage": "", "rawdescription": "\nTabindex of the button.", "description": "

Tabindex of the button.

\n", - "line": 148, + "line": 149, "type": "number", "decorators": [] } @@ -22253,7 +22298,7 @@ "type": "ChangeDetectorRef", "optional": false, "description": "", - "line": 78, + "line": 79, "modifierKind": [ 125 ], @@ -22269,7 +22314,7 @@ "type": "Subscription", "optional": false, "description": "", - "line": 74, + "line": 75, "modifierKind": [ 123 ], @@ -22292,7 +22337,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 158, + "line": 159, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -22313,7 +22358,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 92, + "line": 93, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -22329,7 +22374,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 109, + "line": 110, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nFocuses the button.", @@ -22344,7 +22389,7 @@ "optional": false, "returnType": "any", "typeParameters": [], - "line": 113, + "line": 114, "deprecated": false, "deprecationMessage": "", "inheritance": { @@ -22365,7 +22410,7 @@ "optional": false, "returnType": "any", "typeParameters": [], - "line": 117, + "line": 118, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nGets whether the button has one of the given attributes.", @@ -22392,7 +22437,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 103, + "line": 104, "deprecated": false, "deprecationMessage": "", "inheritance": { @@ -22409,11 +22454,11 @@ "description": "

Once UI anchor.

\n", "rawdescription": "\n\nOnce UI anchor.\n", "type": "component", - "sourceCode": "import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n OnDestroy,\n ChangeDetectorRef,\n NgZone,\n Input,\n} from '@angular/core';\nimport {\n CanDisable,\n CanColor,\n CanDisableCtor,\n CanColorCtor,\n mixinColor,\n mixinDisabled,\n} from '../core';\n\nimport { CanProgress, CanProgressCtor, mixinProgress } from './progress';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Subscription } from 'rxjs';\n/**\n * List of classes to add to Button instances based on host attributes to\n * style as different variants.\n */\nconst BUTTON_HOST_ATTRIBUTES = [\n 'oui-button',\n 'oui-ghost-button',\n 'oui-link-button',\n 'oui-icon-button',\n 'oui-icon-text-button',\n];\n\n/** Default color palette for round buttons (oui-fab and oui-mini-fab) */\nconst DEFAULT_COLOR = 'primary';\n\n// Boilerplate for applying mixins to OuiButton.\n/** @docs-private */\nexport class OuiButtonBase {\n constructor(public _elementRef: ElementRef, public _cdr: ChangeDetectorRef) {}\n}\n\nexport const OuiButtonMixinBase: CanDisableCtor &\n CanColorCtor &\n CanProgressCtor &\n typeof OuiButtonBase = mixinProgress(\n mixinColor(mixinDisabled(OuiButtonBase))\n);\n\n/**\n * Once Ui button.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `button[oui-button], button[oui-ghost-button], button[oui-link-button], button[oui-icon-button],\n button[oui-icon-text-button]`,\n exportAs: 'ouiButton',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[disabled]': 'disabled || null',\n },\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color', 'progress', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiButton\n extends OuiButtonMixinBase\n implements OnDestroy, CanDisable, CanColor, CanProgress\n{\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n public _cdr: ChangeDetectorRef,\n private _ngZone: NgZone\n ) {\n super(elementRef, _cdr);\n this.addClass();\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() =>\n this._ngZone.run(() => {\n this._cdr.markForCheck();\n })\n );\n }\n\n protected addClass() {\n for (const attr of BUTTON_HOST_ATTRIBUTES) {\n if (this.hasHostAttributes(attr)) {\n (this.elementRef.nativeElement as HTMLElement).classList.add(attr);\n }\n }\n if (!this.color) {\n this.color = DEFAULT_COLOR;\n }\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this.elementRef);\n this._monitorSubscription.unsubscribe();\n }\n\n /** Focuses the button. */\n focus(): void {\n this.getHostElement().focus();\n }\n\n getHostElement() {\n return this.elementRef.nativeElement;\n }\n /** Gets whether the button has one of the given attributes. */\n hasHostAttributes(...attributes: string[]) {\n return attributes.some((attribute) =>\n this.getHostElement().hasAttribute(attribute)\n );\n }\n}\n\n/**\n * Once UI anchor.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `a[oui-button], a[oui-ghost-button], a[oui-link-button], a[oui-icon-button],\n a[oui-icon-text-button]`,\n exportAs: 'ouiButton, ouiAnchor',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.tabindex]': 'disabled ? -1 : (tabIndex || 0)',\n '[attr.disabled]': 'disabled || null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '(click)': '_haltDisabledEvents($event)',\n },\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color'],\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiAnchor extends OuiButton {\n /** Tabindex of the button. */\n @Input() tabIndex: number;\n constructor(\n elementRef: ElementRef,\n focusMonitor: FocusMonitor,\n _cdr: ChangeDetectorRef,\n _ngZone: NgZone\n ) {\n super(elementRef, focusMonitor, _cdr, _ngZone);\n }\n\n _haltDisabledEvents(event: Event) {\n // A disabled button shouldn't apply any actions\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n", + "sourceCode": "import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n OnDestroy,\n ChangeDetectorRef,\n NgZone,\n Input,\n} from '@angular/core';\nimport {\n CanDisable,\n CanColor,\n CanDisableCtor,\n CanColorCtor,\n mixinColor,\n mixinDisabled,\n} from '../core';\n\nimport { CanProgress, CanProgressCtor, mixinProgress } from './progress';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Subscription } from 'rxjs';\n/**\n * List of classes to add to Button instances based on host attributes to\n * style as different variants.\n */\nconst BUTTON_HOST_ATTRIBUTES = [\n 'oui-button',\n 'oui-ghost-button',\n 'oui-link-button',\n 'oui-icon-button',\n 'oui-icon-text-button',\n];\n\n/** Default color palette for round buttons (oui-fab and oui-mini-fab) */\nconst DEFAULT_COLOR = 'primary';\n\n// Boilerplate for applying mixins to OuiButton.\n/** @docs-private */\nexport class OuiButtonBase {\n constructor(public _elementRef: ElementRef, public _cdr: ChangeDetectorRef) {}\n}\n\nexport const OuiButtonMixinBase: CanDisableCtor &\n CanColorCtor &\n CanProgressCtor &\n typeof OuiButtonBase = mixinProgress(\n mixinColor(mixinDisabled(OuiButtonBase))\n);\n\n/**\n * Once Ui button.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `button[oui-button], button[oui-ghost-button], button[oui-link-button], button[oui-icon-button],\n button[oui-icon-text-button]`,\n exportAs: 'ouiButton',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[disabled]': 'disabled || null',\n '[tabindex]': 'tabIndex || 0',\n },\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color', 'progress', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiButton\n extends OuiButtonMixinBase\n implements OnDestroy, CanDisable, CanColor, CanProgress\n{\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n public _cdr: ChangeDetectorRef,\n private _ngZone: NgZone\n ) {\n super(elementRef, _cdr);\n this.addClass();\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() =>\n this._ngZone.run(() => {\n this._cdr.markForCheck();\n })\n );\n }\n\n protected addClass() {\n for (const attr of BUTTON_HOST_ATTRIBUTES) {\n if (this.hasHostAttributes(attr)) {\n (this.elementRef.nativeElement as HTMLElement).classList.add(attr);\n }\n }\n if (!this.color) {\n this.color = DEFAULT_COLOR;\n }\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this.elementRef);\n this._monitorSubscription.unsubscribe();\n }\n\n /** Focuses the button. */\n focus(): void {\n this.getHostElement().focus();\n }\n\n getHostElement() {\n return this.elementRef.nativeElement;\n }\n /** Gets whether the button has one of the given attributes. */\n hasHostAttributes(...attributes: string[]) {\n return attributes.some((attribute) =>\n this.getHostElement().hasAttribute(attribute)\n );\n }\n}\n\n/**\n * Once UI anchor.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `a[oui-button], a[oui-ghost-button], a[oui-link-button], a[oui-icon-button],\n a[oui-icon-text-button]`,\n exportAs: 'ouiButton, ouiAnchor',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.tabindex]': 'disabled ? -1 : (tabIndex || 0)',\n '[attr.disabled]': 'disabled || null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '(click)': '_haltDisabledEvents($event)',\n },\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color'],\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiAnchor extends OuiButton {\n /** Tabindex of the button. */\n @Input() tabIndex: number;\n constructor(\n elementRef: ElementRef,\n focusMonitor: FocusMonitor,\n _cdr: ChangeDetectorRef,\n _ngZone: NgZone\n ) {\n super(elementRef, focusMonitor, _cdr, _ngZone);\n }\n\n _haltDisabledEvents(event: Event) {\n // A disabled button shouldn't apply any actions\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n", "assetsDirs": [], "styleUrlsData": [ { - "data": "@import 'button-theme';\n@import 'button-icon';\n@include oui-icon-text();\n\n$border-radius: 100px;\n$font-size: 14px;\n$letter-spacing: 0.2px;\n$padding: 6px 20px;\n$remove-padding: 0px;\n$progress-icon-padding: 0px 0px 0px 23px;\n$line-height: 19px;\n$min-height: 35px;\n$min-width: 70px;\n$font-normal: normal;\n$font-semi-bold: 600;\n$font-bold: 700;\n$cursor: pointer;\n$disabled-cursor: default;\n$ghost-button-background: #fff;\n$border: 1px solid transparent;\n$text-decoration: none;\n$text-align-center: center;\n$text-align-left: left;\n$green-tick-icon: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcuMzUgMTAuMTVMMTYuNTgyLjk0OGwxLjQxNCAxLjQxNEw3LjM0NiAxMi45OCA1LjkzIDExLjU2NWwuMDAyLS4wMDItNC45MjItNC45NEwyLjQyNiA1LjIxbDQuOTI0IDQuOTQyeiIgZmlsbD0iIzAwOUI0OCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+')\n left center no-repeat;\n@mixin oui-button-core() {\n .oui-button,\n .oui-ghost-button,\n .oui-icon-text-button,\n .oui-link-button,\n .oui-progress-button,\n .oui-progress-ghost-button,\n .oui-progress-link-button {\n @include oui-button-reset();\n @include oui-button-base();\n }\n\n .oui-button {\n @include oui-progress-button-stages();\n &.cdk-keyboard-focused {\n text-decoration: underline;\n }\n }\n .oui-link-button {\n @include oui-progress-link-button-stages();\n }\n .oui-ghost-button {\n background: $ghost-button-background;\n @include oui-progress-ghost-button-stages();\n &.cdk-keyboard-focused {\n text-decoration: underline;\n }\n }\n .oui-icon-button {\n @include oui-button-reset();\n }\n}\n.oui-icon-button {\n &.cdk-keyboard-focused,\n &.cdk-program-focused {\n background: rgba(200, 200, 200, 0.4);\n border-radius: $oui-icon-spacing;\n transition: opacity 0.2s cubic-bezier(0.35, 0, 0.25, 1),\n background-color 0.2s cubic-bezier(0.35, 0, 0.25, 1);\n }\n}\n/*common properties in all buttons*/\n@mixin oui-button-base {\n font-size: $font-size;\n border-radius: $border-radius;\n letter-spacing: $letter-spacing;\n padding: $padding;\n line-height: $line-height;\n min-height: $min-height;\n min-width: $min-width;\n font-weight: $font-semi-bold;\n cursor: $cursor;\n border: $border;\n background: transparent;\n text-decoration: $text-decoration;\n text-align: $text-align-center;\n &[disabled] {\n cursor: $disabled-cursor;\n }\n}\n/*reset the browser default properties*/\n@mixin oui-button-reset {\n border: 0 none;\n background: none;\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\n &:focus {\n outline: 0 none;\n }\n // The `outline: none` from above works on all browsers, however Firefox also\n // adds a special `focus-inner` which we have to disable explicitly. See:\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Firefox\n &::-moz-focus-inner {\n border: 0;\n }\n}\n\n.oui-link-button {\n padding: 6px 0px 6px 0px !important;\n min-width: auto !important;\n font-weight: $font-normal !important;\n &:hover {\n text-decoration: underline;\n }\n &[disabled]:hover {\n text-decoration: none;\n }\n &:focus {\n outline: 0 none;\n }\n &.cdk-keyboard-focused {\n outline: solid 1px #006bb1 !important;\n text-decoration: underline;\n border-radius: 5px;\n }\n}\n\n.oui-ghost-button {\n &[disabled],\n &.oui-stage-progress {\n background: transparent !important;\n cursor: $disabled-cursor !important;\n }\n}\n\n@mixin oui-progress-button-stages {\n &.oui-stage-progress {\n background: transparent !important;\n text-align: $text-align-left !important;\n padding: $remove-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n }\n &.oui-stage-done {\n background: $green-tick-icon !important;\n text-align: $text-align-left !important;\n padding: $progress-icon-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n }\n}\n@mixin oui-progress-link-button-stages {\n &.oui-stage-progress {\n background: transparent !important;\n text-align: $text-align-left !important;\n padding: $remove-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n text-decoration: $text-decoration !important;\n }\n &.oui-stage-done {\n background: $green-tick-icon !important;\n text-align: $text-align-left !important;\n padding: $progress-icon-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n text-decoration: $text-decoration !important;\n }\n}\n@mixin oui-progress-ghost-button-stages {\n &.oui-stage-progress {\n background: transparent !important;\n text-align: $text-align-left !important;\n padding: $remove-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n border: $border !important;\n }\n &.oui-stage-done {\n background: $green-tick-icon !important;\n text-align: $text-align-left !important;\n padding: $progress-icon-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n border: $border !important;\n }\n}\n\n@include oui-button-core();\n", + "data": "@import 'button-theme';\r\n@import 'button-icon';\r\n@include oui-icon-text();\r\n\r\n$border-radius: 100px;\r\n$font-size: 14px;\r\n$letter-spacing: 0.2px;\r\n$padding: 6px 20px;\r\n$remove-padding: 0px;\r\n$progress-icon-padding: 0px 0px 0px 23px;\r\n$line-height: 19px;\r\n$min-height: 35px;\r\n$min-width: 70px;\r\n$font-normal: normal;\r\n$font-semi-bold: 600;\r\n$font-bold: 700;\r\n$cursor: pointer;\r\n$disabled-cursor: default;\r\n$ghost-button-background: #fff;\r\n$border: 1px solid transparent;\r\n$text-decoration: none;\r\n$text-align-center: center;\r\n$text-align-left: left;\r\n$green-tick-icon: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcuMzUgMTAuMTVMMTYuNTgyLjk0OGwxLjQxNCAxLjQxNEw3LjM0NiAxMi45OCA1LjkzIDExLjU2NWwuMDAyLS4wMDItNC45MjItNC45NEwyLjQyNiA1LjIxbDQuOTI0IDQuOTQyeiIgZmlsbD0iIzAwOUI0OCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+')\r\n left center no-repeat;\r\n@mixin oui-button-core() {\r\n .oui-button,\r\n .oui-ghost-button,\r\n .oui-icon-text-button,\r\n .oui-link-button,\r\n .oui-progress-button,\r\n .oui-progress-ghost-button,\r\n .oui-progress-link-button {\r\n @include oui-button-reset();\r\n @include oui-button-base();\r\n }\r\n\r\n .oui-button {\r\n @include oui-progress-button-stages();\r\n &.cdk-keyboard-focused {\r\n text-decoration: underline;\r\n }\r\n }\r\n .oui-link-button {\r\n @include oui-progress-link-button-stages();\r\n }\r\n .oui-ghost-button {\r\n background: $ghost-button-background;\r\n @include oui-progress-ghost-button-stages();\r\n &.cdk-keyboard-focused {\r\n text-decoration: underline;\r\n }\r\n }\r\n .oui-icon-button {\r\n @include oui-button-reset();\r\n }\r\n}\r\n.oui-icon-button {\r\n &.cdk-keyboard-focused,\r\n &.cdk-program-focused {\r\n background: rgba(200, 200, 200, 0.4);\r\n border-radius: $oui-icon-spacing;\r\n transition: opacity 0.2s cubic-bezier(0.35, 0, 0.25, 1),\r\n background-color 0.2s cubic-bezier(0.35, 0, 0.25, 1);\r\n }\r\n}\r\n/*common properties in all buttons*/\r\n@mixin oui-button-base {\r\n & {\r\n font-size: $font-size;\r\n border-radius: $border-radius;\r\n letter-spacing: $letter-spacing;\r\n padding: $padding;\r\n line-height: $line-height;\r\n min-height: $min-height;\r\n min-width: $min-width;\r\n font-weight: $font-semi-bold;\r\n cursor: $cursor;\r\n border: $border;\r\n background: transparent;\r\n text-decoration: $text-decoration;\r\n text-align: $text-align-center;\r\n }\r\n &[disabled] {\r\n cursor: $disabled-cursor;\r\n }\r\n}\r\n/*reset the browser default properties*/\r\n@mixin oui-button-reset {\r\n border: 0 none;\r\n background: none;\r\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\r\n &:focus {\r\n outline: 0 none;\r\n }\r\n // The `outline: none` from above works on all browsers, however Firefox also\r\n // adds a special `focus-inner` which we have to disable explicitly. See:\r\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Firefox\r\n &::-moz-focus-inner {\r\n border: 0;\r\n }\r\n}\r\n\r\n.oui-link-button {\r\n padding: 6px 0px 6px 0px !important;\r\n min-width: auto !important;\r\n font-weight: $font-normal !important;\r\n &:hover {\r\n text-decoration: underline;\r\n }\r\n &[disabled]:hover {\r\n text-decoration: none;\r\n }\r\n &:focus {\r\n outline: 0 none;\r\n }\r\n &.cdk-keyboard-focused {\r\n box-shadow: 0 0 0 1px #006bb1 !important;\r\n text-decoration: underline;\r\n border-radius: 5px;\r\n }\r\n}\r\n\r\n.oui-ghost-button {\r\n &[disabled],\r\n &.oui-stage-progress {\r\n background: transparent !important;\r\n cursor: $disabled-cursor !important;\r\n }\r\n}\r\n\r\n@mixin oui-progress-button-stages {\r\n &.oui-stage-progress {\r\n background: transparent !important;\r\n text-align: $text-align-left !important;\r\n padding: $remove-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n }\r\n &.oui-stage-done {\r\n background: $green-tick-icon !important;\r\n text-align: $text-align-left !important;\r\n padding: $progress-icon-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n }\r\n}\r\n@mixin oui-progress-link-button-stages {\r\n &.oui-stage-progress {\r\n background: transparent !important;\r\n text-align: $text-align-left !important;\r\n padding: $remove-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n text-decoration: $text-decoration !important;\r\n }\r\n &.oui-stage-done {\r\n background: $green-tick-icon !important;\r\n text-align: $text-align-left !important;\r\n padding: $progress-icon-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n text-decoration: $text-decoration !important;\r\n }\r\n}\r\n@mixin oui-progress-ghost-button-stages {\r\n &.oui-stage-progress {\r\n background: transparent !important;\r\n text-align: $text-align-left !important;\r\n padding: $remove-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n border: $border !important;\r\n }\r\n &.oui-stage-done {\r\n background: $green-tick-icon !important;\r\n text-align: $text-align-left !important;\r\n padding: $progress-icon-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n border: $border !important;\r\n }\r\n}\r\n\r\n@include oui-button-core();\r\n", "styleUrl": "button.scss" } ], @@ -22449,7 +22494,7 @@ "deprecationMessage": "" } ], - "line": 148, + "line": 149, "jsdoctags": [ { "name": "elementRef", @@ -23061,7 +23106,7 @@ }, { "name": "OuiAutocompleteGroupStorybook", - "id": "component-OuiAutocompleteGroupStorybook-a7c3a42dc260f97f48099129f3271decd60a827448988b8e399989f849989a0745c120e669504c278a5df2bf0c7aa7d074d5b69fefc6e004ad3a5a3600023dd0", + "id": "component-OuiAutocompleteGroupStorybook-a5f1cba4d87fcf80e6dfa5d1185b7a53c25a8276f42c8458d2a0e687a3deb2627f29bff33a42424b99f802fa475d5b605dfddab12b23b6a76a9925d2e49321a6", "file": "ui/src/stories/autocomplete/autocomplete.component.ts", "encapsulation": [], "entryComponents": [], @@ -23076,11 +23121,27 @@ "viewProviders": [], "hostDirectives": [], "inputsClass": [ + { + "name": "appearance", + "deprecated": false, + "deprecationMessage": "", + "line": 112, + "type": "string", + "decorators": [] + }, + { + "name": "autoActiveFirstOption", + "deprecated": false, + "deprecationMessage": "", + "line": 113, + "type": "boolean", + "decorators": [] + }, { "name": "disabled", "deprecated": false, "deprecationMessage": "", - "line": 111, + "line": 115, "type": "boolean", "decorators": [] }, @@ -23088,7 +23149,7 @@ "name": "stateGroups", "deprecated": false, "deprecationMessage": "", - "line": 109, + "line": 111, "type": "StateGroup[]", "decorators": [] } @@ -23103,7 +23164,7 @@ "type": "UntypedFormGroup", "optional": false, "description": "", - "line": 118 + "line": 122 }, { "name": "stateGroupOptions", @@ -23112,7 +23173,7 @@ "type": "Observable", "optional": false, "description": "", - "line": 121 + "line": 125 } ], "methodsClass": [ @@ -23129,7 +23190,7 @@ "optional": false, "returnType": "StateGroup[]", "typeParameters": [], - "line": 133, + "line": 137, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -23153,7 +23214,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 124, + "line": 128, "deprecated": false, "deprecationMessage": "" } @@ -23167,7 +23228,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import { Input, Component, OnInit } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n UntypedFormControl,\r\n UntypedFormBuilder,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport { startWith, map } from 'rxjs/operators';\r\n\r\nexport interface StateGroup {\r\n letter: string;\r\n names: string[];\r\n}\r\nexport const _filter = (opt: string[], value: string): string[] => {\r\n const filterValue = value.toLowerCase();\r\n\r\n return opt.filter((item) => item.toLowerCase().indexOf(filterValue) === 0);\r\n};\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ option }}\r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteStorybook implements OnInit {\r\n filteredOptions: Observable;\r\n myControl = new UntypedFormControl();\r\n @Input() options: any[];\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.myControl.disable();\r\n } else {\r\n this.myControl.enable();\r\n }\r\n }\r\n ngOnInit() {\r\n this.filteredOptions = this.myControl.valueChanges.pipe(\r\n startWith(''),\r\n map((value) => (typeof value === 'string' ? value : value)),\r\n map((option) => (option ? this._filter(option) : this.options.slice()))\r\n );\r\n }\r\n private _filter(option): string[] {\r\n const filterValue = option.toLowerCase();\r\n\r\n return this.options.filter(\r\n // eslint-disable-next-line no-shadow\r\n (option) => option.toLowerCase().indexOf(filterValue) === 0\r\n );\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-group-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ name }}\r\n \r\n \r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteGroupStorybook implements OnInit {\r\n @Input() stateGroups: StateGroup[];\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.stateForm.get('stateGroup')!.disable();\r\n } else {\r\n this.stateForm.get('stateGroup')!.enable();\r\n }\r\n }\r\n stateForm: UntypedFormGroup = this.fb.group({\r\n stateGroup: '',\r\n });\r\n stateGroupOptions: Observable;\r\n\r\n constructor(private fb: UntypedFormBuilder) {}\r\n ngOnInit() {\r\n this.stateGroupOptions = this.stateForm\r\n .get('stateGroup')!\r\n .valueChanges.pipe(\r\n startWith(''),\r\n map((value: string) => this._filterGroup(value))\r\n );\r\n }\r\n\r\n private _filterGroup(value: string): StateGroup[] {\r\n if (value) {\r\n return this.stateGroups\r\n .map((group) => ({\r\n letter: group.letter,\r\n names: _filter(group.names, value),\r\n }))\r\n .filter((group) => group.names.length > 0);\r\n }\r\n\r\n return this.stateGroups;\r\n }\r\n}\r\n", + "sourceCode": "import { Input, Component, OnInit } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n UntypedFormControl,\r\n UntypedFormBuilder,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport { startWith, map } from 'rxjs/operators';\r\n\r\nexport interface StateGroup {\r\n letter: string;\r\n names: string[];\r\n}\r\nexport const _filter = (opt: string[], value: string): string[] => {\r\n const filterValue = value.toLowerCase();\r\n\r\n return opt.filter((item) => item.toLowerCase().indexOf(filterValue) === 0);\r\n};\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ option }}\r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteStorybook implements OnInit {\r\n filteredOptions: Observable;\r\n myControl = new UntypedFormControl();\r\n @Input() options: any[];\r\n @Input() appearance: string;\r\n @Input() autoActiveFirstOption: boolean;\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.myControl.disable();\r\n } else {\r\n this.myControl.enable();\r\n }\r\n }\r\n ngOnInit() {\r\n this.filteredOptions = this.myControl.valueChanges.pipe(\r\n startWith(''),\r\n map((value) => (typeof value === 'string' ? value : value)),\r\n map((option) => (option ? this._filter(option) : this.options.slice()))\r\n );\r\n }\r\n private _filter(option): string[] {\r\n const filterValue = option.toLowerCase();\r\n\r\n return this.options.filter(\r\n // eslint-disable-next-line no-shadow\r\n (option) => option.toLowerCase().indexOf(filterValue) === 0\r\n );\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-group-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ name }}\r\n \r\n \r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteGroupStorybook implements OnInit {\r\n @Input() stateGroups: StateGroup[];\r\n @Input() appearance: string;\r\n @Input() autoActiveFirstOption: boolean;\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.stateForm.get('stateGroup')!.disable();\r\n } else {\r\n this.stateForm.get('stateGroup')!.enable();\r\n }\r\n }\r\n stateForm: UntypedFormGroup = this.fb.group({\r\n stateGroup: '',\r\n });\r\n stateGroupOptions: Observable;\r\n\r\n constructor(private fb: UntypedFormBuilder) {}\r\n ngOnInit() {\r\n this.stateGroupOptions = this.stateForm\r\n .get('stateGroup')!\r\n .valueChanges.pipe(\r\n startWith(''),\r\n map((value: string) => this._filterGroup(value))\r\n );\r\n }\r\n\r\n private _filterGroup(value: string): StateGroup[] {\r\n if (value) {\r\n return this.stateGroups\r\n .map((group) => ({\r\n letter: group.letter,\r\n names: _filter(group.names, value),\r\n }))\r\n .filter((group) => group.names.length > 0);\r\n }\r\n\r\n return this.stateGroups;\r\n }\r\n}\r\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -23184,7 +23245,7 @@ "deprecationMessage": "" } ], - "line": 121, + "line": 125, "jsdoctags": [ { "name": "fb", @@ -23218,7 +23279,7 @@ } ], "returnType": "void", - "line": 111, + "line": 115, "jsdoctags": [ { "name": "value", @@ -23236,7 +23297,7 @@ }, { "name": "OuiAutocompleteStorybook", - "id": "component-OuiAutocompleteStorybook-a7c3a42dc260f97f48099129f3271decd60a827448988b8e399989f849989a0745c120e669504c278a5df2bf0c7aa7d074d5b69fefc6e004ad3a5a3600023dd0", + "id": "component-OuiAutocompleteStorybook-a5f1cba4d87fcf80e6dfa5d1185b7a53c25a8276f42c8458d2a0e687a3deb2627f29bff33a42424b99f802fa475d5b605dfddab12b23b6a76a9925d2e49321a6", "file": "ui/src/stories/autocomplete/autocomplete.component.ts", "encapsulation": [], "entryComponents": [], @@ -23252,13 +23313,29 @@ "hostDirectives": [], "inputsClass": [ { - "name": "disabled", + "name": "appearance", + "deprecated": false, + "deprecationMessage": "", + "line": 49, + "type": "string", + "decorators": [] + }, + { + "name": "autoActiveFirstOption", "deprecated": false, "deprecationMessage": "", "line": 50, "type": "boolean", "decorators": [] }, + { + "name": "disabled", + "deprecated": false, + "deprecationMessage": "", + "line": 52, + "type": "boolean", + "decorators": [] + }, { "name": "options", "deprecated": false, @@ -23304,7 +23381,7 @@ "optional": false, "returnType": "string[]", "typeParameters": [], - "line": 64, + "line": 66, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -23328,7 +23405,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 57, + "line": 59, "deprecated": false, "deprecationMessage": "" } @@ -23342,7 +23419,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import { Input, Component, OnInit } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n UntypedFormControl,\r\n UntypedFormBuilder,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport { startWith, map } from 'rxjs/operators';\r\n\r\nexport interface StateGroup {\r\n letter: string;\r\n names: string[];\r\n}\r\nexport const _filter = (opt: string[], value: string): string[] => {\r\n const filterValue = value.toLowerCase();\r\n\r\n return opt.filter((item) => item.toLowerCase().indexOf(filterValue) === 0);\r\n};\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ option }}\r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteStorybook implements OnInit {\r\n filteredOptions: Observable;\r\n myControl = new UntypedFormControl();\r\n @Input() options: any[];\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.myControl.disable();\r\n } else {\r\n this.myControl.enable();\r\n }\r\n }\r\n ngOnInit() {\r\n this.filteredOptions = this.myControl.valueChanges.pipe(\r\n startWith(''),\r\n map((value) => (typeof value === 'string' ? value : value)),\r\n map((option) => (option ? this._filter(option) : this.options.slice()))\r\n );\r\n }\r\n private _filter(option): string[] {\r\n const filterValue = option.toLowerCase();\r\n\r\n return this.options.filter(\r\n // eslint-disable-next-line no-shadow\r\n (option) => option.toLowerCase().indexOf(filterValue) === 0\r\n );\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-group-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ name }}\r\n \r\n \r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteGroupStorybook implements OnInit {\r\n @Input() stateGroups: StateGroup[];\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.stateForm.get('stateGroup')!.disable();\r\n } else {\r\n this.stateForm.get('stateGroup')!.enable();\r\n }\r\n }\r\n stateForm: UntypedFormGroup = this.fb.group({\r\n stateGroup: '',\r\n });\r\n stateGroupOptions: Observable;\r\n\r\n constructor(private fb: UntypedFormBuilder) {}\r\n ngOnInit() {\r\n this.stateGroupOptions = this.stateForm\r\n .get('stateGroup')!\r\n .valueChanges.pipe(\r\n startWith(''),\r\n map((value: string) => this._filterGroup(value))\r\n );\r\n }\r\n\r\n private _filterGroup(value: string): StateGroup[] {\r\n if (value) {\r\n return this.stateGroups\r\n .map((group) => ({\r\n letter: group.letter,\r\n names: _filter(group.names, value),\r\n }))\r\n .filter((group) => group.names.length > 0);\r\n }\r\n\r\n return this.stateGroups;\r\n }\r\n}\r\n", + "sourceCode": "import { Input, Component, OnInit } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n UntypedFormControl,\r\n UntypedFormBuilder,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport { startWith, map } from 'rxjs/operators';\r\n\r\nexport interface StateGroup {\r\n letter: string;\r\n names: string[];\r\n}\r\nexport const _filter = (opt: string[], value: string): string[] => {\r\n const filterValue = value.toLowerCase();\r\n\r\n return opt.filter((item) => item.toLowerCase().indexOf(filterValue) === 0);\r\n};\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ option }}\r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteStorybook implements OnInit {\r\n filteredOptions: Observable;\r\n myControl = new UntypedFormControl();\r\n @Input() options: any[];\r\n @Input() appearance: string;\r\n @Input() autoActiveFirstOption: boolean;\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.myControl.disable();\r\n } else {\r\n this.myControl.enable();\r\n }\r\n }\r\n ngOnInit() {\r\n this.filteredOptions = this.myControl.valueChanges.pipe(\r\n startWith(''),\r\n map((value) => (typeof value === 'string' ? value : value)),\r\n map((option) => (option ? this._filter(option) : this.options.slice()))\r\n );\r\n }\r\n private _filter(option): string[] {\r\n const filterValue = option.toLowerCase();\r\n\r\n return this.options.filter(\r\n // eslint-disable-next-line no-shadow\r\n (option) => option.toLowerCase().indexOf(filterValue) === 0\r\n );\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-autocomplete-group-storybook',\r\n template: `\r\n \r\n \r\n \r\n \r\n \r\n {{ name }}\r\n \r\n \r\n \r\n \r\n `,\r\n})\r\nexport class OuiAutocompleteGroupStorybook implements OnInit {\r\n @Input() stateGroups: StateGroup[];\r\n @Input() appearance: string;\r\n @Input() autoActiveFirstOption: boolean;\r\n @Input()\r\n set disabled(value: boolean) {\r\n if (value) {\r\n this.stateForm.get('stateGroup')!.disable();\r\n } else {\r\n this.stateForm.get('stateGroup')!.enable();\r\n }\r\n }\r\n stateForm: UntypedFormGroup = this.fb.group({\r\n stateGroup: '',\r\n });\r\n stateGroupOptions: Observable;\r\n\r\n constructor(private fb: UntypedFormBuilder) {}\r\n ngOnInit() {\r\n this.stateGroupOptions = this.stateForm\r\n .get('stateGroup')!\r\n .valueChanges.pipe(\r\n startWith(''),\r\n map((value: string) => this._filterGroup(value))\r\n );\r\n }\r\n\r\n private _filterGroup(value: string): StateGroup[] {\r\n if (value) {\r\n return this.stateGroups\r\n .map((group) => ({\r\n letter: group.letter,\r\n names: _filter(group.names, value),\r\n }))\r\n .filter((group) => group.names.length > 0);\r\n }\r\n\r\n return this.stateGroups;\r\n }\r\n}\r\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -23367,7 +23444,7 @@ } ], "returnType": "void", - "line": 50, + "line": 52, "jsdoctags": [ { "name": "value", @@ -23385,7 +23462,7 @@ }, { "name": "OuiButton", - "id": "component-OuiButton-0d7d7fa85ca575eff44ea16216e0b4e33534845e4ea90e975cbffa14d598d4392f2620b0e45183fa30e446ad5dfa4283ef721d2475ff2f880c1047553f88955f", + "id": "component-OuiButton-cd4d61dce3765d9a6e05591c78f5cba9cd5afb8c73b9e49619e9c1e784c62b00d55c1556f8363d57992e5141a8f4f160312c20c4378256befbfae3dcd72508c6", "file": "ui/src/components/button/button.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -23422,7 +23499,7 @@ "type": "ChangeDetectorRef", "optional": false, "description": "", - "line": 78, + "line": 79, "modifierKind": [ 125 ] @@ -23435,7 +23512,7 @@ "type": "Subscription", "optional": false, "description": "", - "line": 74, + "line": 75, "modifierKind": [ 123 ] @@ -23448,7 +23525,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 92, + "line": 93, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -23461,7 +23538,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 109, + "line": 110, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nFocuses the button.", @@ -23473,7 +23550,7 @@ "optional": false, "returnType": "any", "typeParameters": [], - "line": 113, + "line": 114, "deprecated": false, "deprecationMessage": "" }, @@ -23491,7 +23568,7 @@ "optional": false, "returnType": "any", "typeParameters": [], - "line": 117, + "line": 118, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nGets whether the button has one of the given attributes.", @@ -23515,7 +23592,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 103, + "line": 104, "deprecated": false, "deprecationMessage": "" } @@ -23529,11 +23606,11 @@ "description": "

Once Ui button.

\n", "rawdescription": "\n\nOnce Ui button.\n", "type": "component", - "sourceCode": "import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n OnDestroy,\n ChangeDetectorRef,\n NgZone,\n Input,\n} from '@angular/core';\nimport {\n CanDisable,\n CanColor,\n CanDisableCtor,\n CanColorCtor,\n mixinColor,\n mixinDisabled,\n} from '../core';\n\nimport { CanProgress, CanProgressCtor, mixinProgress } from './progress';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Subscription } from 'rxjs';\n/**\n * List of classes to add to Button instances based on host attributes to\n * style as different variants.\n */\nconst BUTTON_HOST_ATTRIBUTES = [\n 'oui-button',\n 'oui-ghost-button',\n 'oui-link-button',\n 'oui-icon-button',\n 'oui-icon-text-button',\n];\n\n/** Default color palette for round buttons (oui-fab and oui-mini-fab) */\nconst DEFAULT_COLOR = 'primary';\n\n// Boilerplate for applying mixins to OuiButton.\n/** @docs-private */\nexport class OuiButtonBase {\n constructor(public _elementRef: ElementRef, public _cdr: ChangeDetectorRef) {}\n}\n\nexport const OuiButtonMixinBase: CanDisableCtor &\n CanColorCtor &\n CanProgressCtor &\n typeof OuiButtonBase = mixinProgress(\n mixinColor(mixinDisabled(OuiButtonBase))\n);\n\n/**\n * Once Ui button.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `button[oui-button], button[oui-ghost-button], button[oui-link-button], button[oui-icon-button],\n button[oui-icon-text-button]`,\n exportAs: 'ouiButton',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[disabled]': 'disabled || null',\n },\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color', 'progress', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiButton\n extends OuiButtonMixinBase\n implements OnDestroy, CanDisable, CanColor, CanProgress\n{\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n public _cdr: ChangeDetectorRef,\n private _ngZone: NgZone\n ) {\n super(elementRef, _cdr);\n this.addClass();\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() =>\n this._ngZone.run(() => {\n this._cdr.markForCheck();\n })\n );\n }\n\n protected addClass() {\n for (const attr of BUTTON_HOST_ATTRIBUTES) {\n if (this.hasHostAttributes(attr)) {\n (this.elementRef.nativeElement as HTMLElement).classList.add(attr);\n }\n }\n if (!this.color) {\n this.color = DEFAULT_COLOR;\n }\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this.elementRef);\n this._monitorSubscription.unsubscribe();\n }\n\n /** Focuses the button. */\n focus(): void {\n this.getHostElement().focus();\n }\n\n getHostElement() {\n return this.elementRef.nativeElement;\n }\n /** Gets whether the button has one of the given attributes. */\n hasHostAttributes(...attributes: string[]) {\n return attributes.some((attribute) =>\n this.getHostElement().hasAttribute(attribute)\n );\n }\n}\n\n/**\n * Once UI anchor.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `a[oui-button], a[oui-ghost-button], a[oui-link-button], a[oui-icon-button],\n a[oui-icon-text-button]`,\n exportAs: 'ouiButton, ouiAnchor',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.tabindex]': 'disabled ? -1 : (tabIndex || 0)',\n '[attr.disabled]': 'disabled || null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '(click)': '_haltDisabledEvents($event)',\n },\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color'],\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiAnchor extends OuiButton {\n /** Tabindex of the button. */\n @Input() tabIndex: number;\n constructor(\n elementRef: ElementRef,\n focusMonitor: FocusMonitor,\n _cdr: ChangeDetectorRef,\n _ngZone: NgZone\n ) {\n super(elementRef, focusMonitor, _cdr, _ngZone);\n }\n\n _haltDisabledEvents(event: Event) {\n // A disabled button shouldn't apply any actions\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n", + "sourceCode": "import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n OnDestroy,\n ChangeDetectorRef,\n NgZone,\n Input,\n} from '@angular/core';\nimport {\n CanDisable,\n CanColor,\n CanDisableCtor,\n CanColorCtor,\n mixinColor,\n mixinDisabled,\n} from '../core';\n\nimport { CanProgress, CanProgressCtor, mixinProgress } from './progress';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { Subscription } from 'rxjs';\n/**\n * List of classes to add to Button instances based on host attributes to\n * style as different variants.\n */\nconst BUTTON_HOST_ATTRIBUTES = [\n 'oui-button',\n 'oui-ghost-button',\n 'oui-link-button',\n 'oui-icon-button',\n 'oui-icon-text-button',\n];\n\n/** Default color palette for round buttons (oui-fab and oui-mini-fab) */\nconst DEFAULT_COLOR = 'primary';\n\n// Boilerplate for applying mixins to OuiButton.\n/** @docs-private */\nexport class OuiButtonBase {\n constructor(public _elementRef: ElementRef, public _cdr: ChangeDetectorRef) {}\n}\n\nexport const OuiButtonMixinBase: CanDisableCtor &\n CanColorCtor &\n CanProgressCtor &\n typeof OuiButtonBase = mixinProgress(\n mixinColor(mixinDisabled(OuiButtonBase))\n);\n\n/**\n * Once Ui button.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `button[oui-button], button[oui-ghost-button], button[oui-link-button], button[oui-icon-button],\n button[oui-icon-text-button]`,\n exportAs: 'ouiButton',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[disabled]': 'disabled || null',\n '[tabindex]': 'tabIndex || 0',\n },\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color', 'progress', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiButton\n extends OuiButtonMixinBase\n implements OnDestroy, CanDisable, CanColor, CanProgress\n{\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n public _cdr: ChangeDetectorRef,\n private _ngZone: NgZone\n ) {\n super(elementRef, _cdr);\n this.addClass();\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() =>\n this._ngZone.run(() => {\n this._cdr.markForCheck();\n })\n );\n }\n\n protected addClass() {\n for (const attr of BUTTON_HOST_ATTRIBUTES) {\n if (this.hasHostAttributes(attr)) {\n (this.elementRef.nativeElement as HTMLElement).classList.add(attr);\n }\n }\n if (!this.color) {\n this.color = DEFAULT_COLOR;\n }\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this.elementRef);\n this._monitorSubscription.unsubscribe();\n }\n\n /** Focuses the button. */\n focus(): void {\n this.getHostElement().focus();\n }\n\n getHostElement() {\n return this.elementRef.nativeElement;\n }\n /** Gets whether the button has one of the given attributes. */\n hasHostAttributes(...attributes: string[]) {\n return attributes.some((attribute) =>\n this.getHostElement().hasAttribute(attribute)\n );\n }\n}\n\n/**\n * Once UI anchor.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: `a[oui-button], a[oui-ghost-button], a[oui-link-button], a[oui-icon-button],\n a[oui-icon-text-button]`,\n exportAs: 'ouiButton, ouiAnchor',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.tabindex]': 'disabled ? -1 : (tabIndex || 0)',\n '[attr.disabled]': 'disabled || null',\n '[attr.aria-disabled]': 'disabled.toString()',\n '(click)': '_haltDisabledEvents($event)',\n },\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled', 'color'],\n templateUrl: 'button.html',\n styleUrls: ['button.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiAnchor extends OuiButton {\n /** Tabindex of the button. */\n @Input() tabIndex: number;\n constructor(\n elementRef: ElementRef,\n focusMonitor: FocusMonitor,\n _cdr: ChangeDetectorRef,\n _ngZone: NgZone\n ) {\n super(elementRef, focusMonitor, _cdr, _ngZone);\n }\n\n _haltDisabledEvents(event: Event) {\n // A disabled button shouldn't apply any actions\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n}\n", "assetsDirs": [], "styleUrlsData": [ { - "data": "@import 'button-theme';\n@import 'button-icon';\n@include oui-icon-text();\n\n$border-radius: 100px;\n$font-size: 14px;\n$letter-spacing: 0.2px;\n$padding: 6px 20px;\n$remove-padding: 0px;\n$progress-icon-padding: 0px 0px 0px 23px;\n$line-height: 19px;\n$min-height: 35px;\n$min-width: 70px;\n$font-normal: normal;\n$font-semi-bold: 600;\n$font-bold: 700;\n$cursor: pointer;\n$disabled-cursor: default;\n$ghost-button-background: #fff;\n$border: 1px solid transparent;\n$text-decoration: none;\n$text-align-center: center;\n$text-align-left: left;\n$green-tick-icon: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcuMzUgMTAuMTVMMTYuNTgyLjk0OGwxLjQxNCAxLjQxNEw3LjM0NiAxMi45OCA1LjkzIDExLjU2NWwuMDAyLS4wMDItNC45MjItNC45NEwyLjQyNiA1LjIxbDQuOTI0IDQuOTQyeiIgZmlsbD0iIzAwOUI0OCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+')\n left center no-repeat;\n@mixin oui-button-core() {\n .oui-button,\n .oui-ghost-button,\n .oui-icon-text-button,\n .oui-link-button,\n .oui-progress-button,\n .oui-progress-ghost-button,\n .oui-progress-link-button {\n @include oui-button-reset();\n @include oui-button-base();\n }\n\n .oui-button {\n @include oui-progress-button-stages();\n &.cdk-keyboard-focused {\n text-decoration: underline;\n }\n }\n .oui-link-button {\n @include oui-progress-link-button-stages();\n }\n .oui-ghost-button {\n background: $ghost-button-background;\n @include oui-progress-ghost-button-stages();\n &.cdk-keyboard-focused {\n text-decoration: underline;\n }\n }\n .oui-icon-button {\n @include oui-button-reset();\n }\n}\n.oui-icon-button {\n &.cdk-keyboard-focused,\n &.cdk-program-focused {\n background: rgba(200, 200, 200, 0.4);\n border-radius: $oui-icon-spacing;\n transition: opacity 0.2s cubic-bezier(0.35, 0, 0.25, 1),\n background-color 0.2s cubic-bezier(0.35, 0, 0.25, 1);\n }\n}\n/*common properties in all buttons*/\n@mixin oui-button-base {\n font-size: $font-size;\n border-radius: $border-radius;\n letter-spacing: $letter-spacing;\n padding: $padding;\n line-height: $line-height;\n min-height: $min-height;\n min-width: $min-width;\n font-weight: $font-semi-bold;\n cursor: $cursor;\n border: $border;\n background: transparent;\n text-decoration: $text-decoration;\n text-align: $text-align-center;\n &[disabled] {\n cursor: $disabled-cursor;\n }\n}\n/*reset the browser default properties*/\n@mixin oui-button-reset {\n border: 0 none;\n background: none;\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\n &:focus {\n outline: 0 none;\n }\n // The `outline: none` from above works on all browsers, however Firefox also\n // adds a special `focus-inner` which we have to disable explicitly. See:\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Firefox\n &::-moz-focus-inner {\n border: 0;\n }\n}\n\n.oui-link-button {\n padding: 6px 0px 6px 0px !important;\n min-width: auto !important;\n font-weight: $font-normal !important;\n &:hover {\n text-decoration: underline;\n }\n &[disabled]:hover {\n text-decoration: none;\n }\n &:focus {\n outline: 0 none;\n }\n &.cdk-keyboard-focused {\n outline: solid 1px #006bb1 !important;\n text-decoration: underline;\n border-radius: 5px;\n }\n}\n\n.oui-ghost-button {\n &[disabled],\n &.oui-stage-progress {\n background: transparent !important;\n cursor: $disabled-cursor !important;\n }\n}\n\n@mixin oui-progress-button-stages {\n &.oui-stage-progress {\n background: transparent !important;\n text-align: $text-align-left !important;\n padding: $remove-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n }\n &.oui-stage-done {\n background: $green-tick-icon !important;\n text-align: $text-align-left !important;\n padding: $progress-icon-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n }\n}\n@mixin oui-progress-link-button-stages {\n &.oui-stage-progress {\n background: transparent !important;\n text-align: $text-align-left !important;\n padding: $remove-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n text-decoration: $text-decoration !important;\n }\n &.oui-stage-done {\n background: $green-tick-icon !important;\n text-align: $text-align-left !important;\n padding: $progress-icon-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n text-decoration: $text-decoration !important;\n }\n}\n@mixin oui-progress-ghost-button-stages {\n &.oui-stage-progress {\n background: transparent !important;\n text-align: $text-align-left !important;\n padding: $remove-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n border: $border !important;\n }\n &.oui-stage-done {\n background: $green-tick-icon !important;\n text-align: $text-align-left !important;\n padding: $progress-icon-padding !important;\n font-weight: $font-bold !important;\n cursor: $disabled-cursor !important;\n border: $border !important;\n }\n}\n\n@include oui-button-core();\n", + "data": "@import 'button-theme';\r\n@import 'button-icon';\r\n@include oui-icon-text();\r\n\r\n$border-radius: 100px;\r\n$font-size: 14px;\r\n$letter-spacing: 0.2px;\r\n$padding: 6px 20px;\r\n$remove-padding: 0px;\r\n$progress-icon-padding: 0px 0px 0px 23px;\r\n$line-height: 19px;\r\n$min-height: 35px;\r\n$min-width: 70px;\r\n$font-normal: normal;\r\n$font-semi-bold: 600;\r\n$font-bold: 700;\r\n$cursor: pointer;\r\n$disabled-cursor: default;\r\n$ghost-button-background: #fff;\r\n$border: 1px solid transparent;\r\n$text-decoration: none;\r\n$text-align-center: center;\r\n$text-align-left: left;\r\n$green-tick-icon: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTcuMzUgMTAuMTVMMTYuNTgyLjk0OGwxLjQxNCAxLjQxNEw3LjM0NiAxMi45OCA1LjkzIDExLjU2NWwuMDAyLS4wMDItNC45MjItNC45NEwyLjQyNiA1LjIxbDQuOTI0IDQuOTQyeiIgZmlsbD0iIzAwOUI0OCIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9zdmc+')\r\n left center no-repeat;\r\n@mixin oui-button-core() {\r\n .oui-button,\r\n .oui-ghost-button,\r\n .oui-icon-text-button,\r\n .oui-link-button,\r\n .oui-progress-button,\r\n .oui-progress-ghost-button,\r\n .oui-progress-link-button {\r\n @include oui-button-reset();\r\n @include oui-button-base();\r\n }\r\n\r\n .oui-button {\r\n @include oui-progress-button-stages();\r\n &.cdk-keyboard-focused {\r\n text-decoration: underline;\r\n }\r\n }\r\n .oui-link-button {\r\n @include oui-progress-link-button-stages();\r\n }\r\n .oui-ghost-button {\r\n background: $ghost-button-background;\r\n @include oui-progress-ghost-button-stages();\r\n &.cdk-keyboard-focused {\r\n text-decoration: underline;\r\n }\r\n }\r\n .oui-icon-button {\r\n @include oui-button-reset();\r\n }\r\n}\r\n.oui-icon-button {\r\n &.cdk-keyboard-focused,\r\n &.cdk-program-focused {\r\n background: rgba(200, 200, 200, 0.4);\r\n border-radius: $oui-icon-spacing;\r\n transition: opacity 0.2s cubic-bezier(0.35, 0, 0.25, 1),\r\n background-color 0.2s cubic-bezier(0.35, 0, 0.25, 1);\r\n }\r\n}\r\n/*common properties in all buttons*/\r\n@mixin oui-button-base {\r\n & {\r\n font-size: $font-size;\r\n border-radius: $border-radius;\r\n letter-spacing: $letter-spacing;\r\n padding: $padding;\r\n line-height: $line-height;\r\n min-height: $min-height;\r\n min-width: $min-width;\r\n font-weight: $font-semi-bold;\r\n cursor: $cursor;\r\n border: $border;\r\n background: transparent;\r\n text-decoration: $text-decoration;\r\n text-align: $text-align-center;\r\n }\r\n &[disabled] {\r\n cursor: $disabled-cursor;\r\n }\r\n}\r\n/*reset the browser default properties*/\r\n@mixin oui-button-reset {\r\n border: 0 none;\r\n background: none;\r\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\r\n &:focus {\r\n outline: 0 none;\r\n }\r\n // The `outline: none` from above works on all browsers, however Firefox also\r\n // adds a special `focus-inner` which we have to disable explicitly. See:\r\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Firefox\r\n &::-moz-focus-inner {\r\n border: 0;\r\n }\r\n}\r\n\r\n.oui-link-button {\r\n padding: 6px 0px 6px 0px !important;\r\n min-width: auto !important;\r\n font-weight: $font-normal !important;\r\n &:hover {\r\n text-decoration: underline;\r\n }\r\n &[disabled]:hover {\r\n text-decoration: none;\r\n }\r\n &:focus {\r\n outline: 0 none;\r\n }\r\n &.cdk-keyboard-focused {\r\n box-shadow: 0 0 0 1px #006bb1 !important;\r\n text-decoration: underline;\r\n border-radius: 5px;\r\n }\r\n}\r\n\r\n.oui-ghost-button {\r\n &[disabled],\r\n &.oui-stage-progress {\r\n background: transparent !important;\r\n cursor: $disabled-cursor !important;\r\n }\r\n}\r\n\r\n@mixin oui-progress-button-stages {\r\n &.oui-stage-progress {\r\n background: transparent !important;\r\n text-align: $text-align-left !important;\r\n padding: $remove-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n }\r\n &.oui-stage-done {\r\n background: $green-tick-icon !important;\r\n text-align: $text-align-left !important;\r\n padding: $progress-icon-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n }\r\n}\r\n@mixin oui-progress-link-button-stages {\r\n &.oui-stage-progress {\r\n background: transparent !important;\r\n text-align: $text-align-left !important;\r\n padding: $remove-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n text-decoration: $text-decoration !important;\r\n }\r\n &.oui-stage-done {\r\n background: $green-tick-icon !important;\r\n text-align: $text-align-left !important;\r\n padding: $progress-icon-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n text-decoration: $text-decoration !important;\r\n }\r\n}\r\n@mixin oui-progress-ghost-button-stages {\r\n &.oui-stage-progress {\r\n background: transparent !important;\r\n text-align: $text-align-left !important;\r\n padding: $remove-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n border: $border !important;\r\n }\r\n &.oui-stage-done {\r\n background: $green-tick-icon !important;\r\n text-align: $text-align-left !important;\r\n padding: $progress-icon-padding !important;\r\n font-weight: $font-bold !important;\r\n cursor: $disabled-cursor !important;\r\n border: $border !important;\r\n }\r\n}\r\n\r\n@include oui-button-core();\r\n", "styleUrl": "button.scss" } ], @@ -23569,7 +23646,7 @@ "deprecationMessage": "" } ], - "line": 74, + "line": 75, "jsdoctags": [ { "name": "elementRef", @@ -25225,7 +25302,7 @@ }, { "name": "OuiDatepicker", - "id": "component-OuiDatepicker-ef2f443418fcda96544206a6e7f04650559ef230ba716a2fcd192fcccff22a5183bd00b300ca1bd0840b2bdab9f680685ecce9b42c0d3c890966f004ff76d557", + "id": "component-OuiDatepicker-ef3921776ad0b82cfce69b5c144771b4138dd78e0575d40f4974599120fe3e1e28ceff4f20e944b010d0518aa308aae69e37dd81b1e5162259dfe51af7495093", "file": "ui/src/components/datepicker/datepicker.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -25387,7 +25464,7 @@ "type": "ComponentPortal>", "optional": false, "description": "

A portal containing the calendar for this datepicker.

\n", - "line": 274, + "line": 278, "rawdescription": "\nA portal containing the calendar for this datepicker.", "modifierKind": [ 123 @@ -25409,7 +25486,7 @@ "type": "OuiDatepickerInput", "optional": false, "description": "

The input element this datepicker is associated with.

\n", - "line": 286, + "line": 290, "rawdescription": "\nThe input element this datepicker is associated with." }, { @@ -25419,7 +25496,7 @@ "type": "OuiDialogRef> | null", "optional": false, "description": "

A reference to the dialog when the calendar is opened as a dialog.

\n", - "line": 271, + "line": 275, "rawdescription": "\nA reference to the dialog when the calendar is opened as a dialog.", "modifierKind": [ 123 @@ -25446,7 +25523,7 @@ "type": "", "optional": false, "description": "

Emits when the datepicker is disabled.

\n", - "line": 289, + "line": 293, "rawdescription": "\nEmits when the datepicker is disabled.", "modifierKind": [ 148 @@ -25460,7 +25537,7 @@ "type": "HTMLElement | null", "optional": false, "description": "

The element that was focused before the datepicker was opened.

\n", - "line": 280, + "line": 284, "rawdescription": "\nThe element that was focused before the datepicker was opened.", "modifierKind": [ 123 @@ -25474,7 +25551,7 @@ "type": "", "optional": false, "description": "

Subscription to value changes in the associated input element.

\n", - "line": 283, + "line": 287, "rawdescription": "\nSubscription to value changes in the associated input element.", "modifierKind": [ 123 @@ -25488,7 +25565,7 @@ "type": "Subscription", "optional": false, "description": "", - "line": 293, + "line": 297, "modifierKind": [ 123 ] @@ -25501,7 +25578,7 @@ "type": "", "optional": false, "description": "", - "line": 239, + "line": 243, "modifierKind": [ 123 ] @@ -25513,7 +25590,7 @@ "type": "ComponentRef> | null", "optional": false, "description": "

Reference to the component instantiated in popup mode.

\n", - "line": 277, + "line": 281, "rawdescription": "\nReference to the component instantiated in popup mode.", "modifierKind": [ 123 @@ -25526,7 +25603,7 @@ "type": "OverlayRef", "optional": false, "description": "

A reference to the overlay when the calendar is opened as a popup.

\n", - "line": 268, + "line": 272, "rawdescription": "\nA reference to the overlay when the calendar is opened as a popup." }, { @@ -25549,7 +25626,7 @@ "type": "", "optional": false, "description": "

Emits new selected date when selected date changes.

\n", - "line": 292, + "line": 296, "rawdescription": "\nEmits new selected date when selected date changes.", "modifierKind": [ 148 @@ -25588,7 +25665,7 @@ "type": "D | null", "optional": false, "description": "", - "line": 251, + "line": 255, "modifierKind": [ 123 ] @@ -25601,7 +25678,7 @@ "type": "", "optional": false, "description": "

The id for the datepicker calendar.

\n", - "line": 242, + "line": 246, "rawdescription": "\nThe id for the datepicker calendar." } ], @@ -25612,7 +25689,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 480, + "line": 488, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nCreate the popup.", @@ -25627,7 +25704,7 @@ "optional": false, "returnType": "PositionStrategy", "typeParameters": [], - "line": 510, + "line": 518, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nCreate the popup PositionStrategy.", @@ -25649,7 +25726,7 @@ "optional": false, "returnType": "D | null", "typeParameters": [], - "line": 550, + "line": 558, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\n", @@ -25660,8 +25737,8 @@ "jsdoctags": [ { "name": { - "pos": 17260, - "end": 17263, + "pos": 17884, + "end": 17887, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -25672,8 +25749,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 17254, - "end": 17259, + "pos": 17878, + "end": 17883, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -25684,8 +25761,8 @@ }, { "tagName": { - "pos": 17291, - "end": 17298, + "pos": 17916, + "end": 17923, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -25702,7 +25779,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 428, + "line": 436, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nOpen the calendar as a dialog.", @@ -25717,7 +25794,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 452, + "line": 460, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nOpen the calendar as a popup.", @@ -25739,7 +25816,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 351, + "line": 355, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nRegister an input with this datepicker.\n\n", @@ -25747,8 +25824,8 @@ "jsdoctags": [ { "name": { - "pos": 11329, - "end": 11334, + "pos": 11716, + "end": 11721, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -25759,8 +25836,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 11323, - "end": 11328, + "pos": 11710, + "end": 11715, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -25784,7 +25861,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 342, + "line": 346, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nEmits selected month in year view", @@ -25814,7 +25891,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 337, + "line": 341, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nEmits the selected year in multiyear view", @@ -25837,7 +25914,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 558, + "line": 566, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nPasses the current theme color along to the calendar overlay.", @@ -25852,7 +25929,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 385, + "line": 393, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nClose the calendar.", @@ -25864,7 +25941,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 315, + "line": 319, "deprecated": false, "deprecationMessage": "" }, @@ -25874,7 +25951,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 364, + "line": 368, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nOpen the calendar.", @@ -25893,7 +25970,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 328, + "line": 332, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nSelects the given date", @@ -25920,7 +25997,7 @@ "description": "

Component responsible for managing the datepicker popup/dialog.

\n", "rawdescription": "\nComponent responsible for managing the datepicker popup/dialog.", "type": "component", - "sourceCode": "import { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ESCAPE, UP_ARROW } from '@angular/cdk/keycodes';\nimport {\n Overlay,\n OverlayConfig,\n OverlayRef,\n PositionStrategy,\n ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal, ComponentType } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n Output,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { OuiDialog, OuiDialogRef } from '../dialog/public-api';\nimport { merge, Subject, Subscription } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\nimport { OuiCalendar } from './calendar';\nimport { ouiDatepickerAnimations } from './datepicker-animations';\nimport { createMissingDateImplError } from './datepicker-errors';\nimport { OuiDatepickerInput } from './datepicker-input';\nimport { OuiCalendarCellCssClasses } from './calendar-body';\nimport { CanColorCtor, mixinColor, CanColor, ThemePalette } from '../core';\nimport { DateAdapter } from './date-adapter';\n\n/** Used to generate a unique ID for each datepicker instance. */\nlet datepickerUid = 0;\n\n/** Injection token that determines the scroll handling while the calendar is open. */\nexport const OUI_DATEPICKER_SCROLL_STRATEGY = new InjectionToken<\n () => ScrollStrategy\n>('oui-datepicker-scroll-strategy');\n\nexport function OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY(\n overlay: Overlay\n): () => ScrollStrategy {\n return () => overlay.scrollStrategies.reposition();\n}\n\nexport const OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: OUI_DATEPICKER_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY,\n};\n\n// Boilerplate for applying mixins to OuiDatepickerContent.\nexport class OuiDatepickerContentBase {\n constructor(public _elementRef: ElementRef) {}\n}\nexport const _OuiDatepickerContentMixinBase: CanColorCtor &\n typeof OuiDatepickerContentBase = mixinColor(OuiDatepickerContentBase);\n\n/**\n * Component used as the content for the datepicker dialog and popup. We use this instead of using\n * OuiCalendar directly as the content so we can control the initial focus. This also gives us a\n * place to put additional features of the popup that are not part of the calendar itself in the\n * future. (e.g. confirmation buttons).\n */\n@Component({\n selector: 'oui-datepicker-content',\n templateUrl: 'datepicker-content.html',\n styleUrls: ['datepicker-content.scss'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-datepicker-content',\n '[@transformPanel]': '\"enter\"',\n '[class.oui-datepicker-content-touch]': 'datepicker.touchUi',\n },\n animations: [\n ouiDatepickerAnimations.transformPanel,\n ouiDatepickerAnimations.fadeInCalendar,\n ],\n exportAs: 'ouiDatepickerContent',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['color'],\n})\nexport class OuiDatepickerContent\n extends _OuiDatepickerContentMixinBase\n implements AfterViewInit, CanColor\n{\n /** Reference to the internal calendar component. */\n @ViewChild(OuiCalendar) _calendar: OuiCalendar;\n\n /** Reference to the datepicker that created the overlay. */\n datepicker: OuiDatepicker;\n\n /** Whether the datepicker is above or below the input. */\n _isAbove: boolean;\n\n constructor(elementRef: ElementRef) {\n super(elementRef);\n }\n\n ngAfterViewInit() {\n this._calendar.focusActiveCell();\n }\n}\n\n// TODO(mmalerba): We use a component instead of a directive here so the user can use implicit\n// template reference variables (e.g. #d vs #d=\"ouiDatepicker\"). We can change this to a directive\n// if angular adds support for `exportAs: '$implicit'` on directives.\n/** Component responsible for managing the datepicker popup/dialog. */\n@Component({\n selector: 'oui-datepicker',\n template: '',\n exportAs: 'ouiDatepicker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.oui-datepicker-disabled]': 'disabled',\n },\n})\nexport class OuiDatepicker implements OnDestroy, CanColor {\n private _scrollStrategy: () => ScrollStrategy;\n\n /** An input indicating the type of the custom header component for the calendar, if set. */\n @Input() calendarHeaderComponent: ComponentType;\n\n /** The date to open the calendar to initially. */\n @Input()\n get startAt(): D | null {\n // If an explicit startAt is set we start there, otherwise we start at whatever the currently\n // selected value is.\n return (\n this._startAt ||\n (this._datepickerInput ? this._datepickerInput.value : null)\n );\n }\n set startAt(value: D | null) {\n this._startAt = this._getValidDateOrNull(\n this._dateAdapter.deserialize(value)\n );\n }\n private _startAt: D | null;\n\n /** The view that the calendar should start in. */\n @Input() startView: 'month' | 'year' | 'multi-year' = 'month';\n\n /** Color palette to use on the datepicker's calendar. */\n @Input()\n get color(): ThemePalette {\n return (\n this._color ||\n (this._datepickerInput\n ? this._datepickerInput._getThemePalette()\n : undefined)\n );\n }\n set color(value: ThemePalette) {\n this._color = value;\n }\n _color: ThemePalette;\n\n /**\n * Whether the calendar UI is in touch mode. In touch mode the calendar opens in a dialog rather\n * than a popup and elements have more padding to allow for bigger touch targets.\n */\n @Input()\n get touchUi(): boolean {\n return this._touchUi;\n }\n set touchUi(value: boolean) {\n this._touchUi = coerceBooleanProperty(value);\n }\n private _touchUi = false;\n\n /** Whether the datepicker pop-up should be disabled. */\n @Input()\n get disabled(): boolean {\n return this._disabled === undefined && this._datepickerInput\n ? this._datepickerInput.disabled\n : !!this._disabled;\n }\n set disabled(value: boolean) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this._disabled) {\n this._disabled = newValue;\n this._disabledChange.next(newValue);\n this._datepickerInput._datepickerDisabled = newValue;\n }\n }\n private _disabled = false;\n\n /**\n * Emits selected year in multiyear view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly yearSelected: EventEmitter = new EventEmitter();\n\n /**\n * Emits selected month in year view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly monthSelected: EventEmitter = new EventEmitter();\n\n /** Classes to be passed to the date picker panel. Supports the same syntax as `ngClass`. */\n @Input() panelClass: string | string[];\n\n /** Function that can be used to add custom CSS classes to dates. */\n @Input() dateClass: (date: D) => OuiCalendarCellCssClasses;\n\n /** Emits when the datepicker has been opened. */\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('opened') openedStream: EventEmitter = new EventEmitter();\n\n /** Emits when the datepicker has been closed. */\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('closed') closedStream: EventEmitter = new EventEmitter();\n\n /** Whether the calendar is open. */\n @Input()\n get opened(): boolean {\n return this._opened;\n }\n set opened(value: boolean) {\n value ? this.open() : this.close();\n }\n private _opened = false;\n\n /** The id for the datepicker calendar. */\n id = `oui-datepicker-${datepickerUid++}`;\n\n /** The currently selected date. */\n get _selected(): D | null {\n return this._validSelected;\n }\n set _selected(value: D | null) {\n this._validSelected = value;\n }\n private _validSelected: D | null = null;\n\n /** The minimum selectable date. */\n get _minDate(): D | null {\n return this._datepickerInput && this._datepickerInput.min;\n }\n\n /** The maximum selectable date. */\n get _maxDate(): D | null {\n return this._datepickerInput && this._datepickerInput.max;\n }\n\n get _dateFilter(): (date: D | null) => boolean {\n return this._datepickerInput && this._datepickerInput._dateFilter;\n }\n\n /** A reference to the overlay when the calendar is opened as a popup. */\n _popupRef: OverlayRef;\n\n /** A reference to the dialog when the calendar is opened as a dialog. */\n private _dialogRef: OuiDialogRef> | null;\n\n /** A portal containing the calendar for this datepicker. */\n private _calendarPortal: ComponentPortal>;\n\n /** Reference to the component instantiated in popup mode. */\n private _popupComponentRef: ComponentRef> | null;\n\n /** The element that was focused before the datepicker was opened. */\n private _focusedElementBeforeOpen: HTMLElement | null = null;\n\n /** Subscription to value changes in the associated input element. */\n private _inputSubscription = Subscription.EMPTY;\n\n /** The input element this datepicker is associated with. */\n _datepickerInput: OuiDatepickerInput;\n\n /** Emits when the datepicker is disabled. */\n readonly _disabledChange = new Subject();\n\n /** Emits new selected date when selected date changes. */\n readonly _selectedChanged = new Subject();\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private _dialog: OuiDialog,\n private _overlay: Overlay,\n private _ngZone: NgZone,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _viewContainerRef: ViewContainerRef,\n @Inject(OUI_DATEPICKER_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _dateAdapter: DateAdapter,\n @Optional() private _dir: Directionality,\n @Optional() @Inject(DOCUMENT) private _document: any\n ) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n this._scrollStrategy = scrollStrategy;\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n\n ngOnDestroy() {\n this.close();\n this._inputSubscription.unsubscribe();\n this._disabledChange.complete();\n this._monitorSubscription.unsubscribe();\n\n if (this._popupRef) {\n this._popupRef.dispose();\n this._popupComponentRef = null;\n }\n }\n\n /** Selects the given date */\n select(date: D): void {\n const oldValue = this._selected;\n this._selected = date;\n if (!this._dateAdapter.sameDate(oldValue, this._selected)) {\n this._selectedChanged.next(date);\n }\n }\n\n /** Emits the selected year in multiyear view */\n _selectYear(normalizedYear: D): void {\n this.yearSelected.emit(normalizedYear);\n }\n\n /** Emits selected month in year view */\n _selectMonth(normalizedMonth: D): void {\n this.monthSelected.emit(normalizedMonth);\n }\n\n /**\n * Register an input with this datepicker.\n *\n * @param input The datepicker input to register with this datepicker.\n */\n _registerInput(input: OuiDatepickerInput): void {\n if (this._datepickerInput) {\n throw Error(\n 'A OuiDatepicker can only be associated with a single input.'\n );\n }\n this._datepickerInput = input;\n this._inputSubscription = this._datepickerInput._valueChange.subscribe(\n (value: D | null) => (this._selected = value)\n );\n }\n\n /** Open the calendar. */\n open(): void {\n if (this._opened || this.disabled) {\n return;\n }\n if (!this._datepickerInput) {\n throw Error(\n 'Attempted to open an OuiDatepicker with no associated input.'\n );\n }\n if (this._document) {\n this._focusedElementBeforeOpen = this._document.activeElement;\n }\n\n this.touchUi ? this._openAsDialog() : this._openAsPopup();\n this._opened = true;\n // add input focus here\n this._datepickerInput.focus();\n this.openedStream.emit();\n }\n\n /** Close the calendar. */\n close(): void {\n if (!this._opened) {\n return;\n }\n if (this._popupRef && this._popupRef.hasAttached()) {\n this._popupRef.detach();\n }\n if (this._dialogRef) {\n this._dialogRef.close();\n this._dialogRef = null;\n }\n if (this._calendarPortal && this._calendarPortal.isAttached) {\n this._calendarPortal.detach();\n }\n\n const completeClose = () => {\n // The `_opened` could've been reset already if\n // we got two events in quick succession.\n if (this._opened) {\n this._opened = false;\n this.closedStream.emit();\n this._focusedElementBeforeOpen = null;\n this._datepickerInput.blur();\n }\n };\n\n if (\n this._focusedElementBeforeOpen &&\n typeof this._focusedElementBeforeOpen.focus === 'function'\n ) {\n // Because IE moves focus asynchronously, we can't count on it being restored before we've\n // marked the datepicker as closed. If the event fires out of sequence and the element that\n // we're refocusing opens the datepicker on focus, the user could be stuck with not being\n // able to close the calendar at all. We work around it by making the logic, that marks\n // the datepicker as closed, async as well.\n this._focusedElementBeforeOpen.focus();\n setTimeout(completeClose);\n } else {\n completeClose();\n }\n }\n\n /** Open the calendar as a dialog. */\n private _openAsDialog(): void {\n // Usually this would be handled by `open` which ensures that we can only have one overlay\n // open at a time, however since we reset the variables in async handlers some overlays\n // may slip through if the user opens and closes multiple times in quick succession (e.g.\n // by holding down the enter key).\n if (this._dialogRef) {\n this._dialogRef.close();\n }\n\n this._dialogRef = this._dialog.open>(\n OuiDatepickerContent,\n {\n direction: this._dir ? this._dir.value : 'ltr',\n viewContainerRef: this._viewContainerRef,\n panelClass: 'oui-datepicker-dialog',\n }\n );\n\n this._dialogRef.afterClosed().subscribe(() => this.close());\n this._dialogRef.componentInstance.datepicker = this;\n this._setColor();\n }\n\n /** Open the calendar as a popup. */\n private _openAsPopup(): void {\n if (!this._calendarPortal) {\n this._calendarPortal = new ComponentPortal>(\n OuiDatepickerContent,\n this._viewContainerRef\n );\n }\n\n if (!this._popupRef) {\n this._createPopup();\n }\n\n if (!this._popupRef.hasAttached()) {\n this._popupComponentRef = this._popupRef.attach(this._calendarPortal);\n this._popupComponentRef.instance.datepicker = this;\n this._setColor();\n\n // Update the position once the calendar has rendered.\n this._ngZone.onStable\n .asObservable()\n .pipe(take(1))\n .subscribe(() => {\n this._popupRef.updatePosition();\n });\n }\n }\n\n /** Create the popup. */\n private _createPopup(): void {\n const overlayConfig = new OverlayConfig({\n positionStrategy: this._createPopupPositionStrategy(),\n hasBackdrop: true,\n backdropClass: 'oui-overlay-transparent-backdrop',\n direction: this._dir,\n scrollStrategy: this._scrollStrategy(),\n panelClass: 'oui-datepicker-popup',\n });\n\n this._popupRef = this._overlay.create(overlayConfig);\n this._popupRef.overlayElement.setAttribute('role', 'dialog');\n\n merge(\n this._popupRef.backdropClick(),\n this._popupRef.detachments(),\n this._popupRef.keydownEvents().pipe(\n filter(\n (event) =>\n // Closing on alt + up is only valid when there's an input associated with the datepicker.\n event.keyCode === ESCAPE ||\n (this._datepickerInput &&\n event.altKey &&\n event.keyCode === UP_ARROW)\n )\n )\n ).subscribe(() => this.close());\n }\n\n /** Create the popup PositionStrategy. */\n private _createPopupPositionStrategy(): PositionStrategy {\n return this._overlay\n .position()\n .flexibleConnectedTo(this._datepickerInput.getConnectedOverlayOrigin())\n .withTransformOriginOn('.oui-datepicker-content')\n .withFlexibleDimensions(false)\n .withViewportMargin(8)\n .withLockedPosition()\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n },\n ]);\n }\n\n /**\n * @param obj The object to check.\n * @returns The given object if it is both a date instance and valid, otherwise null.\n */\n private _getValidDateOrNull(obj: any): D | null {\n return this._dateAdapter.isDateInstance(obj) &&\n this._dateAdapter.isValid(obj as any as D)\n ? obj\n : null;\n }\n\n /** Passes the current theme color along to the calendar overlay. */\n private _setColor(): void {\n const color = this.color;\n if (this._popupComponentRef) {\n this._popupComponentRef.instance.color = color;\n }\n if (this._dialogRef) {\n this._dialogRef.componentInstance.color = color;\n }\n }\n}\n", + "sourceCode": "import { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { ESCAPE, UP_ARROW } from '@angular/cdk/keycodes';\r\nimport {\r\n Overlay,\r\n OverlayConfig,\r\n OverlayRef,\r\n PositionStrategy,\r\n ScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { ComponentPortal, ComponentType } from '@angular/cdk/portal';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ComponentRef,\r\n ElementRef,\r\n EventEmitter,\r\n Inject,\r\n InjectionToken,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Optional,\r\n Output,\r\n ViewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { OuiDialog, OuiDialogRef } from '../dialog/public-api';\r\nimport { merge, Subject, Subscription } from 'rxjs';\r\nimport { filter, take } from 'rxjs/operators';\r\nimport { OuiCalendar } from './calendar';\r\nimport { ouiDatepickerAnimations } from './datepicker-animations';\r\nimport { createMissingDateImplError } from './datepicker-errors';\r\nimport { OuiDatepickerInput } from './datepicker-input';\r\nimport { OuiCalendarCellCssClasses } from './calendar-body';\r\nimport { CanColorCtor, mixinColor, CanColor, ThemePalette } from '../core';\r\nimport { DateAdapter } from './date-adapter';\r\n\r\n/** Used to generate a unique ID for each datepicker instance. */\r\nlet datepickerUid = 0;\r\n\r\n/** Injection token that determines the scroll handling while the calendar is open. */\r\nexport const OUI_DATEPICKER_SCROLL_STRATEGY = new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-datepicker-scroll-strategy');\r\n\r\nexport function OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY(\r\n overlay: Overlay\r\n): () => ScrollStrategy {\r\n return () => overlay.scrollStrategies.reposition();\r\n}\r\n\r\nexport const OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER = {\r\n provide: OUI_DATEPICKER_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY,\r\n};\r\n\r\n// Boilerplate for applying mixins to OuiDatepickerContent.\r\nexport class OuiDatepickerContentBase {\r\n constructor(public _elementRef: ElementRef) {}\r\n}\r\nexport const _OuiDatepickerContentMixinBase: CanColorCtor &\r\n typeof OuiDatepickerContentBase = mixinColor(OuiDatepickerContentBase);\r\n\r\n/**\r\n * Component used as the content for the datepicker dialog and popup. We use this instead of using\r\n * OuiCalendar directly as the content so we can control the initial focus. This also gives us a\r\n * place to put additional features of the popup that are not part of the calendar itself in the\r\n * future. (e.g. confirmation buttons).\r\n */\r\n@Component({\r\n selector: 'oui-datepicker-content',\r\n templateUrl: 'datepicker-content.html',\r\n styleUrls: ['datepicker-content.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n class: 'oui-datepicker-content',\r\n '[@transformPanel]': '\"enter\"',\r\n '[class.oui-datepicker-content-touch]': 'datepicker.touchUi',\r\n },\r\n animations: [\r\n ouiDatepickerAnimations.transformPanel,\r\n ouiDatepickerAnimations.fadeInCalendar,\r\n ],\r\n exportAs: 'ouiDatepickerContent',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['color'],\r\n})\r\nexport class OuiDatepickerContent\r\n extends _OuiDatepickerContentMixinBase\r\n implements AfterViewInit, CanColor\r\n{\r\n /** Reference to the internal calendar component. */\r\n @ViewChild(OuiCalendar) _calendar: OuiCalendar;\r\n\r\n /** Reference to the datepicker that created the overlay. */\r\n datepicker: OuiDatepicker;\r\n\r\n /** Whether the datepicker is above or below the input. */\r\n _isAbove: boolean;\r\n\r\n constructor(elementRef: ElementRef) {\r\n super(elementRef);\r\n }\r\n\r\n ngAfterViewInit() {\r\n this._calendar.focusActiveCell();\r\n }\r\n}\r\n\r\n// TODO(mmalerba): We use a component instead of a directive here so the user can use implicit\r\n// template reference variables (e.g. #d vs #d=\"ouiDatepicker\"). We can change this to a directive\r\n// if angular adds support for `exportAs: '$implicit'` on directives.\r\n/** Component responsible for managing the datepicker popup/dialog. */\r\n@Component({\r\n selector: 'oui-datepicker',\r\n template: '',\r\n exportAs: 'ouiDatepicker',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '[class.oui-datepicker-disabled]': 'disabled',\r\n },\r\n})\r\nexport class OuiDatepicker implements OnDestroy, CanColor {\r\n private _scrollStrategy: () => ScrollStrategy;\r\n\r\n /** An input indicating the type of the custom header component for the calendar, if set. */\r\n @Input() calendarHeaderComponent: ComponentType;\r\n\r\n /** The date to open the calendar to initially. */\r\n @Input()\r\n get startAt(): D | null {\r\n // If an explicit startAt is set we start there, otherwise we start at whatever the currently\r\n // selected value is.\r\n return (\r\n this._startAt ||\r\n (this._datepickerInput ? this._datepickerInput.value : null)\r\n );\r\n }\r\n set startAt(value: D | null) {\r\n this._startAt = this._getValidDateOrNull(\r\n this._dateAdapter.deserialize(value)\r\n );\r\n }\r\n private _startAt: D | null;\r\n\r\n /** The view that the calendar should start in. */\r\n @Input() startView: 'month' | 'year' | 'multi-year' = 'month';\r\n\r\n /** Color palette to use on the datepicker's calendar. */\r\n @Input()\r\n get color(): ThemePalette {\r\n return (\r\n this._color ||\r\n (this._datepickerInput\r\n ? this._datepickerInput._getThemePalette()\r\n : undefined)\r\n );\r\n }\r\n set color(value: ThemePalette) {\r\n this._color = value;\r\n }\r\n _color: ThemePalette;\r\n\r\n /**\r\n * Whether the calendar UI is in touch mode. In touch mode the calendar opens in a dialog rather\r\n * than a popup and elements have more padding to allow for bigger touch targets.\r\n */\r\n @Input()\r\n get touchUi(): boolean {\r\n return this._touchUi;\r\n }\r\n set touchUi(value: boolean) {\r\n this._touchUi = coerceBooleanProperty(value);\r\n }\r\n private _touchUi = false;\r\n\r\n /** Whether the datepicker pop-up should be disabled. */\r\n @Input()\r\n get disabled(): boolean {\r\n return this._disabled === undefined && this._datepickerInput\r\n ? this._datepickerInput.disabled\r\n : !!this._disabled;\r\n }\r\n set disabled(value: boolean) {\r\n const newValue = coerceBooleanProperty(value);\r\n\r\n if (newValue !== this._disabled) {\r\n this._disabled = newValue;\r\n this._disabledChange.next(newValue);\r\n this._datepickerInput._datepickerDisabled = newValue;\r\n }\r\n }\r\n private _disabled = false;\r\n\r\n /**\r\n * Emits selected year in multiyear view.\r\n * This doesn't imply a change on the selected date.\r\n */\r\n @Output() readonly yearSelected: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Emits selected month in year view.\r\n * This doesn't imply a change on the selected date.\r\n */\r\n @Output() readonly monthSelected: EventEmitter = new EventEmitter();\r\n\r\n /** Classes to be passed to the date picker panel. Supports the same syntax as `ngClass`. */\r\n @Input() panelClass: string | string[];\r\n\r\n /** Function that can be used to add custom CSS classes to dates. */\r\n @Input() dateClass: (date: D) => OuiCalendarCellCssClasses;\r\n\r\n /** Emits when the datepicker has been opened. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('opened') openedStream: EventEmitter = new EventEmitter();\r\n\r\n /** Emits when the datepicker has been closed. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('closed') closedStream: EventEmitter = new EventEmitter();\r\n\r\n /** Whether the calendar is open. */\r\n @Input()\r\n get opened(): boolean {\r\n return this._opened;\r\n }\r\n set opened(value: boolean) {\r\n if (value) {\r\n this.open();\r\n } else {\r\n this.close();\r\n }\r\n }\r\n private _opened = false;\r\n\r\n /** The id for the datepicker calendar. */\r\n id = `oui-datepicker-${datepickerUid++}`;\r\n\r\n /** The currently selected date. */\r\n get _selected(): D | null {\r\n return this._validSelected;\r\n }\r\n set _selected(value: D | null) {\r\n this._validSelected = value;\r\n }\r\n private _validSelected: D | null = null;\r\n\r\n /** The minimum selectable date. */\r\n get _minDate(): D | null {\r\n return this._datepickerInput && this._datepickerInput.min;\r\n }\r\n\r\n /** The maximum selectable date. */\r\n get _maxDate(): D | null {\r\n return this._datepickerInput && this._datepickerInput.max;\r\n }\r\n\r\n get _dateFilter(): (date: D | null) => boolean {\r\n return this._datepickerInput && this._datepickerInput._dateFilter;\r\n }\r\n\r\n /** A reference to the overlay when the calendar is opened as a popup. */\r\n _popupRef: OverlayRef;\r\n\r\n /** A reference to the dialog when the calendar is opened as a dialog. */\r\n private _dialogRef: OuiDialogRef> | null;\r\n\r\n /** A portal containing the calendar for this datepicker. */\r\n private _calendarPortal: ComponentPortal>;\r\n\r\n /** Reference to the component instantiated in popup mode. */\r\n private _popupComponentRef: ComponentRef> | null;\r\n\r\n /** The element that was focused before the datepicker was opened. */\r\n private _focusedElementBeforeOpen: HTMLElement | null = null;\r\n\r\n /** Subscription to value changes in the associated input element. */\r\n private _inputSubscription = Subscription.EMPTY;\r\n\r\n /** The input element this datepicker is associated with. */\r\n _datepickerInput: OuiDatepickerInput;\r\n\r\n /** Emits when the datepicker is disabled. */\r\n readonly _disabledChange = new Subject();\r\n\r\n /** Emits new selected date when selected date changes. */\r\n readonly _selectedChanged = new Subject();\r\n private _monitorSubscription: Subscription = Subscription.EMPTY;\r\n constructor(\r\n private _dialog: OuiDialog,\r\n private _overlay: Overlay,\r\n private _ngZone: NgZone,\r\n protected elementRef: ElementRef,\r\n private _focusMonitor: FocusMonitor,\r\n private _viewContainerRef: ViewContainerRef,\r\n @Inject(OUI_DATEPICKER_SCROLL_STRATEGY) scrollStrategy: any,\r\n @Optional() private _dateAdapter: DateAdapter,\r\n @Optional() private _dir: Directionality,\r\n @Optional() @Inject(DOCUMENT) private _document: any\r\n ) {\r\n if (!this._dateAdapter) {\r\n throw createMissingDateImplError('DateAdapter');\r\n }\r\n this._scrollStrategy = scrollStrategy;\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this.elementRef, true)\r\n .subscribe(() => this._ngZone.run(() => {}));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.close();\r\n this._inputSubscription.unsubscribe();\r\n this._disabledChange.complete();\r\n this._monitorSubscription.unsubscribe();\r\n\r\n if (this._popupRef) {\r\n this._popupRef.dispose();\r\n this._popupComponentRef = null;\r\n }\r\n }\r\n\r\n /** Selects the given date */\r\n select(date: D): void {\r\n const oldValue = this._selected;\r\n this._selected = date;\r\n if (!this._dateAdapter.sameDate(oldValue, this._selected)) {\r\n this._selectedChanged.next(date);\r\n }\r\n }\r\n\r\n /** Emits the selected year in multiyear view */\r\n _selectYear(normalizedYear: D): void {\r\n this.yearSelected.emit(normalizedYear);\r\n }\r\n\r\n /** Emits selected month in year view */\r\n _selectMonth(normalizedMonth: D): void {\r\n this.monthSelected.emit(normalizedMonth);\r\n }\r\n\r\n /**\r\n * Register an input with this datepicker.\r\n *\r\n * @param input The datepicker input to register with this datepicker.\r\n */\r\n _registerInput(input: OuiDatepickerInput): void {\r\n if (this._datepickerInput) {\r\n throw Error(\r\n 'A OuiDatepicker can only be associated with a single input.'\r\n );\r\n }\r\n this._datepickerInput = input;\r\n this._inputSubscription = this._datepickerInput._valueChange.subscribe(\r\n (value: D | null) => (this._selected = value)\r\n );\r\n }\r\n\r\n /** Open the calendar. */\r\n open(): void {\r\n if (this._opened || this.disabled) {\r\n return;\r\n }\r\n if (!this._datepickerInput) {\r\n throw Error(\r\n 'Attempted to open an OuiDatepicker with no associated input.'\r\n );\r\n }\r\n if (this._document) {\r\n this._focusedElementBeforeOpen = this._document.activeElement;\r\n }\r\n\r\n if (this.touchUi) {\r\n this._openAsDialog();\r\n } else {\r\n this._openAsPopup();\r\n }\r\n this._opened = true;\r\n // add input focus here\r\n this._datepickerInput.focus();\r\n this.openedStream.emit();\r\n }\r\n\r\n /** Close the calendar. */\r\n close(): void {\r\n if (!this._opened) {\r\n return;\r\n }\r\n if (this._popupRef && this._popupRef.hasAttached()) {\r\n this._popupRef.detach();\r\n }\r\n if (this._dialogRef) {\r\n this._dialogRef.close();\r\n this._dialogRef = null;\r\n }\r\n if (this._calendarPortal && this._calendarPortal.isAttached) {\r\n this._calendarPortal.detach();\r\n }\r\n\r\n const completeClose = () => {\r\n // The `_opened` could've been reset already if\r\n // we got two events in quick succession.\r\n if (this._opened) {\r\n this._opened = false;\r\n this.closedStream.emit();\r\n this._focusedElementBeforeOpen = null;\r\n this._datepickerInput.blur();\r\n }\r\n };\r\n\r\n if (\r\n this._focusedElementBeforeOpen &&\r\n typeof this._focusedElementBeforeOpen.focus === 'function'\r\n ) {\r\n // Because IE moves focus asynchronously, we can't count on it being restored before we've\r\n // marked the datepicker as closed. If the event fires out of sequence and the element that\r\n // we're refocusing opens the datepicker on focus, the user could be stuck with not being\r\n // able to close the calendar at all. We work around it by making the logic, that marks\r\n // the datepicker as closed, async as well.\r\n this._focusedElementBeforeOpen.focus();\r\n setTimeout(completeClose);\r\n } else {\r\n completeClose();\r\n }\r\n }\r\n\r\n /** Open the calendar as a dialog. */\r\n private _openAsDialog(): void {\r\n // Usually this would be handled by `open` which ensures that we can only have one overlay\r\n // open at a time, however since we reset the variables in async handlers some overlays\r\n // may slip through if the user opens and closes multiple times in quick succession (e.g.\r\n // by holding down the enter key).\r\n if (this._dialogRef) {\r\n this._dialogRef.close();\r\n }\r\n\r\n this._dialogRef = this._dialog.open>(\r\n OuiDatepickerContent,\r\n {\r\n direction: this._dir ? this._dir.value : 'ltr',\r\n viewContainerRef: this._viewContainerRef,\r\n panelClass: 'oui-datepicker-dialog',\r\n }\r\n );\r\n\r\n this._dialogRef.afterClosed().subscribe(() => this.close());\r\n this._dialogRef.componentInstance.datepicker = this;\r\n this._setColor();\r\n }\r\n\r\n /** Open the calendar as a popup. */\r\n private _openAsPopup(): void {\r\n if (!this._calendarPortal) {\r\n this._calendarPortal = new ComponentPortal>(\r\n OuiDatepickerContent,\r\n this._viewContainerRef\r\n );\r\n }\r\n\r\n if (!this._popupRef) {\r\n this._createPopup();\r\n }\r\n\r\n if (!this._popupRef.hasAttached()) {\r\n this._popupComponentRef = this._popupRef.attach(this._calendarPortal);\r\n this._popupComponentRef.instance.datepicker = this;\r\n this._setColor();\r\n\r\n // Update the position once the calendar has rendered.\r\n this._ngZone.onStable\r\n .asObservable()\r\n .pipe(take(1))\r\n .subscribe(() => {\r\n this._popupRef.updatePosition();\r\n });\r\n }\r\n }\r\n\r\n /** Create the popup. */\r\n private _createPopup(): void {\r\n const overlayConfig = new OverlayConfig({\r\n positionStrategy: this._createPopupPositionStrategy(),\r\n hasBackdrop: true,\r\n backdropClass: 'oui-overlay-transparent-backdrop',\r\n direction: this._dir,\r\n scrollStrategy: this._scrollStrategy(),\r\n panelClass: 'oui-datepicker-popup',\r\n });\r\n\r\n this._popupRef = this._overlay.create(overlayConfig);\r\n this._popupRef.overlayElement.setAttribute('role', 'dialog');\r\n\r\n merge(\r\n this._popupRef.backdropClick(),\r\n this._popupRef.detachments(),\r\n this._popupRef.keydownEvents().pipe(\r\n filter(\r\n (event) =>\r\n // Closing on alt + up is only valid when there's an input associated with the datepicker.\r\n event.keyCode === ESCAPE ||\r\n (this._datepickerInput &&\r\n event.altKey &&\r\n event.keyCode === UP_ARROW)\r\n )\r\n )\r\n ).subscribe(() => this.close());\r\n }\r\n\r\n /** Create the popup PositionStrategy. */\r\n private _createPopupPositionStrategy(): PositionStrategy {\r\n return this._overlay\r\n .position()\r\n .flexibleConnectedTo(this._datepickerInput.getConnectedOverlayOrigin())\r\n .withTransformOriginOn('.oui-datepicker-content')\r\n .withFlexibleDimensions(false)\r\n .withViewportMargin(8)\r\n .withLockedPosition()\r\n .withPositions([\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n },\r\n {\r\n originX: 'end',\r\n originY: 'bottom',\r\n overlayX: 'end',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'end',\r\n originY: 'top',\r\n overlayX: 'end',\r\n overlayY: 'bottom',\r\n },\r\n ]);\r\n }\r\n\r\n /**\r\n * @param obj The object to check.\r\n * @returns The given object if it is both a date instance and valid, otherwise null.\r\n */\r\n private _getValidDateOrNull(obj: any): D | null {\r\n return this._dateAdapter.isDateInstance(obj) &&\r\n this._dateAdapter.isValid(obj as any as D)\r\n ? obj\r\n : null;\r\n }\r\n\r\n /** Passes the current theme color along to the calendar overlay. */\r\n private _setColor(): void {\r\n const color = this.color;\r\n if (this._popupComponentRef) {\r\n this._popupComponentRef.instance.color = color;\r\n }\r\n if (this._dialogRef) {\r\n this._dialogRef.componentInstance.color = color;\r\n }\r\n }\r\n}\r\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -25991,7 +26068,7 @@ "deprecationMessage": "" } ], - "line": 293, + "line": 297, "jsdoctags": [ { "name": "_dialog", @@ -26297,7 +26374,7 @@ } ], "returnType": "void", - "line": 248, + "line": 252, "jsdoctags": [ { "name": "value", @@ -26314,7 +26391,7 @@ "name": "_selected", "type": "", "returnType": "D | null", - "line": 245, + "line": 249, "rawdescription": "\nThe currently selected date.", "description": "

The currently selected date.

\n" } @@ -26325,7 +26402,7 @@ "name": "_minDate", "type": "", "returnType": "D | null", - "line": 254, + "line": 258, "rawdescription": "\nThe minimum selectable date.", "description": "

The minimum selectable date.

\n" } @@ -26336,7 +26413,7 @@ "name": "_maxDate", "type": "", "returnType": "D | null", - "line": 259, + "line": 263, "rawdescription": "\nThe maximum selectable date.", "description": "

The maximum selectable date.

\n" } @@ -26347,14 +26424,14 @@ "name": "_dateFilter", "type": "function", "returnType": "boolean", - "line": 263 + "line": 267 } } } }, { "name": "OuiDatepickerContent", - "id": "component-OuiDatepickerContent-ef2f443418fcda96544206a6e7f04650559ef230ba716a2fcd192fcccff22a5183bd00b300ca1bd0840b2bdab9f680685ecce9b42c0d3c890966f004ff76d557", + "id": "component-OuiDatepickerContent-ef3921776ad0b82cfce69b5c144771b4138dd78e0575d40f4974599120fe3e1e28ceff4f20e944b010d0518aa308aae69e37dd81b1e5162259dfe51af7495093", "file": "ui/src/components/datepicker/datepicker.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -26442,7 +26519,7 @@ "description": "

Component used as the content for the datepicker dialog and popup. We use this instead of using\nOuiCalendar directly as the content so we can control the initial focus. This also gives us a\nplace to put additional features of the popup that are not part of the calendar itself in the\nfuture. (e.g. confirmation buttons).

\n", "rawdescription": "\n\nComponent used as the content for the datepicker dialog and popup. We use this instead of using\nOuiCalendar directly as the content so we can control the initial focus. This also gives us a\nplace to put additional features of the popup that are not part of the calendar itself in the\nfuture. (e.g. confirmation buttons).\n", "type": "component", - "sourceCode": "import { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ESCAPE, UP_ARROW } from '@angular/cdk/keycodes';\nimport {\n Overlay,\n OverlayConfig,\n OverlayRef,\n PositionStrategy,\n ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport { ComponentPortal, ComponentType } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n Output,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FocusMonitor } from '@angular/cdk/a11y';\nimport { OuiDialog, OuiDialogRef } from '../dialog/public-api';\nimport { merge, Subject, Subscription } from 'rxjs';\nimport { filter, take } from 'rxjs/operators';\nimport { OuiCalendar } from './calendar';\nimport { ouiDatepickerAnimations } from './datepicker-animations';\nimport { createMissingDateImplError } from './datepicker-errors';\nimport { OuiDatepickerInput } from './datepicker-input';\nimport { OuiCalendarCellCssClasses } from './calendar-body';\nimport { CanColorCtor, mixinColor, CanColor, ThemePalette } from '../core';\nimport { DateAdapter } from './date-adapter';\n\n/** Used to generate a unique ID for each datepicker instance. */\nlet datepickerUid = 0;\n\n/** Injection token that determines the scroll handling while the calendar is open. */\nexport const OUI_DATEPICKER_SCROLL_STRATEGY = new InjectionToken<\n () => ScrollStrategy\n>('oui-datepicker-scroll-strategy');\n\nexport function OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY(\n overlay: Overlay\n): () => ScrollStrategy {\n return () => overlay.scrollStrategies.reposition();\n}\n\nexport const OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: OUI_DATEPICKER_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY,\n};\n\n// Boilerplate for applying mixins to OuiDatepickerContent.\nexport class OuiDatepickerContentBase {\n constructor(public _elementRef: ElementRef) {}\n}\nexport const _OuiDatepickerContentMixinBase: CanColorCtor &\n typeof OuiDatepickerContentBase = mixinColor(OuiDatepickerContentBase);\n\n/**\n * Component used as the content for the datepicker dialog and popup. We use this instead of using\n * OuiCalendar directly as the content so we can control the initial focus. This also gives us a\n * place to put additional features of the popup that are not part of the calendar itself in the\n * future. (e.g. confirmation buttons).\n */\n@Component({\n selector: 'oui-datepicker-content',\n templateUrl: 'datepicker-content.html',\n styleUrls: ['datepicker-content.scss'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-datepicker-content',\n '[@transformPanel]': '\"enter\"',\n '[class.oui-datepicker-content-touch]': 'datepicker.touchUi',\n },\n animations: [\n ouiDatepickerAnimations.transformPanel,\n ouiDatepickerAnimations.fadeInCalendar,\n ],\n exportAs: 'ouiDatepickerContent',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['color'],\n})\nexport class OuiDatepickerContent\n extends _OuiDatepickerContentMixinBase\n implements AfterViewInit, CanColor\n{\n /** Reference to the internal calendar component. */\n @ViewChild(OuiCalendar) _calendar: OuiCalendar;\n\n /** Reference to the datepicker that created the overlay. */\n datepicker: OuiDatepicker;\n\n /** Whether the datepicker is above or below the input. */\n _isAbove: boolean;\n\n constructor(elementRef: ElementRef) {\n super(elementRef);\n }\n\n ngAfterViewInit() {\n this._calendar.focusActiveCell();\n }\n}\n\n// TODO(mmalerba): We use a component instead of a directive here so the user can use implicit\n// template reference variables (e.g. #d vs #d=\"ouiDatepicker\"). We can change this to a directive\n// if angular adds support for `exportAs: '$implicit'` on directives.\n/** Component responsible for managing the datepicker popup/dialog. */\n@Component({\n selector: 'oui-datepicker',\n template: '',\n exportAs: 'ouiDatepicker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.oui-datepicker-disabled]': 'disabled',\n },\n})\nexport class OuiDatepicker implements OnDestroy, CanColor {\n private _scrollStrategy: () => ScrollStrategy;\n\n /** An input indicating the type of the custom header component for the calendar, if set. */\n @Input() calendarHeaderComponent: ComponentType;\n\n /** The date to open the calendar to initially. */\n @Input()\n get startAt(): D | null {\n // If an explicit startAt is set we start there, otherwise we start at whatever the currently\n // selected value is.\n return (\n this._startAt ||\n (this._datepickerInput ? this._datepickerInput.value : null)\n );\n }\n set startAt(value: D | null) {\n this._startAt = this._getValidDateOrNull(\n this._dateAdapter.deserialize(value)\n );\n }\n private _startAt: D | null;\n\n /** The view that the calendar should start in. */\n @Input() startView: 'month' | 'year' | 'multi-year' = 'month';\n\n /** Color palette to use on the datepicker's calendar. */\n @Input()\n get color(): ThemePalette {\n return (\n this._color ||\n (this._datepickerInput\n ? this._datepickerInput._getThemePalette()\n : undefined)\n );\n }\n set color(value: ThemePalette) {\n this._color = value;\n }\n _color: ThemePalette;\n\n /**\n * Whether the calendar UI is in touch mode. In touch mode the calendar opens in a dialog rather\n * than a popup and elements have more padding to allow for bigger touch targets.\n */\n @Input()\n get touchUi(): boolean {\n return this._touchUi;\n }\n set touchUi(value: boolean) {\n this._touchUi = coerceBooleanProperty(value);\n }\n private _touchUi = false;\n\n /** Whether the datepicker pop-up should be disabled. */\n @Input()\n get disabled(): boolean {\n return this._disabled === undefined && this._datepickerInput\n ? this._datepickerInput.disabled\n : !!this._disabled;\n }\n set disabled(value: boolean) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this._disabled) {\n this._disabled = newValue;\n this._disabledChange.next(newValue);\n this._datepickerInput._datepickerDisabled = newValue;\n }\n }\n private _disabled = false;\n\n /**\n * Emits selected year in multiyear view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly yearSelected: EventEmitter = new EventEmitter();\n\n /**\n * Emits selected month in year view.\n * This doesn't imply a change on the selected date.\n */\n @Output() readonly monthSelected: EventEmitter = new EventEmitter();\n\n /** Classes to be passed to the date picker panel. Supports the same syntax as `ngClass`. */\n @Input() panelClass: string | string[];\n\n /** Function that can be used to add custom CSS classes to dates. */\n @Input() dateClass: (date: D) => OuiCalendarCellCssClasses;\n\n /** Emits when the datepicker has been opened. */\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('opened') openedStream: EventEmitter = new EventEmitter();\n\n /** Emits when the datepicker has been closed. */\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('closed') closedStream: EventEmitter = new EventEmitter();\n\n /** Whether the calendar is open. */\n @Input()\n get opened(): boolean {\n return this._opened;\n }\n set opened(value: boolean) {\n value ? this.open() : this.close();\n }\n private _opened = false;\n\n /** The id for the datepicker calendar. */\n id = `oui-datepicker-${datepickerUid++}`;\n\n /** The currently selected date. */\n get _selected(): D | null {\n return this._validSelected;\n }\n set _selected(value: D | null) {\n this._validSelected = value;\n }\n private _validSelected: D | null = null;\n\n /** The minimum selectable date. */\n get _minDate(): D | null {\n return this._datepickerInput && this._datepickerInput.min;\n }\n\n /** The maximum selectable date. */\n get _maxDate(): D | null {\n return this._datepickerInput && this._datepickerInput.max;\n }\n\n get _dateFilter(): (date: D | null) => boolean {\n return this._datepickerInput && this._datepickerInput._dateFilter;\n }\n\n /** A reference to the overlay when the calendar is opened as a popup. */\n _popupRef: OverlayRef;\n\n /** A reference to the dialog when the calendar is opened as a dialog. */\n private _dialogRef: OuiDialogRef> | null;\n\n /** A portal containing the calendar for this datepicker. */\n private _calendarPortal: ComponentPortal>;\n\n /** Reference to the component instantiated in popup mode. */\n private _popupComponentRef: ComponentRef> | null;\n\n /** The element that was focused before the datepicker was opened. */\n private _focusedElementBeforeOpen: HTMLElement | null = null;\n\n /** Subscription to value changes in the associated input element. */\n private _inputSubscription = Subscription.EMPTY;\n\n /** The input element this datepicker is associated with. */\n _datepickerInput: OuiDatepickerInput;\n\n /** Emits when the datepicker is disabled. */\n readonly _disabledChange = new Subject();\n\n /** Emits new selected date when selected date changes. */\n readonly _selectedChanged = new Subject();\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private _dialog: OuiDialog,\n private _overlay: Overlay,\n private _ngZone: NgZone,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _viewContainerRef: ViewContainerRef,\n @Inject(OUI_DATEPICKER_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _dateAdapter: DateAdapter,\n @Optional() private _dir: Directionality,\n @Optional() @Inject(DOCUMENT) private _document: any\n ) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n this._scrollStrategy = scrollStrategy;\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n\n ngOnDestroy() {\n this.close();\n this._inputSubscription.unsubscribe();\n this._disabledChange.complete();\n this._monitorSubscription.unsubscribe();\n\n if (this._popupRef) {\n this._popupRef.dispose();\n this._popupComponentRef = null;\n }\n }\n\n /** Selects the given date */\n select(date: D): void {\n const oldValue = this._selected;\n this._selected = date;\n if (!this._dateAdapter.sameDate(oldValue, this._selected)) {\n this._selectedChanged.next(date);\n }\n }\n\n /** Emits the selected year in multiyear view */\n _selectYear(normalizedYear: D): void {\n this.yearSelected.emit(normalizedYear);\n }\n\n /** Emits selected month in year view */\n _selectMonth(normalizedMonth: D): void {\n this.monthSelected.emit(normalizedMonth);\n }\n\n /**\n * Register an input with this datepicker.\n *\n * @param input The datepicker input to register with this datepicker.\n */\n _registerInput(input: OuiDatepickerInput): void {\n if (this._datepickerInput) {\n throw Error(\n 'A OuiDatepicker can only be associated with a single input.'\n );\n }\n this._datepickerInput = input;\n this._inputSubscription = this._datepickerInput._valueChange.subscribe(\n (value: D | null) => (this._selected = value)\n );\n }\n\n /** Open the calendar. */\n open(): void {\n if (this._opened || this.disabled) {\n return;\n }\n if (!this._datepickerInput) {\n throw Error(\n 'Attempted to open an OuiDatepicker with no associated input.'\n );\n }\n if (this._document) {\n this._focusedElementBeforeOpen = this._document.activeElement;\n }\n\n this.touchUi ? this._openAsDialog() : this._openAsPopup();\n this._opened = true;\n // add input focus here\n this._datepickerInput.focus();\n this.openedStream.emit();\n }\n\n /** Close the calendar. */\n close(): void {\n if (!this._opened) {\n return;\n }\n if (this._popupRef && this._popupRef.hasAttached()) {\n this._popupRef.detach();\n }\n if (this._dialogRef) {\n this._dialogRef.close();\n this._dialogRef = null;\n }\n if (this._calendarPortal && this._calendarPortal.isAttached) {\n this._calendarPortal.detach();\n }\n\n const completeClose = () => {\n // The `_opened` could've been reset already if\n // we got two events in quick succession.\n if (this._opened) {\n this._opened = false;\n this.closedStream.emit();\n this._focusedElementBeforeOpen = null;\n this._datepickerInput.blur();\n }\n };\n\n if (\n this._focusedElementBeforeOpen &&\n typeof this._focusedElementBeforeOpen.focus === 'function'\n ) {\n // Because IE moves focus asynchronously, we can't count on it being restored before we've\n // marked the datepicker as closed. If the event fires out of sequence and the element that\n // we're refocusing opens the datepicker on focus, the user could be stuck with not being\n // able to close the calendar at all. We work around it by making the logic, that marks\n // the datepicker as closed, async as well.\n this._focusedElementBeforeOpen.focus();\n setTimeout(completeClose);\n } else {\n completeClose();\n }\n }\n\n /** Open the calendar as a dialog. */\n private _openAsDialog(): void {\n // Usually this would be handled by `open` which ensures that we can only have one overlay\n // open at a time, however since we reset the variables in async handlers some overlays\n // may slip through if the user opens and closes multiple times in quick succession (e.g.\n // by holding down the enter key).\n if (this._dialogRef) {\n this._dialogRef.close();\n }\n\n this._dialogRef = this._dialog.open>(\n OuiDatepickerContent,\n {\n direction: this._dir ? this._dir.value : 'ltr',\n viewContainerRef: this._viewContainerRef,\n panelClass: 'oui-datepicker-dialog',\n }\n );\n\n this._dialogRef.afterClosed().subscribe(() => this.close());\n this._dialogRef.componentInstance.datepicker = this;\n this._setColor();\n }\n\n /** Open the calendar as a popup. */\n private _openAsPopup(): void {\n if (!this._calendarPortal) {\n this._calendarPortal = new ComponentPortal>(\n OuiDatepickerContent,\n this._viewContainerRef\n );\n }\n\n if (!this._popupRef) {\n this._createPopup();\n }\n\n if (!this._popupRef.hasAttached()) {\n this._popupComponentRef = this._popupRef.attach(this._calendarPortal);\n this._popupComponentRef.instance.datepicker = this;\n this._setColor();\n\n // Update the position once the calendar has rendered.\n this._ngZone.onStable\n .asObservable()\n .pipe(take(1))\n .subscribe(() => {\n this._popupRef.updatePosition();\n });\n }\n }\n\n /** Create the popup. */\n private _createPopup(): void {\n const overlayConfig = new OverlayConfig({\n positionStrategy: this._createPopupPositionStrategy(),\n hasBackdrop: true,\n backdropClass: 'oui-overlay-transparent-backdrop',\n direction: this._dir,\n scrollStrategy: this._scrollStrategy(),\n panelClass: 'oui-datepicker-popup',\n });\n\n this._popupRef = this._overlay.create(overlayConfig);\n this._popupRef.overlayElement.setAttribute('role', 'dialog');\n\n merge(\n this._popupRef.backdropClick(),\n this._popupRef.detachments(),\n this._popupRef.keydownEvents().pipe(\n filter(\n (event) =>\n // Closing on alt + up is only valid when there's an input associated with the datepicker.\n event.keyCode === ESCAPE ||\n (this._datepickerInput &&\n event.altKey &&\n event.keyCode === UP_ARROW)\n )\n )\n ).subscribe(() => this.close());\n }\n\n /** Create the popup PositionStrategy. */\n private _createPopupPositionStrategy(): PositionStrategy {\n return this._overlay\n .position()\n .flexibleConnectedTo(this._datepickerInput.getConnectedOverlayOrigin())\n .withTransformOriginOn('.oui-datepicker-content')\n .withFlexibleDimensions(false)\n .withViewportMargin(8)\n .withLockedPosition()\n .withPositions([\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n {\n originX: 'end',\n originY: 'bottom',\n overlayX: 'end',\n overlayY: 'top',\n },\n {\n originX: 'end',\n originY: 'top',\n overlayX: 'end',\n overlayY: 'bottom',\n },\n ]);\n }\n\n /**\n * @param obj The object to check.\n * @returns The given object if it is both a date instance and valid, otherwise null.\n */\n private _getValidDateOrNull(obj: any): D | null {\n return this._dateAdapter.isDateInstance(obj) &&\n this._dateAdapter.isValid(obj as any as D)\n ? obj\n : null;\n }\n\n /** Passes the current theme color along to the calendar overlay. */\n private _setColor(): void {\n const color = this.color;\n if (this._popupComponentRef) {\n this._popupComponentRef.instance.color = color;\n }\n if (this._dialogRef) {\n this._dialogRef.componentInstance.color = color;\n }\n }\n}\n", + "sourceCode": "import { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { ESCAPE, UP_ARROW } from '@angular/cdk/keycodes';\r\nimport {\r\n Overlay,\r\n OverlayConfig,\r\n OverlayRef,\r\n PositionStrategy,\r\n ScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { ComponentPortal, ComponentType } from '@angular/cdk/portal';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ComponentRef,\r\n ElementRef,\r\n EventEmitter,\r\n Inject,\r\n InjectionToken,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Optional,\r\n Output,\r\n ViewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { OuiDialog, OuiDialogRef } from '../dialog/public-api';\r\nimport { merge, Subject, Subscription } from 'rxjs';\r\nimport { filter, take } from 'rxjs/operators';\r\nimport { OuiCalendar } from './calendar';\r\nimport { ouiDatepickerAnimations } from './datepicker-animations';\r\nimport { createMissingDateImplError } from './datepicker-errors';\r\nimport { OuiDatepickerInput } from './datepicker-input';\r\nimport { OuiCalendarCellCssClasses } from './calendar-body';\r\nimport { CanColorCtor, mixinColor, CanColor, ThemePalette } from '../core';\r\nimport { DateAdapter } from './date-adapter';\r\n\r\n/** Used to generate a unique ID for each datepicker instance. */\r\nlet datepickerUid = 0;\r\n\r\n/** Injection token that determines the scroll handling while the calendar is open. */\r\nexport const OUI_DATEPICKER_SCROLL_STRATEGY = new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-datepicker-scroll-strategy');\r\n\r\nexport function OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY(\r\n overlay: Overlay\r\n): () => ScrollStrategy {\r\n return () => overlay.scrollStrategies.reposition();\r\n}\r\n\r\nexport const OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER = {\r\n provide: OUI_DATEPICKER_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY,\r\n};\r\n\r\n// Boilerplate for applying mixins to OuiDatepickerContent.\r\nexport class OuiDatepickerContentBase {\r\n constructor(public _elementRef: ElementRef) {}\r\n}\r\nexport const _OuiDatepickerContentMixinBase: CanColorCtor &\r\n typeof OuiDatepickerContentBase = mixinColor(OuiDatepickerContentBase);\r\n\r\n/**\r\n * Component used as the content for the datepicker dialog and popup. We use this instead of using\r\n * OuiCalendar directly as the content so we can control the initial focus. This also gives us a\r\n * place to put additional features of the popup that are not part of the calendar itself in the\r\n * future. (e.g. confirmation buttons).\r\n */\r\n@Component({\r\n selector: 'oui-datepicker-content',\r\n templateUrl: 'datepicker-content.html',\r\n styleUrls: ['datepicker-content.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n class: 'oui-datepicker-content',\r\n '[@transformPanel]': '\"enter\"',\r\n '[class.oui-datepicker-content-touch]': 'datepicker.touchUi',\r\n },\r\n animations: [\r\n ouiDatepickerAnimations.transformPanel,\r\n ouiDatepickerAnimations.fadeInCalendar,\r\n ],\r\n exportAs: 'ouiDatepickerContent',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['color'],\r\n})\r\nexport class OuiDatepickerContent\r\n extends _OuiDatepickerContentMixinBase\r\n implements AfterViewInit, CanColor\r\n{\r\n /** Reference to the internal calendar component. */\r\n @ViewChild(OuiCalendar) _calendar: OuiCalendar;\r\n\r\n /** Reference to the datepicker that created the overlay. */\r\n datepicker: OuiDatepicker;\r\n\r\n /** Whether the datepicker is above or below the input. */\r\n _isAbove: boolean;\r\n\r\n constructor(elementRef: ElementRef) {\r\n super(elementRef);\r\n }\r\n\r\n ngAfterViewInit() {\r\n this._calendar.focusActiveCell();\r\n }\r\n}\r\n\r\n// TODO(mmalerba): We use a component instead of a directive here so the user can use implicit\r\n// template reference variables (e.g. #d vs #d=\"ouiDatepicker\"). We can change this to a directive\r\n// if angular adds support for `exportAs: '$implicit'` on directives.\r\n/** Component responsible for managing the datepicker popup/dialog. */\r\n@Component({\r\n selector: 'oui-datepicker',\r\n template: '',\r\n exportAs: 'ouiDatepicker',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '[class.oui-datepicker-disabled]': 'disabled',\r\n },\r\n})\r\nexport class OuiDatepicker implements OnDestroy, CanColor {\r\n private _scrollStrategy: () => ScrollStrategy;\r\n\r\n /** An input indicating the type of the custom header component for the calendar, if set. */\r\n @Input() calendarHeaderComponent: ComponentType;\r\n\r\n /** The date to open the calendar to initially. */\r\n @Input()\r\n get startAt(): D | null {\r\n // If an explicit startAt is set we start there, otherwise we start at whatever the currently\r\n // selected value is.\r\n return (\r\n this._startAt ||\r\n (this._datepickerInput ? this._datepickerInput.value : null)\r\n );\r\n }\r\n set startAt(value: D | null) {\r\n this._startAt = this._getValidDateOrNull(\r\n this._dateAdapter.deserialize(value)\r\n );\r\n }\r\n private _startAt: D | null;\r\n\r\n /** The view that the calendar should start in. */\r\n @Input() startView: 'month' | 'year' | 'multi-year' = 'month';\r\n\r\n /** Color palette to use on the datepicker's calendar. */\r\n @Input()\r\n get color(): ThemePalette {\r\n return (\r\n this._color ||\r\n (this._datepickerInput\r\n ? this._datepickerInput._getThemePalette()\r\n : undefined)\r\n );\r\n }\r\n set color(value: ThemePalette) {\r\n this._color = value;\r\n }\r\n _color: ThemePalette;\r\n\r\n /**\r\n * Whether the calendar UI is in touch mode. In touch mode the calendar opens in a dialog rather\r\n * than a popup and elements have more padding to allow for bigger touch targets.\r\n */\r\n @Input()\r\n get touchUi(): boolean {\r\n return this._touchUi;\r\n }\r\n set touchUi(value: boolean) {\r\n this._touchUi = coerceBooleanProperty(value);\r\n }\r\n private _touchUi = false;\r\n\r\n /** Whether the datepicker pop-up should be disabled. */\r\n @Input()\r\n get disabled(): boolean {\r\n return this._disabled === undefined && this._datepickerInput\r\n ? this._datepickerInput.disabled\r\n : !!this._disabled;\r\n }\r\n set disabled(value: boolean) {\r\n const newValue = coerceBooleanProperty(value);\r\n\r\n if (newValue !== this._disabled) {\r\n this._disabled = newValue;\r\n this._disabledChange.next(newValue);\r\n this._datepickerInput._datepickerDisabled = newValue;\r\n }\r\n }\r\n private _disabled = false;\r\n\r\n /**\r\n * Emits selected year in multiyear view.\r\n * This doesn't imply a change on the selected date.\r\n */\r\n @Output() readonly yearSelected: EventEmitter = new EventEmitter();\r\n\r\n /**\r\n * Emits selected month in year view.\r\n * This doesn't imply a change on the selected date.\r\n */\r\n @Output() readonly monthSelected: EventEmitter = new EventEmitter();\r\n\r\n /** Classes to be passed to the date picker panel. Supports the same syntax as `ngClass`. */\r\n @Input() panelClass: string | string[];\r\n\r\n /** Function that can be used to add custom CSS classes to dates. */\r\n @Input() dateClass: (date: D) => OuiCalendarCellCssClasses;\r\n\r\n /** Emits when the datepicker has been opened. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('opened') openedStream: EventEmitter = new EventEmitter();\r\n\r\n /** Emits when the datepicker has been closed. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('closed') closedStream: EventEmitter = new EventEmitter();\r\n\r\n /** Whether the calendar is open. */\r\n @Input()\r\n get opened(): boolean {\r\n return this._opened;\r\n }\r\n set opened(value: boolean) {\r\n if (value) {\r\n this.open();\r\n } else {\r\n this.close();\r\n }\r\n }\r\n private _opened = false;\r\n\r\n /** The id for the datepicker calendar. */\r\n id = `oui-datepicker-${datepickerUid++}`;\r\n\r\n /** The currently selected date. */\r\n get _selected(): D | null {\r\n return this._validSelected;\r\n }\r\n set _selected(value: D | null) {\r\n this._validSelected = value;\r\n }\r\n private _validSelected: D | null = null;\r\n\r\n /** The minimum selectable date. */\r\n get _minDate(): D | null {\r\n return this._datepickerInput && this._datepickerInput.min;\r\n }\r\n\r\n /** The maximum selectable date. */\r\n get _maxDate(): D | null {\r\n return this._datepickerInput && this._datepickerInput.max;\r\n }\r\n\r\n get _dateFilter(): (date: D | null) => boolean {\r\n return this._datepickerInput && this._datepickerInput._dateFilter;\r\n }\r\n\r\n /** A reference to the overlay when the calendar is opened as a popup. */\r\n _popupRef: OverlayRef;\r\n\r\n /** A reference to the dialog when the calendar is opened as a dialog. */\r\n private _dialogRef: OuiDialogRef> | null;\r\n\r\n /** A portal containing the calendar for this datepicker. */\r\n private _calendarPortal: ComponentPortal>;\r\n\r\n /** Reference to the component instantiated in popup mode. */\r\n private _popupComponentRef: ComponentRef> | null;\r\n\r\n /** The element that was focused before the datepicker was opened. */\r\n private _focusedElementBeforeOpen: HTMLElement | null = null;\r\n\r\n /** Subscription to value changes in the associated input element. */\r\n private _inputSubscription = Subscription.EMPTY;\r\n\r\n /** The input element this datepicker is associated with. */\r\n _datepickerInput: OuiDatepickerInput;\r\n\r\n /** Emits when the datepicker is disabled. */\r\n readonly _disabledChange = new Subject();\r\n\r\n /** Emits new selected date when selected date changes. */\r\n readonly _selectedChanged = new Subject();\r\n private _monitorSubscription: Subscription = Subscription.EMPTY;\r\n constructor(\r\n private _dialog: OuiDialog,\r\n private _overlay: Overlay,\r\n private _ngZone: NgZone,\r\n protected elementRef: ElementRef,\r\n private _focusMonitor: FocusMonitor,\r\n private _viewContainerRef: ViewContainerRef,\r\n @Inject(OUI_DATEPICKER_SCROLL_STRATEGY) scrollStrategy: any,\r\n @Optional() private _dateAdapter: DateAdapter,\r\n @Optional() private _dir: Directionality,\r\n @Optional() @Inject(DOCUMENT) private _document: any\r\n ) {\r\n if (!this._dateAdapter) {\r\n throw createMissingDateImplError('DateAdapter');\r\n }\r\n this._scrollStrategy = scrollStrategy;\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this.elementRef, true)\r\n .subscribe(() => this._ngZone.run(() => {}));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.close();\r\n this._inputSubscription.unsubscribe();\r\n this._disabledChange.complete();\r\n this._monitorSubscription.unsubscribe();\r\n\r\n if (this._popupRef) {\r\n this._popupRef.dispose();\r\n this._popupComponentRef = null;\r\n }\r\n }\r\n\r\n /** Selects the given date */\r\n select(date: D): void {\r\n const oldValue = this._selected;\r\n this._selected = date;\r\n if (!this._dateAdapter.sameDate(oldValue, this._selected)) {\r\n this._selectedChanged.next(date);\r\n }\r\n }\r\n\r\n /** Emits the selected year in multiyear view */\r\n _selectYear(normalizedYear: D): void {\r\n this.yearSelected.emit(normalizedYear);\r\n }\r\n\r\n /** Emits selected month in year view */\r\n _selectMonth(normalizedMonth: D): void {\r\n this.monthSelected.emit(normalizedMonth);\r\n }\r\n\r\n /**\r\n * Register an input with this datepicker.\r\n *\r\n * @param input The datepicker input to register with this datepicker.\r\n */\r\n _registerInput(input: OuiDatepickerInput): void {\r\n if (this._datepickerInput) {\r\n throw Error(\r\n 'A OuiDatepicker can only be associated with a single input.'\r\n );\r\n }\r\n this._datepickerInput = input;\r\n this._inputSubscription = this._datepickerInput._valueChange.subscribe(\r\n (value: D | null) => (this._selected = value)\r\n );\r\n }\r\n\r\n /** Open the calendar. */\r\n open(): void {\r\n if (this._opened || this.disabled) {\r\n return;\r\n }\r\n if (!this._datepickerInput) {\r\n throw Error(\r\n 'Attempted to open an OuiDatepicker with no associated input.'\r\n );\r\n }\r\n if (this._document) {\r\n this._focusedElementBeforeOpen = this._document.activeElement;\r\n }\r\n\r\n if (this.touchUi) {\r\n this._openAsDialog();\r\n } else {\r\n this._openAsPopup();\r\n }\r\n this._opened = true;\r\n // add input focus here\r\n this._datepickerInput.focus();\r\n this.openedStream.emit();\r\n }\r\n\r\n /** Close the calendar. */\r\n close(): void {\r\n if (!this._opened) {\r\n return;\r\n }\r\n if (this._popupRef && this._popupRef.hasAttached()) {\r\n this._popupRef.detach();\r\n }\r\n if (this._dialogRef) {\r\n this._dialogRef.close();\r\n this._dialogRef = null;\r\n }\r\n if (this._calendarPortal && this._calendarPortal.isAttached) {\r\n this._calendarPortal.detach();\r\n }\r\n\r\n const completeClose = () => {\r\n // The `_opened` could've been reset already if\r\n // we got two events in quick succession.\r\n if (this._opened) {\r\n this._opened = false;\r\n this.closedStream.emit();\r\n this._focusedElementBeforeOpen = null;\r\n this._datepickerInput.blur();\r\n }\r\n };\r\n\r\n if (\r\n this._focusedElementBeforeOpen &&\r\n typeof this._focusedElementBeforeOpen.focus === 'function'\r\n ) {\r\n // Because IE moves focus asynchronously, we can't count on it being restored before we've\r\n // marked the datepicker as closed. If the event fires out of sequence and the element that\r\n // we're refocusing opens the datepicker on focus, the user could be stuck with not being\r\n // able to close the calendar at all. We work around it by making the logic, that marks\r\n // the datepicker as closed, async as well.\r\n this._focusedElementBeforeOpen.focus();\r\n setTimeout(completeClose);\r\n } else {\r\n completeClose();\r\n }\r\n }\r\n\r\n /** Open the calendar as a dialog. */\r\n private _openAsDialog(): void {\r\n // Usually this would be handled by `open` which ensures that we can only have one overlay\r\n // open at a time, however since we reset the variables in async handlers some overlays\r\n // may slip through if the user opens and closes multiple times in quick succession (e.g.\r\n // by holding down the enter key).\r\n if (this._dialogRef) {\r\n this._dialogRef.close();\r\n }\r\n\r\n this._dialogRef = this._dialog.open>(\r\n OuiDatepickerContent,\r\n {\r\n direction: this._dir ? this._dir.value : 'ltr',\r\n viewContainerRef: this._viewContainerRef,\r\n panelClass: 'oui-datepicker-dialog',\r\n }\r\n );\r\n\r\n this._dialogRef.afterClosed().subscribe(() => this.close());\r\n this._dialogRef.componentInstance.datepicker = this;\r\n this._setColor();\r\n }\r\n\r\n /** Open the calendar as a popup. */\r\n private _openAsPopup(): void {\r\n if (!this._calendarPortal) {\r\n this._calendarPortal = new ComponentPortal>(\r\n OuiDatepickerContent,\r\n this._viewContainerRef\r\n );\r\n }\r\n\r\n if (!this._popupRef) {\r\n this._createPopup();\r\n }\r\n\r\n if (!this._popupRef.hasAttached()) {\r\n this._popupComponentRef = this._popupRef.attach(this._calendarPortal);\r\n this._popupComponentRef.instance.datepicker = this;\r\n this._setColor();\r\n\r\n // Update the position once the calendar has rendered.\r\n this._ngZone.onStable\r\n .asObservable()\r\n .pipe(take(1))\r\n .subscribe(() => {\r\n this._popupRef.updatePosition();\r\n });\r\n }\r\n }\r\n\r\n /** Create the popup. */\r\n private _createPopup(): void {\r\n const overlayConfig = new OverlayConfig({\r\n positionStrategy: this._createPopupPositionStrategy(),\r\n hasBackdrop: true,\r\n backdropClass: 'oui-overlay-transparent-backdrop',\r\n direction: this._dir,\r\n scrollStrategy: this._scrollStrategy(),\r\n panelClass: 'oui-datepicker-popup',\r\n });\r\n\r\n this._popupRef = this._overlay.create(overlayConfig);\r\n this._popupRef.overlayElement.setAttribute('role', 'dialog');\r\n\r\n merge(\r\n this._popupRef.backdropClick(),\r\n this._popupRef.detachments(),\r\n this._popupRef.keydownEvents().pipe(\r\n filter(\r\n (event) =>\r\n // Closing on alt + up is only valid when there's an input associated with the datepicker.\r\n event.keyCode === ESCAPE ||\r\n (this._datepickerInput &&\r\n event.altKey &&\r\n event.keyCode === UP_ARROW)\r\n )\r\n )\r\n ).subscribe(() => this.close());\r\n }\r\n\r\n /** Create the popup PositionStrategy. */\r\n private _createPopupPositionStrategy(): PositionStrategy {\r\n return this._overlay\r\n .position()\r\n .flexibleConnectedTo(this._datepickerInput.getConnectedOverlayOrigin())\r\n .withTransformOriginOn('.oui-datepicker-content')\r\n .withFlexibleDimensions(false)\r\n .withViewportMargin(8)\r\n .withLockedPosition()\r\n .withPositions([\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n },\r\n {\r\n originX: 'end',\r\n originY: 'bottom',\r\n overlayX: 'end',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'end',\r\n originY: 'top',\r\n overlayX: 'end',\r\n overlayY: 'bottom',\r\n },\r\n ]);\r\n }\r\n\r\n /**\r\n * @param obj The object to check.\r\n * @returns The given object if it is both a date instance and valid, otherwise null.\r\n */\r\n private _getValidDateOrNull(obj: any): D | null {\r\n return this._dateAdapter.isDateInstance(obj) &&\r\n this._dateAdapter.isValid(obj as any as D)\r\n ? obj\r\n : null;\r\n }\r\n\r\n /** Passes the current theme color along to the calendar overlay. */\r\n private _setColor(): void {\r\n const color = this.color;\r\n if (this._popupComponentRef) {\r\n this._popupComponentRef.instance.color = color;\r\n }\r\n if (this._dialogRef) {\r\n this._dialogRef.componentInstance.color = color;\r\n }\r\n }\r\n}\r\n", "assetsDirs": [], "styleUrlsData": [ { @@ -26488,7 +26565,7 @@ }, { "name": "OuiDatepickerCustomStorybook", - "id": "component-OuiDatepickerCustomStorybook-6df087d8c9d348ec38ff08538f8e33e41f2a1a7288d6a727c2955e792cade68d8483e2a1cbcc3b46fc2b31288ab49914c7e9412d25ce5d9f51d8a751ff8f75ac", + "id": "component-OuiDatepickerCustomStorybook-ee54a56052b533f2afecd75c86b7766455aa487816a793e90aed32c3634b3048e6887c00be3d271dd0c63475c19e24be5d624030ad4aba05a137c4ae8e04bcec", "file": "ui/src/stories/datepicker/datepicker.component.ts", "encapsulation": [], "entryComponents": [], @@ -26825,7 +26902,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import {\r\n Component,\r\n Output,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n} from '@angular/core';\r\nimport { OuiDatepickerInputEvent } from '../../components/datepicker';\r\nimport { OuiDateFormats, OUI_DATE_FORMATS } from '../../components';\r\n\r\nexport const OUI_CUSTOM_DATE_FORMATS: OuiDateFormats = {\r\n parse: {\r\n dateInput: null,\r\n },\r\n display: {\r\n dateInput: {\r\n year: 'numeric',\r\n day: '2-digit',\r\n month: '2-digit',\r\n },\r\n monthYearLabel: { year: 'numeric', month: 'short' },\r\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\r\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\r\n },\r\n};\r\n\r\n@Component({\r\n selector: 'oui-datepicker-storybook',\r\n template: `\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n `,\r\n})\r\nexport class OuiDatepickerStorybook implements OnChanges {\r\n @Input() appearance = 'standard';\r\n @Input() color = 'primary';\r\n @Input() startView = ['month', 'year', 'multi-year'];\r\n @Input() opened = false;\r\n @Input() disabled = false;\r\n @Input() mindate: Date = new Date();\r\n minDate: Date = new Date();\r\n @Input() value: Date = new Date();\r\n _value: Date = new Date();\r\n @Input() maxdate: Date = new Date();\r\n maxDate: Date = new Date();\r\n @Output()\r\n readonly _closed: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _monthSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _opened: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _yearSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _dateChange: EventEmitter = new EventEmitter();\r\n constructor() {}\r\n ngOnChanges() {\r\n this.minDate = new Date(this.mindate);\r\n this.maxDate = new Date(this.maxdate);\r\n this._value = new Date(this.value);\r\n if (this.opened) {\r\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\r\n }\r\n }\r\n\r\n closed(e?: string) {\r\n this._closed.emit(e);\r\n }\r\n monthSelected(e?: string) {\r\n this._monthSelected.emit(e);\r\n }\r\n datepickeropened(e?: string) {\r\n this._opened.emit(e);\r\n }\r\n yearSelected(e?: string) {\r\n this._yearSelected.emit(e);\r\n }\r\n dateChange(e?: string) {\r\n this._dateChange.emit(e);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-datepicker-custom-storybook',\r\n template: `\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n `,\r\n providers: [{ provide: OUI_DATE_FORMATS, useValue: OUI_CUSTOM_DATE_FORMATS }],\r\n})\r\nexport class OuiDatepickerCustomStorybook implements OnChanges {\r\n @Input() appearance = 'standard';\r\n @Input() color = 'primary';\r\n @Input() startView = ['month', 'year', 'multi-year'];\r\n @Input() opened = false;\r\n @Input() disabled = false;\r\n @Input() mindate: Date = new Date();\r\n minDate: Date = new Date();\r\n @Input() value: Date = new Date();\r\n _value: Date = new Date();\r\n @Input() maxdate: Date = new Date();\r\n maxDate: Date = new Date();\r\n @Output()\r\n readonly _closed: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _monthSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _opened: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _yearSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _dateChange: EventEmitter = new EventEmitter();\r\n constructor() {}\r\n ngOnChanges() {\r\n this.minDate = new Date(this.mindate);\r\n this.maxDate = new Date(this.maxdate);\r\n this._value = new Date(this.value);\r\n if (this.opened) {\r\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\r\n }\r\n }\r\n closed(e?: string) {\r\n this._closed.emit(e);\r\n }\r\n monthSelected(e?: string) {\r\n this._monthSelected.emit(e);\r\n }\r\n datepickeropened(e?: string) {\r\n this._opened.emit(e);\r\n }\r\n yearSelected(e?: string) {\r\n this._yearSelected.emit(e);\r\n }\r\n dateChange(e?: string) {\r\n this._dateChange.emit(e);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-daterangepicker-storybook',\r\n template: `\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n `,\r\n})\r\nexport class OuiDaterangepickerStorybook implements OnChanges {\r\n @Input() appearance = 'standard';\r\n @Input() color = 'primary';\r\n @Input() startView = 'primary';\r\n @Input() opened = false;\r\n @Input() disabled = false;\r\n @Input() mindate: Date;\r\n minDate: Date = new Date();\r\n minRangeDate: Date;\r\n @Input() maxdate: Date;\r\n maxRangeDate: Date;\r\n maxDate: Date;\r\n @Output()\r\n readonly _dateChange: EventEmitter<{}> = new EventEmitter<{}>();\r\n constructor() {}\r\n ngOnChanges() {\r\n this.minRangeDate = new Date(this.mindate);\r\n this.maxRangeDate = new Date(this.maxdate);\r\n }\r\n mindateChange(e: OuiDatepickerInputEvent) {\r\n this.minDate = new Date(e.value);\r\n if (this.maxDate) {\r\n this._dateChange.emit({\r\n min: this.minDate,\r\n max: this.maxDate,\r\n });\r\n }\r\n // this._dateChange.emit(e);\r\n }\r\n maxdateChange(e: OuiDatepickerInputEvent) {\r\n this.maxDate = new Date(e.value);\r\n if (this.minDate) {\r\n this._dateChange.emit({\r\n min: this.minDate,\r\n max: this.maxDate,\r\n });\r\n }\r\n // this._dateChange.emit(e);\r\n }\r\n}\r\n", + "sourceCode": "import {\n Component,\n Output,\n EventEmitter,\n Input,\n OnChanges,\n} from '@angular/core';\nimport { OuiDatepickerInputEvent } from '../../components/datepicker';\nimport { OuiDateFormats, OUI_DATE_FORMATS } from '../../components';\n\nexport const OUI_CUSTOM_DATE_FORMATS: OuiDateFormats = {\n parse: {\n dateInput: null,\n },\n display: {\n dateInput: {\n year: 'numeric',\n day: '2-digit',\n month: '2-digit',\n },\n monthYearLabel: { year: 'numeric', month: 'short' },\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\n },\n};\n\n@Component({\n selector: 'oui-datepicker-storybook',\n template: `\n
\n \n \n \n \n \n
\n `,\n})\nexport class OuiDatepickerStorybook implements OnChanges {\n @Input() appearance = 'standard';\n @Input() color = 'primary';\n @Input() startView = ['month', 'year', 'multi-year'];\n @Input() opened = false;\n @Input() disabled = false;\n @Input() mindate: Date = new Date();\n minDate: Date = new Date();\n @Input() value: Date = new Date();\n _value: Date = new Date();\n @Input() maxdate: Date = new Date();\n maxDate: Date = new Date();\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _monthSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n @Output()\n readonly _yearSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _dateChange: EventEmitter = new EventEmitter();\n constructor() {}\n ngOnChanges() {\n this.minDate = new Date(this.mindate);\n this.maxDate = new Date(this.maxdate);\n this._value = new Date(this.value);\n if (this.opened) {\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\n }\n }\n\n closed(e?: string) {\n this._closed.emit(e);\n }\n monthSelected(e?: string) {\n this._monthSelected.emit(e);\n }\n datepickeropened(e?: string) {\n this._opened.emit(e);\n }\n yearSelected(e?: string) {\n this._yearSelected.emit(e);\n }\n dateChange(e?: string) {\n this._dateChange.emit(e);\n }\n}\n\n@Component({\n selector: 'oui-datepicker-custom-storybook',\n template: `\n
\n \n \n \n \n \n
\n `,\n providers: [{ provide: OUI_DATE_FORMATS, useValue: OUI_CUSTOM_DATE_FORMATS }],\n})\nexport class OuiDatepickerCustomStorybook implements OnChanges {\n @Input() appearance = 'standard';\n @Input() color = 'primary';\n @Input() startView = ['month', 'year', 'multi-year'];\n @Input() opened = false;\n @Input() disabled = false;\n @Input() mindate: Date = new Date();\n minDate: Date = new Date();\n @Input() value: Date = new Date();\n _value: Date = new Date();\n @Input() maxdate: Date = new Date();\n maxDate: Date = new Date();\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _monthSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n @Output()\n readonly _yearSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _dateChange: EventEmitter = new EventEmitter();\n constructor() {}\n ngOnChanges() {\n this.minDate = new Date(this.mindate);\n this.maxDate = new Date(this.maxdate);\n this._value = new Date(this.value);\n if (this.opened) {\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\n }\n }\n closed(e?: string) {\n this._closed.emit(e);\n }\n monthSelected(e?: string) {\n this._monthSelected.emit(e);\n }\n datepickeropened(e?: string) {\n this._opened.emit(e);\n }\n yearSelected(e?: string) {\n this._yearSelected.emit(e);\n }\n dateChange(e?: string) {\n this._dateChange.emit(e);\n }\n}\n\n@Component({\n selector: 'oui-daterangepicker-storybook',\n template: `\n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n `,\n})\nexport class OuiDaterangepickerStorybook implements OnChanges {\n @Input() appearance = 'standard';\n @Input() color = 'primary';\n @Input() startView = 'primary';\n @Input() opened = false;\n @Input() disabled = false;\n @Input() mindate: Date;\n minDate: Date = new Date();\n minRangeDate: Date;\n @Input() maxdate: Date;\n maxRangeDate: Date;\n maxDate: Date;\n @Output()\n readonly _dateChange: EventEmitter<{}> = new EventEmitter<{}>();\n constructor() {}\n ngOnChanges() {\n this.minRangeDate = new Date(this.mindate);\n this.maxRangeDate = new Date(this.maxdate);\n }\n mindateChange(e: OuiDatepickerInputEvent) {\n this.minDate = new Date(e.value);\n if (this.maxDate) {\n this._dateChange.emit({\n min: this.minDate,\n max: this.maxDate,\n });\n }\n // this._dateChange.emit(e);\n }\n maxdateChange(e: OuiDatepickerInputEvent) {\n this.maxDate = new Date(e.value);\n if (this.minDate) {\n this._dateChange.emit({\n min: this.minDate,\n max: this.maxDate,\n });\n }\n // this._dateChange.emit(e);\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -26844,7 +26921,7 @@ }, { "name": "OuiDatepickerStorybook", - "id": "component-OuiDatepickerStorybook-6df087d8c9d348ec38ff08538f8e33e41f2a1a7288d6a727c2955e792cade68d8483e2a1cbcc3b46fc2b31288ab49914c7e9412d25ce5d9f51d8a751ff8f75ac", + "id": "component-OuiDatepickerStorybook-ee54a56052b533f2afecd75c86b7766455aa487816a793e90aed32c3634b3048e6887c00be3d271dd0c63475c19e24be5d624030ad4aba05a137c4ae8e04bcec", "file": "ui/src/stories/datepicker/datepicker.component.ts", "encapsulation": [], "entryComponents": [], @@ -27177,7 +27254,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import {\r\n Component,\r\n Output,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n} from '@angular/core';\r\nimport { OuiDatepickerInputEvent } from '../../components/datepicker';\r\nimport { OuiDateFormats, OUI_DATE_FORMATS } from '../../components';\r\n\r\nexport const OUI_CUSTOM_DATE_FORMATS: OuiDateFormats = {\r\n parse: {\r\n dateInput: null,\r\n },\r\n display: {\r\n dateInput: {\r\n year: 'numeric',\r\n day: '2-digit',\r\n month: '2-digit',\r\n },\r\n monthYearLabel: { year: 'numeric', month: 'short' },\r\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\r\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\r\n },\r\n};\r\n\r\n@Component({\r\n selector: 'oui-datepicker-storybook',\r\n template: `\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n `,\r\n})\r\nexport class OuiDatepickerStorybook implements OnChanges {\r\n @Input() appearance = 'standard';\r\n @Input() color = 'primary';\r\n @Input() startView = ['month', 'year', 'multi-year'];\r\n @Input() opened = false;\r\n @Input() disabled = false;\r\n @Input() mindate: Date = new Date();\r\n minDate: Date = new Date();\r\n @Input() value: Date = new Date();\r\n _value: Date = new Date();\r\n @Input() maxdate: Date = new Date();\r\n maxDate: Date = new Date();\r\n @Output()\r\n readonly _closed: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _monthSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _opened: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _yearSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _dateChange: EventEmitter = new EventEmitter();\r\n constructor() {}\r\n ngOnChanges() {\r\n this.minDate = new Date(this.mindate);\r\n this.maxDate = new Date(this.maxdate);\r\n this._value = new Date(this.value);\r\n if (this.opened) {\r\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\r\n }\r\n }\r\n\r\n closed(e?: string) {\r\n this._closed.emit(e);\r\n }\r\n monthSelected(e?: string) {\r\n this._monthSelected.emit(e);\r\n }\r\n datepickeropened(e?: string) {\r\n this._opened.emit(e);\r\n }\r\n yearSelected(e?: string) {\r\n this._yearSelected.emit(e);\r\n }\r\n dateChange(e?: string) {\r\n this._dateChange.emit(e);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-datepicker-custom-storybook',\r\n template: `\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n `,\r\n providers: [{ provide: OUI_DATE_FORMATS, useValue: OUI_CUSTOM_DATE_FORMATS }],\r\n})\r\nexport class OuiDatepickerCustomStorybook implements OnChanges {\r\n @Input() appearance = 'standard';\r\n @Input() color = 'primary';\r\n @Input() startView = ['month', 'year', 'multi-year'];\r\n @Input() opened = false;\r\n @Input() disabled = false;\r\n @Input() mindate: Date = new Date();\r\n minDate: Date = new Date();\r\n @Input() value: Date = new Date();\r\n _value: Date = new Date();\r\n @Input() maxdate: Date = new Date();\r\n maxDate: Date = new Date();\r\n @Output()\r\n readonly _closed: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _monthSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _opened: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _yearSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _dateChange: EventEmitter = new EventEmitter();\r\n constructor() {}\r\n ngOnChanges() {\r\n this.minDate = new Date(this.mindate);\r\n this.maxDate = new Date(this.maxdate);\r\n this._value = new Date(this.value);\r\n if (this.opened) {\r\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\r\n }\r\n }\r\n closed(e?: string) {\r\n this._closed.emit(e);\r\n }\r\n monthSelected(e?: string) {\r\n this._monthSelected.emit(e);\r\n }\r\n datepickeropened(e?: string) {\r\n this._opened.emit(e);\r\n }\r\n yearSelected(e?: string) {\r\n this._yearSelected.emit(e);\r\n }\r\n dateChange(e?: string) {\r\n this._dateChange.emit(e);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-daterangepicker-storybook',\r\n template: `\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n `,\r\n})\r\nexport class OuiDaterangepickerStorybook implements OnChanges {\r\n @Input() appearance = 'standard';\r\n @Input() color = 'primary';\r\n @Input() startView = 'primary';\r\n @Input() opened = false;\r\n @Input() disabled = false;\r\n @Input() mindate: Date;\r\n minDate: Date = new Date();\r\n minRangeDate: Date;\r\n @Input() maxdate: Date;\r\n maxRangeDate: Date;\r\n maxDate: Date;\r\n @Output()\r\n readonly _dateChange: EventEmitter<{}> = new EventEmitter<{}>();\r\n constructor() {}\r\n ngOnChanges() {\r\n this.minRangeDate = new Date(this.mindate);\r\n this.maxRangeDate = new Date(this.maxdate);\r\n }\r\n mindateChange(e: OuiDatepickerInputEvent) {\r\n this.minDate = new Date(e.value);\r\n if (this.maxDate) {\r\n this._dateChange.emit({\r\n min: this.minDate,\r\n max: this.maxDate,\r\n });\r\n }\r\n // this._dateChange.emit(e);\r\n }\r\n maxdateChange(e: OuiDatepickerInputEvent) {\r\n this.maxDate = new Date(e.value);\r\n if (this.minDate) {\r\n this._dateChange.emit({\r\n min: this.minDate,\r\n max: this.maxDate,\r\n });\r\n }\r\n // this._dateChange.emit(e);\r\n }\r\n}\r\n", + "sourceCode": "import {\n Component,\n Output,\n EventEmitter,\n Input,\n OnChanges,\n} from '@angular/core';\nimport { OuiDatepickerInputEvent } from '../../components/datepicker';\nimport { OuiDateFormats, OUI_DATE_FORMATS } from '../../components';\n\nexport const OUI_CUSTOM_DATE_FORMATS: OuiDateFormats = {\n parse: {\n dateInput: null,\n },\n display: {\n dateInput: {\n year: 'numeric',\n day: '2-digit',\n month: '2-digit',\n },\n monthYearLabel: { year: 'numeric', month: 'short' },\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\n },\n};\n\n@Component({\n selector: 'oui-datepicker-storybook',\n template: `\n
\n \n \n \n \n \n
\n `,\n})\nexport class OuiDatepickerStorybook implements OnChanges {\n @Input() appearance = 'standard';\n @Input() color = 'primary';\n @Input() startView = ['month', 'year', 'multi-year'];\n @Input() opened = false;\n @Input() disabled = false;\n @Input() mindate: Date = new Date();\n minDate: Date = new Date();\n @Input() value: Date = new Date();\n _value: Date = new Date();\n @Input() maxdate: Date = new Date();\n maxDate: Date = new Date();\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _monthSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n @Output()\n readonly _yearSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _dateChange: EventEmitter = new EventEmitter();\n constructor() {}\n ngOnChanges() {\n this.minDate = new Date(this.mindate);\n this.maxDate = new Date(this.maxdate);\n this._value = new Date(this.value);\n if (this.opened) {\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\n }\n }\n\n closed(e?: string) {\n this._closed.emit(e);\n }\n monthSelected(e?: string) {\n this._monthSelected.emit(e);\n }\n datepickeropened(e?: string) {\n this._opened.emit(e);\n }\n yearSelected(e?: string) {\n this._yearSelected.emit(e);\n }\n dateChange(e?: string) {\n this._dateChange.emit(e);\n }\n}\n\n@Component({\n selector: 'oui-datepicker-custom-storybook',\n template: `\n
\n \n \n \n \n \n
\n `,\n providers: [{ provide: OUI_DATE_FORMATS, useValue: OUI_CUSTOM_DATE_FORMATS }],\n})\nexport class OuiDatepickerCustomStorybook implements OnChanges {\n @Input() appearance = 'standard';\n @Input() color = 'primary';\n @Input() startView = ['month', 'year', 'multi-year'];\n @Input() opened = false;\n @Input() disabled = false;\n @Input() mindate: Date = new Date();\n minDate: Date = new Date();\n @Input() value: Date = new Date();\n _value: Date = new Date();\n @Input() maxdate: Date = new Date();\n maxDate: Date = new Date();\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _monthSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n @Output()\n readonly _yearSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _dateChange: EventEmitter = new EventEmitter();\n constructor() {}\n ngOnChanges() {\n this.minDate = new Date(this.mindate);\n this.maxDate = new Date(this.maxdate);\n this._value = new Date(this.value);\n if (this.opened) {\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\n }\n }\n closed(e?: string) {\n this._closed.emit(e);\n }\n monthSelected(e?: string) {\n this._monthSelected.emit(e);\n }\n datepickeropened(e?: string) {\n this._opened.emit(e);\n }\n yearSelected(e?: string) {\n this._yearSelected.emit(e);\n }\n dateChange(e?: string) {\n this._dateChange.emit(e);\n }\n}\n\n@Component({\n selector: 'oui-daterangepicker-storybook',\n template: `\n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n `,\n})\nexport class OuiDaterangepickerStorybook implements OnChanges {\n @Input() appearance = 'standard';\n @Input() color = 'primary';\n @Input() startView = 'primary';\n @Input() opened = false;\n @Input() disabled = false;\n @Input() mindate: Date;\n minDate: Date = new Date();\n minRangeDate: Date;\n @Input() maxdate: Date;\n maxRangeDate: Date;\n maxDate: Date;\n @Output()\n readonly _dateChange: EventEmitter<{}> = new EventEmitter<{}>();\n constructor() {}\n ngOnChanges() {\n this.minRangeDate = new Date(this.mindate);\n this.maxRangeDate = new Date(this.maxdate);\n }\n mindateChange(e: OuiDatepickerInputEvent) {\n this.minDate = new Date(e.value);\n if (this.maxDate) {\n this._dateChange.emit({\n min: this.minDate,\n max: this.maxDate,\n });\n }\n // this._dateChange.emit(e);\n }\n maxdateChange(e: OuiDatepickerInputEvent) {\n this.maxDate = new Date(e.value);\n if (this.minDate) {\n this._dateChange.emit({\n min: this.minDate,\n max: this.maxDate,\n });\n }\n // this._dateChange.emit(e);\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -27543,7 +27620,7 @@ }, { "name": "OuiDaterangepickerStorybook", - "id": "component-OuiDaterangepickerStorybook-6df087d8c9d348ec38ff08538f8e33e41f2a1a7288d6a727c2955e792cade68d8483e2a1cbcc3b46fc2b31288ab49914c7e9412d25ce5d9f51d8a751ff8f75ac", + "id": "component-OuiDaterangepickerStorybook-ee54a56052b533f2afecd75c86b7766455aa487816a793e90aed32c3634b3048e6887c00be3d271dd0c63475c19e24be5d624030ad4aba05a137c4ae8e04bcec", "file": "ui/src/stories/datepicker/datepicker.component.ts", "encapsulation": [], "entryComponents": [], @@ -27746,7 +27823,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import {\r\n Component,\r\n Output,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n} from '@angular/core';\r\nimport { OuiDatepickerInputEvent } from '../../components/datepicker';\r\nimport { OuiDateFormats, OUI_DATE_FORMATS } from '../../components';\r\n\r\nexport const OUI_CUSTOM_DATE_FORMATS: OuiDateFormats = {\r\n parse: {\r\n dateInput: null,\r\n },\r\n display: {\r\n dateInput: {\r\n year: 'numeric',\r\n day: '2-digit',\r\n month: '2-digit',\r\n },\r\n monthYearLabel: { year: 'numeric', month: 'short' },\r\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\r\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\r\n },\r\n};\r\n\r\n@Component({\r\n selector: 'oui-datepicker-storybook',\r\n template: `\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n `,\r\n})\r\nexport class OuiDatepickerStorybook implements OnChanges {\r\n @Input() appearance = 'standard';\r\n @Input() color = 'primary';\r\n @Input() startView = ['month', 'year', 'multi-year'];\r\n @Input() opened = false;\r\n @Input() disabled = false;\r\n @Input() mindate: Date = new Date();\r\n minDate: Date = new Date();\r\n @Input() value: Date = new Date();\r\n _value: Date = new Date();\r\n @Input() maxdate: Date = new Date();\r\n maxDate: Date = new Date();\r\n @Output()\r\n readonly _closed: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _monthSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _opened: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _yearSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _dateChange: EventEmitter = new EventEmitter();\r\n constructor() {}\r\n ngOnChanges() {\r\n this.minDate = new Date(this.mindate);\r\n this.maxDate = new Date(this.maxdate);\r\n this._value = new Date(this.value);\r\n if (this.opened) {\r\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\r\n }\r\n }\r\n\r\n closed(e?: string) {\r\n this._closed.emit(e);\r\n }\r\n monthSelected(e?: string) {\r\n this._monthSelected.emit(e);\r\n }\r\n datepickeropened(e?: string) {\r\n this._opened.emit(e);\r\n }\r\n yearSelected(e?: string) {\r\n this._yearSelected.emit(e);\r\n }\r\n dateChange(e?: string) {\r\n this._dateChange.emit(e);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-datepicker-custom-storybook',\r\n template: `\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n `,\r\n providers: [{ provide: OUI_DATE_FORMATS, useValue: OUI_CUSTOM_DATE_FORMATS }],\r\n})\r\nexport class OuiDatepickerCustomStorybook implements OnChanges {\r\n @Input() appearance = 'standard';\r\n @Input() color = 'primary';\r\n @Input() startView = ['month', 'year', 'multi-year'];\r\n @Input() opened = false;\r\n @Input() disabled = false;\r\n @Input() mindate: Date = new Date();\r\n minDate: Date = new Date();\r\n @Input() value: Date = new Date();\r\n _value: Date = new Date();\r\n @Input() maxdate: Date = new Date();\r\n maxDate: Date = new Date();\r\n @Output()\r\n readonly _closed: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _monthSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _opened: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _yearSelected: EventEmitter = new EventEmitter();\r\n @Output()\r\n readonly _dateChange: EventEmitter = new EventEmitter();\r\n constructor() {}\r\n ngOnChanges() {\r\n this.minDate = new Date(this.mindate);\r\n this.maxDate = new Date(this.maxdate);\r\n this._value = new Date(this.value);\r\n if (this.opened) {\r\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\r\n }\r\n }\r\n closed(e?: string) {\r\n this._closed.emit(e);\r\n }\r\n monthSelected(e?: string) {\r\n this._monthSelected.emit(e);\r\n }\r\n datepickeropened(e?: string) {\r\n this._opened.emit(e);\r\n }\r\n yearSelected(e?: string) {\r\n this._yearSelected.emit(e);\r\n }\r\n dateChange(e?: string) {\r\n this._dateChange.emit(e);\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'oui-daterangepicker-storybook',\r\n template: `\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n `,\r\n})\r\nexport class OuiDaterangepickerStorybook implements OnChanges {\r\n @Input() appearance = 'standard';\r\n @Input() color = 'primary';\r\n @Input() startView = 'primary';\r\n @Input() opened = false;\r\n @Input() disabled = false;\r\n @Input() mindate: Date;\r\n minDate: Date = new Date();\r\n minRangeDate: Date;\r\n @Input() maxdate: Date;\r\n maxRangeDate: Date;\r\n maxDate: Date;\r\n @Output()\r\n readonly _dateChange: EventEmitter<{}> = new EventEmitter<{}>();\r\n constructor() {}\r\n ngOnChanges() {\r\n this.minRangeDate = new Date(this.mindate);\r\n this.maxRangeDate = new Date(this.maxdate);\r\n }\r\n mindateChange(e: OuiDatepickerInputEvent) {\r\n this.minDate = new Date(e.value);\r\n if (this.maxDate) {\r\n this._dateChange.emit({\r\n min: this.minDate,\r\n max: this.maxDate,\r\n });\r\n }\r\n // this._dateChange.emit(e);\r\n }\r\n maxdateChange(e: OuiDatepickerInputEvent) {\r\n this.maxDate = new Date(e.value);\r\n if (this.minDate) {\r\n this._dateChange.emit({\r\n min: this.minDate,\r\n max: this.maxDate,\r\n });\r\n }\r\n // this._dateChange.emit(e);\r\n }\r\n}\r\n", + "sourceCode": "import {\n Component,\n Output,\n EventEmitter,\n Input,\n OnChanges,\n} from '@angular/core';\nimport { OuiDatepickerInputEvent } from '../../components/datepicker';\nimport { OuiDateFormats, OUI_DATE_FORMATS } from '../../components';\n\nexport const OUI_CUSTOM_DATE_FORMATS: OuiDateFormats = {\n parse: {\n dateInput: null,\n },\n display: {\n dateInput: {\n year: 'numeric',\n day: '2-digit',\n month: '2-digit',\n },\n monthYearLabel: { year: 'numeric', month: 'short' },\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\n },\n};\n\n@Component({\n selector: 'oui-datepicker-storybook',\n template: `\n
\n \n \n \n \n \n
\n `,\n})\nexport class OuiDatepickerStorybook implements OnChanges {\n @Input() appearance = 'standard';\n @Input() color = 'primary';\n @Input() startView = ['month', 'year', 'multi-year'];\n @Input() opened = false;\n @Input() disabled = false;\n @Input() mindate: Date = new Date();\n minDate: Date = new Date();\n @Input() value: Date = new Date();\n _value: Date = new Date();\n @Input() maxdate: Date = new Date();\n maxDate: Date = new Date();\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _monthSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n @Output()\n readonly _yearSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _dateChange: EventEmitter = new EventEmitter();\n constructor() {}\n ngOnChanges() {\n this.minDate = new Date(this.mindate);\n this.maxDate = new Date(this.maxdate);\n this._value = new Date(this.value);\n if (this.opened) {\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\n }\n }\n\n closed(e?: string) {\n this._closed.emit(e);\n }\n monthSelected(e?: string) {\n this._monthSelected.emit(e);\n }\n datepickeropened(e?: string) {\n this._opened.emit(e);\n }\n yearSelected(e?: string) {\n this._yearSelected.emit(e);\n }\n dateChange(e?: string) {\n this._dateChange.emit(e);\n }\n}\n\n@Component({\n selector: 'oui-datepicker-custom-storybook',\n template: `\n
\n \n \n \n \n \n
\n `,\n providers: [{ provide: OUI_DATE_FORMATS, useValue: OUI_CUSTOM_DATE_FORMATS }],\n})\nexport class OuiDatepickerCustomStorybook implements OnChanges {\n @Input() appearance = 'standard';\n @Input() color = 'primary';\n @Input() startView = ['month', 'year', 'multi-year'];\n @Input() opened = false;\n @Input() disabled = false;\n @Input() mindate: Date = new Date();\n minDate: Date = new Date();\n @Input() value: Date = new Date();\n _value: Date = new Date();\n @Input() maxdate: Date = new Date();\n maxDate: Date = new Date();\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _monthSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n @Output()\n readonly _yearSelected: EventEmitter = new EventEmitter();\n @Output()\n readonly _dateChange: EventEmitter = new EventEmitter();\n constructor() {}\n ngOnChanges() {\n this.minDate = new Date(this.mindate);\n this.maxDate = new Date(this.maxdate);\n this._value = new Date(this.value);\n if (this.opened) {\n (document.querySelector('.oui-datepicker-toggle') as HTMLElement).focus();\n }\n }\n closed(e?: string) {\n this._closed.emit(e);\n }\n monthSelected(e?: string) {\n this._monthSelected.emit(e);\n }\n datepickeropened(e?: string) {\n this._opened.emit(e);\n }\n yearSelected(e?: string) {\n this._yearSelected.emit(e);\n }\n dateChange(e?: string) {\n this._dateChange.emit(e);\n }\n}\n\n@Component({\n selector: 'oui-daterangepicker-storybook',\n template: `\n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n `,\n})\nexport class OuiDaterangepickerStorybook implements OnChanges {\n @Input() appearance = 'standard';\n @Input() color = 'primary';\n @Input() startView = 'primary';\n @Input() opened = false;\n @Input() disabled = false;\n @Input() mindate: Date;\n minDate: Date = new Date();\n minRangeDate: Date;\n @Input() maxdate: Date;\n maxRangeDate: Date;\n maxDate: Date;\n @Output()\n readonly _dateChange: EventEmitter<{}> = new EventEmitter<{}>();\n constructor() {}\n ngOnChanges() {\n this.minRangeDate = new Date(this.mindate);\n this.maxRangeDate = new Date(this.maxdate);\n }\n mindateChange(e: OuiDatepickerInputEvent) {\n this.minDate = new Date(e.value);\n if (this.maxDate) {\n this._dateChange.emit({\n min: this.minDate,\n max: this.maxDate,\n });\n }\n // this._dateChange.emit(e);\n }\n maxdateChange(e: OuiDatepickerInputEvent) {\n this.maxDate = new Date(e.value);\n if (this.minDate) {\n this._dateChange.emit({\n min: this.minDate,\n max: this.maxDate,\n });\n }\n // this._dateChange.emit(e);\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -27765,7 +27842,7 @@ }, { "name": "OuiDialogContainer", - "id": "component-OuiDialogContainer-812b6d5b3f5aebad2798a2e317e30788275e165d75f464b80ee5aff6d7b89d0c8037734c23489f5b72c88bd1fcbd75749f731547beb8bc8c4e94536107df6212", + "id": "component-OuiDialogContainer-77e46f21436d791c9cf9bee4d7dffc6745619d8c238f0275a2e962d22b30543929874e7314718f6ff4fca0b2f09b3d909367db710f71178ec95d2f7e37fdef28", "file": "ui/src/components/dialog/dialog-container.ts", "changeDetection": "ChangeDetectionStrategy.Default", "encapsulation": [ @@ -27888,7 +27965,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 167, + "line": 180, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nSetting up the focus trap and saves a reference to the element that was focused before the dialog was open.\n", @@ -27916,7 +27993,7 @@ "optional": false, "returnType": "any", "typeParameters": [], - "line": 187, + "line": 200, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nOnly return when there is focus inside the dialog", @@ -27925,6 +28002,21 @@ 123 ] }, + { + "name": "_removeFocusTrap", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 210, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nRemoves the focus trap from the dialog.\nThis method is called to clean up resources and ensure the dialog no longer traps focus.\n", + "description": "

Removes the focus trap from the dialog.\nThis method is called to clean up resources and ensure the dialog no longer traps focus.

\n", + "modifierKind": [ + 123 + ] + }, { "name": "_restoreFocus", "args": [], @@ -27940,6 +28032,54 @@ 125 ] }, + { + "name": "_toggleFocus", + "args": [ + { + "name": "addFocus", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 169, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\n\nDynamically adds or removes focus from the dialog container.\n\n", + "description": "

Dynamically adds or removes focus from the dialog container.

\n", + "modifierKind": [ + 125 + ], + "jsdoctags": [ + { + "name": { + "pos": 5394, + "end": 5402, + "flags": 16842752, + "modifierFlagsCache": 0, + "transformFlags": 0, + "kind": 80, + "escapedText": "addFocus" + }, + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "pos": 5388, + "end": 5393, + "flags": 16842752, + "modifierFlagsCache": 0, + "transformFlags": 0, + "kind": 80, + "escapedText": "param" + }, + "comment": "

Whether to add focus (true) or remove focus (false).

\n" + } + ] + }, { "name": "_trapFocus", "args": [], @@ -28069,11 +28209,11 @@ "description": "

Internal component that wraps user-provided dialog content.

\n", "rawdescription": "\n\nInternal component that wraps user-provided dialog content.\n\n", "type": "component", - "sourceCode": "import {\n Component,\n ComponentRef,\n EmbeddedViewRef,\n ViewChild,\n ViewEncapsulation,\n ChangeDetectionStrategy,\n ElementRef,\n OnInit,\n Inject,\n Optional,\n} from '@angular/core';\nimport {\n BasePortalOutlet,\n ComponentPortal,\n CdkPortalOutlet,\n TemplatePortal,\n} from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport { OuiDialogConfig } from './dialog-config';\nimport { FocusTrap, ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';\n\n/**\n * Throws an exception for the case when a ComponentPortal is\n * attached to a DomPortalOutlet without an origin.\n *\n * @docs-private\n */\nexport function throwOuiDialogContentAlreadyAttachedError() {\n throw Error(\n 'Attempting to attach dialog content after content is already attached'\n );\n}\n\n/**\n * Internal component that wraps user-provided dialog content.\n *\n * @docs-private\n */\n@Component({\n selector: 'oui-dialog-container',\n templateUrl: 'dialog-container.html',\n styleUrls: ['dialog.scss'],\n encapsulation: ViewEncapsulation.None,\n // Using OnPush for dialogs caused some G3 sync issues. Disabled until we can track them down.\n // eslint-disable-next-line\n changeDetection: ChangeDetectionStrategy.Default,\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-container',\n tabindex: '-1',\n 'aria-modal': 'true',\n '[attr.id]': '_id',\n '[attr.role]': '_config.role',\n '[attr.aria-labelledby]': '_config.ariaLabel ? null : _ariaLabelledBy',\n '[attr.aria-label]': '_config.ariaLabel',\n '[attr.aria-describedby]': '_config.ariaDescribedBy || null',\n },\n})\nexport class OuiDialogContainer extends BasePortalOutlet implements OnInit {\n /** The portal outlet inside of this container into which the dialog content will be loaded. */\n @ViewChild(CdkPortalOutlet, { static: true })\n _portalOutlet: CdkPortalOutlet;\n\n /** The class that traps and manages focus within the dialog. */\n private _focusTrap: FocusTrap;\n\n /** Element that was focused before the dialog was opened. Save this to restore upon close. */\n private _elementFocusedBeforeDialogWasOpened: HTMLElement = null;\n\n /** ID of the element that should be considered as the dialog's label. */\n _ariaLabelledBy: string | null = null;\n\n /** ID for the container DOM element. */\n _id: string;\n\n constructor(\n private _focusTrapFactory: ConfigurableFocusTrapFactory,\n public _config: OuiDialogConfig,\n public elementRef: ElementRef,\n @Optional() @Inject(DOCUMENT) private _document: Document\n ) {\n super();\n }\n\n ngOnInit() {\n this._addMarginForDefaultScroll();\n }\n private _addMarginForDefaultScroll() {\n if (!this._config.scrollStrategy) {\n this.elementRef.nativeElement.style.marginTop = '40px';\n this.elementRef.nativeElement.style.marginBottom = '40px';\n }\n }\n /**\n * Attach a ComponentPortal as content to this dialog container.\n *\n * @param portal Portal to be attached as the dialog content.\n */\n attachComponentPortal(portal: ComponentPortal): ComponentRef {\n if (this._portalOutlet.hasAttached()) {\n throwOuiDialogContentAlreadyAttachedError();\n }\n this._addFocusTrap();\n return this._portalOutlet.attachComponentPortal(portal);\n }\n\n /**\n * Attach a TemplatePortal as content to this dialog container.\n *\n * @param portal Portal to be attached as the dialog content.\n */\n attachTemplatePortal(portal: TemplatePortal): EmbeddedViewRef {\n if (this._portalOutlet.hasAttached()) {\n throwOuiDialogContentAlreadyAttachedError();\n }\n this._addFocusTrap();\n return this._portalOutlet.attachTemplatePortal(portal);\n }\n\n /** Moves the focus inside the focus trap. */\n public _trapFocus() {\n // If we were to attempt to focus immediately, then the content of the dialog would not yet be\n // ready in instances where change detection has to run first. To deal with this, we simply\n // wait for the microtask queue to be empty.\n if (this._config.autoFocus) {\n this._focusTrap.focusInitialElementWhenReady();\n } else if (!this._containsFocus()) {\n // Otherwise ensure that focus is on the dialog container. It's possible that a different\n // component tried to move focus while the open animation was running.\n // if the focus isn't inside the dialog already, because it's possible that the consumer\n // turned off `autoFocus` in order to move focus themselves.\n this.elementRef.nativeElement.focus();\n }\n }\n\n /** Restores focus to the element that was focused before the dialog opened. */\n public _restoreFocus() {\n const toFocus = this._elementFocusedBeforeDialogWasOpened;\n\n // We need the extra check, because IE can set the `activeElement` to null in some cases.\n if (\n this._config.restoreFocus &&\n toFocus &&\n typeof toFocus.focus === 'function'\n ) {\n const activeElement = this._document.activeElement as HTMLElement;\n const element = this.elementRef.nativeElement;\n if (\n !activeElement ||\n activeElement === this._document.body ||\n activeElement === element ||\n element.contains(activeElement)\n ) {\n toFocus.focus();\n }\n }\n\n if (this._focusTrap) {\n this._focusTrap.destroy();\n }\n }\n\n /**\n * Setting up the focus trap and saves a reference to the element that was focused before the dialog was open.\n */\n private _addFocusTrap() {\n if (!this._focusTrap) {\n this._focusTrap = this._focusTrapFactory.create(\n this.elementRef.nativeElement\n );\n }\n if (this._document) {\n this._elementFocusedBeforeDialogWasOpened = this._document\n .activeElement as HTMLElement;\n // Note that there is no focus method when rendering on the server.\n if (this.elementRef.nativeElement.focus) {\n // Move focus onto the dialog immediately in order to prevent the user from accidentally\n // opening multiple dialogs at the same time. Needs to be async, because the element\n // may not be focusable immediately.\n Promise.resolve().then(() => this.elementRef.nativeElement.focus());\n }\n }\n }\n\n /** Only return when there is focus inside the dialog */\n private _containsFocus() {\n const element = this.elementRef.nativeElement as HTMLElement;\n const activeElement = this._document.activeElement;\n return element === activeElement || element.contains(activeElement);\n }\n}\n", + "sourceCode": "import {\n Component,\n ComponentRef,\n EmbeddedViewRef,\n ViewChild,\n ViewEncapsulation,\n ChangeDetectionStrategy,\n ElementRef,\n OnInit,\n Inject,\n Optional,\n} from '@angular/core';\nimport {\n BasePortalOutlet,\n ComponentPortal,\n CdkPortalOutlet,\n TemplatePortal,\n} from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport { OuiDialogConfig } from './dialog-config';\nimport { FocusTrap, ConfigurableFocusTrapFactory } from '@angular/cdk/a11y';\n\n/**\n * Throws an exception for the case when a ComponentPortal is\n * attached to a DomPortalOutlet without an origin.\n *\n * @docs-private\n */\nexport function throwOuiDialogContentAlreadyAttachedError() {\n throw Error(\n 'Attempting to attach dialog content after content is already attached'\n );\n}\n\n/**\n * Internal component that wraps user-provided dialog content.\n *\n * @docs-private\n */\n@Component({\n selector: 'oui-dialog-container',\n templateUrl: 'dialog-container.html',\n styleUrls: ['dialog.scss'],\n encapsulation: ViewEncapsulation.None,\n // Using OnPush for dialogs caused some G3 sync issues. Disabled until we can track them down.\n // eslint-disable-next-line\n changeDetection: ChangeDetectionStrategy.Default,\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-container',\n tabindex: '-1',\n 'aria-modal': 'true',\n '[attr.id]': '_id',\n '[attr.role]': '_config.role',\n '[attr.aria-labelledby]': '_config.ariaLabel ? null : _ariaLabelledBy',\n '[attr.aria-label]': '_config.ariaLabel',\n '[attr.aria-describedby]': '_config.ariaDescribedBy || null',\n },\n})\nexport class OuiDialogContainer extends BasePortalOutlet implements OnInit {\n /** The portal outlet inside of this container into which the dialog content will be loaded. */\n @ViewChild(CdkPortalOutlet, { static: true })\n _portalOutlet: CdkPortalOutlet;\n\n /** The class that traps and manages focus within the dialog. */\n private _focusTrap: FocusTrap;\n\n /** Element that was focused before the dialog was opened. Save this to restore upon close. */\n private _elementFocusedBeforeDialogWasOpened: HTMLElement = null;\n\n /** ID of the element that should be considered as the dialog's label. */\n _ariaLabelledBy: string | null = null;\n\n /** ID for the container DOM element. */\n _id: string;\n\n constructor(\n private _focusTrapFactory: ConfigurableFocusTrapFactory,\n public _config: OuiDialogConfig,\n public elementRef: ElementRef,\n @Optional() @Inject(DOCUMENT) private _document: Document\n ) {\n super();\n }\n\n ngOnInit() {\n this._addMarginForDefaultScroll();\n }\n private _addMarginForDefaultScroll() {\n if (!this._config.scrollStrategy) {\n this.elementRef.nativeElement.style.marginTop = '40px';\n this.elementRef.nativeElement.style.marginBottom = '40px';\n }\n }\n /**\n * Attach a ComponentPortal as content to this dialog container.\n *\n * @param portal Portal to be attached as the dialog content.\n */\n attachComponentPortal(portal: ComponentPortal): ComponentRef {\n if (this._portalOutlet.hasAttached()) {\n throwOuiDialogContentAlreadyAttachedError();\n }\n this._addFocusTrap();\n return this._portalOutlet.attachComponentPortal(portal);\n }\n\n /**\n * Attach a TemplatePortal as content to this dialog container.\n *\n * @param portal Portal to be attached as the dialog content.\n */\n attachTemplatePortal(portal: TemplatePortal): EmbeddedViewRef {\n if (this._portalOutlet.hasAttached()) {\n throwOuiDialogContentAlreadyAttachedError();\n }\n this._addFocusTrap();\n return this._portalOutlet.attachTemplatePortal(portal);\n }\n\n /** Moves the focus inside the focus trap. */\n public _trapFocus() {\n // If we were to attempt to focus immediately, then the content of the dialog would not yet be\n // ready in instances where change detection has to run first. To deal with this, we simply\n // wait for the microtask queue to be empty.\n if (this._config.autoFocus) {\n this._focusTrap.focusInitialElementWhenReady();\n } else if (!this._containsFocus()) {\n // Otherwise ensure that focus is on the dialog container. It's possible that a different\n // component tried to move focus while the open animation was running.\n // if the focus isn't inside the dialog already, because it's possible that the consumer\n // turned off `autoFocus` in order to move focus themselves.\n this.elementRef.nativeElement.focus();\n }\n }\n\n /** Restores focus to the element that was focused before the dialog opened. */\n public _restoreFocus() {\n const toFocus = this._elementFocusedBeforeDialogWasOpened;\n\n // We need the extra check, because IE can set the `activeElement` to null in some cases.\n if (\n this._config.restoreFocus &&\n toFocus &&\n typeof toFocus.focus === 'function'\n ) {\n const activeElement = this._document.activeElement as HTMLElement;\n const element = this.elementRef.nativeElement;\n if (\n !activeElement ||\n activeElement === this._document.body ||\n activeElement === element ||\n element.contains(activeElement)\n ) {\n toFocus.focus();\n }\n }\n\n if (this._focusTrap) {\n this._focusTrap.destroy();\n }\n }\n\n /**\n * Dynamically adds or removes focus from the dialog container.\n *\n * @param addFocus Whether to add focus (true) or remove focus (false).\n */\n public _toggleFocus(addFocus: boolean): void {\n if (addFocus) {\n this._addFocusTrap(); // Add focus\n } else {\n this._removeFocusTrap(); // Remove focus\n }\n }\n\n /**\n * Setting up the focus trap and saves a reference to the element that was focused before the dialog was open.\n */\n private _addFocusTrap() {\n if (!this._focusTrap) {\n this._focusTrap = this._focusTrapFactory.create(\n this.elementRef.nativeElement\n );\n }\n if (this._document) {\n this._elementFocusedBeforeDialogWasOpened = this._document\n .activeElement as HTMLElement;\n // Note that there is no focus method when rendering on the server.\n if (this.elementRef.nativeElement.focus) {\n // Move focus onto the dialog immediately in order to prevent the user from accidentally\n // opening multiple dialogs at the same time. Needs to be async, because the element\n // may not be focusable immediately.\n Promise.resolve().then(() => this.elementRef.nativeElement.focus());\n }\n }\n }\n\n /** Only return when there is focus inside the dialog */\n private _containsFocus() {\n const element = this.elementRef.nativeElement as HTMLElement;\n const activeElement = this._document.activeElement;\n return element === activeElement || element.contains(activeElement);\n }\n\n /**\n * Removes the focus trap from the dialog.\n * This method is called to clean up resources and ensure the dialog no longer traps focus.\n */\n private _removeFocusTrap() {\n if (this._focusTrap) {\n this._focusTrap.destroy();\n // Clear the reference to help with garbage collection\n this._focusTrap = null;\n }\n }\n}\n", "assetsDirs": [], "styleUrlsData": [ { - "data": "@import 'dialog-theme';\n$icon-focus-background: rgba(200, 200, 200, 0.4);\n$icon-focus-transition: opacity 0.2s cubic-bezier(0.35, 0, 0.25, 1),\n background-color 0.2s cubic-bezier(0.35, 0, 0.25, 1);\n$header-icon-width: 24px;\n$header-icon-height: 24px;\n\n.cdk-overlay-backdrop {\n background: rgba(255, 255, 255, 0.8) !important;\n}\n.cdk-overlay-pane {\n display: block;\n}\n* {\n outline: 0 none !important;\n}\n\n.oui-dialog-container {\n width: 100%;\n height: 100%;\n min-height: inherit;\n max-height: inherit;\n z-index: 29991;\n border-radius: 0;\n margin: 0 auto;\n display: block;\n -webkit-box-shadow: 0 1px 3px 2px rgba(167, 167, 167, 0.5);\n -moz-box-shadow: 0 1px 3px 2px rgba(167, 167, 167, 0.5);\n box-shadow: 0 1px 3px 2px rgba(167, 167, 167, 0.5);\n box-sizing: border-box;\n -webkit-box-sizing: border-box;\n font-size: 14px;\n color: #333;\n padding: 0px;\n background: #fff;\n .oui-dialog-header {\n font-size: 22px;\n line-height: 30px;\n padding: 13px 22px 20px;\n position: relative;\n color: #333;\n min-height: 29px;\n .oui-dialog-header-title {\n width: calc(100% - 118px);\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n display: block;\n }\n .oui-dialog-header-image {\n position: absolute;\n width: 20px;\n margin-right: 10px;\n text-align: center;\n height: 20px;\n top: 18px;\n img {\n vertical-align: super;\n margin-top: 3.5px;\n }\n }\n }\n}\n\n.oui-dialog-header-image + .oui-dialog-header-title {\n margin-left: 30px;\n width: calc(100% - 148px) !important;\n}\n\n.oui-dialog-header-action {\n position: absolute;\n top: 16px;\n left: auto;\n right: 16px;\n bottom: auto;\n svg {\n fill: #4a4a4a;\n }\n}\n.oui-dialog-header-action::after {\n clear: both;\n content: '';\n display: block;\n}\n.oui-dialog-header-action div {\n margin: 0px 0px 0px 4px;\n float: right;\n box-sizing: border-box;\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n}\n.oui-dialog-header-action a {\n box-sizing: border-box;\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n}\n\n.oui-dialog-header-action div:nth-last-child(1) {\n margin: 0px;\n}\n\n.oui-dialog-header-close {\n cursor: pointer;\n width: $header-icon-width;\n height: $header-icon-height;\n line-height: 1;\n padding: 2px;\n text-align: center;\n .oui-icon {\n width: 20px;\n height: 20px;\n svg {\n vertical-align: top;\n }\n }\n &[class^='cdk'],\n &[class$='focused'],\n &:hover {\n background: $icon-focus-background;\n border-radius: 2px;\n transition: $icon-focus-transition;\n }\n}\n.oui-dialog-header-article {\n width: $header-icon-width;\n height: $header-icon-height;\n float: right;\n margin-left: 4px;\n line-height: 1;\n padding: 2px;\n text-align: center;\n .oui-icon {\n width: 16px;\n height: 20px;\n padding-top: 3px;\n svg {\n vertical-align: top;\n }\n }\n &[class^='cdk'],\n &[class$='focused'] {\n background: $icon-focus-background;\n border-radius: 2px;\n transition: $icon-focus-transition;\n }\n svg {\n fill: #006bb1;\n }\n}\n.oui-dialog-header-video {\n width: $header-icon-width;\n height: $header-icon-height;\n position: relative;\n float: right;\n margin-left: 4px;\n line-height: 1;\n padding: 2px;\n .oui-icon {\n width: 20px;\n height: 20px;\n }\n &[class^='cdk'],\n &[class$='focused'] {\n background: $icon-focus-background;\n border-radius: 2px;\n transition: $icon-focus-transition;\n }\n svg {\n fill: #006bb1;\n }\n}\n.oui-dialog-header-separator {\n margin-right: 5px !important;\n}\n.oui-dialog-header-separator::after {\n border-right: 1px solid #333;\n content: '';\n height: 20px;\n position: absolute;\n right: -5px;\n}\n\n.oui-dialog-content {\n color: #333;\n min-height: 30px;\n line-height: 22px;\n padding: 0 22px 30px;\n font-size: 14px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n -o-user-select: none;\n user-select: none;\n cursor: default;\n overflow: auto;\n max-height: 65vh;\n}\n.oui-dialog-footer {\n padding: 12px 22px;\n width: 100%;\n border-top: 1px solid #c8c8c8;\n box-sizing: border-box;\n .oui-dialog-footer-action-left {\n float: left;\n button {\n margin-right: 36px;\n &:nth-last-child(1) {\n margin-right: 0px;\n }\n }\n }\n .oui-dialog-footer-action-right {\n float: right;\n button {\n margin-left: 12px;\n &:nth-child(1) {\n margin-left: 0px;\n }\n }\n }\n}\n.oui-dialog-footer::after {\n clear: both;\n content: '';\n display: block;\n}\n.cross-disabled {\n pointer-events: none;\n cursor: default;\n opacity: 0.6;\n}\n", + "data": "@import 'dialog-theme';\n$icon-focus-background: rgba(200, 200, 200, 0.4);\n$icon-focus-transition: opacity 0.2s cubic-bezier(0.35, 0, 0.25, 1),\n background-color 0.2s cubic-bezier(0.35, 0, 0.25, 1);\n$header-icon-width: 24px;\n$header-icon-height: 24px;\n\n.cdk-overlay-backdrop {\n background: rgba(255, 255, 255, 0.8) !important;\n}\n.cdk-overlay-pane {\n display: block;\n}\n* {\n outline: 0 none !important;\n}\n\n.oui-dialog-container {\n width: 100%;\n height: 100%;\n min-height: inherit;\n max-height: inherit;\n z-index: 29991;\n border-radius: 0;\n margin: 0 auto;\n display: block;\n -webkit-box-shadow: 0 1px 3px 2px rgba(167, 167, 167, 0.5);\n -moz-box-shadow: 0 1px 3px 2px rgba(167, 167, 167, 0.5);\n box-shadow: 0 1px 3px 2px rgba(167, 167, 167, 0.5);\n box-sizing: border-box;\n -webkit-box-sizing: border-box;\n font-size: 14px;\n color: #333;\n padding: 0px;\n background: #fff;\n .oui-dialog-header {\n font-size: 22px;\n line-height: 30px;\n padding: 13px 22px 20px;\n position: relative;\n color: #333;\n min-height: 29px;\n .oui-dialog-header-title {\n width: calc(100% - 118px);\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n display: block;\n }\n .oui-dialog-header-image {\n position: absolute;\n width: 20px;\n margin-right: 10px;\n text-align: center;\n height: 20px;\n top: 18px;\n img {\n vertical-align: super;\n margin-top: 3.5px;\n }\n }\n }\n}\n\n.oui-dialog-header-image + .oui-dialog-header-title {\n margin-left: 30px;\n width: calc(100% - 148px) !important;\n}\n\n.oui-dialog-header-action {\n position: absolute;\n top: 16px;\n left: auto;\n right: 16px;\n bottom: auto;\n svg {\n fill: #4a4a4a;\n }\n}\n.oui-dialog-header-action::after {\n clear: both;\n content: '';\n display: block;\n}\n.oui-dialog-header-action div {\n margin: 0px 0px 0px 4px;\n float: right;\n box-sizing: border-box;\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n}\n.oui-dialog-header-action a {\n box-sizing: border-box;\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n}\n\n.oui-dialog-header-action div:nth-last-child(1) {\n margin: 0px;\n}\n\n.oui-dialog-header-close {\n cursor: pointer;\n width: $header-icon-width;\n height: $header-icon-height;\n line-height: 1;\n padding: 2px;\n text-align: center;\n .oui-icon {\n width: 20px;\n height: 20px;\n svg {\n vertical-align: top;\n }\n }\n &[class^='cdk'],\n &[class$='focused'],\n &:hover {\n background: $icon-focus-background;\n border-radius: 2px;\n transition: $icon-focus-transition;\n }\n}\n.oui-dialog-header-article {\n width: $header-icon-width;\n height: $header-icon-height;\n float: right;\n margin-left: 4px;\n line-height: 1;\n padding: 2px;\n text-align: center;\n .oui-icon {\n width: 16px;\n height: 20px;\n svg {\n vertical-align: top;\n fill: #4a4a4a;\n }\n }\n &[class^='cdk'],\n &[class$='focused'],\n &:hover {\n background: $icon-focus-background;\n border-radius: 2px;\n transition: $icon-focus-transition;\n }\n svg {\n fill: #006bb1;\n }\n}\n.oui-dialog-header-video {\n width: $header-icon-width;\n height: $header-icon-height;\n position: relative;\n float: right;\n margin-left: 4px;\n line-height: 1;\n padding: 2px;\n .oui-icon {\n width: 20px;\n height: 20px;\n }\n &[class^='cdk'],\n &[class$='focused'] {\n background: $icon-focus-background;\n border-radius: 2px;\n transition: $icon-focus-transition;\n }\n svg {\n fill: #006bb1;\n }\n}\n.oui-dialog-header-separator {\n margin-right: 5px !important;\n}\n.oui-dialog-header-separator::after {\n border-right: 1px solid #333;\n content: '';\n height: 20px;\n position: absolute;\n right: -5px;\n}\n\n.oui-dialog-content {\n color: #333;\n min-height: 30px;\n line-height: 22px;\n padding: 0 22px 30px;\n font-size: 14px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n -o-user-select: none;\n user-select: none;\n cursor: default;\n overflow: auto;\n max-height: 65vh;\n}\n.oui-dialog-footer {\n padding: 12px 22px;\n width: 100%;\n border-top: 1px solid #c8c8c8;\n box-sizing: border-box;\n .oui-dialog-footer-action-left {\n float: left;\n button {\n margin-right: 36px;\n &:nth-last-child(1) {\n margin-right: 0px;\n }\n }\n }\n .oui-dialog-footer-action-right {\n float: right;\n button {\n margin-left: 12px;\n &:nth-child(1) {\n margin-left: 0px;\n }\n }\n }\n}\n.oui-dialog-footer::after {\n clear: both;\n content: '';\n display: block;\n}\n.cross-disabled {\n pointer-events: none;\n cursor: default;\n opacity: 0.6;\n}\n", "styleUrl": "dialog.scss" } ], @@ -28159,7 +28299,7 @@ }, { "name": "OuiDialogHeaderArticle", - "id": "directive-OuiDialogHeader-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogHeader-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "encapsulation": [], "entryComponents": [], @@ -28171,7 +28311,7 @@ "selector": "[oui-dialog-header-article], [ouiDialogHeaderArticle]", "styleUrls": [], "styles": [], - "template": "", + "template": "", "templateUrl": [], "viewProviders": [], "hostDirectives": [], @@ -28199,7 +28339,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 114, + "line": 115, "deprecated": false, "deprecationMessage": "" } @@ -28213,7 +28353,7 @@ "description": "

header action article.

\n", "rawdescription": "\n\nheader action article.\n", "type": "component", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -28310,7 +28450,7 @@ }, { "name": "OuiDialogHeaderClose", - "id": "directive-OuiDialogHeader-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogHeader-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "encapsulation": [], "entryComponents": [], @@ -28337,7 +28477,7 @@ "type": "Subscription", "optional": false, "description": "", - "line": 170, + "line": 171, "modifierKind": [ 123 ] @@ -28350,7 +28490,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 186, + "line": 187, "deprecated": false, "deprecationMessage": "" } @@ -28364,7 +28504,7 @@ "description": "

header action close

\n", "rawdescription": "\n\nheader action close\n", "type": "component", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -28405,7 +28545,7 @@ "deprecationMessage": "" } ], - "line": 170, + "line": 171, "jsdoctags": [ { "name": "ouiIconRegistry", @@ -28461,7 +28601,7 @@ }, { "name": "OuiDialogHeaderVideo", - "id": "directive-OuiDialogHeader-4c5d8cb794ce2091937eb4ba504351b486d5a89c92a54ad2f3dd97a0a2a183caa83e298a99eae85fcde8c0a630d680ec98c1ab764323a209b8ec838331d1f6fe", + "id": "directive-OuiDialogHeader-12755564bb6e7d7e57347ef0a3fe769182dd3f95cdcf42f7eced0c25c531ac18f235af49d2396630796e6383dbc58932bfa0d8775391f77a70c47ee643aa5875", "file": "ui/src/components/dialog/dialog-content.ts", "encapsulation": [], "entryComponents": [], @@ -28488,7 +28628,7 @@ "type": "Subscription", "optional": false, "description": "", - "line": 133, + "line": 134, "modifierKind": [ 123 ] @@ -28501,7 +28641,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 150, + "line": 151, "deprecated": false, "deprecationMessage": "" } @@ -28515,7 +28655,7 @@ "description": "

header action article.

\n", "rawdescription": "\n\nheader action article.\n", "type": "component", - "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `article-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.ARTICLE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", + "sourceCode": "import {\n Directive,\n Input,\n OnChanges,\n OnInit,\n Optional,\n SimpleChanges,\n ElementRef,\n Component,\n NgZone,\n OnDestroy,\n} from '@angular/core';\nimport { OuiDialog } from './dialog';\nimport { OuiDialogRef } from './dialog-ref';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { Subscription } from 'rxjs';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Counter used to generate unique IDs for dialog elements. */\nlet dialogElementUid = 0;\n\n/**\n * Header section of ui.\n */\n@Directive({\n selector: '[oui-dialog-header], [ouiDialogHeader]',\n exportAs: 'ouiDialogHeader',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header',\n },\n})\nexport class OuiDialogHeader {\n constructor() {}\n}\n\n/**\n * Header Title of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-title], [ouiDialogHeaderTitle]',\n exportAs: 'ouiDialogHeaderTitle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-title',\n },\n})\nexport class OuiDialogHeaderTitle {\n constructor() {}\n}\n\n/**\n * Header Image of ui.\n */\n@Directive({\n selector: '[oui-dialog-header-image], [ouiDialogHeaderImage]',\n exportAs: 'ouiDialogHeaderImage',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-image',\n },\n})\nexport class OuiDialogHeaderImage {\n constructor() {}\n}\n\n/**\n * Header action area of dialog.\n */\n@Directive({\n selector: '[oui-dialog-header-action], [ouiDialogHeaderAction]',\n exportAs: 'ouiDialogHeaderAction',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-action',\n },\n})\nexport class OuiDialogHeaderAction {\n constructor() {}\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-article], [ouiDialogHeaderArticle]',\n template: '',\n exportAs: 'ouiDialogHeaderArticle',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-article',\n },\n})\nexport class OuiDialogHeaderArticle implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action article.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-video], [ouiDialogHeaderVideo]',\n template: '',\n exportAs: 'ouiDialogHeaderVideo',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-video',\n },\n})\nexport class OuiDialogHeaderVideo implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `video-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.VIDEO_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action close\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-dialog-header-close], [ouiDialogHeaderClose]',\n template: '',\n exportAs: 'ouiDialogHeaderClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-close',\n '[attr.tabindex]': '0',\n },\n})\nexport class OuiDialogHeaderClose implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone\n ) {\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON)\n );\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n ngOnDestroy() {\n this._monitorSubscription.unsubscribe();\n }\n}\n\n/**\n * header action separator close\n */\n@Directive({\n selector: '[oui-dialog-header-separator], [ouiDialogHeaderSeparator]',\n exportAs: 'ouiDialogHeaderSeparator',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-header-separator',\n },\n})\nexport class OuiDialogHeaderSeparator {\n constructor() {}\n}\n\n/**\n * directive for close the current dialog.\n */\n@Directive({\n selector: `[oui-dialog-close], [ouiDialogClose]`,\n exportAs: 'ouiDialogClose',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[class.cross-disabled]': 'dialogResult===false',\n '(click)': 'closeDialog()',\n '[attr.aria-label]': 'ariaLabel',\n '(keyup.space)': 'handleKeydown($event)',\n '(keydown.enter)': 'handleKeydown($event)',\n },\n})\nexport class OuiDialogClose implements OnInit, OnChanges {\n /** Screenreader label for the button. */\n @Input('aria-label')\n ariaLabel = 'Close dialog';\n\n /** Dialog close input. */\n @Input('oui-dialog-close')\n dialogResult: any;\n\n @Input('ouiDialogClose')\n _ouiDialogClose: any;\n\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n /** Ensures the option is selected when activated from the keyboard. */\n handleKeydown(event: KeyboardEvent): void {\n this.closeDialog();\n event.preventDefault();\n }\n\n closeDialog() {\n if (this.dialogResult !== false) {\n this.dialogRef.close(this.dialogResult);\n }\n }\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n const proxiedChange =\n changes._ouiDialogClose || changes._ouiDialogCloseResult;\n if (proxiedChange) {\n this.dialogResult = proxiedChange.currentValue;\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-content], [ouiDialogContent]',\n exportAs: 'ouiDialogContent',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-content',\n },\n})\nexport class OuiDialogContent implements OnInit {\n constructor(\n @Optional() public dialogRef: OuiDialogRef,\n private _elementRef: ElementRef,\n private _dialog: OuiDialog\n ) {}\n\n ngOnInit() {\n if (!this.dialogRef) {\n // When this directive is included in a dialog via TemplateRef (rather than being\n // in a Component), the DialogRef isn't available via injection because embedded\n // views cannot be given a custom injector. Instead, we look up the DialogRef by\n // ID. This must occur in `onInit`, as the ID binding for the dialog container won't\n // be resolved at constructor time.\n this.dialogRef = getClosestDialog(\n this._elementRef,\n this._dialog.openDialogs\n )!;\n }\n this._setContentHeight();\n }\n /* prevent content scroll in default scroll strategy **/\n private _setContentHeight() {\n if (!this.dialogRef.dialogConfig.scrollStrategy) {\n this._elementRef.nativeElement.style.maxHeight = 'none';\n this._elementRef.nativeElement.style.overflow = 'visible';\n }\n }\n}\n\n/**\n * Content section of dialog.\n */\n@Directive({\n selector: '[oui-dialog-footer], [ouiDialogFooter]',\n exportAs: 'ouiDialogFooter',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer',\n },\n})\nexport class OuiDialogFooter {\n @Input()\n id = `oui-dialog-footer-${dialogElementUid++}`;\n constructor() {}\n}\n\n/**\n * footer action left\n */\n@Directive({\n selector: '[oui-dialog-footer-action-left], [ouiDialogFooterActionLeft]',\n exportAs: 'ouiDialogFooterActionLeft',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-left',\n },\n})\nexport class OuiDialogFooterActionLeft {\n constructor() {}\n}\n\n/**\n * footer action right\n */\n@Directive({\n selector: '[oui-dialog-footer-action-right], [ouiDialogFooterActionRight]',\n exportAs: 'ouiDialogFooterActionRight',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n class: 'oui-dialog-footer-action-right',\n },\n})\nexport class OuiDialogFooterActionRight {\n constructor() {}\n}\n\n/**\n * Finds the closest MatDialogRef to an element by looking at the DOM.\n *\n * @param element Element relative to which to look for a dialog.\n * @param openDialogs References to the currently-open dialogs.\n */\nfunction getClosestDialog(\n element: ElementRef,\n openDialogs: OuiDialogRef[]\n) {\n let parent: HTMLElement | null = element.nativeElement.parentElement;\n\n while (parent && !parent.classList.contains('oui-dialog-container')) {\n parent = parent.parentElement;\n }\n\n return parent ? openDialogs.find((dialog) => dialog.id === parent!.id) : null;\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -28556,7 +28696,7 @@ "deprecationMessage": "" } ], - "line": 133, + "line": 134, "jsdoctags": [ { "name": "ouiIconRegistry", @@ -29150,7 +29290,7 @@ }, { "name": "OuiIconButtonStorybook", - "id": "component-OuiIconButtonStorybook-c89f93f9a9d641b78944a9ed4da5a770c9ce2a88429cae30825026418607664089647169c08cc70e0009a1f1504ceb00a59c36e8c162ca2ebfc641662355c2c2", + "id": "component-OuiIconButtonStorybook-f0dbf981e04d76384e8e34b4d68e4f62f5f710bac57bf8d2c6d6b9c2785c02ecb1f97f614e015207877000096744f4db78fdf01866429ddbfcf346391e3960ae", "file": "ui/src/stories/button/button.component.ts", "encapsulation": [], "entryComponents": [], @@ -29164,7 +29304,24 @@ "templateUrl": [], "viewProviders": [], "hostDirectives": [], - "inputsClass": [], + "inputsClass": [ + { + "name": "color", + "deprecated": false, + "deprecationMessage": "", + "line": 18, + "type": "string", + "decorators": [] + }, + { + "name": "disabled", + "deprecated": false, + "deprecationMessage": "", + "line": 19, + "type": "boolean", + "decorators": [] + } + ], "outputsClass": [], "propertiesClass": [], "methodsClass": [], @@ -29177,7 +29334,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import { Component } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { OuiIconRegistry } from '../../components';\n@Component({\n selector: 'oui-icon-button-storybook',\n template: `\n \n {{ text }}\n \n `,\n})\nexport class OuiIconButtonStorybook {\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://d1azc1qln24ryf.cloudfront.net/135790/oncehub-20/symbol-defs.svg?10k0w6'\n )\n );\n }\n}\n", + "sourceCode": "import { Component, Input } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { OuiIconRegistry } from '../../components';\r\n@Component({\r\n selector: 'oui-icon-button-storybook',\r\n template: `\r\n \r\n {{ text }}\r\n \r\n `,\r\n})\r\nexport class OuiIconButtonStorybook {\r\n @Input() color: string;\r\n @Input() disabled: boolean;\r\n constructor(\r\n private ouiIconRegistry: OuiIconRegistry,\r\n private domSanitizer: DomSanitizer\r\n ) {\r\n this.ouiIconRegistry.addSvgIconSet(\r\n this.domSanitizer.bypassSecurityTrustResourceUrl(\r\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?81ot1f'\r\n )\r\n );\r\n }\r\n}\r\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -29200,7 +29357,7 @@ "deprecationMessage": "" } ], - "line": 17, + "line": 19, "jsdoctags": [ { "name": "ouiIconRegistry", @@ -29226,7 +29383,7 @@ }, { "name": "OuiiconStorybook", - "id": "component-OuiiconStorybook-7bbcdc4c83da1875951fbc83aa453cf0da495b2297cfaa10e078aa3d85243768287e9c85894c4ce75c74e2ef4a01df887f918b5fd76708226f1bfb278181ccc8", + "id": "component-OuiiconStorybook-e1aca21517754add6b0ab4a4fb8ce71fbd5e5f8fc3324df8ffe2b3aa08ca7644855dda6fb5693d3c86e4eeaa3ce57fda9cd866a5d8c6e43739b03356c5d28ba2", "file": "ui/src/stories/icon/icon.component.ts", "encapsulation": [], "entryComponents": [], @@ -29281,7 +29438,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import { OuiIconRegistry } from '../../components';\nimport { Component, Input } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n@Component({\n selector: 'oui-icon-storybook',\n template: `\n \n `,\n})\nexport class OuiiconStorybook {\n @Input() icon = 'notification-editor';\n @Input() color = 'primary';\n @Input() size = 20;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://d1azc1qln24ryf.cloudfront.net/135790/oncehub-20/symbol-defs.svg?hn1bl5'\n )\n );\n }\n}\n", + "sourceCode": "import { OuiIconRegistry } from '../../components';\nimport { Component, Input } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n@Component({\n selector: 'oui-icon-storybook',\n template: `\n \n `,\n})\nexport class OuiiconStorybook {\n @Input() icon = 'notification-editor';\n @Input() color = 'primary';\n @Input() size = 20;\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?5df5gz'\n )\n );\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -30057,7 +30214,7 @@ "assetsDirs": [], "styleUrlsData": [ { - "data": "@import './menu-theme';\n\n// menu width must be a multiple of 56px\n$oui-menu-overlay-min-width: 205px !default; // 56 * 2\n$oui-menu-overlay-max-width: 244px !default; // 56 * 5\n\n$oui-menu-item-height: 48px !default;\n$oui-menu-side-padding: 16px !default;\n$oui-menu-icon-margin: 16px !default;\n\n$oui-menu-border-radius: 4px !default;\n\n$oui-menu-z-index: 9999;\n\n$oui-menu-border-color: 1px solid #c8c8c8;\n\n/*box shadow and border as a boxshadow(good for zoom-in and zoom-out in browsers) */\n$oui-menu-box-shadow: 0px 1px 3px 0px #4a4a4a;\n$oui-menu-border-box-shadow: 0 0 0 1px #c8c8c8;\n\n/*font size and line-height*/\n$oui-menu-font-size: 13px;\n$oui-menu-line-height: 22px;\n\n/*reset the browser default properties*/\n@mixin oui-button-reset {\n border: 0 none;\n background: none;\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\n &:focus {\n outline: 0 none;\n }\n // The `outline: none` from above works on all browsers, however Firefox also\n // adds a special `focus-inner` which we have to disable explicitly. See:\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Firefox\n &::-moz-focus-inner {\n border: 0;\n }\n}\n\n@mixin oui-menu-base() {\n //min-width: $oui-menu-overlay-min-width;\n max-width: $oui-menu-overlay-max-width;\n overflow: auto;\n}\n\n.oui-menu-panel {\n @include oui-menu-base();\n max-height: calc(100vh - #{$oui-menu-item-height});\n background-color: #fff;\n box-shadow: $oui-menu-box-shadow;\n outline: 0;\n z-index: $oui-menu-z-index;\n font-size: $oui-menu-font-size;\n line-height: $oui-menu-line-height;\n}\n\n.oui-menu-content {\n //box-shadow: $oui-menu-border-box-shadow;\n padding: 10px 0px;\n //added border\n border: $oui-menu-border-color;\n overflow: hidden;\n}\n\n@mixin oui-menu-item-base() {\n //white-space: nowrap;\n font-size: 13px;\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\n overflow: hidden;\n text-overflow: ellipsis;\n // Needs to be a block for the ellipsis to work.\n display: block;\n line-height: $oui-menu-line-height;\n padding: 0 $oui-menu-side-padding;\n text-align: left;\n text-decoration: none; // necessary to reset anchor tags\n // Required for Edge not to show scrollbars when setting the width manually. See #12112.\n max-width: 100%;\n width: 100%;\n\n &[disabled] {\n cursor: default;\n }\n\n .oui-icon {\n display: inline-block;\n vertical-align: top;\n width: 20px;\n height: 20px;\n margin-right: 8px;\n text-align: center;\n margin-top: 1px;\n svg {\n vertical-align: top;\n }\n }\n}\n\n.oui-menu-item {\n @include oui-button-reset();\n @include oui-menu-item-base();\n position: relative;\n padding: 8px 8px;\n display: block;\n color: #333;\n cursor: pointer;\n position: relative;\n min-width: $oui-menu-overlay-min-width;\n max-width: $oui-menu-overlay-max-width;\n width: 100%;\n\n span {\n display: inline-block;\n max-width: 200px;\n vertical-align: top;\n line-height: 20px;\n margin-top: 1px;\n }\n}\n\n.oui-menu-item:hover,\n.oui-menu-item.cdk-program-focused,\n.oui-menu-item.cdk-keyboard-focused,\n.oui-menu-item-highlighted {\n &:not([disabled]) {\n background: #eeeeee;\n text-decoration: none;\n }\n}\n\n@mixin oui-menu-icon-hover {\n background-color: rgba(200, 200, 200, 0.4);\n border-radius: 2px;\n transition: opacity 0.2s cubic-bezier(0.35, 0, 0.25, 1),\n background-color 0.2s cubic-bezier(0.35, 0, 0.25, 1);\n cursor: pointer;\n}\n\n.oui-menu-icon-container {\n height: 20px;\n}\n.oui-menu-icon {\n svg {\n padding: 2px;\n pointer-events: auto !important;\n }\n}\n.oui-menu-icon,\n.oui-menu-icon-hover {\n display: inline-block;\n margin: 0;\n &:hover {\n @include oui-menu-icon-hover();\n }\n}\n.oui-menu-icon-hover {\n @include oui-menu-icon-hover();\n}\n.oui-menu-icon-container.oui-menu-icon-vertical {\n display: block;\n height: 24px;\n .oui-menu-icon {\n transform: rotate(90deg);\n }\n}\n\nbody {\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n", + "data": "@import './menu-theme';\r\n\r\n// menu width must be a multiple of 56px\r\n$oui-menu-overlay-min-width: 205px !default; // 56 * 2\r\n$oui-menu-overlay-max-width: 244px !default; // 56 * 5\r\n\r\n$oui-menu-item-height: 48px !default;\r\n$oui-menu-side-padding: 16px !default;\r\n$oui-menu-icon-margin: 16px !default;\r\n\r\n$oui-menu-border-radius: 4px !default;\r\n\r\n$oui-menu-z-index: 9999;\r\n\r\n$oui-menu-border-color: 1px solid #c8c8c8;\r\n\r\n/*box shadow and border as a boxshadow(good for zoom-in and zoom-out in browsers) */\r\n$oui-menu-box-shadow: 0px 1px 3px 0px #4a4a4a;\r\n$oui-menu-border-box-shadow: 0 0 0 1px #c8c8c8;\r\n\r\n/*font size and line-height*/\r\n$oui-menu-font-size: 13px;\r\n$oui-menu-line-height: 22px;\r\n\r\n/*reset the browser default properties*/\r\n@mixin oui-button-reset {\r\n & {\r\n border: 0 none;\r\n background: none;\r\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\r\n }\r\n &:focus {\r\n outline: 0 none;\r\n }\r\n // The `outline: none` from above works on all browsers, however Firefox also\r\n // adds a special `focus-inner` which we have to disable explicitly. See:\r\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Firefox\r\n &::-moz-focus-inner {\r\n border: 0;\r\n }\r\n}\r\n\r\n@mixin oui-menu-base() {\r\n //min-width: $oui-menu-overlay-min-width;\r\n max-width: $oui-menu-overlay-max-width;\r\n overflow: auto;\r\n}\r\n\r\n.oui-menu-panel {\r\n @include oui-menu-base();\r\n max-height: calc(100vh - #{$oui-menu-item-height});\r\n background-color: #fff;\r\n box-shadow: $oui-menu-box-shadow;\r\n outline: 0;\r\n z-index: $oui-menu-z-index;\r\n font-size: $oui-menu-font-size;\r\n line-height: $oui-menu-line-height;\r\n}\r\n\r\n.oui-menu-content {\r\n //box-shadow: $oui-menu-border-box-shadow;\r\n padding: 10px 0px;\r\n //added border\r\n border: $oui-menu-border-color;\r\n overflow: hidden;\r\n}\r\n\r\n@mixin oui-menu-item-base() {\r\n //white-space: nowrap;\r\n & {\r\n font-size: 13px;\r\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n // Needs to be a block for the ellipsis to work.\r\n display: block;\r\n line-height: $oui-menu-line-height;\r\n padding: 0 $oui-menu-side-padding;\r\n text-align: left;\r\n text-decoration: none; // necessary to reset anchor tags\r\n // Required for Edge not to show scrollbars when setting the width manually. See #12112.\r\n max-width: 100%;\r\n width: 100%;\r\n }\r\n\r\n &[disabled] {\r\n cursor: default;\r\n }\r\n\r\n .oui-icon {\r\n display: inline-block;\r\n vertical-align: top;\r\n width: 20px;\r\n height: 20px;\r\n margin-right: 8px;\r\n text-align: center;\r\n margin-top: 1px;\r\n svg {\r\n vertical-align: top;\r\n }\r\n }\r\n}\r\n\r\n.oui-menu-item {\r\n @include oui-button-reset();\r\n @include oui-menu-item-base();\r\n & {\r\n position: relative;\r\n padding: 8px 8px;\r\n display: block;\r\n color: #333;\r\n cursor: pointer;\r\n position: relative;\r\n min-width: $oui-menu-overlay-min-width;\r\n max-width: $oui-menu-overlay-max-width;\r\n width: 100%;\r\n }\r\n\r\n span {\r\n display: inline-block;\r\n max-width: 200px;\r\n vertical-align: top;\r\n line-height: 20px;\r\n margin-top: 1px;\r\n }\r\n}\r\n\r\n.oui-menu-item:hover,\r\n.oui-menu-item.cdk-program-focused,\r\n.oui-menu-item.cdk-keyboard-focused,\r\n.oui-menu-item-highlighted {\r\n &:not([disabled]) {\r\n background: #eeeeee;\r\n text-decoration: none;\r\n }\r\n}\r\n\r\n@mixin oui-menu-icon-hover {\r\n background-color: rgba(200, 200, 200, 0.4);\r\n border-radius: 2px;\r\n transition: opacity 0.2s cubic-bezier(0.35, 0, 0.25, 1),\r\n background-color 0.2s cubic-bezier(0.35, 0, 0.25, 1);\r\n cursor: pointer;\r\n}\r\n\r\n.oui-menu-icon-container {\r\n height: 20px;\r\n}\r\n.oui-menu-icon {\r\n svg {\r\n padding: 2px;\r\n pointer-events: auto !important;\r\n }\r\n}\r\n.oui-menu-icon,\r\n.oui-menu-icon-hover {\r\n display: inline-block;\r\n margin: 0;\r\n &:hover {\r\n @include oui-menu-icon-hover();\r\n }\r\n}\r\n.oui-menu-icon-hover {\r\n @include oui-menu-icon-hover();\r\n}\r\n.oui-menu-icon-container.oui-menu-icon-vertical {\r\n display: block;\r\n height: 24px;\r\n .oui-menu-icon {\r\n transform: rotate(90deg);\r\n }\r\n}\r\n\r\nbody {\r\n -ms-overflow-style: -ms-autohiding-scrollbar;\r\n}\r\n", "styleUrl": "menu.scss" } ], @@ -30445,7 +30602,7 @@ "assetsDirs": [], "styleUrlsData": [ { - "data": "@import './menu-theme';\n\n// menu width must be a multiple of 56px\n$oui-menu-overlay-min-width: 205px !default; // 56 * 2\n$oui-menu-overlay-max-width: 244px !default; // 56 * 5\n\n$oui-menu-item-height: 48px !default;\n$oui-menu-side-padding: 16px !default;\n$oui-menu-icon-margin: 16px !default;\n\n$oui-menu-border-radius: 4px !default;\n\n$oui-menu-z-index: 9999;\n\n$oui-menu-border-color: 1px solid #c8c8c8;\n\n/*box shadow and border as a boxshadow(good for zoom-in and zoom-out in browsers) */\n$oui-menu-box-shadow: 0px 1px 3px 0px #4a4a4a;\n$oui-menu-border-box-shadow: 0 0 0 1px #c8c8c8;\n\n/*font size and line-height*/\n$oui-menu-font-size: 13px;\n$oui-menu-line-height: 22px;\n\n/*reset the browser default properties*/\n@mixin oui-button-reset {\n border: 0 none;\n background: none;\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\n &:focus {\n outline: 0 none;\n }\n // The `outline: none` from above works on all browsers, however Firefox also\n // adds a special `focus-inner` which we have to disable explicitly. See:\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Firefox\n &::-moz-focus-inner {\n border: 0;\n }\n}\n\n@mixin oui-menu-base() {\n //min-width: $oui-menu-overlay-min-width;\n max-width: $oui-menu-overlay-max-width;\n overflow: auto;\n}\n\n.oui-menu-panel {\n @include oui-menu-base();\n max-height: calc(100vh - #{$oui-menu-item-height});\n background-color: #fff;\n box-shadow: $oui-menu-box-shadow;\n outline: 0;\n z-index: $oui-menu-z-index;\n font-size: $oui-menu-font-size;\n line-height: $oui-menu-line-height;\n}\n\n.oui-menu-content {\n //box-shadow: $oui-menu-border-box-shadow;\n padding: 10px 0px;\n //added border\n border: $oui-menu-border-color;\n overflow: hidden;\n}\n\n@mixin oui-menu-item-base() {\n //white-space: nowrap;\n font-size: 13px;\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\n overflow: hidden;\n text-overflow: ellipsis;\n // Needs to be a block for the ellipsis to work.\n display: block;\n line-height: $oui-menu-line-height;\n padding: 0 $oui-menu-side-padding;\n text-align: left;\n text-decoration: none; // necessary to reset anchor tags\n // Required for Edge not to show scrollbars when setting the width manually. See #12112.\n max-width: 100%;\n width: 100%;\n\n &[disabled] {\n cursor: default;\n }\n\n .oui-icon {\n display: inline-block;\n vertical-align: top;\n width: 20px;\n height: 20px;\n margin-right: 8px;\n text-align: center;\n margin-top: 1px;\n svg {\n vertical-align: top;\n }\n }\n}\n\n.oui-menu-item {\n @include oui-button-reset();\n @include oui-menu-item-base();\n position: relative;\n padding: 8px 8px;\n display: block;\n color: #333;\n cursor: pointer;\n position: relative;\n min-width: $oui-menu-overlay-min-width;\n max-width: $oui-menu-overlay-max-width;\n width: 100%;\n\n span {\n display: inline-block;\n max-width: 200px;\n vertical-align: top;\n line-height: 20px;\n margin-top: 1px;\n }\n}\n\n.oui-menu-item:hover,\n.oui-menu-item.cdk-program-focused,\n.oui-menu-item.cdk-keyboard-focused,\n.oui-menu-item-highlighted {\n &:not([disabled]) {\n background: #eeeeee;\n text-decoration: none;\n }\n}\n\n@mixin oui-menu-icon-hover {\n background-color: rgba(200, 200, 200, 0.4);\n border-radius: 2px;\n transition: opacity 0.2s cubic-bezier(0.35, 0, 0.25, 1),\n background-color 0.2s cubic-bezier(0.35, 0, 0.25, 1);\n cursor: pointer;\n}\n\n.oui-menu-icon-container {\n height: 20px;\n}\n.oui-menu-icon {\n svg {\n padding: 2px;\n pointer-events: auto !important;\n }\n}\n.oui-menu-icon,\n.oui-menu-icon-hover {\n display: inline-block;\n margin: 0;\n &:hover {\n @include oui-menu-icon-hover();\n }\n}\n.oui-menu-icon-hover {\n @include oui-menu-icon-hover();\n}\n.oui-menu-icon-container.oui-menu-icon-vertical {\n display: block;\n height: 24px;\n .oui-menu-icon {\n transform: rotate(90deg);\n }\n}\n\nbody {\n -ms-overflow-style: -ms-autohiding-scrollbar;\n}\n", + "data": "@import './menu-theme';\r\n\r\n// menu width must be a multiple of 56px\r\n$oui-menu-overlay-min-width: 205px !default; // 56 * 2\r\n$oui-menu-overlay-max-width: 244px !default; // 56 * 5\r\n\r\n$oui-menu-item-height: 48px !default;\r\n$oui-menu-side-padding: 16px !default;\r\n$oui-menu-icon-margin: 16px !default;\r\n\r\n$oui-menu-border-radius: 4px !default;\r\n\r\n$oui-menu-z-index: 9999;\r\n\r\n$oui-menu-border-color: 1px solid #c8c8c8;\r\n\r\n/*box shadow and border as a boxshadow(good for zoom-in and zoom-out in browsers) */\r\n$oui-menu-box-shadow: 0px 1px 3px 0px #4a4a4a;\r\n$oui-menu-border-box-shadow: 0 0 0 1px #c8c8c8;\r\n\r\n/*font size and line-height*/\r\n$oui-menu-font-size: 13px;\r\n$oui-menu-line-height: 22px;\r\n\r\n/*reset the browser default properties*/\r\n@mixin oui-button-reset {\r\n & {\r\n border: 0 none;\r\n background: none;\r\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\r\n }\r\n &:focus {\r\n outline: 0 none;\r\n }\r\n // The `outline: none` from above works on all browsers, however Firefox also\r\n // adds a special `focus-inner` which we have to disable explicitly. See:\r\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#Firefox\r\n &::-moz-focus-inner {\r\n border: 0;\r\n }\r\n}\r\n\r\n@mixin oui-menu-base() {\r\n //min-width: $oui-menu-overlay-min-width;\r\n max-width: $oui-menu-overlay-max-width;\r\n overflow: auto;\r\n}\r\n\r\n.oui-menu-panel {\r\n @include oui-menu-base();\r\n max-height: calc(100vh - #{$oui-menu-item-height});\r\n background-color: #fff;\r\n box-shadow: $oui-menu-box-shadow;\r\n outline: 0;\r\n z-index: $oui-menu-z-index;\r\n font-size: $oui-menu-font-size;\r\n line-height: $oui-menu-line-height;\r\n}\r\n\r\n.oui-menu-content {\r\n //box-shadow: $oui-menu-border-box-shadow;\r\n padding: 10px 0px;\r\n //added border\r\n border: $oui-menu-border-color;\r\n overflow: hidden;\r\n}\r\n\r\n@mixin oui-menu-item-base() {\r\n //white-space: nowrap;\r\n & {\r\n font-size: 13px;\r\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n // Needs to be a block for the ellipsis to work.\r\n display: block;\r\n line-height: $oui-menu-line-height;\r\n padding: 0 $oui-menu-side-padding;\r\n text-align: left;\r\n text-decoration: none; // necessary to reset anchor tags\r\n // Required for Edge not to show scrollbars when setting the width manually. See #12112.\r\n max-width: 100%;\r\n width: 100%;\r\n }\r\n\r\n &[disabled] {\r\n cursor: default;\r\n }\r\n\r\n .oui-icon {\r\n display: inline-block;\r\n vertical-align: top;\r\n width: 20px;\r\n height: 20px;\r\n margin-right: 8px;\r\n text-align: center;\r\n margin-top: 1px;\r\n svg {\r\n vertical-align: top;\r\n }\r\n }\r\n}\r\n\r\n.oui-menu-item {\r\n @include oui-button-reset();\r\n @include oui-menu-item-base();\r\n & {\r\n position: relative;\r\n padding: 8px 8px;\r\n display: block;\r\n color: #333;\r\n cursor: pointer;\r\n position: relative;\r\n min-width: $oui-menu-overlay-min-width;\r\n max-width: $oui-menu-overlay-max-width;\r\n width: 100%;\r\n }\r\n\r\n span {\r\n display: inline-block;\r\n max-width: 200px;\r\n vertical-align: top;\r\n line-height: 20px;\r\n margin-top: 1px;\r\n }\r\n}\r\n\r\n.oui-menu-item:hover,\r\n.oui-menu-item.cdk-program-focused,\r\n.oui-menu-item.cdk-keyboard-focused,\r\n.oui-menu-item-highlighted {\r\n &:not([disabled]) {\r\n background: #eeeeee;\r\n text-decoration: none;\r\n }\r\n}\r\n\r\n@mixin oui-menu-icon-hover {\r\n background-color: rgba(200, 200, 200, 0.4);\r\n border-radius: 2px;\r\n transition: opacity 0.2s cubic-bezier(0.35, 0, 0.25, 1),\r\n background-color 0.2s cubic-bezier(0.35, 0, 0.25, 1);\r\n cursor: pointer;\r\n}\r\n\r\n.oui-menu-icon-container {\r\n height: 20px;\r\n}\r\n.oui-menu-icon {\r\n svg {\r\n padding: 2px;\r\n pointer-events: auto !important;\r\n }\r\n}\r\n.oui-menu-icon,\r\n.oui-menu-icon-hover {\r\n display: inline-block;\r\n margin: 0;\r\n &:hover {\r\n @include oui-menu-icon-hover();\r\n }\r\n}\r\n.oui-menu-icon-hover {\r\n @include oui-menu-icon-hover();\r\n}\r\n.oui-menu-icon-container.oui-menu-icon-vertical {\r\n display: block;\r\n height: 24px;\r\n .oui-menu-icon {\r\n transform: rotate(90deg);\r\n }\r\n}\r\n\r\nbody {\r\n -ms-overflow-style: -ms-autohiding-scrollbar;\r\n}\r\n", "styleUrl": "menu.scss" } ], @@ -30824,7 +30981,7 @@ }, { "name": "OuiMenuStorybook", - "id": "component-OuiMenuStorybook-e30d8fe1bee5b4056ac8703f11c48017c65ba83c7a44ab8600e5f94e84eb24a087d322cc079379ecb38052105aca5ab8c36fd5eab1aa55ce7f5a1555df898836", + "id": "component-OuiMenuStorybook-3cb799f45054753a0d5817f6677e7fa994c11ed5a208ab8e4cf09445eb3302742dbb1eecdbf0185db9d3e7fd4f3f727ba6fac382706e53f8b68ac5f9527c1e0c", "file": "ui/src/stories/menu/menu.component.ts", "encapsulation": [], "entryComponents": [], @@ -30944,7 +31101,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import { OuiIconRegistry } from '../../components';\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Component({\n selector: 'oui-menu-storybook',\n template: `\n
\n \n \n
\n \n \n \n \n \n `,\n})\nexport class OuiMenuStorybook {\n @Input() xPosition = 'before';\n @Input() yPosition = 'above';\n @Input() vertical = false;\n @Input() hasBackdrop = true;\n\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://d1azc1qln24ryf.cloudfront.net/135790/oncehub-20/symbol-defs.svg?hn1bl5ss'\n )\n );\n }\n opened() {\n this._opened.emit();\n }\n closed(e: string) {\n this._closed.emit(e);\n }\n}\n\n@Component({\n selector: 'oui-nested-menu-storybook',\n template: `\n
\n \n \n
\n \n \n \n \n\n \n \n \n \n \n `,\n})\nexport class OuiNestedMenuStorybook {\n @Input() xPosition = 'before';\n @Input() yPosition = 'above';\n @Input() vertical = false;\n @Input() hasBackdrop = true;\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://d1azc1qln24ryf.cloudfront.net/135790/oncehub-20/symbol-defs.svg?hn1bl5'\n )\n );\n }\n opened() {\n this._opened.emit();\n }\n closed(e: string) {\n this._closed.emit(e);\n }\n}\n", + "sourceCode": "import { OuiIconRegistry } from '../../components';\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Component({\n selector: 'oui-menu-storybook',\n template: `\n
\n \n \n
\n \n \n \n \n \n `,\n})\nexport class OuiMenuStorybook {\n @Input() xPosition = 'before';\n @Input() yPosition = 'above';\n @Input() vertical = false;\n @Input() hasBackdrop = true;\n\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?81ot1f'\n )\n );\n }\n opened() {\n this._opened.emit();\n }\n closed(e: string) {\n this._closed.emit(e);\n }\n}\n\n@Component({\n selector: 'oui-nested-menu-storybook',\n template: `\n
\n \n \n
\n \n \n \n \n\n \n \n \n \n \n `,\n})\nexport class OuiNestedMenuStorybook {\n @Input() xPosition = 'before';\n @Input() yPosition = 'above';\n @Input() vertical = false;\n @Input() hasBackdrop = true;\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?81ot1f'\n )\n );\n }\n opened() {\n this._opened.emit();\n }\n closed(e: string) {\n this._closed.emit(e);\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -32503,7 +32660,7 @@ }, { "name": "OuiNestedMenuStorybook", - "id": "component-OuiNestedMenuStorybook-e30d8fe1bee5b4056ac8703f11c48017c65ba83c7a44ab8600e5f94e84eb24a087d322cc079379ecb38052105aca5ab8c36fd5eab1aa55ce7f5a1555df898836", + "id": "component-OuiNestedMenuStorybook-3cb799f45054753a0d5817f6677e7fa994c11ed5a208ab8e4cf09445eb3302742dbb1eecdbf0185db9d3e7fd4f3f727ba6fac382706e53f8b68ac5f9527c1e0c", "file": "ui/src/stories/menu/menu.component.ts", "encapsulation": [], "entryComponents": [], @@ -32623,7 +32780,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import { OuiIconRegistry } from '../../components';\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Component({\n selector: 'oui-menu-storybook',\n template: `\n
\n \n \n
\n \n \n \n \n \n `,\n})\nexport class OuiMenuStorybook {\n @Input() xPosition = 'before';\n @Input() yPosition = 'above';\n @Input() vertical = false;\n @Input() hasBackdrop = true;\n\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://d1azc1qln24ryf.cloudfront.net/135790/oncehub-20/symbol-defs.svg?hn1bl5ss'\n )\n );\n }\n opened() {\n this._opened.emit();\n }\n closed(e: string) {\n this._closed.emit(e);\n }\n}\n\n@Component({\n selector: 'oui-nested-menu-storybook',\n template: `\n
\n \n \n
\n \n \n \n \n\n \n \n \n \n \n `,\n})\nexport class OuiNestedMenuStorybook {\n @Input() xPosition = 'before';\n @Input() yPosition = 'above';\n @Input() vertical = false;\n @Input() hasBackdrop = true;\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://d1azc1qln24ryf.cloudfront.net/135790/oncehub-20/symbol-defs.svg?hn1bl5'\n )\n );\n }\n opened() {\n this._opened.emit();\n }\n closed(e: string) {\n this._closed.emit(e);\n }\n}\n", + "sourceCode": "import { OuiIconRegistry } from '../../components';\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Component({\n selector: 'oui-menu-storybook',\n template: `\n
\n \n \n
\n \n \n \n \n \n `,\n})\nexport class OuiMenuStorybook {\n @Input() xPosition = 'before';\n @Input() yPosition = 'above';\n @Input() vertical = false;\n @Input() hasBackdrop = true;\n\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?81ot1f'\n )\n );\n }\n opened() {\n this._opened.emit();\n }\n closed(e: string) {\n this._closed.emit(e);\n }\n}\n\n@Component({\n selector: 'oui-nested-menu-storybook',\n template: `\n
\n \n \n
\n \n \n \n \n\n \n \n \n \n \n `,\n})\nexport class OuiNestedMenuStorybook {\n @Input() xPosition = 'before';\n @Input() yPosition = 'above';\n @Input() vertical = false;\n @Input() hasBackdrop = true;\n @Output()\n readonly _closed: EventEmitter = new EventEmitter();\n @Output()\n readonly _opened: EventEmitter = new EventEmitter();\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?81ot1f'\n )\n );\n }\n opened() {\n this._opened.emit();\n }\n closed(e: string) {\n this._closed.emit(e);\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -32751,7 +32908,7 @@ }, { "name": "OuiOption", - "id": "component-OuiOption-436221d2917bb329efe9ec76f95eb377b81359f9380f577db0c0ce2da5a0904b6eee34d58bbfe6f9af17f79a4a5c6deb5879f211cbb416ef7a77f3b11b3bc534", + "id": "component-OuiOption-6803c2b34ba11ee66c956668869be7746da442626cda9f8b384b5071dcad58a7685f856cc2e7cb60f03aba43a3989b6e24b0ec44dbf21413ada07dbfb2fa712a", "file": "ui/src/components/core/option/option.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -32914,7 +33071,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 279, + "line": 291, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nEmits the selection change event.", @@ -32941,7 +33098,7 @@ "optional": false, "returnType": "HTMLElement", "typeParameters": [], - "line": 252, + "line": 264, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nGets the host DOM element.", @@ -32953,7 +33110,7 @@ "optional": false, "returnType": "string", "typeParameters": [], - "line": 247, + "line": 259, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReturns the correct tabindex for the option depending on disabled state.", @@ -32972,7 +33129,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 225, + "line": 237, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nEnsures the option is selected when activated from the keyboard.", @@ -32995,7 +33152,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 238, + "line": 250, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\n`Selects the option while indicating the selection came from the user. Used to\ndetermine if the select's view -> model callback should be invoked.`\n", @@ -33031,7 +33188,7 @@ "optional": false, "returnType": "string", "typeParameters": [], - "line": 220, + "line": 232, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nGets the label to be used when determining whether the option should be focused.", @@ -33043,7 +33200,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 256, + "line": 268, "deprecated": false, "deprecationMessage": "" }, @@ -33053,7 +33210,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 272, + "line": 284, "deprecated": false, "deprecationMessage": "" }, @@ -33087,7 +33244,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 212, + "line": 224, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nThis method removes display styles on the option that made it appear\nactive. This is used by the ActiveDescendantKeyManager so key\nevents will display the proper options as active on arrow key events.\n", @@ -33103,11 +33260,11 @@ "description": "

Single option inside of a <oui-select> element.

\n", "rawdescription": "\n\nSingle option inside of a `` element.\n", "type": "component", - "sourceCode": "import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\nimport {\n AfterViewChecked,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewEncapsulation,\n NgZone,\n} from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { OuiOptgroup } from './optgroup';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/**\n * Option IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nlet _uniqueIdCounter = 0;\n\n/** Event object emitted by OuiOption when selected or deselected. */\nexport class OuiOptionSelectionChange {\n constructor(\n /** Reference to the option that emitted the event. */\n public source: OuiOption,\n /** Whether the change in the option's value was a result of a user action. */\n public isUserInput = false\n ) {}\n}\n\n/**\n * Describes a parent component that manages a list of options.\n * Contains properties that the options can inherit.\n *\n * @docs-private\n */\nexport interface OuiOptionParentComponent {\n multiple?: boolean;\n}\n\n/**\n * Injection token used to provide the parent component to options.\n */\nexport const OUI_OPTION_PARENT_COMPONENT =\n new InjectionToken('OUI_OPTION_PARENT_COMPONENT');\n\n/**\n * Single option inside of a `` element.\n */\n@Component({\n selector: 'oui-option',\n exportAs: 'ouiOption',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n role: 'option',\n '[attr.tabindex]': '_getTabIndex()',\n '[class.oui-selected]': 'selected',\n '[class.oui-option-multiple]': 'multiple',\n '[class.oui-active]': 'active',\n '[id]': 'id',\n '[attr.aria-selected]': 'selected.toString()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[class.oui-option-disabled]': 'disabled',\n '(click)': '_selectViaInteraction()',\n '(keydown)': '_handleKeydown($event)',\n class: 'oui-option',\n },\n styleUrls: ['option.scss'],\n templateUrl: 'option.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiOption implements AfterViewChecked, OnDestroy {\n private _selected = false;\n private _active = false;\n private _disabled = false;\n private _mostRecentViewValue = '';\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n /** Whether the wrapping component is in multiple selection mode. */\n get multiple() {\n return this._parent && this._parent.multiple;\n }\n\n /** Whether or not the option is currently selected. */\n get selected(): boolean {\n return this._selected;\n }\n\n /** The form value of the option. */\n @Input()\n value: any;\n\n /** The unique ID of the option. */\n @Input()\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n id = `oui-option-${_uniqueIdCounter++}`;\n\n /** Whether the option is disabled. */\n @Input()\n get disabled() {\n return (this.group && this.group.disabled) || this._disabled;\n }\n set disabled(value: any) {\n this._disabled = coerceBooleanProperty(value);\n }\n\n /** Event emitted when the option is selected or deselected. */\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onSelectionChange = new EventEmitter();\n\n /** Emits when the state of the option changes and any parents have to be notified. */\n readonly _stateChanges = new Subject();\n\n constructor(\n private _element: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Optional()\n @Inject(OUI_OPTION_PARENT_COMPONENT)\n private _parent: OuiOptionParentComponent,\n @Optional() readonly group: OuiOptgroup\n ) {\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n\n /**\n * Whether or not the option is currently active and ready to be selected.\n * An active option displays styles as if it is focused, but the\n * focus is actually retained somewhere else. This comes in handy\n * for components like autocomplete where focus must remain on the input.\n */\n get active(): boolean {\n return this._active;\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValue(): string {\n return (this._getHostElement().textContent || '').trim();\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValueForSelect(): string {\n return this._getHostElement().querySelector('.oui-option-text').innerHTML;\n }\n\n /** Selects the option. */\n select(): void {\n if (!this._selected) {\n this._selected = true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Deselects the option. */\n deselect(): void {\n if (this._selected) {\n this._selected = false;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Sets focus onto this option. */\n focus(): void {\n const element = this._getHostElement();\n\n if (typeof element.focus === 'function') {\n element.focus();\n }\n }\n\n /**\n * This method sets display styles on the option to make it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setActiveStyles(): void {\n if (!this._active) {\n this._active = true;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * This method removes display styles on the option that made it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setInactiveStyles(): void {\n if (this._active) {\n this._active = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /** Gets the label to be used when determining whether the option should be focused. */\n getLabel(): string {\n return this.viewValue;\n }\n\n /** Ensures the option is selected when activated from the keyboard. */\n _handleKeydown(event: KeyboardEvent): void {\n if (event.keyCode === ENTER || event.keyCode === SPACE) {\n this._selectViaInteraction();\n\n // Prevent the page from scrolling down and form submits.\n event.preventDefault();\n }\n }\n\n /**\n * `Selects the option while indicating the selection came from the user. Used to\n * determine if the select's view -> model callback should be invoked.`\n */\n _selectViaInteraction(): void {\n if (!this.disabled) {\n this._selected = this.multiple ? !this._selected : true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent(true);\n }\n }\n\n /** Returns the correct tabindex for the option depending on disabled state. */\n _getTabIndex(): string {\n return this.disabled ? '-1' : '0';\n }\n\n /** Gets the host DOM element. */\n _getHostElement(): HTMLElement {\n return this._element.nativeElement;\n }\n\n ngAfterViewChecked() {\n // Since parent components could be using the option's label to display the selected values\n // (e.g. `oui-select`) and they don't have a way of knowing if the option's label has changed\n // we have to check for changes in the DOM ourselves and dispatch an event. These checks are\n // relatively cheap, however we still limit them only to selected options in order to avoid\n // hitting the DOM too often.\n if (this._selected) {\n const viewValue = this.viewValue;\n\n if (viewValue !== this._mostRecentViewValue) {\n this._mostRecentViewValue = viewValue;\n this._stateChanges.next();\n }\n }\n }\n\n ngOnDestroy() {\n this._stateChanges.complete();\n this._monitorSubscription.unsubscribe();\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n\n /** Emits the selection change event. */\n private _emitSelectionChangeEvent(isUserInput = false): void {\n this.onSelectionChange.emit(\n new OuiOptionSelectionChange(this, isUserInput)\n );\n }\n}\n\n/**\n * Counts the amount of option group labels that precede the specified option.\n *\n * @param optionIndex Index of the option at which to start counting.\n * @param options Flat list of all of the options.\n * @param optionGroups Flat list of all of the option groups.\n * @docs-private\n */\nexport function _countGroupLabelsBeforeOption(\n optionIndex: number,\n options: QueryList,\n optionGroups: QueryList\n): number {\n if (optionGroups.length) {\n const optionsArray = options.toArray();\n const groups = optionGroups.toArray();\n let groupCounter = 0;\n\n for (let i = 0; i <= optionIndex; i++) {\n if (\n optionsArray[i].group &&\n optionsArray[i].group === groups[groupCounter]\n ) {\n groupCounter++;\n }\n }\n\n return groupCounter;\n }\n\n return 0;\n}\n\n/**\n * Determines the position to which to scroll a panel in order for an option to be into view.\n *\n * @param optionIndex Index of the option to be scrolled into the view.\n * @param optionHeight Height of the options.\n * @param currentScrollPosition Current scroll position of the panel.\n * @param panelHeight Height of the panel.\n * @docs-private\n */\nexport function _getOptionScrollPosition(\n optionIndex: number,\n optionHeight: number,\n currentScrollPosition: number,\n panelHeight: number\n): number {\n const optionOffset = optionIndex * optionHeight;\n\n if (optionOffset < currentScrollPosition) {\n return optionOffset;\n }\n\n if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {\n return Math.max(0, optionOffset - panelHeight + optionHeight);\n }\n\n return currentScrollPosition;\n}\n", + "sourceCode": "import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\nimport {\n AfterViewChecked,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewEncapsulation,\n NgZone,\n} from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { OuiOptgroup } from './optgroup';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/**\n * Option IDs need to be unique across components, so this counter exists outside of\n * the component definition.\n */\nlet _uniqueIdCounter = 0;\n\n/** Event object emitted by OuiOption when selected or deselected. */\nexport class OuiOptionSelectionChange {\n constructor(\n /** Reference to the option that emitted the event. */\n public source: OuiOption,\n /** Whether the change in the option's value was a result of a user action. */\n public isUserInput = false\n ) {}\n}\n\n/**\n * Describes a parent component that manages a list of options.\n * Contains properties that the options can inherit.\n *\n * @docs-private\n */\nexport interface OuiOptionParentComponent {\n multiple?: boolean;\n}\n\n/**\n * Injection token used to provide the parent component to options.\n */\nexport const OUI_OPTION_PARENT_COMPONENT =\n new InjectionToken('OUI_OPTION_PARENT_COMPONENT');\n\n/**\n * Single option inside of a `` element.\n */\n@Component({\n selector: 'oui-option',\n exportAs: 'ouiOption',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n role: 'option',\n '[attr.tabindex]': '_getTabIndex()',\n '[class.oui-selected]': 'selected',\n '[class.oui-option-multiple]': 'multiple',\n '[class.oui-active]': 'active',\n '[id]': 'id',\n '[attr.aria-selected]': 'selected.toString()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[class.oui-option-disabled]': 'disabled',\n '(click)': '_selectViaInteraction()',\n '(keydown)': '_handleKeydown($event)',\n class: 'oui-option',\n },\n styleUrls: ['option.scss'],\n templateUrl: 'option.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OuiOption implements AfterViewChecked, OnDestroy {\n private _selected = false;\n private _active = false;\n private _disabled = false;\n private _mostRecentViewValue = '';\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n\n /** Whether the wrapping component is in multiple selection mode. */\n get multiple() {\n return this._parent && this._parent.multiple;\n }\n\n /** Whether or not the option is currently selected. */\n get selected(): boolean {\n return this._selected;\n }\n\n /** The form value of the option. */\n @Input()\n value: any;\n\n /** The unique ID of the option. */\n @Input()\n // eslint-disable-next-line @typescript-eslint/no-inferrable-types\n id = `oui-option-${_uniqueIdCounter++}`;\n\n /** Whether the option is disabled. */\n @Input()\n get disabled() {\n return (this.group && this.group.disabled) || this._disabled;\n }\n set disabled(value: any) {\n this._disabled = coerceBooleanProperty(value);\n }\n\n /** Event emitted when the option is selected or deselected. */\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output()\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n readonly onSelectionChange = new EventEmitter();\n\n /** Emits when the state of the option changes and any parents have to be notified. */\n readonly _stateChanges = new Subject();\n\n constructor(\n private _element: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n protected elementRef: ElementRef,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Optional()\n @Inject(OUI_OPTION_PARENT_COMPONENT)\n private _parent: OuiOptionParentComponent,\n @Optional() readonly group: OuiOptgroup\n ) {\n this._monitorSubscription = this._focusMonitor\n .monitor(this.elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n }\n\n /**\n * Whether or not the option is currently active and ready to be selected.\n * An active option displays styles as if it is focused, but the\n * focus is actually retained somewhere else. This comes in handy\n * for components like autocomplete where focus must remain on the input.\n */\n get active(): boolean {\n return this._active;\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValue(): string {\n return (this._getHostElement().textContent || '').trim();\n }\n\n /**\n * The displayed value of the option. It is necessary to show the selected option in the\n * select's trigger.\n */\n get viewValueForSelect(): string {\n return this._getHostElement().querySelector('.oui-option-text').innerHTML;\n }\n\n /** Selects the option. */\n select(): void {\n if (!this._selected) {\n this._selected = true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Deselects the option. */\n deselect(): void {\n if (this._selected) {\n this._selected = false;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent();\n }\n }\n\n /** Sets focus onto this option. */\n focus(): void {\n const element = this._getHostElement();\n\n if (typeof element.focus === 'function') {\n element.focus();\n }\n }\n\n /**\n * This method sets display styles on the option to make it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setActiveStyles(): void {\n if (!this._active) {\n this._active = true;\n setTimeout((_) => {\n const focusedElement = document.querySelector(\n '.oui-active'\n ) as HTMLElement;\n const multiSelect = document.querySelector(\n '.oui-option-pseudo-checkbox'\n ) as HTMLElement;\n const ouiSearch = document.querySelector('.oui-select-search-input');\n if (focusedElement && !multiSelect && !ouiSearch) {\n focusedElement?.focus();\n }\n });\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * This method removes display styles on the option that made it appear\n * active. This is used by the ActiveDescendantKeyManager so key\n * events will display the proper options as active on arrow key events.\n */\n setInactiveStyles(): void {\n if (this._active) {\n this._active = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /** Gets the label to be used when determining whether the option should be focused. */\n getLabel(): string {\n return this.viewValue;\n }\n\n /** Ensures the option is selected when activated from the keyboard. */\n _handleKeydown(event: KeyboardEvent): void {\n if (event.keyCode === ENTER || event.keyCode === SPACE) {\n this._selectViaInteraction();\n\n // Prevent the page from scrolling down and form submits.\n event.preventDefault();\n }\n }\n\n /**\n * `Selects the option while indicating the selection came from the user. Used to\n * determine if the select's view -> model callback should be invoked.`\n */\n _selectViaInteraction(): void {\n if (!this.disabled) {\n this._selected = this.multiple ? !this._selected : true;\n this._changeDetectorRef.markForCheck();\n this._emitSelectionChangeEvent(true);\n }\n }\n\n /** Returns the correct tabindex for the option depending on disabled state. */\n _getTabIndex(): string {\n return this.disabled ? '-1' : '0';\n }\n\n /** Gets the host DOM element. */\n _getHostElement(): HTMLElement {\n return this._element.nativeElement;\n }\n\n ngAfterViewChecked() {\n // Since parent components could be using the option's label to display the selected values\n // (e.g. `oui-select`) and they don't have a way of knowing if the option's label has changed\n // we have to check for changes in the DOM ourselves and dispatch an event. These checks are\n // relatively cheap, however we still limit them only to selected options in order to avoid\n // hitting the DOM too often.\n if (this._selected) {\n const viewValue = this.viewValue;\n\n if (viewValue !== this._mostRecentViewValue) {\n this._mostRecentViewValue = viewValue;\n this._stateChanges.next();\n }\n }\n }\n\n ngOnDestroy() {\n this._stateChanges.complete();\n this._monitorSubscription.unsubscribe();\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n\n /** Emits the selection change event. */\n private _emitSelectionChangeEvent(isUserInput = false): void {\n this.onSelectionChange.emit(\n new OuiOptionSelectionChange(this, isUserInput)\n );\n }\n}\n\n/**\n * Counts the amount of option group labels that precede the specified option.\n *\n * @param optionIndex Index of the option at which to start counting.\n * @param options Flat list of all of the options.\n * @param optionGroups Flat list of all of the option groups.\n * @docs-private\n */\nexport function _countGroupLabelsBeforeOption(\n optionIndex: number,\n options: QueryList,\n optionGroups: QueryList\n): number {\n if (optionGroups.length) {\n const optionsArray = options.toArray();\n const groups = optionGroups.toArray();\n let groupCounter = 0;\n\n for (let i = 0; i <= optionIndex; i++) {\n if (\n optionsArray[i].group &&\n optionsArray[i].group === groups[groupCounter]\n ) {\n groupCounter++;\n }\n }\n\n return groupCounter;\n }\n\n return 0;\n}\n\n/**\n * Determines the position to which to scroll a panel in order for an option to be into view.\n *\n * @param optionIndex Index of the option to be scrolled into the view.\n * @param optionHeight Height of the options.\n * @param currentScrollPosition Current scroll position of the panel.\n * @param panelHeight Height of the panel.\n * @docs-private\n */\nexport function _getOptionScrollPosition(\n optionIndex: number,\n optionHeight: number,\n currentScrollPosition: number,\n panelHeight: number,\n selectedOptionOffset?: number\n): number {\n const optionOffset = selectedOptionOffset || optionIndex * optionHeight;\n\n if (optionOffset < currentScrollPosition) {\n return optionOffset;\n }\n\n if (optionOffset + optionHeight > currentScrollPosition + panelHeight) {\n return Math.max(0, optionOffset - panelHeight + optionHeight);\n }\n\n return currentScrollPosition;\n}\n", "assetsDirs": [], "styleUrlsData": [ { - "data": "@import '../style/menu-common';\n@import '../style/vendor-prefixes';\n\n// This mixin ensures an element spans to fill the nearest ancestor with defined positioning.\n@mixin oui-fill {\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n position: absolute;\n}\n\n.oui-option {\n @include oui-menu-item-base();\n position: relative;\n cursor: pointer;\n outline: none;\n display: flex;\n flex-direction: row;\n max-width: 100%;\n box-sizing: border-box;\n align-items: center;\n -webkit-tap-highlight-color: transparent;\n\n &[aria-disabled='true'] {\n @include user-select(none);\n cursor: default;\n }\n\n .oui-optgroup &:not(.oui-option-multiple) {\n [dir='rtl'] & {\n padding-left: $oui-menu-side-padding;\n padding-right: $oui-menu-side-padding * 2;\n }\n }\n &.oui-active {\n background: #eee !important;\n }\n}\n\n.single-type-checkbox {\n .oui-checkbox-inner-container {\n display: none;\n }\n}\n\n// Collapses unwanted whitespace created by newlines in code like the following:\n.oui-option-text {\n overflow: hidden;\n text-overflow: ellipsis;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n}\n\n// Collapses unwanted whitespace created by newlines in code like the following:\n.oui-option-text {\n display: inline-block;\n flex-grow: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.oui-option-multiple {\n .oui-checkbox-inner-container {\n display: block;\n }\n}\n\n.oui-option-pseudo-checkbox {\n $margin: $oui-menu-side-padding * 0.5;\n margin-right: $margin;\n\n [dir='rtl'] & {\n margin-left: $margin;\n margin-right: 0;\n }\n}\n", + "data": "@import '../style/menu-common';\r\n@import '../style/vendor-prefixes';\r\n\r\n// This mixin ensures an element spans to fill the nearest ancestor with defined positioning.\r\n@mixin oui-fill {\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n position: absolute;\r\n}\r\n\r\n.oui-option {\r\n position: relative;\r\n cursor: pointer;\r\n outline: none;\r\n display: flex;\r\n flex-direction: row;\r\n max-width: 100%;\r\n box-sizing: border-box;\r\n align-items: center;\r\n -webkit-tap-highlight-color: transparent;\r\n @include oui-menu-item-base();\r\n\r\n &[aria-disabled='true'] {\r\n @include user-select(none);\r\n cursor: default;\r\n }\r\n\r\n .oui-optgroup &:not(.oui-option-multiple) {\r\n [dir='rtl'] & {\r\n padding-left: $oui-menu-side-padding;\r\n padding-right: $oui-menu-side-padding * 2;\r\n }\r\n }\r\n &.oui-active {\r\n background: #eee !important;\r\n }\r\n}\r\n\r\n.single-type-checkbox {\r\n .oui-checkbox-inner-container {\r\n display: none;\r\n }\r\n}\r\n\r\n// Collapses unwanted whitespace created by newlines in code like the following:\r\n.oui-option-text {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n display: inline-block;\r\n vertical-align: middle;\r\n width: 100%;\r\n}\r\n\r\n// Collapses unwanted whitespace created by newlines in code like the following:\r\n.oui-option-text {\r\n display: inline-block;\r\n flex-grow: 1;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.oui-option-multiple {\r\n .oui-checkbox-inner-container {\r\n display: block;\r\n }\r\n}\r\n\r\n.oui-option-pseudo-checkbox {\r\n $margin: $oui-menu-side-padding * 0.5;\r\n margin-right: $margin;\r\n\r\n [dir='rtl'] & {\r\n margin-left: $margin;\r\n margin-right: 0;\r\n }\r\n}\r\n", "styleUrl": "option.scss" } ], @@ -33935,7 +34092,7 @@ }, { "name": "OuiPanel", - "id": "component-OuiPanel-065bb74cd1fa7f57341de83af5abd480b4a05e128e287e5f54c73e268d54b3b383070ce1cfa253877356eca1debdca5c7fc6658f6f2f2690c8fd1b55a9d5486e", + "id": "component-OuiPanel-319dcf3ca1c2c7cf6cd7e3d4bba379c4aa2e94e41aa061d20bff089c80142fbba6de25bd8c82eef015fcc7021d8182a8115d4fe629b75df19d3067ec60a18de4", "file": "ui/src/components/panel/panel.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -34334,7 +34491,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import {\n ChangeDetectionStrategy,\n ViewEncapsulation,\n Component,\n InjectionToken,\n Inject,\n Input,\n ViewChild,\n TemplateRef,\n OnInit,\n ContentChild,\n Output,\n EventEmitter,\n Attribute,\n NgZone,\n ElementRef,\n OnDestroy,\n} from '@angular/core';\nimport { PanelPositionX, PanelPositionY } from './panel-positions';\nimport {\n throwOuiPanelInvalidPositionX,\n throwOuiPanelInvalidPositionY,\n} from './panel-errors';\nimport { OuiPanelOverlay } from './panel-overlay';\nimport { OuiPanelContent } from './panel-content';\nimport { Subject, Observable, Subscription } from 'rxjs';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Default `oui-panel` options that can be overridden. */\nexport interface OuiPanelDefaultOptions {\n /** The x-axis position of the menu. */\n xPosition: PanelPositionX;\n\n /** The y-axis position of the menu. */\n yPosition: PanelPositionY;\n}\n\n/** Injection token to be used to override the default options for `oui-menu`. */\nexport const OUI_PANEL_DEFAULT_OPTIONS =\n new InjectionToken('oui-panel-default-options', {\n providedIn: 'root',\n factory: OUI_PANEL_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function OUI_PANEL_DEFAULT_OPTIONS_FACTORY(): OuiPanelDefaultOptions {\n return {\n xPosition: 'after',\n yPosition: 'below',\n };\n}\n\n@Component({\n selector: 'oui-panel',\n templateUrl: 'panel.html',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanel',\n})\nexport class OuiPanel implements OnInit, OuiPanelOverlay {\n private _xPosition: PanelPositionX = this._defaultOptions.xPosition;\n private _yPosition: PanelPositionY = this._defaultOptions.yPosition;\n private readonly _mouseLeave: Subject = new Subject();\n public mouseLeave: Observable;\n private readonly _mouseEnter: Subject = new Subject();\n public mouseEnter: Observable;\n public escapeEvent: Subject = new Subject();\n\n @Input() width?: number;\n\n /** Config object to be passed into the menu's ngClass */\n _classList: { [key: string]: boolean } = {};\n\n @ViewChild(TemplateRef)\n templateRef: TemplateRef;\n\n /**\n * Panel content that will be rendered lazily.\n *\n * @docs-private\n */\n @ContentChild(OuiPanelContent)\n lazyContent: OuiPanelContent;\n\n /** Event emitted when the menu is closed. */\n @Output()\n readonly closed: EventEmitter = new EventEmitter();\n\n /** Position of the menu in the X axis. */\n @Input()\n get xPosition(): PanelPositionX {\n return this._xPosition;\n }\n set xPosition(value: PanelPositionX) {\n if (value !== 'before' && value !== 'after') {\n throwOuiPanelInvalidPositionX();\n }\n this._xPosition = value;\n this.setPositionClasses();\n }\n\n /** Position of the menu in the Y axis. */\n @Input()\n get yPosition(): PanelPositionY {\n return this._yPosition;\n }\n set yPosition(value: PanelPositionY) {\n if (value !== 'above' && value !== 'below') {\n throwOuiPanelInvalidPositionY();\n }\n this._yPosition = value;\n this.setPositionClasses();\n }\n constructor(\n @Inject(OUI_PANEL_DEFAULT_OPTIONS)\n private _defaultOptions: OuiPanelDefaultOptions\n ) {\n this.mouseLeave = this._mouseLeave.asObservable();\n this.mouseEnter = this._mouseEnter.asObservable();\n }\n\n ngOnInit() {\n this.setPositionClasses();\n }\n\n /**\n * Adds classes to the panel-overlay based on its position. Can be used by\n * consumers to add specific styling based on the position.\n *\n * @param posX Position of the panel along the x axis.\n * @param posY Position of the panel along the y axis.\n * @docs-private\n */\n setPositionClasses(\n posX: PanelPositionX = this.xPosition,\n posY: PanelPositionY = this.yPosition\n ) {\n const classes = this._classList;\n classes['oui-panel-before'] = posX === 'before';\n classes['oui-panel-after'] = posX === 'after';\n classes['oui-panel-above'] = posY === 'above';\n classes['oui-panel-below'] = posY === 'below';\n }\n\n public _handleMouseLeave(event: MouseEvent) {\n this._mouseLeave.next(event);\n }\n\n public _handleMouseEnter(event: MouseEvent) {\n this._mouseEnter.next(event);\n }\n\n public _handleCloseIcon() {\n this.escapeEvent.next();\n }\n}\n\n@Component({\n selector: 'oui-panel-icon',\n template:\n '',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanelIcon',\n})\nexport class OuiPanelIcon implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n tabIndex: any;\n constructor(\n private _elementRef: ElementRef,\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Attribute('tabindex') tabIndex: string\n ) {\n this.tabIndex = parseInt(tabIndex, 10) || 0;\n this._monitorSubscription = this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n\n this.ouiIconRegistry.addSvgIconLiteral(\n `panel-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.PANEL_ICON)\n );\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon_8X8`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON_8X8)\n );\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef.nativeElement);\n this._monitorSubscription.unsubscribe();\n }\n}\n", + "sourceCode": "import {\n ChangeDetectionStrategy,\n ViewEncapsulation,\n Component,\n InjectionToken,\n Inject,\n Input,\n ViewChild,\n TemplateRef,\n OnInit,\n ContentChild,\n Output,\n EventEmitter,\n Attribute,\n NgZone,\n ElementRef,\n OnDestroy,\n} from '@angular/core';\nimport { PanelPositionX, PanelPositionY } from './panel-positions';\nimport {\n throwOuiPanelInvalidPositionX,\n throwOuiPanelInvalidPositionY,\n} from './panel-errors';\nimport { OuiPanelOverlay } from './panel-overlay';\nimport { OuiPanelContent } from './panel-content';\nimport { Subject, Observable, Subscription } from 'rxjs';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Default `oui-panel` options that can be overridden. */\nexport interface OuiPanelDefaultOptions {\n /** The x-axis position of the menu. */\n xPosition: PanelPositionX;\n\n /** The y-axis position of the menu. */\n yPosition: PanelPositionY;\n}\n\n/** Injection token to be used to override the default options for `oui-menu`. */\nexport const OUI_PANEL_DEFAULT_OPTIONS =\n new InjectionToken('oui-panel-default-options', {\n providedIn: 'root',\n factory: OUI_PANEL_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function OUI_PANEL_DEFAULT_OPTIONS_FACTORY(): OuiPanelDefaultOptions {\n return {\n xPosition: 'after',\n yPosition: 'below',\n };\n}\n\n@Component({\n selector: 'oui-panel',\n templateUrl: 'panel.html',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanel',\n})\nexport class OuiPanel implements OnInit, OuiPanelOverlay {\n private _xPosition: PanelPositionX = this._defaultOptions.xPosition;\n private _yPosition: PanelPositionY = this._defaultOptions.yPosition;\n private readonly _mouseLeave: Subject = new Subject();\n public mouseLeave: Observable;\n private readonly _mouseEnter: Subject = new Subject();\n public mouseEnter: Observable;\n public escapeEvent: Subject = new Subject();\n\n @Input() width?: number;\n\n /** Config object to be passed into the menu's ngClass */\n _classList: { [key: string]: boolean } = {};\n\n @ViewChild(TemplateRef)\n templateRef: TemplateRef;\n\n /**\n * Panel content that will be rendered lazily.\n *\n * @docs-private\n */\n @ContentChild(OuiPanelContent)\n lazyContent: OuiPanelContent;\n\n /** Event emitted when the menu is closed. */\n @Output()\n readonly closed: EventEmitter = new EventEmitter();\n\n /** Position of the menu in the X axis. */\n @Input()\n get xPosition(): PanelPositionX {\n return this._xPosition;\n }\n set xPosition(value: PanelPositionX) {\n if (value !== 'before' && value !== 'after') {\n throwOuiPanelInvalidPositionX();\n }\n this._xPosition = value;\n this.setPositionClasses();\n }\n\n /** Position of the menu in the Y axis. */\n @Input()\n get yPosition(): PanelPositionY {\n return this._yPosition;\n }\n set yPosition(value: PanelPositionY) {\n if (value !== 'above' && value !== 'below') {\n throwOuiPanelInvalidPositionY();\n }\n this._yPosition = value;\n this.setPositionClasses();\n }\n constructor(\n @Inject(OUI_PANEL_DEFAULT_OPTIONS)\n private _defaultOptions: OuiPanelDefaultOptions\n ) {\n this.mouseLeave = this._mouseLeave.asObservable();\n this.mouseEnter = this._mouseEnter.asObservable();\n }\n\n ngOnInit() {\n this.setPositionClasses();\n }\n\n /**\n * Adds classes to the panel-overlay based on its position. Can be used by\n * consumers to add specific styling based on the position.\n *\n * @param posX Position of the panel along the x axis.\n * @param posY Position of the panel along the y axis.\n * @docs-private\n */\n setPositionClasses(\n posX: PanelPositionX = this.xPosition,\n posY: PanelPositionY = this.yPosition\n ) {\n const classes = this._classList;\n classes['oui-panel-before'] = posX === 'before';\n classes['oui-panel-after'] = posX === 'after';\n classes['oui-panel-above'] = posY === 'above';\n classes['oui-panel-below'] = posY === 'below';\n }\n\n public _handleMouseLeave(event: MouseEvent) {\n this._mouseLeave.next(event);\n }\n\n public _handleMouseEnter(event: MouseEvent) {\n this._mouseEnter.next(event);\n }\n\n public _handleCloseIcon() {\n this.escapeEvent.next();\n }\n}\n\n@Component({\n selector: 'oui-panel-icon',\n template:\n '',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanelIcon',\n})\nexport class OuiPanelIcon implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n tabIndex: any;\n constructor(\n private _elementRef: ElementRef,\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Attribute('tabindex') tabIndex: string\n ) {\n this._elementRef.nativeElement.setAttribute('tabindex', '0');\n this.tabIndex = parseInt(tabIndex, 10) || 0;\n this._monitorSubscription = this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n\n this.ouiIconRegistry.addSvgIconLiteral(\n `panel-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.PANEL_ICON)\n );\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon_8X8`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON_8X8)\n );\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef.nativeElement);\n this._monitorSubscription.unsubscribe();\n }\n}\n", "assetsDirs": [], "styleUrlsData": [ { @@ -34456,7 +34613,7 @@ }, { "name": "OuiPanelIcon", - "id": "component-OuiPanelIcon-065bb74cd1fa7f57341de83af5abd480b4a05e128e287e5f54c73e268d54b3b383070ce1cfa253877356eca1debdca5c7fc6658f6f2f2690c8fd1b55a9d5486e", + "id": "component-OuiPanelIcon-319dcf3ca1c2c7cf6cd7e3d4bba379c4aa2e94e41aa061d20bff089c80142fbba6de25bd8c82eef015fcc7021d8182a8115d4fe629b75df19d3067ec60a18de4", "file": "ui/src/components/panel/panel.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -34509,7 +34666,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 197, + "line": 198, "deprecated": false, "deprecationMessage": "" } @@ -34523,7 +34680,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import {\n ChangeDetectionStrategy,\n ViewEncapsulation,\n Component,\n InjectionToken,\n Inject,\n Input,\n ViewChild,\n TemplateRef,\n OnInit,\n ContentChild,\n Output,\n EventEmitter,\n Attribute,\n NgZone,\n ElementRef,\n OnDestroy,\n} from '@angular/core';\nimport { PanelPositionX, PanelPositionY } from './panel-positions';\nimport {\n throwOuiPanelInvalidPositionX,\n throwOuiPanelInvalidPositionY,\n} from './panel-errors';\nimport { OuiPanelOverlay } from './panel-overlay';\nimport { OuiPanelContent } from './panel-content';\nimport { Subject, Observable, Subscription } from 'rxjs';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Default `oui-panel` options that can be overridden. */\nexport interface OuiPanelDefaultOptions {\n /** The x-axis position of the menu. */\n xPosition: PanelPositionX;\n\n /** The y-axis position of the menu. */\n yPosition: PanelPositionY;\n}\n\n/** Injection token to be used to override the default options for `oui-menu`. */\nexport const OUI_PANEL_DEFAULT_OPTIONS =\n new InjectionToken('oui-panel-default-options', {\n providedIn: 'root',\n factory: OUI_PANEL_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function OUI_PANEL_DEFAULT_OPTIONS_FACTORY(): OuiPanelDefaultOptions {\n return {\n xPosition: 'after',\n yPosition: 'below',\n };\n}\n\n@Component({\n selector: 'oui-panel',\n templateUrl: 'panel.html',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanel',\n})\nexport class OuiPanel implements OnInit, OuiPanelOverlay {\n private _xPosition: PanelPositionX = this._defaultOptions.xPosition;\n private _yPosition: PanelPositionY = this._defaultOptions.yPosition;\n private readonly _mouseLeave: Subject = new Subject();\n public mouseLeave: Observable;\n private readonly _mouseEnter: Subject = new Subject();\n public mouseEnter: Observable;\n public escapeEvent: Subject = new Subject();\n\n @Input() width?: number;\n\n /** Config object to be passed into the menu's ngClass */\n _classList: { [key: string]: boolean } = {};\n\n @ViewChild(TemplateRef)\n templateRef: TemplateRef;\n\n /**\n * Panel content that will be rendered lazily.\n *\n * @docs-private\n */\n @ContentChild(OuiPanelContent)\n lazyContent: OuiPanelContent;\n\n /** Event emitted when the menu is closed. */\n @Output()\n readonly closed: EventEmitter = new EventEmitter();\n\n /** Position of the menu in the X axis. */\n @Input()\n get xPosition(): PanelPositionX {\n return this._xPosition;\n }\n set xPosition(value: PanelPositionX) {\n if (value !== 'before' && value !== 'after') {\n throwOuiPanelInvalidPositionX();\n }\n this._xPosition = value;\n this.setPositionClasses();\n }\n\n /** Position of the menu in the Y axis. */\n @Input()\n get yPosition(): PanelPositionY {\n return this._yPosition;\n }\n set yPosition(value: PanelPositionY) {\n if (value !== 'above' && value !== 'below') {\n throwOuiPanelInvalidPositionY();\n }\n this._yPosition = value;\n this.setPositionClasses();\n }\n constructor(\n @Inject(OUI_PANEL_DEFAULT_OPTIONS)\n private _defaultOptions: OuiPanelDefaultOptions\n ) {\n this.mouseLeave = this._mouseLeave.asObservable();\n this.mouseEnter = this._mouseEnter.asObservable();\n }\n\n ngOnInit() {\n this.setPositionClasses();\n }\n\n /**\n * Adds classes to the panel-overlay based on its position. Can be used by\n * consumers to add specific styling based on the position.\n *\n * @param posX Position of the panel along the x axis.\n * @param posY Position of the panel along the y axis.\n * @docs-private\n */\n setPositionClasses(\n posX: PanelPositionX = this.xPosition,\n posY: PanelPositionY = this.yPosition\n ) {\n const classes = this._classList;\n classes['oui-panel-before'] = posX === 'before';\n classes['oui-panel-after'] = posX === 'after';\n classes['oui-panel-above'] = posY === 'above';\n classes['oui-panel-below'] = posY === 'below';\n }\n\n public _handleMouseLeave(event: MouseEvent) {\n this._mouseLeave.next(event);\n }\n\n public _handleMouseEnter(event: MouseEvent) {\n this._mouseEnter.next(event);\n }\n\n public _handleCloseIcon() {\n this.escapeEvent.next();\n }\n}\n\n@Component({\n selector: 'oui-panel-icon',\n template:\n '',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanelIcon',\n})\nexport class OuiPanelIcon implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n tabIndex: any;\n constructor(\n private _elementRef: ElementRef,\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Attribute('tabindex') tabIndex: string\n ) {\n this.tabIndex = parseInt(tabIndex, 10) || 0;\n this._monitorSubscription = this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n\n this.ouiIconRegistry.addSvgIconLiteral(\n `panel-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.PANEL_ICON)\n );\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon_8X8`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON_8X8)\n );\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef.nativeElement);\n this._monitorSubscription.unsubscribe();\n }\n}\n", + "sourceCode": "import {\n ChangeDetectionStrategy,\n ViewEncapsulation,\n Component,\n InjectionToken,\n Inject,\n Input,\n ViewChild,\n TemplateRef,\n OnInit,\n ContentChild,\n Output,\n EventEmitter,\n Attribute,\n NgZone,\n ElementRef,\n OnDestroy,\n} from '@angular/core';\nimport { PanelPositionX, PanelPositionY } from './panel-positions';\nimport {\n throwOuiPanelInvalidPositionX,\n throwOuiPanelInvalidPositionY,\n} from './panel-errors';\nimport { OuiPanelOverlay } from './panel-overlay';\nimport { OuiPanelContent } from './panel-content';\nimport { Subject, Observable, Subscription } from 'rxjs';\nimport { OuiIconRegistry } from '../icon/icon-registery';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ICONS } from '../core/shared/icons';\nimport { FocusMonitor } from '@angular/cdk/a11y';\n\n/** Default `oui-panel` options that can be overridden. */\nexport interface OuiPanelDefaultOptions {\n /** The x-axis position of the menu. */\n xPosition: PanelPositionX;\n\n /** The y-axis position of the menu. */\n yPosition: PanelPositionY;\n}\n\n/** Injection token to be used to override the default options for `oui-menu`. */\nexport const OUI_PANEL_DEFAULT_OPTIONS =\n new InjectionToken('oui-panel-default-options', {\n providedIn: 'root',\n factory: OUI_PANEL_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function OUI_PANEL_DEFAULT_OPTIONS_FACTORY(): OuiPanelDefaultOptions {\n return {\n xPosition: 'after',\n yPosition: 'below',\n };\n}\n\n@Component({\n selector: 'oui-panel',\n templateUrl: 'panel.html',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanel',\n})\nexport class OuiPanel implements OnInit, OuiPanelOverlay {\n private _xPosition: PanelPositionX = this._defaultOptions.xPosition;\n private _yPosition: PanelPositionY = this._defaultOptions.yPosition;\n private readonly _mouseLeave: Subject = new Subject();\n public mouseLeave: Observable;\n private readonly _mouseEnter: Subject = new Subject();\n public mouseEnter: Observable;\n public escapeEvent: Subject = new Subject();\n\n @Input() width?: number;\n\n /** Config object to be passed into the menu's ngClass */\n _classList: { [key: string]: boolean } = {};\n\n @ViewChild(TemplateRef)\n templateRef: TemplateRef;\n\n /**\n * Panel content that will be rendered lazily.\n *\n * @docs-private\n */\n @ContentChild(OuiPanelContent)\n lazyContent: OuiPanelContent;\n\n /** Event emitted when the menu is closed. */\n @Output()\n readonly closed: EventEmitter = new EventEmitter();\n\n /** Position of the menu in the X axis. */\n @Input()\n get xPosition(): PanelPositionX {\n return this._xPosition;\n }\n set xPosition(value: PanelPositionX) {\n if (value !== 'before' && value !== 'after') {\n throwOuiPanelInvalidPositionX();\n }\n this._xPosition = value;\n this.setPositionClasses();\n }\n\n /** Position of the menu in the Y axis. */\n @Input()\n get yPosition(): PanelPositionY {\n return this._yPosition;\n }\n set yPosition(value: PanelPositionY) {\n if (value !== 'above' && value !== 'below') {\n throwOuiPanelInvalidPositionY();\n }\n this._yPosition = value;\n this.setPositionClasses();\n }\n constructor(\n @Inject(OUI_PANEL_DEFAULT_OPTIONS)\n private _defaultOptions: OuiPanelDefaultOptions\n ) {\n this.mouseLeave = this._mouseLeave.asObservable();\n this.mouseEnter = this._mouseEnter.asObservable();\n }\n\n ngOnInit() {\n this.setPositionClasses();\n }\n\n /**\n * Adds classes to the panel-overlay based on its position. Can be used by\n * consumers to add specific styling based on the position.\n *\n * @param posX Position of the panel along the x axis.\n * @param posY Position of the panel along the y axis.\n * @docs-private\n */\n setPositionClasses(\n posX: PanelPositionX = this.xPosition,\n posY: PanelPositionY = this.yPosition\n ) {\n const classes = this._classList;\n classes['oui-panel-before'] = posX === 'before';\n classes['oui-panel-after'] = posX === 'after';\n classes['oui-panel-above'] = posY === 'above';\n classes['oui-panel-below'] = posY === 'below';\n }\n\n public _handleMouseLeave(event: MouseEvent) {\n this._mouseLeave.next(event);\n }\n\n public _handleMouseEnter(event: MouseEvent) {\n this._mouseEnter.next(event);\n }\n\n public _handleCloseIcon() {\n this.escapeEvent.next();\n }\n}\n\n@Component({\n selector: 'oui-panel-icon',\n template:\n '',\n styleUrls: ['panel.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'ouiPanelIcon',\n})\nexport class OuiPanelIcon implements OnDestroy {\n private _monitorSubscription: Subscription = Subscription.EMPTY;\n tabIndex: any;\n constructor(\n private _elementRef: ElementRef,\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer,\n private _focusMonitor: FocusMonitor,\n private _ngZone: NgZone,\n @Attribute('tabindex') tabIndex: string\n ) {\n this._elementRef.nativeElement.setAttribute('tabindex', '0');\n this.tabIndex = parseInt(tabIndex, 10) || 0;\n this._monitorSubscription = this._focusMonitor\n .monitor(this._elementRef, true)\n .subscribe(() => this._ngZone.run(() => {}));\n\n this.ouiIconRegistry.addSvgIconLiteral(\n `panel-icon`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.PANEL_ICON)\n );\n this.ouiIconRegistry.addSvgIconLiteral(\n `close-icon_8X8`,\n this.domSanitizer.bypassSecurityTrustHtml(ICONS.CLOSE_ICON_8X8)\n );\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this._elementRef.nativeElement);\n this._monitorSubscription.unsubscribe();\n }\n}\n", "assetsDirs": [], "styleUrlsData": [ { @@ -35494,7 +35651,7 @@ "assetsDirs": [], "styleUrlsData": [ { - "data": "@import '../../../checkbox/checkbox.scss';\r\n\r\n// The width/height of the checkbox element.\r\n$oui-checkbox-size: 16px !default;\r\n\r\n// The width of the checkbox border shown when the checkbox is unchecked.\r\n$oui-checkbox-border-width: 1px;\r\n\r\n// The base duration used for the majority of transitions for the checkbox.\r\n$oui-checkbox-transition-duration: 90ms;\r\n\r\n// Padding inside of a pseudo checkbox.\r\n$_oui-pseudo-checkbox-padding: $oui-checkbox-border-width * 2;\r\n\r\n// Size of the checkmark in a pseudo checkbox.\r\n$_oui-pseudo-checkmark-size: $oui-checkbox-size -\r\n (3.5 * $_oui-pseudo-checkbox-padding);\r\n\r\n.oui-pseudo-checkbox {\r\n width: $oui-checkbox-size;\r\n height: $oui-checkbox-size;\r\n border: $oui-checkbox-border-width solid #9c9c9c;\r\n border-radius: 3px;\r\n cursor: pointer;\r\n display: inline-block;\r\n vertical-align: middle;\r\n box-sizing: border-box;\r\n position: relative;\r\n flex-shrink: 0;\r\n transition: border-color $oui-checkbox-transition-duration\r\n $oui-linear-out-slow-in-timing-function,\r\n background-color $oui-checkbox-transition-duration\r\n $oui-linear-out-slow-in-timing-function;\r\n\r\n // Used to render the checkmark/mixedmark inside of the box.\r\n &::after {\r\n position: absolute;\r\n opacity: 0;\r\n content: '';\r\n border-bottom: $oui-checkbox-border-width * 2 solid #333;\r\n transition: opacity $oui-checkbox-transition-duration\r\n $oui-linear-out-slow-in-timing-function;\r\n }\r\n}\r\n\r\n.oui-pseudo-checkbox-disabled {\r\n cursor: default;\r\n}\r\n\r\n.oui-pseudo-checkbox-checked::after {\r\n top: ($oui-checkbox-size * 0.5) - ($_oui-pseudo-checkmark-size * 0.25) -\r\n ($oui-checkbox-size * 0.1) - $oui-checkbox-border-width;\r\n left: $_oui-pseudo-checkbox-padding - $oui-checkbox-border-width * 0.5;\r\n width: 10px;\r\n height: 6px;\r\n border-left: $oui-checkbox-border-width * 2 solid #333;\r\n transform: rotate(-45deg);\r\n opacity: 1;\r\n}\r\n", + "data": "@import '../../../checkbox/checkbox.scss';\n\n// The width/height of the checkbox element.\n$oui-checkbox-size: 16px !default;\n\n// The width of the checkbox border shown when the checkbox is unchecked.\n$oui-checkbox-border-width: 1px;\n\n// The base duration used for the majority of transitions for the checkbox.\n$oui-checkbox-transition-duration: 90ms;\n\n// Padding inside of a pseudo checkbox.\n$_oui-pseudo-checkbox-padding: $oui-checkbox-border-width * 2;\n\n// Size of the checkmark in a pseudo checkbox.\n$_oui-pseudo-checkmark-size: $oui-checkbox-size -\n (3.5 * $_oui-pseudo-checkbox-padding);\n\n.oui-pseudo-checkbox {\n width: $oui-checkbox-size;\n height: $oui-checkbox-size;\n border: $oui-checkbox-border-width solid #9c9c9c;\n border-radius: 3px;\n cursor: pointer;\n display: inline-block;\n vertical-align: middle;\n box-sizing: border-box;\n position: relative;\n flex-shrink: 0;\n transition: border-color $oui-checkbox-transition-duration\n $oui-linear-out-slow-in-timing-function,\n background-color $oui-checkbox-transition-duration\n $oui-linear-out-slow-in-timing-function;\n\n // Used to render the checkmark/mixedmark inside of the box.\n &::after {\n content: '';\n display: block;\n position: absolute;\n box-sizing: border-box;\n transform: rotate(-45deg);\n border-bottom: 2px solid #333;\n border-left: 2px solid #333;\n top: ($oui-checkbox-size * 0.5) - ($_oui-pseudo-checkmark-size * 0.25) -\n ($oui-checkbox-size * 0.05) - $oui-checkbox-border-width;\n left: 2px;\n width: 10px;\n height: 5px;\n transition: opacity 90ms $oui-linear-out-slow-in-timing-function;\n opacity: 0;\n }\n}\n\n.oui-pseudo-checkbox-disabled {\n cursor: default;\n}\n\n.oui-pseudo-checkbox-checked::after {\n opacity: 1;\n}\n", "styleUrl": "pseudo-checkbox.scss" } ], @@ -37395,7 +37552,7 @@ "assetsDirs": [], "styleUrlsData": [ { - "data": ".oui-scrollbar-container::-webkit-scrollbar {\r\n width: 10px;\r\n}\r\n.oui-scrollbar-container::-webkit-scrollbar-track {\r\n display: none;\r\n}\r\n.oui-scrollbar-container::-webkit-scrollbar-thumb {\r\n background-color: #ccc !important;\r\n border: 2px #fff solid;\r\n border-radius: 15px;\r\n}\r\n.oui-scrollbar-container-large::-webkit-scrollbar {\r\n width: 16px;\r\n}\r\n.oui-scrollbar-container-large::-webkit-scrollbar-thumb {\r\n border: 4px #fff solid !important;\r\n}\r\n\r\n.oui-scrollbar-container {\r\n overflow-y: auto;\r\n scrollbar-color: #ccc transparent;\r\n scrollbar-width: thin;\r\n}\r\n", + "data": ".oui-scrollbar-container {\n overflow-y: auto;\n &::-webkit-scrollbar {\n width: 10px;\n }\n &::-webkit-scrollbar-track {\n display: none;\n }\n &::-webkit-scrollbar-thumb {\n background-color: #ccc !important;\n border: 2px #fff solid;\n border-radius: 15px;\n }\n}\n.oui-scrollbar-container-large {\n &::-webkit-scrollbar {\n width: 16px;\n }\n &::-webkit-scrollbar-thumb {\n border: 4px #fff solid !important;\n }\n}\n\n.oui-scrollbar-container {\n /* Standardized Properties */\n @supports not selector(::-webkit-scrollbar) {\n scrollbar-color: #ccc transparent;\n scrollbar-width: thin;\n }\n}\n", "styleUrl": "scrollbar.scss" } ], @@ -37616,7 +37773,7 @@ }, { "name": "OuiSelect", - "id": "component-OuiSelect-69627b742fec8101b0c412f353bb903b4d499f0f8291080ef1d6ac0c418484f2235fec3981e84104b948fe2f242b0a29fea2c39687b9ed9b01e6aa4fcda7ba37", + "id": "component-OuiSelect-08d5ca0d9e57fe0b53fd1a332196d178df30100ca9fb0087259f4b8a1ae16a1016170481f04d33ecca5ee382a48196b5a882bb369fc5cad3a4a4f2d289256b1b", "file": "ui/src/components/select/select.component.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -37656,7 +37813,17 @@ "deprecationMessage": "", "rawdescription": "\nWhether the action items are required and use saveSelectionChange instead of selectionChange.", "description": "

Whether the action items are required and use saveSelectionChange instead of selectionChange.

\n", - "line": 489, + "line": 548, + "type": "boolean", + "decorators": [] + }, + { + "name": "allowNoSelection", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nWhether the user should be allowed to select no option in case of multiple options.", + "description": "

Whether the user should be allowed to select no option in case of multiple options.

\n", + "line": 539, "type": "boolean", "decorators": [] }, @@ -37667,7 +37834,7 @@ "deprecationMessage": "", "rawdescription": "\nAria label of the select. If not specified, the placeholder will be used as label.", "description": "

Aria label of the select. If not specified, the placeholder will be used as label.

\n", - "line": 338, + "line": 354, "type": "string", "decorators": [] }, @@ -37677,7 +37844,17 @@ "deprecationMessage": "", "rawdescription": "\nInput that can be used to specify the `aria-labelledby` attribute.", "description": "

Input that can be used to specify the aria-labelledby attribute.

\n", - "line": 341, + "line": 357, + "type": "string", + "decorators": [] + }, + { + "name": "cancelLabel", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nIn case of multiple the cancelLabel to be shown on cancel action button.", + "description": "

In case of multiple the cancelLabel to be shown on cancel action button.

\n", + "line": 486, "type": "string", "decorators": [] }, @@ -37687,7 +37864,7 @@ "deprecationMessage": "", "rawdescription": "\n\nFunction to compare the option values with the selected values. The first argument\nis a value from an option. The second is a value from the selection. A boolean\nshould be returned.\n", "description": "

Function to compare the option values with the selected values. The first argument\nis a value from an option. The second is a value from the selection. A boolean\nshould be returned.

\n", - "line": 514, + "line": 582, "type": "(o1: any, o2: any) => boolean", "decorators": [] }, @@ -37697,17 +37874,27 @@ "deprecationMessage": "", "rawdescription": "\nWhether to center the active option over the trigger.", "description": "

Whether to center the active option over the trigger.

\n", - "line": 501, + "line": 569, "type": "boolean", "decorators": [] }, + { + "name": "doneLabel", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nIn case of multiple the doneLabel to be shown on apply action button.", + "description": "

In case of multiple the doneLabel to be shown on apply action button.

\n", + "line": 496, + "type": "string", + "decorators": [] + }, { "name": "errorStateMatcher", "deprecated": false, "deprecationMessage": "", "rawdescription": "\nObject used to control when error messages are shown.", "description": "

Object used to control when error messages are shown.

\n", - "line": 384, + "line": 400, "type": "ErrorStateMatcher", "decorators": [] }, @@ -37717,7 +37904,7 @@ "deprecationMessage": "", "rawdescription": "\nUnique id of the element.", "description": "

Unique id of the element.

\n", - "line": 542, + "line": 610, "type": "string", "decorators": [] }, @@ -37727,7 +37914,7 @@ "deprecationMessage": "", "rawdescription": "\nWhether the oui-select is of large size.", "description": "

Whether the oui-select is of large size.

\n", - "line": 347, + "line": 363, "type": "boolean", "decorators": [] }, @@ -37737,7 +37924,7 @@ "deprecationMessage": "", "rawdescription": "\nWhether the user should be allowed to select multiple options.", "description": "

Whether the user should be allowed to select multiple options.

\n", - "line": 476, + "line": 526, "type": "boolean", "decorators": [] }, @@ -37747,7 +37934,7 @@ "deprecationMessage": "", "rawdescription": "\nClasses to be passed to the select panel. Supports the same syntax as `ngClass`.", "description": "

Classes to be passed to the select panel. Supports the same syntax as ngClass.

\n", - "line": 426, + "line": 446, "type": "string | string[] | Set | literal type", "decorators": [] }, @@ -37757,7 +37944,7 @@ "deprecationMessage": "", "rawdescription": "\nPlaceholder to be shown if no value has been selected.", "description": "

Placeholder to be shown if no value has been selected.

\n", - "line": 456, + "line": 476, "type": "string", "decorators": [] }, @@ -37767,7 +37954,7 @@ "deprecationMessage": "", "rawdescription": "\nWhether the component is required.", "description": "

Whether the component is required.

\n", - "line": 466, + "line": 516, "type": "boolean", "decorators": [] }, @@ -37782,13 +37969,31 @@ "type": "{}", "decorators": [] }, + { + "name": "singleActionItem", + "deprecated": false, + "deprecationMessage": "", + "line": 559, + "type": "boolean", + "decorators": [] + }, + { + "name": "singleActionLabel", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nIn case of singleSelect and multiSelect the singleActionLabel to be shown on actionItem.", + "description": "

In case of singleSelect and multiSelect the singleActionLabel to be shown on actionItem.

\n", + "line": 506, + "type": "string", + "decorators": [] + }, { "name": "sortComparator", "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nFunction used to sort the values in a select in multiple mode.\nFollows the same logic as `Array.prototype.sort`.\n", "description": "

Function used to sort the values in a select in multiple mode.\nFollows the same logic as Array.prototype.sort.

\n", - "line": 331, + "line": 347, "type": "function", "decorators": [] }, @@ -37798,7 +38003,7 @@ "deprecationMessage": "", "rawdescription": "\nValue of the select control.", "description": "

Value of the select control.

\n", - "line": 530, + "line": 598, "type": "any", "decorators": [] } @@ -37811,7 +38016,7 @@ "deprecationMessage": "", "rawdescription": "\nEvent emitted when the select has been closed.", "description": "

Event emitted when the select has been closed.

\n", - "line": 401, + "line": 417, "type": "Observable" }, { @@ -37821,7 +38026,7 @@ "deprecationMessage": "", "rawdescription": "\nEvent emitted when the select has been opened.", "description": "

Event emitted when the select has been opened.

\n", - "line": 393, + "line": 409, "type": "Observable" }, { @@ -37831,7 +38036,7 @@ "deprecationMessage": "", "rawdescription": "\nEvent emitted when the select panel has been toggled.", "description": "

Event emitted when the select panel has been toggled.

\n", - "line": 359, + "line": 375, "type": "EventEmitter" }, { @@ -37841,7 +38046,7 @@ "deprecationMessage": "", "rawdescription": "\nEvent emitted when the selected value has been changed and saved by the user.", "description": "

Event emitted when the selected value has been changed and saved by the user.

\n", - "line": 415, + "line": 431, "type": "EventEmitter" }, { @@ -37851,9 +38056,19 @@ "deprecationMessage": "", "rawdescription": "\nEvent emitted when the selected value has been changed by the user.", "description": "

Event emitted when the selected value has been changed by the user.

\n", - "line": 410, + "line": 426, "type": "EventEmitter" }, + { + "name": "singleSelectionChange", + "defaultValue": "new EventEmitter()", + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nCan pass any method to be triggered on singleActionItem click.", + "description": "

Can pass any method to be triggered on singleActionItem click.

\n", + "line": 436, + "type": "EventEmitter" + }, { "name": "valueChange", "defaultValue": "new EventEmitter()", @@ -37863,15 +38078,15 @@ "description": "

Event that emits whenever the raw value of the select changes. This is here primarily\nto facilitate the two-way binding for the value input.

\n", "jsdoctags": [ { - "pos": 11538, - "end": 11556, + "pos": 12232, + "end": 12250, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, "kind": 334, "tagName": { - "pos": 11539, - "end": 11551, + "pos": 12233, + "end": 12245, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -37881,7 +38096,7 @@ "comment": "" } ], - "line": 381, + "line": 397, "type": "EventEmitter" } ], @@ -37900,6 +38115,20 @@ 123 ] }, + { + "name": "_allowNoSelection", + "defaultValue": "false", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "optional": false, + "description": "

In multiple selection mode, enable Done button even in case of no option selected

\n", + "line": 253, + "rawdescription": "\nIn multiple selection mode, enable Done button even in case of no option selected", + "modifierKind": [ + 123 + ] + }, { "name": "_ariaDescribedby", "deprecated": false, @@ -37907,9 +38136,23 @@ "type": "string", "optional": false, "description": "

The aria-describedby attribute on the select for improved a11y.

\n", - "line": 252, + "line": 265, "rawdescription": "\nThe aria-describedby attribute on the select for improved a11y." }, + { + "name": "_cancelLabel", + "defaultValue": "'Cancel'", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "

The label displayed on the cancel button of the select in case of multi-select.

\n", + "line": 241, + "rawdescription": "\nThe label displayed on the cancel button of the select in case of multi-select.", + "modifierKind": [ + 123 + ] + }, { "name": "_compareWith", "defaultValue": "() => {...}", @@ -37918,7 +38161,7 @@ "type": "", "optional": false, "description": "

Comparison function to specify which option is displayed. Defaults to object equality.

\n", - "line": 436, + "line": 456, "rawdescription": "\nComparison function to specify which option is displayed. Defaults to object equality.", "modifierKind": [ 123 @@ -37932,7 +38175,7 @@ "type": "", "optional": false, "description": "

Emits whenever the component is destroyed.

\n", - "line": 303, + "line": 316, "rawdescription": "\nEmits whenever the component is destroyed.", "modifierKind": [ 123, @@ -37947,12 +38190,26 @@ "type": "", "optional": false, "description": "

Whether the component is disabling centering of the active option over the trigger.

\n", - "line": 306, + "line": 319, "rawdescription": "\nWhether the component is disabling centering of the active option over the trigger.", "modifierKind": [ 123 ] }, + { + "name": "_doneLabel", + "defaultValue": "'Done'", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "

The label displayed on the done button of the select in case of multi-select.

\n", + "line": 244, + "rawdescription": "\nThe label displayed on the done button of the select in case of multi-select.", + "modifierKind": [ + 123 + ] + }, { "name": "_elementRef", "deprecated": false, @@ -37960,7 +38217,7 @@ "type": "ElementRef", "optional": false, "description": "", - "line": 563, + "line": 631, "modifierKind": [ 125 ] @@ -37973,7 +38230,7 @@ "type": "", "optional": false, "description": "", - "line": 308, + "line": 321, "modifierKind": [ 123 ] @@ -37985,7 +38242,7 @@ "type": "string", "optional": false, "description": "", - "line": 355, + "line": 371, "modifierKind": [ 123 ] @@ -37997,7 +38254,7 @@ "type": "ActiveDescendantKeyManager", "optional": false, "description": "

Manages keyboard events for options in the panel.

\n", - "line": 261, + "line": 274, "rawdescription": "\nManages keyboard events for options in the panel." }, { @@ -38008,7 +38265,7 @@ "type": "", "optional": false, "description": "", - "line": 342, + "line": 358, "modifierKind": [ 123 ] @@ -38020,7 +38277,7 @@ "type": "any", "optional": false, "description": "", - "line": 343 + "line": 359 }, { "name": "_multiple", @@ -38030,7 +38287,7 @@ "type": "", "optional": false, "description": "

Whether the component is in multiple selection mode.

\n", - "line": 240, + "line": 250, "rawdescription": "\nWhether the component is in multiple selection mode.", "modifierKind": [ 123 @@ -38044,7 +38301,7 @@ "type": "number", "optional": false, "description": "

The y-offset of the overlay panel in relation to the trigger's top start corner.\nThis must be adjusted to align the selected option text over the trigger text.\nwhen the panel opens. Will change based on the y-position of the selected option.

\n", - "line": 280, + "line": 293, "rawdescription": "\n\nThe y-offset of the overlay panel in relation to the trigger's top start corner.\nThis must be adjusted to align the selected option text over the trigger text.\nwhen the panel opens. Will change based on the y-position of the selected option.\n" }, { @@ -38055,7 +38312,7 @@ "type": "function", "optional": false, "description": "

View -> model callback called when value changes

\n", - "line": 449, + "line": 469, "rawdescription": "\n`View -> model callback called when value changes`" }, { @@ -38066,7 +38323,7 @@ "type": "", "optional": false, "description": "

View -> model callback called when select has been touched

\n", - "line": 452, + "line": 472, "rawdescription": "\n`View -> model callback called when select has been touched`" }, { @@ -38077,7 +38334,7 @@ "type": "string", "optional": false, "description": "

The IDs of child options to be passed to the aria-owns attribute.

\n", - "line": 264, + "line": 277, "rawdescription": "\nThe IDs of child options to be passed to the aria-owns attribute." }, { @@ -38087,7 +38344,7 @@ "type": "OuiIconRegistry", "optional": false, "description": "", - "line": 564, + "line": 632, "modifierKind": [ 125 ] @@ -38100,7 +38357,7 @@ "type": "", "optional": false, "description": "

Emits when the panel element is finished transforming in.

\n", - "line": 433, + "line": 453, "rawdescription": "\nEmits when the panel element is finished transforming in." }, { @@ -38124,7 +38381,7 @@ "type": "string", "optional": false, "description": "

The placeholder displayed in the trigger of the select.

\n", - "line": 237, + "line": 238, "rawdescription": "\nThe placeholder displayed in the trigger of the select.", "modifierKind": [ 123 @@ -38138,7 +38395,7 @@ "type": "[]", "optional": false, "description": "

This position config ensures that the top "start" corner of the overlay\nis aligned with with the top "start" of the origin by default (overlapping\nthe trigger completely). If the panel cannot fit below the trigger, it\nwill fall back to a position above the trigger.

\n", - "line": 288, + "line": 301, "rawdescription": "\n\nThis position config ensures that the top \"start\" corner of the overlay\nis aligned with with the top \"start\" of the origin by default (overlapping\nthe trigger completely). If the panel cannot fit below the trigger, it\nwill fall back to a position above the trigger.\n" }, { @@ -38163,7 +38420,7 @@ "type": "number", "optional": false, "description": "

The scroll position of the overlay panel, calculated to center the selected option.

\n", - "line": 234, + "line": 235, "rawdescription": "\nThe scroll position of the overlay panel, calculated to center the selected option.", "modifierKind": [ 123 @@ -38176,9 +38433,36 @@ "type": "SelectionModel", "optional": false, "description": "

Deals with the selection logic.

\n", - "line": 258, + "line": 271, "rawdescription": "\nDeals with the selection logic." }, + { + "name": "_singleActionItems", + "defaultValue": "false", + "deprecated": false, + "deprecationMessage": "", + "type": "", + "optional": false, + "description": "", + "line": 232, + "modifierKind": [ + 123 + ] + }, + { + "name": "_singleActionLabel", + "defaultValue": "'New action button'", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "

The label displayed on the singleSelect and multiSelect of the select as a actionItem.

\n", + "line": 247, + "rawdescription": "\nThe label displayed on the singleSelect and multiSelect of the select as a actionItem.", + "modifierKind": [ + 123 + ] + }, { "name": "_transformOrigin", "defaultValue": "'top'", @@ -38187,7 +38471,7 @@ "type": "string", "optional": false, "description": "

The value of the select panel's transform-origin property.

\n", - "line": 267, + "line": 280, "rawdescription": "\nThe value of the select panel's transform-origin property." }, { @@ -38198,7 +38482,7 @@ "type": "number", "optional": false, "description": "

The cached font-size of the trigger element.

\n", - "line": 255, + "line": 268, "rawdescription": "\nThe cached font-size of the trigger element." }, { @@ -38208,7 +38492,7 @@ "type": "ClientRect", "optional": false, "description": "

The last measured value for the trigger's client bounding rect.

\n", - "line": 249, + "line": 262, "rawdescription": "\nThe last measured value for the trigger's client bounding rect." }, { @@ -38219,7 +38503,7 @@ "type": "", "optional": false, "description": "

Unique id for this input.

\n", - "line": 246, + "line": 259, "rawdescription": "\nUnique id for this input.", "modifierKind": [ 123 @@ -38232,7 +38516,7 @@ "type": "any", "optional": false, "description": "", - "line": 325, + "line": 341, "modifierKind": [ 123 ] @@ -38245,7 +38529,7 @@ "type": "string", "optional": false, "description": "

Adding top class to overlay panel

\n", - "line": 273, + "line": 286, "rawdescription": "\nAdding top class to overlay panel" }, { @@ -38256,7 +38540,7 @@ "type": "string", "optional": false, "description": "

A name for this control that can be used by oui-form-field.

\n", - "line": 311, + "line": 324, "rawdescription": "\nA name for this control that can be used by `oui-form-field`." }, { @@ -38266,7 +38550,7 @@ "type": "OuiSelectTrigger", "optional": false, "description": "

User-supplied override of the trigger element.

\n", - "line": 423, + "line": 443, "rawdescription": "\nUser-supplied override of the trigger element.", "decorators": [ { @@ -38285,7 +38569,7 @@ "type": "ElementRef", "optional": false, "description": "

Trigger that opens the select.

\n", - "line": 317, + "line": 330, "rawdescription": "\nTrigger that opens the select.", "decorators": [ { @@ -38304,7 +38588,7 @@ "type": "ElementRef", "optional": false, "description": "

Trigger that opens the select.

\n", - "line": 320, + "line": 333, "rawdescription": "\nTrigger that opens the select.", "decorators": [ { @@ -38334,7 +38618,7 @@ "type": "boolean", "optional": false, "description": "

Search input field

\n", - "line": 243, + "line": 256, "rawdescription": "\nSearch input field" }, { @@ -38344,7 +38628,7 @@ "type": "NgControl", "optional": false, "description": "", - "line": 560, + "line": 628, "decorators": [ { "name": "Self", @@ -38368,7 +38652,7 @@ "type": "QueryList", "optional": false, "description": "

All of the defined groups of options.

\n", - "line": 419, + "line": 439, "rawdescription": "\nAll of the defined groups of options.", "decorators": [ { @@ -38387,7 +38671,7 @@ "type": "QueryList", "optional": false, "description": "

All of the defined select options.

\n", - "line": 388, + "line": 404, "rawdescription": "\nAll of the defined select options.", "decorators": [ { @@ -38407,7 +38691,7 @@ "type": "Observable", "optional": false, "description": "

Combined stream of all of the child options' change events.

\n", - "line": 362, + "line": 378, "rawdescription": "\nCombined stream of all of the child options' change events.", "modifierKind": [ 148 @@ -38420,7 +38704,7 @@ "type": "string", "optional": false, "description": "

If there is search input field a class is added dynamically to the perfect scrollbar

\n", - "line": 270, + "line": 283, "rawdescription": "\nIf there is search input field a class is added dynamically to the perfect scrollbar" }, { @@ -38430,7 +38714,7 @@ "type": "CdkConnectedOverlay", "optional": false, "description": "

Overlay pane containing the options.

\n", - "line": 430, + "line": 450, "rawdescription": "\nOverlay pane containing the options.", "decorators": [ { @@ -38449,7 +38733,7 @@ "type": "ElementRef", "optional": false, "description": "

Panel containing the select options.

\n", - "line": 323, + "line": 339, "rawdescription": "\nPanel containing the select options.", "decorators": [ { @@ -38461,6 +38745,25 @@ 170 ] }, + { + "name": "singleButton", + "deprecated": false, + "deprecationMessage": "", + "type": "ElementRef", + "optional": false, + "description": "

Trigger that opens the select.

\n", + "line": 336, + "rawdescription": "\nTrigger that opens the select.", + "decorators": [ + { + "name": "ViewChild", + "stringifiedArguments": "'singleButton', {read: ElementRef}" + } + ], + "modifierKind": [ + 170 + ] + }, { "name": "trigger", "deprecated": false, @@ -38468,7 +38771,7 @@ "type": "ElementRef", "optional": false, "description": "

Trigger that opens the select.

\n", - "line": 314, + "line": 327, "rawdescription": "\nTrigger that opens the select.", "decorators": [ { @@ -38488,7 +38791,7 @@ "optional": false, "returnType": "string | null", "typeParameters": [], - "line": 1303, + "line": 1436, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nDetermines the `aria-activedescendant` to be set on the host.", @@ -38500,7 +38803,7 @@ "optional": false, "returnType": "string | null", "typeParameters": [], - "line": 1287, + "line": 1420, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReturns the aria-label of the select component.", @@ -38512,7 +38815,7 @@ "optional": false, "returnType": "string | null", "typeParameters": [], - "line": 1294, + "line": 1427, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReturns the aria-labelledby of the select component.", @@ -38524,7 +38827,7 @@ "optional": false, "returnType": "string", "typeParameters": [], - "line": 1019, + "line": 1129, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReturns the theme to be used on the panel.", @@ -38536,7 +38839,7 @@ "optional": false, "returnType": "number", "typeParameters": [], - "line": 1429, + "line": 1592, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReturns the panel's scrollTop.", @@ -38555,7 +38858,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 790, + "line": 864, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHandles keyboard events while the select is closed.", @@ -38588,7 +38891,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 781, + "line": 853, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHandles all keydown events on the select.", @@ -38618,7 +38921,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 890, + "line": 996, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHandles keyboard events when the selected is open.", @@ -38644,7 +38947,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1255, + "line": 1388, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nHighlights the selected item. If no option is selected, it will highlight\nthe first item instead.\n", @@ -38659,7 +38962,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1270, + "line": 1403, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nHighlights the first of the filtered options if no element is currently highlighted\n", @@ -38674,7 +38977,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1042, + "line": 1152, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -38687,7 +38990,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1108, + "line": 1218, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nSets up a key manager to listen to keyboard events on the overlay panel.", @@ -38696,13 +38999,28 @@ 123 ] }, + { + "name": "_isDoneButtonDisabled", + "args": [], + "optional": false, + "returnType": "boolean", + "typeParameters": [], + "line": 1334, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nDetermine whether the \"Done\" button should be enabled or disabled based on the selection state", + "description": "

Determine whether the "Done" button should be enabled or disabled based on the selection state

\n", + "modifierKind": [ + 123 + ] + }, { "name": "_isRtl", "args": [], "optional": false, "returnType": "boolean", "typeParameters": [], - "line": 776, + "line": 848, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nWhether the element is in RTL mode.", @@ -38714,7 +39032,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1010, + "line": 1120, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nCallback that is invoked when the overlay panel has been attached.\n", @@ -38726,7 +39044,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 996, + "line": 1106, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nCalls the touched callback only if the panel is closed. Otherwise, the trigger will\n\"blur\" to the panel when it opens, causing a false positive.\n", @@ -38738,7 +39056,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 985, + "line": 1095, "deprecated": false, "deprecationMessage": "" }, @@ -38761,7 +39079,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1164, + "line": 1276, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nInvoked when an option is clicked.", @@ -38804,7 +39122,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1226, + "line": 1359, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nEmits change event to set the model value.", @@ -38831,7 +39149,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1137, + "line": 1249, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nDrops current option subscriptions and IDs and resets from scratch.", @@ -38846,7 +39164,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1400, + "line": 1529, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nGiven that we are not actually focusing active options, we must manually adjust scroll\nto reveal options below the fold. First, we find the offset of the option from the top\nof the panel. If that offset is below the fold, the new scrollTop will be the offset -\nthe panel height + the option height, so the active option will be just visible at the\nbottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\nwill become the offset. If that offset is visible within the panel already, the scrollTop is\nnot adjusted.\n", @@ -38868,7 +39186,7 @@ "optional": false, "returnType": "OuiOption | undefined", "typeParameters": [], - "line": 1086, + "line": 1196, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nFinds and selects and option based on its value.\n\n", @@ -38888,8 +39206,8 @@ }, { "tagName": { - "pos": 33560, - "end": 33567, + "pos": 37039, + "end": 37046, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -38906,7 +39224,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1247, + "line": 1380, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nRecords option IDs to pass to the aria-owns property.", @@ -38921,7 +39239,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1025, + "line": 1135, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nSets the pseudo checkbox padding size based on the width of the pseudo checkbox.", @@ -38943,7 +39261,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1422, + "line": 1584, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nSets the panel scrollTop. This allows us to manually scroll to display options\nabove or below the fold, as they are not actually being focused when active.\n", @@ -38965,7 +39283,7 @@ "args": [ { "name": "value", - "type": "any | any[]", + "type": "any", "deprecated": false, "deprecationMessage": "" } @@ -38973,7 +39291,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1060, + "line": 1170, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nSets the selected option based on a value. If no option can be\nfound with the designated value, the select trigger is cleared.\n", @@ -38984,7 +39302,7 @@ "jsdoctags": [ { "name": "value", - "type": "any | any[]", + "type": "any", "deprecated": false, "deprecationMessage": "", "tagName": { @@ -38999,7 +39317,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1212, + "line": 1345, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nSorts the selected values in the selected based on their order in the panel.", @@ -39014,7 +39332,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 685, + "line": 757, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nCloses the overlay panel and focuses the host element.", @@ -39026,7 +39344,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1199, + "line": 1315, "deprecated": false, "deprecationMessage": "" }, @@ -39036,7 +39354,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1205, + "line": 1321, "deprecated": false, "deprecationMessage": "" }, @@ -39046,7 +39364,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1282, + "line": 1415, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nFocuses the select element.", @@ -39058,7 +39376,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 933, + "line": 1039, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nHandle ctrl key\n", @@ -39098,7 +39416,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 951, + "line": 1061, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\n", @@ -39109,8 +39427,8 @@ "jsdoctags": [ { "name": { - "pos": 29336, - "end": 29343, + "pos": 32823, + "end": 32830, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39121,8 +39439,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 29330, - "end": 29335, + "pos": 32817, + "end": 32822, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39133,8 +39451,8 @@ }, { "name": { - "pos": 29357, - "end": 29362, + "pos": 32844, + "end": 32849, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39145,8 +39463,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 29351, - "end": 29356, + "pos": 32838, + "end": 32843, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39157,8 +39475,8 @@ }, { "name": { - "pos": 29376, - "end": 29386, + "pos": 32863, + "end": 32873, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39169,8 +39487,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 29370, - "end": 29375, + "pos": 32857, + "end": 32862, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39181,8 +39499,8 @@ }, { "name": { - "pos": 29400, - "end": 29407, + "pos": 32887, + "end": 32894, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39193,8 +39511,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 29394, - "end": 29399, + "pos": 32881, + "end": 32886, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39205,6 +39523,16 @@ } ] }, + { + "name": "handleSingleActionItemClick", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 1328, + "deprecated": false, + "deprecationMessage": "" + }, { "name": "homeOrEndPressed", "args": [ @@ -39224,7 +39552,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 872, + "line": 976, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHome || End keys pressed", @@ -39256,7 +39584,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 615, + "line": 683, "deprecated": false, "deprecationMessage": "" }, @@ -39266,7 +39594,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 633, + "line": 701, "deprecated": false, "deprecationMessage": "" }, @@ -39283,7 +39611,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 639, + "line": 707, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -39304,7 +39632,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 647, + "line": 715, "deprecated": false, "deprecationMessage": "" }, @@ -39314,7 +39642,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 594, + "line": 662, "deprecated": false, "deprecationMessage": "" }, @@ -39324,7 +39652,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1325, + "line": 1458, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nImplemented as part of OuiFormFieldControl.\n\n", @@ -39337,7 +39665,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 661, + "line": 733, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nOpens the overlay panel.", @@ -39349,7 +39677,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1350, + "line": 1483, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nCustom overlay class for cdk overlay container\n", @@ -39361,7 +39689,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1343, + "line": 1476, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nAdd outer class to perfect scrollbar\nThis is added only when there is a search field\n", @@ -39388,7 +39716,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 718, + "line": 790, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nSaves a callback function to be invoked when the select's value\nchanges from user input. Part of the ControlValueAccessor interface\nrequired to integrate with Angular's core forms API.\n\n", @@ -39396,8 +39724,8 @@ "jsdoctags": [ { "name": { - "pos": 21875, - "end": 21877, + "pos": 24116, + "end": 24118, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39416,8 +39744,8 @@ } ], "tagName": { - "pos": 21869, - "end": 21874, + "pos": 24110, + "end": 24115, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39442,7 +39770,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 729, + "line": 801, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nSaves a callback function to be invoked when the select is blurred\nby the user. Part of the ControlValueAccessor interface required\nto integrate with Angular's core forms API.\n\n", @@ -39450,8 +39778,8 @@ "jsdoctags": [ { "name": { - "pos": 22241, - "end": 22243, + "pos": 24482, + "end": 24484, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39463,8 +39791,8 @@ "deprecationMessage": "", "function": [], "tagName": { - "pos": 22235, - "end": 22240, + "pos": 24476, + "end": 24481, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39488,7 +39816,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1376, + "line": 1505, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -39509,7 +39837,7 @@ "optional": false, "returnType": "boolean", "typeParameters": [], - "line": 881, + "line": 987, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nCheck if search input field is present in select box", @@ -39528,7 +39856,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 1316, + "line": 1449, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nImplemented as part of OuiFormFieldControl.\n\n", @@ -39558,7 +39886,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 739, + "line": 811, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nDisables the select. Part of the ControlValueAccessor interface required\nto integrate with Angular's core forms API.\n\n", @@ -39566,8 +39894,8 @@ "jsdoctags": [ { "name": { - "pos": 22545, - "end": 22555, + "pos": 24786, + "end": 24796, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39578,8 +39906,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 22539, - "end": 22544, + "pos": 24780, + "end": 24785, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39590,6 +39918,36 @@ } ] }, + { + "name": "singleTabKeySelection", + "args": [ + { + "name": "singleButtonFocused", + "type": "", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 896, + "deprecated": false, + "deprecationMessage": "", + "rawdescription": "\nOn Tab key press select the buttons at the bottom if singleActionItem is enabled", + "description": "

On Tab key press select the buttons at the bottom if singleActionItem is enabled

\n", + "jsdoctags": [ + { + "name": "singleButtonFocused", + "type": "", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "tabbedKeyMethod", "args": [ @@ -39603,7 +39961,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 854, + "line": 947, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHandles TAB press when panel is open to focus the cancel || done button", @@ -39639,7 +39997,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 820, + "line": 913, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nOn Tab key press select the buttons at the bottom if actionItems is enabled and searchbar", @@ -39674,7 +40032,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 656, + "line": 724, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nToggles the overlay panel open or closed.", @@ -39693,7 +40051,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 705, + "line": 777, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nSets the select's value. Part of the ControlValueAccessor interface\nrequired to integrate with Angular's core forms API.\n\n", @@ -39701,8 +40059,8 @@ "jsdoctags": [ { "name": { - "pos": 21481, - "end": 21486, + "pos": 23722, + "end": 23727, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39713,8 +40071,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 21475, - "end": 21480, + "pos": 23716, + "end": 23721, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -39735,11 +40093,11 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import { ActiveDescendantKeyManager, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { SelectionModel } from '@angular/cdk/collections';\r\nimport {\r\n A,\r\n DOWN_ARROW,\r\n END,\r\n ENTER,\r\n HOME,\r\n LEFT_ARROW,\r\n RIGHT_ARROW,\r\n SPACE,\r\n UP_ARROW,\r\n hasModifierKey,\r\n TAB,\r\n} from '@angular/cdk/keycodes';\r\nimport { CdkConnectedOverlay } from '@angular/cdk/overlay';\r\nimport {\r\n AfterContentInit,\r\n Attribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n ContentChildren,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n isDevMode,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n QueryList,\r\n Self,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n Inject,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n} from '@angular/forms';\r\nimport {\r\n _countGroupLabelsBeforeOption,\r\n _getOptionScrollPosition,\r\n CanDisable,\r\n CanDisableCtor,\r\n CanUpdateErrorState,\r\n CanUpdateErrorStateCtor,\r\n HasTabIndex,\r\n HasTabIndexCtor,\r\n OuiOptionSelectionChange,\r\n mixinErrorState,\r\n mixinTabIndex,\r\n mixinDisabled,\r\n} from '../core';\r\nimport { OuiFormField, OuiFormFieldControl } from '../form-field/public-api';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { OUI_OPTION_PARENT_COMPONENT, OuiOption } from '../core/option/option';\r\nimport { OuiOptgroup } from '../core/option/optgroup';\r\nimport { ErrorStateMatcher } from '../core/error/error-options';\r\nimport { defer, merge, Observable, Subject } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n filter,\r\n map,\r\n startWith,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n} from 'rxjs/operators';\r\nimport {\r\n getOuiSelectDynamicMultipleError,\r\n getOuiSelectNonArrayValueError,\r\n getOuiSelectNonFunctionValueError,\r\n} from './select-errors';\r\nimport { OuiIconRegistry } from '../icon/icon-registery';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ICONS } from '../core/shared/icons';\r\n\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * The following style constants are necessary to save here in order\r\n * to properly calculate the alignment of the selected option over\r\n * the trigger element.\r\n */\r\n\r\n/** The height of each select option. */\r\nexport const SELECT_OPTION_HEIGHT = 40;\r\n\r\n/** The panel's padding on the x-axis */\r\nexport const SELECT_PANEL_PADDING_X = 16;\r\n\r\n/** The panel's x axis padding if it is indented (e.g. there is an option group). */\r\nexport const SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;\r\n\r\n/** The height of the select items in `em` units. */\r\nexport const SELECT_ITEM_HEIGHT_EM = 3;\r\n\r\n/** The total height of the select panel. */\r\nexport const SELECT_PANEL_HEIGHT = 200;\r\n\r\n// TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.\r\n/**\r\n * Distance between the panel edge and the option text in\r\n * multi-selection mode.\r\n *\r\n * Calculated as:\r\n * (SELECT_PANEL_PADDING_X * 1.5) + 20 = 44\r\n * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.\r\n * The checkbox width is 16px.\r\n */\r\nexport let SELECT_MULTIPLE_PANEL_PADDING_X = 0;\r\n\r\n/**\r\n * The select panel will only \"fit\" inside the viewport if it is positioned at\r\n * this value or more away from the viewport boundary.\r\n */\r\nexport const SELECT_PANEL_VIEWPORT_PADDING = 8;\r\n\r\n/** Change event object that is emitted when the select value has changed. */\r\nexport class OuiSelectChange {\r\n constructor(\r\n /** Reference to the select that emitted the change event. */\r\n public source: OuiSelect,\r\n /** Current value of the select that emitted the event. */\r\n public value: any\r\n ) {}\r\n}\r\n\r\n// Boilerplate for applying mixins to OuiSelect.\r\n/** @docs-private */\r\nexport class OuiSelectBase {\r\n constructor(\r\n public _elementRef: ElementRef,\r\n public _defaultErrorStateMatcher: ErrorStateMatcher,\r\n public _parentForm: NgForm,\r\n public _parentFormGroup: FormGroupDirective,\r\n public ngControl: NgControl\r\n ) {}\r\n}\r\n\r\nexport const _OuiSelectMixinBase: CanDisableCtor &\r\n HasTabIndexCtor &\r\n CanUpdateErrorStateCtor &\r\n typeof OuiSelectBase = mixinTabIndex(\r\n mixinDisabled(mixinErrorState(OuiSelectBase))\r\n);\r\n\r\n/**\r\n * Allows the user to customize the trigger that is displayed when the select has a value.\r\n */\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: 'oui-select-trigger',\r\n})\r\nexport class OuiSelectTrigger {}\r\n\r\n@Component({\r\n selector: 'oui-select',\r\n exportAs: 'ouiSelect',\r\n templateUrl: 'select.html',\r\n styleUrls: ['select.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['disabled', 'tabIndex'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n role: 'listbox',\r\n '[attr.id]': 'id',\r\n '[attr.tabindex]': 'tabIndex',\r\n '[attr.aria-label]': '_getAriaLabel()',\r\n '[attr.aria-labelledby]': '_getAriaLabelledby()',\r\n '[attr.aria-required]': 'required.toString()',\r\n '[attr.aria-disabled]': 'disabled.toString()',\r\n '[attr.aria-invalid]': 'errorState',\r\n '[attr.aria-owns]': 'panelOpen ? _optionIds : null',\r\n '[attr.aria-multiselectable]': 'multiple',\r\n '[attr.aria-describedby]': '_ariaDescribedby || null',\r\n '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\r\n '[class.oui-select-disabled]': 'disabled',\r\n '[class.oui-select-invalid]': 'errorState',\r\n '[class.oui-select-required]': 'required',\r\n '[class.oui-select-empty]': 'empty',\r\n class: 'oui-select oui-input',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(focus)': '_onFocus()',\r\n '(blur)': '_onBlur()',\r\n },\r\n providers: [\r\n { provide: OuiFormFieldControl, useExisting: OuiSelect },\r\n { provide: OUI_OPTION_PARENT_COMPONENT, useExisting: OuiSelect },\r\n ],\r\n})\r\nexport class OuiSelect\r\n extends _OuiSelectMixinBase\r\n implements\r\n AfterContentInit,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n DoCheck,\r\n ControlValueAccessor,\r\n CanDisable,\r\n HasTabIndex,\r\n OuiFormFieldControl,\r\n CanUpdateErrorState\r\n{\r\n /**Holds selected values after done */\r\n @Input() savedValues = [];\r\n /**Done button disabled until dropdown is dirty */\r\n disableDoneButton = true;\r\n /** Whether or not the overlay panel is open. */\r\n private _panelOpen = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _required = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _actionItems = false;\r\n\r\n /** The scroll position of the overlay panel, calculated to center the selected option. */\r\n private _scrollTop = 0;\r\n\r\n /** The placeholder displayed in the trigger of the select. */\r\n private _placeholder: string;\r\n\r\n /** Whether the component is in multiple selection mode. */\r\n private _multiple = false;\r\n\r\n /** Search input field **/\r\n isSearchFieldPresent: boolean;\r\n\r\n /** Unique id for this input. */\r\n private _uid = `oui-select-${nextUniqueId++}`;\r\n\r\n /** The last measured value for the trigger's client bounding rect. */\r\n _triggerRect: ClientRect;\r\n\r\n /** The aria-describedby attribute on the select for improved a11y. */\r\n _ariaDescribedby: string;\r\n\r\n /** The cached font-size of the trigger element. */\r\n _triggerFontSize = 0;\r\n\r\n /** Deals with the selection logic. */\r\n _selectionModel: SelectionModel;\r\n\r\n /** Manages keyboard events for options in the panel. */\r\n _keyManager: ActiveDescendantKeyManager;\r\n\r\n /** The IDs of child options to be passed to the aria-owns attribute. */\r\n _optionIds = '';\r\n\r\n /** The value of the select panel's transform-origin property. */\r\n _transformOrigin = 'top';\r\n\r\n /** If there is search input field a class is added dynamically to the perfect scrollbar **/\r\n ouiSelectInputOuterClassName: string;\r\n\r\n /** Adding top class to overlay panel */\r\n cdkConnectionOverlayPanel = '';\r\n\r\n /**\r\n * The y-offset of the overlay panel in relation to the trigger's top start corner.\r\n * This must be adjusted to align the selected option text over the trigger text.\r\n * when the panel opens. Will change based on the y-position of the selected option.\r\n */\r\n _offsetY = 0;\r\n\r\n /**\r\n * This position config ensures that the top \"start\" corner of the overlay\r\n * is aligned with with the top \"start\" of the origin by default (overlapping\r\n * the trigger completely). If the panel cannot fit below the trigger, it\r\n * will fall back to a position above the trigger.\r\n */\r\n _positions = [\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n },\r\n ];\r\n /** Emits whenever the component is destroyed. */\r\n private readonly _destroy = new Subject();\r\n\r\n /** Whether the component is disabling centering of the active option over the trigger. */\r\n private _disableOptionCentering = false;\r\n\r\n private _focused = false;\r\n\r\n /** A name for this control that can be used by `oui-form-field`. */\r\n controlType = 'oui-select';\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('trigger') trigger: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddCancelButton', { read: ElementRef }) ddCancelButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddDoneButton', { read: ElementRef }) ddDoneButton: ElementRef;\r\n\r\n /** Panel containing the select options. */\r\n @ViewChild('panel', { read: ElementRef }) panel: ElementRef;\r\n\r\n private _value: any;\r\n\r\n /**\r\n * Function used to sort the values in a select in multiple mode.\r\n * Follows the same logic as `Array.prototype.sort`.\r\n */\r\n @Input() sortComparator: (\r\n a: OuiOption,\r\n b: OuiOption,\r\n options: OuiOption[]\r\n ) => number;\r\n\r\n /** Aria label of the select. If not specified, the placeholder will be used as label. */\r\n @Input('aria-label') ariaLabel = '';\r\n\r\n /** Input that can be used to specify the `aria-labelledby` attribute. */\r\n @Input('aria-labelledby') ariaLabelledby: string;\r\n private _large = false;\r\n _monitorSubscription: any;\r\n\r\n /** Whether the oui-select is of large size. */\r\n @Input()\r\n get large(): boolean {\r\n return this._large;\r\n }\r\n set large(value) {\r\n this._large = coerceBooleanProperty(value);\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n private _id: string;\r\n\r\n /** Event emitted when the select panel has been toggled. */\r\n @Output()\r\n readonly openedChange: EventEmitter = new EventEmitter();\r\n\r\n /** Combined stream of all of the child options' change events. */\r\n readonly optionSelectionChanges: Observable = defer(\r\n (): Observable => {\r\n if (this.options) {\r\n return merge(...this.options.map((option) => option.onSelectionChange));\r\n }\r\n\r\n return this._ngZone.onStable.asObservable().pipe(\r\n take(1),\r\n switchMap(() => this.optionSelectionChanges)\r\n );\r\n }\r\n );\r\n\r\n /**\r\n * Event that emits whenever the raw value of the select changes. This is here primarily\r\n * to facilitate the two-way binding for the `value` input.\r\n *\r\n * @docs-private\r\n */\r\n @Output() readonly valueChange: EventEmitter = new EventEmitter();\r\n\r\n /** Object used to control when error messages are shown. */\r\n @Input() errorStateMatcher: ErrorStateMatcher;\r\n\r\n /** All of the defined select options. */\r\n @ContentChildren(OuiOption, { descendants: true })\r\n options: QueryList;\r\n\r\n /** Event emitted when the select has been opened. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('opened')\r\n readonly _openedStream: Observable = this.openedChange.pipe(\r\n filter((o) => o),\r\n map(() => {})\r\n );\r\n\r\n /** Event emitted when the select has been closed. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('closed')\r\n readonly _closedStream: Observable = this.openedChange.pipe(\r\n filter((o) => !o),\r\n map(() => {\r\n this.isSearchFieldPresent = false;\r\n })\r\n );\r\n\r\n /** Event emitted when the selected value has been changed by the user. */\r\n @Output()\r\n readonly selectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the selected value has been changed and saved by the user. */\r\n @Output()\r\n readonly saveSelectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** All of the defined groups of options. */\r\n @ContentChildren(OuiOptgroup) optionGroups: QueryList;\r\n\r\n /** User-supplied override of the trigger element. */\r\n @ContentChild(OuiSelectTrigger)\r\n customTrigger: OuiSelectTrigger;\r\n\r\n /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */\r\n @Input() panelClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** Overlay pane containing the options. */\r\n @ViewChild(CdkConnectedOverlay)\r\n overlayDir: CdkConnectedOverlay;\r\n\r\n /** Emits when the panel element is finished transforming in. */\r\n _panelDoneAnimatingStream = new Subject();\r\n\r\n /** Comparison function to specify which option is displayed. Defaults to object equality. */\r\n private _compareWith = (o1: any, o2: any) => o1 === o2;\r\n\r\n /** Whether the select is focused. */\r\n get focused(): boolean {\r\n return this._focused || this._panelOpen;\r\n }\r\n /**\r\n * @deprecated Setter to be removed as this property is intended to be readonly.\r\n */\r\n set focused(value: boolean) {\r\n this._focused = value;\r\n }\r\n /** `View -> model callback called when value changes` */\r\n _onChange: (value: any) => void = () => {};\r\n\r\n /** `View -> model callback called when select has been touched` */\r\n _onTouched = () => {};\r\n\r\n /** Placeholder to be shown if no value has been selected. */\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the component is required. */\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the user should be allowed to select multiple options. */\r\n @Input()\r\n get multiple(): boolean {\r\n return this._multiple;\r\n }\r\n set multiple(value: boolean) {\r\n if (this._selectionModel) {\r\n throw getOuiSelectDynamicMultipleError();\r\n }\r\n\r\n this._multiple = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the action items are required and use saveSelectionChange instead of selectionChange. */\r\n @Input()\r\n get actionItems(): boolean {\r\n return this._actionItems;\r\n }\r\n set actionItems(value: boolean) {\r\n if (this._multiple) {\r\n this._actionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Whether to center the active option over the trigger. */\r\n @Input()\r\n get disableOptionCentering(): boolean {\r\n return this._disableOptionCentering;\r\n }\r\n set disableOptionCentering(value: boolean) {\r\n this._disableOptionCentering = coerceBooleanProperty(value);\r\n }\r\n\r\n /**\r\n * Function to compare the option values with the selected values. The first argument\r\n * is a value from an option. The second is a value from the selection. A boolean\r\n * should be returned.\r\n */\r\n @Input()\r\n get compareWith() {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (o1: any, o2: any) => boolean) {\r\n if (typeof fn !== 'function') {\r\n throw getOuiSelectNonFunctionValueError();\r\n }\r\n this._compareWith = fn;\r\n if (this._selectionModel) {\r\n // A different comparator means the selection could change.\r\n this._initializeSelection();\r\n }\r\n }\r\n\r\n /** Value of the select control. */\r\n @Input()\r\n get value(): any {\r\n return this._value;\r\n }\r\n set value(newValue: any) {\r\n if (newValue !== this._value) {\r\n this.writeValue(newValue);\r\n this._value = newValue;\r\n }\r\n }\r\n\r\n /** Unique id of the element. */\r\n @Input()\r\n get id(): string {\r\n return this._id;\r\n }\r\n set id(value: string) {\r\n this._id = value || this._uid;\r\n this.stateChanges.next();\r\n }\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _ngZone: NgZone,\r\n _defaultErrorStateMatcher: ErrorStateMatcher,\r\n elementRef: ElementRef,\r\n private _focusMonitor: FocusMonitor,\r\n @Optional() private _dir: Directionality,\r\n @Optional() _parentForm: NgForm,\r\n @Optional() _parentFormGroup: FormGroupDirective,\r\n @Optional() private _parentFormField: OuiFormField,\r\n @Self() @Optional() public ngControl: NgControl,\r\n @Attribute('tabindex') tabIndex: string,\r\n @Optional() @Inject(DOCUMENT) private _document: any,\r\n public _elementRef: ElementRef,\r\n public _ouiIconRegistry: OuiIconRegistry,\r\n private _domSanitizer: DomSanitizer\r\n ) {\r\n super(\r\n elementRef,\r\n _defaultErrorStateMatcher,\r\n _parentForm,\r\n _parentFormGroup,\r\n ngControl\r\n );\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this._elementRef, true)\r\n .subscribe(() => this._ngZone.run(() => {}));\r\n this._ouiIconRegistry.addSvgIconLiteral(\r\n `select-arrow-icon`,\r\n this._domSanitizer.bypassSecurityTrustHtml(ICONS.SELECT_ARROW_ICON)\r\n );\r\n\r\n if (this.ngControl) {\r\n // Note: we provide the value accessor through here, instead of\r\n // the `providers` to avoid running into a circular import.\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n this.tabIndex = parseInt(tabIndex, 10) || 0;\r\n\r\n // Force setter to be called in case id was not specified.\r\n this.id = this.id;\r\n }\r\n\r\n ngOnInit() {\r\n this._selectionModel = new SelectionModel(this.multiple);\r\n this.stateChanges.next();\r\n\r\n // We need `distinctUntilChanged` here, because some browsers will\r\n // fire the animation end event twice for the same animation. See:\r\n // https://github.com/angular/angular/issues/24084\r\n this._panelDoneAnimatingStream\r\n .pipe(distinctUntilChanged(), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n if (this.panelOpen) {\r\n this._scrollTop = 0;\r\n this.openedChange.emit(true);\r\n } else {\r\n this.openedChange.emit(false);\r\n this.overlayDir.offsetX = 0;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._initKeyManager();\r\n\r\n this._selectionModel.changed\r\n .pipe(takeUntil(this._destroy))\r\n .subscribe((event) => {\r\n event.added.forEach((option) => option.select());\r\n event.removed.forEach((option) => option.deselect());\r\n });\r\n\r\n this.options.changes\r\n .pipe(startWith(null), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n this._resetOptions();\r\n this._initializeSelection();\r\n });\r\n }\r\n\r\n ngDoCheck() {\r\n if (this.ngControl) {\r\n this.updateErrorState();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let\r\n // the parent form field know to run change detection when the disabled state changes.\r\n if (changes.disabled) {\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._monitorSubscription.unsubscribe();\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n this._destroy.next();\r\n this._destroy.complete();\r\n this.stateChanges.complete();\r\n }\r\n\r\n /** Toggles the overlay panel open or closed. */\r\n toggle(): void {\r\n this.panelOpen ? this.close() : this.open();\r\n }\r\n\r\n /** Opens the overlay panel. */\r\n open(): void {\r\n if (\r\n this.disabled ||\r\n !this.options ||\r\n !this.options.length ||\r\n this._panelOpen\r\n ) {\r\n return;\r\n }\r\n\r\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\r\n\r\n this._panelOpen = true;\r\n this._keyManager.withHorizontalOrientation(null);\r\n\r\n this._highlightCorrectOption();\r\n this._changeDetectorRef.markForCheck();\r\n this.openedChange.emit(true);\r\n this._elementRef.nativeElement.classList.add(\r\n 'oui-select-list-options-opened'\r\n );\r\n }\r\n\r\n /** Closes the overlay panel and focuses the host element. */\r\n close(): void {\r\n if (this._panelOpen) {\r\n this._panelOpen = false;\r\n this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');\r\n this._changeDetectorRef.markForCheck();\r\n this._onTouched();\r\n this.openedChange.emit(false);\r\n this._elementRef.nativeElement.classList.remove(\r\n 'oui-select-list-options-opened'\r\n );\r\n setTimeout((_) => this._document.activeElement.blur());\r\n }\r\n }\r\n\r\n /**\r\n * Sets the select's value. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param value New value to be written to the model.\r\n */\r\n writeValue(value: any): void {\r\n if (this.options) {\r\n this._setSelectionByValue(value);\r\n }\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select's value\r\n * changes from user input. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the value changes.\r\n */\r\n registerOnChange(fn: (value: any) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select is blurred\r\n * by the user. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the component has been touched.\r\n */\r\n registerOnTouched(fn: () => {}): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n /**\r\n * Disables the select. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param isDisabled Sets whether the component is disabled.\r\n */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether or not the overlay panel is open. */\r\n get panelOpen(): boolean {\r\n return this._panelOpen;\r\n }\r\n\r\n /** The currently selected option. */\r\n get selected(): OuiOption | OuiOption[] {\r\n return this.multiple\r\n ? this._selectionModel.selected\r\n : this._selectionModel.selected[0];\r\n }\r\n\r\n /** The value displayed in the trigger. */\r\n get triggerValue(): string {\r\n if (this.empty) {\r\n return '';\r\n }\r\n if (this._multiple) {\r\n const selectedOptions = this._selectionModel.selected.map(\r\n (option) => option.viewValueForSelect\r\n );\r\n\r\n if (this._isRtl()) {\r\n selectedOptions.reverse();\r\n }\r\n return selectedOptions.join(', ');\r\n }\r\n return this._selectionModel.selected[0].viewValueForSelect;\r\n }\r\n\r\n /** Whether the element is in RTL mode. */\r\n _isRtl(): boolean {\r\n return this._dir ? this._dir.value === 'rtl' : false;\r\n }\r\n\r\n /** Handles all keydown events on the select. */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (!this.disabled) {\r\n this.panelOpen\r\n ? this._handleOpenKeydown(event)\r\n : this._handleClosedKeydown(event);\r\n }\r\n }\r\n\r\n /** Handles keyboard events while the select is closed. */\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const keyCode = event.keyCode;\r\n const isArrowKey =\r\n keyCode === DOWN_ARROW ||\r\n keyCode === UP_ARROW ||\r\n keyCode === LEFT_ARROW ||\r\n keyCode === RIGHT_ARROW;\r\n const isOpenKey = keyCode === ENTER || keyCode === SPACE;\r\n const manager = this._keyManager;\r\n\r\n // Open the select on ALT + arrow key to match the native \r\n event.preventDefault();\r\n this.close();\r\n } else if (\r\n (keyCode === ENTER || keyCode === SPACE) &&\r\n manager.activeItem &&\r\n !hasModifierKey(event)\r\n ) {\r\n event.preventDefault();\r\n manager.activeItem._selectViaInteraction();\r\n } else if (this._multiple && keyCode === A && event.ctrlKey) {\r\n event.preventDefault();\r\n this.handleCtrlKey();\r\n } else if (normalNavigationCheck) {\r\n // Check for non multiple select dropdown that the key pressed is not Tab, Space, Enter\r\n if (!this.isSearchFieldPresent) this.focus();\r\n this.handleScrolling(manager, event, isArrowKey, keyCode);\r\n }\r\n }\r\n\r\n /**\r\n * Handle ctrl key\r\n */\r\n private handleCtrlKey() {\r\n const hasDeselectedOptions = this.options.some(\r\n (opt) => !opt.disabled && !opt.selected\r\n );\r\n\r\n this.options.forEach((option) => {\r\n if (!option.disabled) {\r\n hasDeselectedOptions ? option.select() : option.deselect();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @param manager\r\n * @param event\r\n * @param isArrowKey\r\n * @param keyCode\r\n */\r\n private handleScrolling(\r\n manager: ActiveDescendantKeyManager,\r\n event: KeyboardEvent,\r\n isArrowKey: boolean,\r\n keyCode: number\r\n ) {\r\n const previouslyFocusedIndex = manager.activeItemIndex;\r\n\r\n manager.onKeydown(event);\r\n\r\n if (\r\n this._multiple &&\r\n isArrowKey &&\r\n event.shiftKey &&\r\n manager.activeItem &&\r\n manager.activeItemIndex !== previouslyFocusedIndex\r\n ) {\r\n manager.activeItem._selectViaInteraction();\r\n }\r\n if (isArrowKey && manager.activeItemIndex !== previouslyFocusedIndex) {\r\n this._scrollToOption();\r\n } else {\r\n // First or last\r\n if (keyCode === DOWN_ARROW) {\r\n manager.setFirstItemActive();\r\n this._setScrollTop(0);\r\n }\r\n if (keyCode === UP_ARROW) {\r\n manager.setLastItemActive();\r\n this._scrollToOption();\r\n }\r\n }\r\n }\r\n\r\n _onFocus() {\r\n if (!this.disabled) {\r\n this._focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\r\n * \"blur\" to the panel when it opens, causing a false positive.\r\n */\r\n _onBlur() {\r\n this._focused = false;\r\n // this.isSearchFieldPresent = false;\r\n\r\n if (!this.disabled && !this.panelOpen) {\r\n this._onTouched();\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Callback that is invoked when the overlay panel has been attached.\r\n */\r\n _onAttached(): void {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {\r\n this._setPseudoCheckboxPaddingSize();\r\n this._changeDetectorRef.detectChanges();\r\n this.panel.nativeElement.scrollTop = this._scrollTop;\r\n });\r\n }\r\n\r\n /** Returns the theme to be used on the panel. */\r\n _getPanelTheme(): string {\r\n return this._parentFormField ? `oui-${this._parentFormField.color}` : '';\r\n }\r\n\r\n // TODO(josephperrott): Remove after 2018 spec updates are fully merged.\r\n /** Sets the pseudo checkbox padding size based on the width of the pseudo checkbox. */\r\n private _setPseudoCheckboxPaddingSize() {\r\n if (!SELECT_MULTIPLE_PANEL_PADDING_X && this.multiple) {\r\n const pseudoCheckbox = this.panel.nativeElement.querySelector(\r\n '.oui-pseudo-checkbox'\r\n );\r\n if (pseudoCheckbox) {\r\n SELECT_MULTIPLE_PANEL_PADDING_X =\r\n SELECT_PANEL_PADDING_X * 1.5 + pseudoCheckbox.offsetWidth;\r\n }\r\n }\r\n }\r\n\r\n /** Whether the select has a value. */\r\n get empty(): boolean {\r\n return !this._selectionModel || this._selectionModel.isEmpty();\r\n }\r\n\r\n private _initializeSelection(): void {\r\n // Defer setting the value in order to avoid the \"Expression\r\n // has changed after it was checked\" errors from Angular.\r\n Promise.resolve().then(() => {\r\n this._setSelectionByValue(\r\n this.ngControl ? this.ngControl.value : this._value\r\n );\r\n this.savedValues = this.ngControl ? this.ngControl.value : this._value;\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the selected option based on a value. If no option can be\r\n * found with the designated value, the select trigger is cleared.\r\n */\r\n private _setSelectionByValue(value: any | any[]): void {\r\n if (this.multiple && value) {\r\n if (!Array.isArray(value)) {\r\n throw getOuiSelectNonArrayValueError();\r\n }\r\n\r\n this._selectionModel.clear();\r\n value.forEach((currentValue: any) => this._selectValue(currentValue));\r\n this._sortValues();\r\n } else {\r\n this._selectionModel.clear();\r\n const correspondingOption = this._selectValue(value);\r\n // Shift focus to the active item. Note that we shouldn't do this in multiple\r\n // mode, because we don't know what option the user interacted with last.\r\n if (correspondingOption) {\r\n this._keyManager.setActiveItem(correspondingOption);\r\n }\r\n }\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /**\r\n * Finds and selects and option based on its value.\r\n *\r\n * @returns Option that has the corresponding value.\r\n */\r\n private _selectValue(value: any): OuiOption | undefined {\r\n const correspondingOption = this.options.find((option: OuiOption) => {\r\n try {\r\n // Treat null as a special reset value.\r\n return option.value != null && this._compareWith(option.value, value);\r\n } catch (error) {\r\n if (isDevMode()) {\r\n // Notify developers of errors in their comparator.\r\n console.warn(error);\r\n }\r\n return false;\r\n }\r\n });\r\n\r\n if (correspondingOption) {\r\n this._selectionModel.select(correspondingOption);\r\n }\r\n\r\n return correspondingOption;\r\n }\r\n\r\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\r\n private _initKeyManager() {\r\n this._keyManager = new ActiveDescendantKeyManager(this.options)\r\n .withTypeAhead()\r\n .withVerticalOrientation()\r\n .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')\r\n .withAllowedModifierKeys(['shiftKey']);\r\n\r\n this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n // Restore focus to the trigger before closing. Ensures that the focus\r\n // position won't be lost if the user got focus into the overlay.\r\n this.focus();\r\n this.close();\r\n });\r\n\r\n this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n if (this._panelOpen && this.panel) {\r\n // Panel is opened\r\n // Need not to scroll\r\n } else if (\r\n !this._panelOpen &&\r\n !this.multiple &&\r\n this._keyManager.activeItem\r\n ) {\r\n this._keyManager.activeItem._selectViaInteraction();\r\n }\r\n });\r\n }\r\n\r\n /** Drops current option subscriptions and IDs and resets from scratch. */\r\n private _resetOptions(): void {\r\n const changedOrDestroyed = merge(this.options.changes, this._destroy);\r\n\r\n this.optionSelectionChanges\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe((event) => {\r\n this._onSelect(event.source, event.isUserInput);\r\n\r\n if (event.isUserInput && !this.multiple && this._panelOpen) {\r\n this.close();\r\n this.focus();\r\n }\r\n });\r\n\r\n // Listen to changes in the internal state of the options and react accordingly.\r\n // Handles cases like the labels of the selected options changing.\r\n merge(...this.options.map((option) => option._stateChanges))\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe(() => {\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n });\r\n\r\n this._setOptionIds();\r\n }\r\n\r\n /** Invoked when an option is clicked. */\r\n private _onSelect(option: OuiOption, isUserInput: boolean): void {\r\n const wasSelected = this._selectionModel.isSelected(option);\r\n\r\n if (option.value == null && !this._multiple) {\r\n option.deselect();\r\n this._selectionModel.clear();\r\n this._propagateChanges(option.value);\r\n } else {\r\n option.selected\r\n ? this._selectionModel.select(option)\r\n : this._selectionModel.deselect(option);\r\n\r\n if (isUserInput) {\r\n this._keyManager.setActiveItem(option);\r\n }\r\n\r\n if (this.multiple) {\r\n this._sortValues();\r\n\r\n if (isUserInput) {\r\n // In case the user selected the option with their mouse, we\r\n // want to restore focus back to the trigger, in order to\r\n // prevent the select keyboard controls from clashing with\r\n // the ones from `oui-option`.\r\n this.focus();\r\n }\r\n }\r\n }\r\n\r\n if (wasSelected !== this._selectionModel.isSelected(option)) {\r\n this._propagateChanges();\r\n }\r\n this.disableDoneButton = false;\r\n this.stateChanges.next();\r\n }\r\n discardRecentChanges() {\r\n this.value = this.savedValues;\r\n this._setSelectionByValue(this.value);\r\n this.disableDoneButton = true;\r\n this.close();\r\n }\r\n doneRecentChanges() {\r\n this.savedValues = this.value;\r\n this.disableDoneButton = true;\r\n this.saveSelectionChange.emit(new OuiSelectChange(this, this.value));\r\n this.close();\r\n }\r\n /** Sorts the selected values in the selected based on their order in the panel. */\r\n private _sortValues() {\r\n if (this.multiple) {\r\n const options = this.options.toArray();\r\n\r\n this._selectionModel.sort((a, b) =>\r\n this.sortComparator\r\n ? this.sortComparator(a, b, options)\r\n : options.indexOf(a) - options.indexOf(b)\r\n );\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Emits change event to set the model value. */\r\n private _propagateChanges(fallbackValue?: any): void {\r\n let valueToEmit: any = null;\r\n\r\n if (this.multiple) {\r\n valueToEmit = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n } else {\r\n valueToEmit = this.selected\r\n ? (this.selected as OuiOption).value\r\n : fallbackValue;\r\n }\r\n\r\n this._value = valueToEmit;\r\n this.valueChange.emit(valueToEmit);\r\n this._onChange(valueToEmit);\r\n this.selectionChange.emit(new OuiSelectChange(this, valueToEmit));\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /** Records option IDs to pass to the aria-owns property. */\r\n private _setOptionIds() {\r\n this._optionIds = this.options.map((option) => option.id).join(' ');\r\n }\r\n\r\n /**\r\n * Highlights the selected item. If no option is selected, it will highlight\r\n * the first item instead.\r\n */\r\n private _highlightCorrectOption(): void {\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n } else if (this._keyManager) {\r\n if (this.empty) {\r\n this._keyManager.setFirstItemActive();\r\n } else {\r\n this._keyManager.setActiveItem(this._selectionModel.selected[0]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Highlights the first of the filtered options if no element is currently highlighted\r\n */\r\n private _highlightFirstFilteredOption(): void {\r\n if (this._keyManager) {\r\n const activeElement = this._keyManager.activeItem?._getHostElement();\r\n // activeElement is not part of DOM if there is no parent element\r\n if (!activeElement || !activeElement.parentElement) {\r\n // highlight first element if there is no active element or active element is not part of DOM\r\n this._keyManager.setFirstItemActive();\r\n }\r\n }\r\n }\r\n\r\n /** Focuses the select element. */\r\n focus(): void {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n\r\n /** Returns the aria-label of the select component. */\r\n _getAriaLabel(): string | null {\r\n // If an ariaLabelledby value has been set by the consumer, the select should not overwrite the\r\n // `aria-labelledby` value by setting the ariaLabel to the placeholder.\r\n return this.ariaLabelledby ? null : this.ariaLabel || this.placeholder;\r\n }\r\n\r\n /** Returns the aria-labelledby of the select component. */\r\n _getAriaLabelledby(): string | null {\r\n if (this.ariaLabelledby) {\r\n return this.ariaLabelledby;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Determines the `aria-activedescendant` to be set on the host. */\r\n _getAriaActiveDescendant(): string | null {\r\n if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\r\n return this._keyManager.activeItem.id;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n setDescribedByIds(ids: string[]) {\r\n this._ariaDescribedby = ids.join(' ');\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n onContainerClick() {\r\n this.focus();\r\n this.open();\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n get shouldLabelFloat(): boolean {\r\n return this._panelOpen || !this.empty;\r\n }\r\n\r\n /**\r\n * Add outer class to perfect scrollbar\r\n * This is added only when there is a search field\r\n */\r\n ouiSelectInputOuter() {\r\n this.ouiSelectInputOuterClassName = 'oui-select-input-outer';\r\n }\r\n\r\n /**\r\n * Custom overlay class for cdk overlay container\r\n */\r\n openCdk() {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe((e) => {\r\n this.cdkConnectionOverlayPanel = '';\r\n if (e.connectionPair.originY === 'top') {\r\n this.cdkConnectionOverlayPanel = 'select-overlay-top';\r\n }\r\n this._changeDetectorRef.detectChanges();\r\n setTimeout((_) => this._scrollToOption());\r\n });\r\n\r\n const cdkOverLayContainer = this._document.querySelector(\r\n '.cdk-overlay-container'\r\n );\r\n const ouiSelectPanel = this._document.querySelector('.oui-select-panel');\r\n cdkOverLayContainer.classList.add('oui-select-overlay-container');\r\n const containerWidth = this._elementRef.nativeElement.offsetWidth;\r\n ouiSelectPanel.style.width = `${containerWidth}px`;\r\n const searchQueryString = '.oui-select-search-inner';\r\n if (this._document.querySelector(searchQueryString)) {\r\n this.scrollCalc(searchQueryString);\r\n }\r\n const actionItemsQueryString = '.oui-select-action-items';\r\n if (this._document.querySelector(actionItemsQueryString)) {\r\n this.scrollCalc(actionItemsQueryString);\r\n }\r\n }\r\n scrollCalc(selectQueryString: string) {\r\n const searchInput = this._document.querySelector(selectQueryString);\r\n const outter = this._document.querySelector('.oui-select-panel');\r\n let inner = this._document.querySelector('.oui-option');\r\n if (inner === null) {\r\n inner = 0;\r\n }\r\n const scrollbarWidth = outter.offsetWidth - inner.offsetWidth;\r\n if (scrollbarWidth > 5) {\r\n searchInput.style.width = `${inner.offsetWidth}px`;\r\n } else {\r\n searchInput.style.width = `calc(100% + 8px)`;\r\n }\r\n }\r\n\r\n /**\r\n * Given that we are not actually focusing active options, we must manually adjust scroll\r\n * to reveal options below the fold. First, we find the offset of the option from the top\r\n * of the panel. If that offset is below the fold, the new scrollTop will be the offset -\r\n * the panel height + the option height, so the active option will be just visible at the\r\n * bottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\r\n * will become the offset. If that offset is visible within the panel already, the scrollTop is\r\n * not adjusted.\r\n */\r\n private _scrollToOption(): void {\r\n const manager = this._keyManager;\r\n const index = manager.activeItemIndex || 0;\r\n const labelCount = _countGroupLabelsBeforeOption(\r\n index,\r\n this.options,\r\n this.optionGroups\r\n );\r\n const scrollTop = this._getScrollTop();\r\n const newScrollPosition = _getOptionScrollPosition(\r\n index + labelCount,\r\n SELECT_OPTION_HEIGHT,\r\n scrollTop,\r\n SELECT_PANEL_HEIGHT\r\n );\r\n this._setScrollTop(newScrollPosition);\r\n }\r\n\r\n /**\r\n * Sets the panel scrollTop. This allows us to manually scroll to display options\r\n * above or below the fold, as they are not actually being focused when active.\r\n */\r\n _setScrollTop(scrollTop: number): void {\r\n if (this.panel) {\r\n this.panel.nativeElement.scrollTop = scrollTop;\r\n }\r\n }\r\n\r\n /** Returns the panel's scrollTop. */\r\n _getScrollTop(): number {\r\n return this.panel ? this.panel.nativeElement.scrollTop : 0;\r\n }\r\n}\r\n", + "sourceCode": "import { ActiveDescendantKeyManager, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { SelectionModel } from '@angular/cdk/collections';\r\nimport {\r\n A,\r\n DOWN_ARROW,\r\n END,\r\n ENTER,\r\n HOME,\r\n LEFT_ARROW,\r\n RIGHT_ARROW,\r\n SPACE,\r\n UP_ARROW,\r\n hasModifierKey,\r\n TAB,\r\n} from '@angular/cdk/keycodes';\r\nimport { CdkConnectedOverlay } from '@angular/cdk/overlay';\r\nimport {\r\n AfterContentInit,\r\n Attribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n ContentChildren,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n isDevMode,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n QueryList,\r\n Self,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n Inject,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n} from '@angular/forms';\r\nimport {\r\n _countGroupLabelsBeforeOption,\r\n _getOptionScrollPosition,\r\n CanDisable,\r\n CanDisableCtor,\r\n CanUpdateErrorState,\r\n CanUpdateErrorStateCtor,\r\n HasTabIndex,\r\n HasTabIndexCtor,\r\n OuiOptionSelectionChange,\r\n mixinErrorState,\r\n mixinTabIndex,\r\n mixinDisabled,\r\n} from '../core';\r\nimport { OuiFormField, OuiFormFieldControl } from '../form-field/public-api';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { OUI_OPTION_PARENT_COMPONENT, OuiOption } from '../core/option/option';\r\nimport { OuiOptgroup } from '../core/option/optgroup';\r\nimport { ErrorStateMatcher } from '../core/error/error-options';\r\nimport { defer, merge, Observable, Subject } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n filter,\r\n map,\r\n startWith,\r\n switchMap,\r\n take,\r\n takeUntil,\r\n} from 'rxjs/operators';\r\nimport {\r\n getOuiSelectDynamicMultipleError,\r\n getOuiSelectNonArrayValueError,\r\n getOuiSelectNonFunctionValueError,\r\n} from './select-errors';\r\nimport { OuiIconRegistry } from '../icon/icon-registery';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { ICONS } from '../core/shared/icons';\r\n\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * The following style constants are necessary to save here in order\r\n * to properly calculate the alignment of the selected option over\r\n * the trigger element.\r\n */\r\n\r\n/** The height of each select option. */\r\nexport const SELECT_OPTION_HEIGHT = 40;\r\n\r\n/** The panel's padding on the x-axis */\r\nexport const SELECT_PANEL_PADDING_X = 16;\r\n\r\n/** The panel's x axis padding if it is indented (e.g. there is an option group). */\r\nexport const SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;\r\n\r\n/** The height of the select items in `em` units. */\r\nexport const SELECT_ITEM_HEIGHT_EM = 3;\r\n\r\n/** The total height of the select panel. */\r\nexport const SELECT_PANEL_HEIGHT = 200;\r\n\r\n// TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.\r\n/**\r\n * Distance between the panel edge and the option text in\r\n * multi-selection mode.\r\n *\r\n * Calculated as:\r\n * (SELECT_PANEL_PADDING_X * 1.5) + 20 = 44\r\n * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.\r\n * The checkbox width is 16px.\r\n */\r\nexport let SELECT_MULTIPLE_PANEL_PADDING_X = 0;\r\n\r\n/**\r\n * The select panel will only \"fit\" inside the viewport if it is positioned at\r\n * this value or more away from the viewport boundary.\r\n */\r\nexport const SELECT_PANEL_VIEWPORT_PADDING = 8;\r\n\r\n/** Change event object that is emitted when the select value has changed. */\r\nexport class OuiSelectChange {\r\n constructor(\r\n /** Reference to the select that emitted the change event. */\r\n public source: OuiSelect,\r\n /** Current value of the select that emitted the event. */\r\n public value: any\r\n ) {}\r\n}\r\n\r\n// Boilerplate for applying mixins to OuiSelect.\r\n/** @docs-private */\r\nexport class OuiSelectBase {\r\n constructor(\r\n public _elementRef: ElementRef,\r\n public _defaultErrorStateMatcher: ErrorStateMatcher,\r\n public _parentForm: NgForm,\r\n public _parentFormGroup: FormGroupDirective,\r\n public ngControl: NgControl\r\n ) {}\r\n}\r\n\r\nexport const _OuiSelectMixinBase: CanDisableCtor &\r\n HasTabIndexCtor &\r\n CanUpdateErrorStateCtor &\r\n typeof OuiSelectBase = mixinTabIndex(\r\n mixinDisabled(mixinErrorState(OuiSelectBase))\r\n);\r\n\r\n/**\r\n * Allows the user to customize the trigger that is displayed when the select has a value.\r\n */\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: 'oui-select-trigger',\r\n})\r\nexport class OuiSelectTrigger {}\r\n\r\n@Component({\r\n selector: 'oui-select',\r\n exportAs: 'ouiSelect',\r\n templateUrl: 'select.html',\r\n styleUrls: ['select.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['disabled', 'tabIndex'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n role: 'listbox',\r\n '[attr.id]': 'id',\r\n '[attr.tabindex]': 'tabIndex',\r\n '[attr.aria-label]': '_getAriaLabel()',\r\n '[attr.aria-labelledby]': '_getAriaLabelledby()',\r\n '[attr.aria-required]': 'required.toString()',\r\n '[attr.aria-disabled]': 'disabled.toString()',\r\n '[attr.aria-invalid]': 'errorState',\r\n '[attr.aria-owns]': 'panelOpen ? _optionIds : null',\r\n '[attr.aria-multiselectable]': 'multiple',\r\n '[attr.aria-describedby]': '_ariaDescribedby || null',\r\n '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\r\n '[class.oui-select-disabled]': 'disabled',\r\n '[class.oui-select-invalid]': 'errorState',\r\n '[class.oui-select-required]': 'required',\r\n '[class.oui-select-empty]': 'empty',\r\n class: 'oui-select oui-input',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(focus)': '_onFocus()',\r\n '(blur)': '_onBlur()',\r\n },\r\n providers: [\r\n { provide: OuiFormFieldControl, useExisting: OuiSelect },\r\n { provide: OUI_OPTION_PARENT_COMPONENT, useExisting: OuiSelect },\r\n ],\r\n})\r\nexport class OuiSelect\r\n extends _OuiSelectMixinBase\r\n implements\r\n AfterContentInit,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n DoCheck,\r\n ControlValueAccessor,\r\n CanDisable,\r\n HasTabIndex,\r\n OuiFormFieldControl,\r\n CanUpdateErrorState\r\n{\r\n /**Holds selected values after done */\r\n @Input() savedValues = [];\r\n /**Done button disabled until dropdown is dirty */\r\n disableDoneButton = true;\r\n /** Whether or not the overlay panel is open. */\r\n private _panelOpen = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _required = false;\r\n\r\n /** Whether filling out the select is required in the form. */\r\n private _actionItems = false;\r\n private _singleActionItems = false;\r\n\r\n /** The scroll position of the overlay panel, calculated to center the selected option. */\r\n private _scrollTop = 0;\r\n\r\n /** The placeholder displayed in the trigger of the select. */\r\n private _placeholder: string;\r\n\r\n /** The label displayed on the cancel button of the select in case of multi-select. */\r\n private _cancelLabel = 'Cancel';\r\n\r\n /** The label displayed on the done button of the select in case of multi-select. */\r\n private _doneLabel = 'Done';\r\n\r\n /** The label displayed on the singleSelect and multiSelect of the select as a actionItem. */\r\n private _singleActionLabel = 'New action button';\r\n\r\n /** Whether the component is in multiple selection mode. */\r\n private _multiple = false;\r\n\r\n /** In multiple selection mode, enable Done button even in case of no option selected */\r\n private _allowNoSelection = false;\r\n\r\n /** Search input field **/\r\n isSearchFieldPresent: boolean;\r\n\r\n /** Unique id for this input. */\r\n private _uid = `oui-select-${nextUniqueId++}`;\r\n\r\n /** The last measured value for the trigger's client bounding rect. */\r\n _triggerRect: ClientRect;\r\n\r\n /** The aria-describedby attribute on the select for improved a11y. */\r\n _ariaDescribedby: string;\r\n\r\n /** The cached font-size of the trigger element. */\r\n _triggerFontSize = 0;\r\n\r\n /** Deals with the selection logic. */\r\n _selectionModel: SelectionModel;\r\n\r\n /** Manages keyboard events for options in the panel. */\r\n _keyManager: ActiveDescendantKeyManager;\r\n\r\n /** The IDs of child options to be passed to the aria-owns attribute. */\r\n _optionIds = '';\r\n\r\n /** The value of the select panel's transform-origin property. */\r\n _transformOrigin = 'top';\r\n\r\n /** If there is search input field a class is added dynamically to the perfect scrollbar **/\r\n ouiSelectInputOuterClassName: string;\r\n\r\n /** Adding top class to overlay panel */\r\n cdkConnectionOverlayPanel = '';\r\n\r\n /**\r\n * The y-offset of the overlay panel in relation to the trigger's top start corner.\r\n * This must be adjusted to align the selected option text over the trigger text.\r\n * when the panel opens. Will change based on the y-position of the selected option.\r\n */\r\n _offsetY = 0;\r\n\r\n /**\r\n * This position config ensures that the top \"start\" corner of the overlay\r\n * is aligned with with the top \"start\" of the origin by default (overlapping\r\n * the trigger completely). If the panel cannot fit below the trigger, it\r\n * will fall back to a position above the trigger.\r\n */\r\n _positions = [\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n },\r\n ];\r\n /** Emits whenever the component is destroyed. */\r\n private readonly _destroy = new Subject();\r\n\r\n /** Whether the component is disabling centering of the active option over the trigger. */\r\n private _disableOptionCentering = false;\r\n\r\n private _focused = false;\r\n\r\n /** A name for this control that can be used by `oui-form-field`. */\r\n controlType = 'oui-select';\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('trigger') trigger: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddCancelButton', { read: ElementRef }) ddCancelButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('ddDoneButton', { read: ElementRef }) ddDoneButton: ElementRef;\r\n\r\n /** Trigger that opens the select. */\r\n @ViewChild('singleButton', { read: ElementRef }) singleButton: ElementRef;\r\n\r\n /** Panel containing the select options. */\r\n @ViewChild('panel', { read: ElementRef }) panel: ElementRef;\r\n\r\n private _value: any;\r\n\r\n /**\r\n * Function used to sort the values in a select in multiple mode.\r\n * Follows the same logic as `Array.prototype.sort`.\r\n */\r\n @Input() sortComparator: (\r\n a: OuiOption,\r\n b: OuiOption,\r\n options: OuiOption[]\r\n ) => number;\r\n\r\n /** Aria label of the select. If not specified, the placeholder will be used as label. */\r\n @Input('aria-label') ariaLabel = '';\r\n\r\n /** Input that can be used to specify the `aria-labelledby` attribute. */\r\n @Input('aria-labelledby') ariaLabelledby: string;\r\n private _large = false;\r\n _monitorSubscription: any;\r\n\r\n /** Whether the oui-select is of large size. */\r\n @Input()\r\n get large(): boolean {\r\n return this._large;\r\n }\r\n set large(value) {\r\n this._large = coerceBooleanProperty(value);\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n private _id: string;\r\n\r\n /** Event emitted when the select panel has been toggled. */\r\n @Output()\r\n readonly openedChange: EventEmitter = new EventEmitter();\r\n\r\n /** Combined stream of all of the child options' change events. */\r\n readonly optionSelectionChanges: Observable = defer(\r\n (): Observable => {\r\n if (this.options) {\r\n return merge(...this.options.map((option) => option.onSelectionChange));\r\n }\r\n\r\n return this._ngZone.onStable.asObservable().pipe(\r\n take(1),\r\n switchMap(() => this.optionSelectionChanges)\r\n );\r\n }\r\n );\r\n\r\n /**\r\n * Event that emits whenever the raw value of the select changes. This is here primarily\r\n * to facilitate the two-way binding for the `value` input.\r\n *\r\n * @docs-private\r\n */\r\n @Output() readonly valueChange: EventEmitter = new EventEmitter();\r\n\r\n /** Object used to control when error messages are shown. */\r\n @Input() errorStateMatcher: ErrorStateMatcher;\r\n\r\n /** All of the defined select options. */\r\n @ContentChildren(OuiOption, { descendants: true })\r\n options: QueryList;\r\n\r\n /** Event emitted when the select has been opened. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('opened')\r\n readonly _openedStream: Observable = this.openedChange.pipe(\r\n filter((o) => o),\r\n map(() => {})\r\n );\r\n\r\n /** Event emitted when the select has been closed. */\r\n // eslint-disable-next-line @angular-eslint/no-output-rename\r\n @Output('closed')\r\n readonly _closedStream: Observable = this.openedChange.pipe(\r\n filter((o) => !o),\r\n map(() => {\r\n this.isSearchFieldPresent = false;\r\n })\r\n );\r\n\r\n /** Event emitted when the selected value has been changed by the user. */\r\n @Output()\r\n readonly selectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the selected value has been changed and saved by the user. */\r\n @Output()\r\n readonly saveSelectionChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Can pass any method to be triggered on singleActionItem click. */\r\n @Output()\r\n readonly singleSelectionChange = new EventEmitter();\r\n\r\n /** All of the defined groups of options. */\r\n @ContentChildren(OuiOptgroup) optionGroups: QueryList;\r\n\r\n /** User-supplied override of the trigger element. */\r\n @ContentChild(OuiSelectTrigger)\r\n customTrigger: OuiSelectTrigger;\r\n\r\n /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */\r\n @Input() panelClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** Overlay pane containing the options. */\r\n @ViewChild(CdkConnectedOverlay)\r\n overlayDir: CdkConnectedOverlay;\r\n\r\n /** Emits when the panel element is finished transforming in. */\r\n _panelDoneAnimatingStream = new Subject();\r\n\r\n /** Comparison function to specify which option is displayed. Defaults to object equality. */\r\n private _compareWith = (o1: any, o2: any) => o1 === o2;\r\n\r\n /** Whether the select is focused. */\r\n get focused(): boolean {\r\n return this._focused || this._panelOpen;\r\n }\r\n /**\r\n * @deprecated Setter to be removed as this property is intended to be readonly.\r\n */\r\n set focused(value: boolean) {\r\n this._focused = value;\r\n }\r\n /** `View -> model callback called when value changes` */\r\n _onChange: (value: any) => void = () => {};\r\n\r\n /** `View -> model callback called when select has been touched` */\r\n _onTouched = () => {};\r\n\r\n /** Placeholder to be shown if no value has been selected. */\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of multiple the cancelLabel to be shown on cancel action button. */\r\n @Input()\r\n get cancelLabel(): string {\r\n return this._cancelLabel;\r\n }\r\n set cancelLabel(value: string) {\r\n this._cancelLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of multiple the doneLabel to be shown on apply action button. */\r\n @Input()\r\n get doneLabel(): string {\r\n return this._doneLabel;\r\n }\r\n set doneLabel(value: string) {\r\n this._doneLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** In case of singleSelect and multiSelect the singleActionLabel to be shown on actionItem. */\r\n @Input()\r\n get singleActionLabel(): string {\r\n return this._singleActionLabel;\r\n }\r\n set singleActionLabel(value: string) {\r\n this._singleActionLabel = value;\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the component is required. */\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether the user should be allowed to select multiple options. */\r\n @Input()\r\n get multiple(): boolean {\r\n return this._multiple;\r\n }\r\n set multiple(value: boolean) {\r\n if (this._selectionModel) {\r\n throw getOuiSelectDynamicMultipleError();\r\n }\r\n\r\n this._multiple = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the user should be allowed to select no option in case of multiple options. */\r\n @Input()\r\n get allowNoSelection(): boolean {\r\n return this._allowNoSelection;\r\n }\r\n set allowNoSelection(value: boolean) {\r\n this._allowNoSelection = coerceBooleanProperty(value);\r\n }\r\n\r\n /** Whether the action items are required and use saveSelectionChange instead of selectionChange. */\r\n @Input()\r\n get actionItems(): boolean {\r\n return this._actionItems;\r\n }\r\n set actionItems(value: boolean) {\r\n if (this._multiple) {\r\n this._actionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n @Input()\r\n get singleActionItem(): boolean {\r\n return this._singleActionItems;\r\n }\r\n set singleActionItem(value: boolean) {\r\n this._singleActionItems = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether to center the active option over the trigger. */\r\n @Input()\r\n get disableOptionCentering(): boolean {\r\n return this._disableOptionCentering;\r\n }\r\n set disableOptionCentering(value: boolean) {\r\n this._disableOptionCentering = coerceBooleanProperty(value);\r\n }\r\n\r\n /**\r\n * Function to compare the option values with the selected values. The first argument\r\n * is a value from an option. The second is a value from the selection. A boolean\r\n * should be returned.\r\n */\r\n @Input()\r\n get compareWith() {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (o1: any, o2: any) => boolean) {\r\n if (typeof fn !== 'function') {\r\n throw getOuiSelectNonFunctionValueError();\r\n }\r\n this._compareWith = fn;\r\n if (this._selectionModel) {\r\n // A different comparator means the selection could change.\r\n this._initializeSelection();\r\n }\r\n }\r\n\r\n /** Value of the select control. */\r\n @Input()\r\n get value(): any {\r\n return this._value;\r\n }\r\n set value(newValue: any) {\r\n if (newValue !== this._value) {\r\n this.writeValue(newValue);\r\n this._value = newValue;\r\n }\r\n }\r\n\r\n /** Unique id of the element. */\r\n @Input()\r\n get id(): string {\r\n return this._id;\r\n }\r\n set id(value: string) {\r\n this._id = value || this._uid;\r\n this.stateChanges.next();\r\n }\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _ngZone: NgZone,\r\n _defaultErrorStateMatcher: ErrorStateMatcher,\r\n elementRef: ElementRef,\r\n private _focusMonitor: FocusMonitor,\r\n @Optional() private _dir: Directionality,\r\n @Optional() _parentForm: NgForm,\r\n @Optional() _parentFormGroup: FormGroupDirective,\r\n @Optional() private _parentFormField: OuiFormField,\r\n @Self() @Optional() public ngControl: NgControl,\r\n @Attribute('tabindex') tabIndex: string,\r\n @Optional() @Inject(DOCUMENT) private _document: any,\r\n public _elementRef: ElementRef,\r\n public _ouiIconRegistry: OuiIconRegistry,\r\n private _domSanitizer: DomSanitizer\r\n ) {\r\n super(\r\n elementRef,\r\n _defaultErrorStateMatcher,\r\n _parentForm,\r\n _parentFormGroup,\r\n ngControl\r\n );\r\n this._monitorSubscription = this._focusMonitor\r\n .monitor(this._elementRef, true)\r\n .subscribe(() => this._ngZone.run(() => {}));\r\n this._ouiIconRegistry.addSvgIconLiteral(\r\n `select-arrow-icon`,\r\n this._domSanitizer.bypassSecurityTrustHtml(ICONS.SELECT_ARROW_ICON)\r\n );\r\n\r\n if (this.ngControl) {\r\n // Note: we provide the value accessor through here, instead of\r\n // the `providers` to avoid running into a circular import.\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n this.tabIndex = parseInt(tabIndex, 10) || 0;\r\n\r\n // Force setter to be called in case id was not specified.\r\n this.id = this.id;\r\n }\r\n\r\n ngOnInit() {\r\n this._selectionModel = new SelectionModel(this.multiple);\r\n this.stateChanges.next();\r\n\r\n // We need `distinctUntilChanged` here, because some browsers will\r\n // fire the animation end event twice for the same animation. See:\r\n // https://github.com/angular/angular/issues/24084\r\n this._panelDoneAnimatingStream\r\n .pipe(distinctUntilChanged(), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n if (this.panelOpen) {\r\n this._scrollTop = 0;\r\n this.openedChange.emit(true);\r\n } else {\r\n this.openedChange.emit(false);\r\n this.overlayDir.offsetX = 0;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._initKeyManager();\r\n\r\n this._selectionModel.changed\r\n .pipe(takeUntil(this._destroy))\r\n .subscribe((event) => {\r\n event.added.forEach((option) => option.select());\r\n event.removed.forEach((option) => option.deselect());\r\n });\r\n\r\n this.options.changes\r\n .pipe(startWith(null), takeUntil(this._destroy))\r\n .subscribe(() => {\r\n this._resetOptions();\r\n this._initializeSelection();\r\n });\r\n }\r\n\r\n ngDoCheck() {\r\n if (this.ngControl) {\r\n this.updateErrorState();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let\r\n // the parent form field know to run change detection when the disabled state changes.\r\n if (changes.disabled) {\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._monitorSubscription.unsubscribe();\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n this._destroy.next();\r\n this._destroy.complete();\r\n this.stateChanges.complete();\r\n }\r\n\r\n /** Toggles the overlay panel open or closed. */\r\n toggle(): void {\r\n if (this.panelOpen) {\r\n this.close();\r\n } else {\r\n this.open();\r\n }\r\n }\r\n\r\n /** Opens the overlay panel. */\r\n open(): void {\r\n if (\r\n this.disabled ||\r\n !this.options ||\r\n !this.options.length ||\r\n this._panelOpen\r\n ) {\r\n return;\r\n }\r\n\r\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\r\n\r\n this._panelOpen = true;\r\n this._keyManager.withHorizontalOrientation(null);\r\n\r\n this._highlightCorrectOption();\r\n this._changeDetectorRef.markForCheck();\r\n this.openedChange.emit(true);\r\n this._elementRef.nativeElement.classList.add(\r\n 'oui-select-list-options-opened'\r\n );\r\n }\r\n\r\n /** Closes the overlay panel and focuses the host element. */\r\n close(): void {\r\n if (this._panelOpen) {\r\n this._panelOpen = false;\r\n this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');\r\n this._changeDetectorRef.markForCheck();\r\n this._onTouched();\r\n this.openedChange.emit(false);\r\n this._elementRef.nativeElement.classList.remove(\r\n 'oui-select-list-options-opened'\r\n );\r\n setTimeout((_) => this._document.activeElement.blur());\r\n }\r\n }\r\n\r\n /**\r\n * Sets the select's value. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param value New value to be written to the model.\r\n */\r\n writeValue(value: any): void {\r\n if (this.options) {\r\n this._setSelectionByValue(value);\r\n }\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select's value\r\n * changes from user input. Part of the ControlValueAccessor interface\r\n * required to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the value changes.\r\n */\r\n registerOnChange(fn: (value: any) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n /**\r\n * Saves a callback function to be invoked when the select is blurred\r\n * by the user. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param fn Callback to be triggered when the component has been touched.\r\n */\r\n registerOnTouched(fn: () => {}): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n /**\r\n * Disables the select. Part of the ControlValueAccessor interface required\r\n * to integrate with Angular's core forms API.\r\n *\r\n * @param isDisabled Sets whether the component is disabled.\r\n */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n\r\n /** Whether or not the overlay panel is open. */\r\n get panelOpen(): boolean {\r\n return this._panelOpen;\r\n }\r\n\r\n /** The currently selected option. */\r\n get selected(): OuiOption | OuiOption[] {\r\n return this.multiple\r\n ? this._selectionModel.selected\r\n : this._selectionModel.selected[0];\r\n }\r\n\r\n /** The value displayed in the trigger. */\r\n get triggerValue(): string {\r\n if (this.empty) {\r\n return '';\r\n }\r\n if (this._multiple) {\r\n const selectedOptions = this._selectionModel.selected.map(\r\n (option) => option.viewValueForSelect\r\n );\r\n\r\n if (this._isRtl()) {\r\n selectedOptions.reverse();\r\n }\r\n return selectedOptions.join(', ');\r\n }\r\n return this._selectionModel.selected[0].viewValueForSelect;\r\n }\r\n\r\n /** Whether the element is in RTL mode. */\r\n _isRtl(): boolean {\r\n return this._dir ? this._dir.value === 'rtl' : false;\r\n }\r\n\r\n /** Handles all keydown events on the select. */\r\n _handleKeydown(event: KeyboardEvent): void {\r\n if (!this.disabled) {\r\n if (this.panelOpen) {\r\n this._handleOpenKeydown(event);\r\n } else {\r\n this._handleClosedKeydown(event);\r\n }\r\n }\r\n }\r\n\r\n /** Handles keyboard events while the select is closed. */\r\n private _handleClosedKeydown(event: KeyboardEvent): void {\r\n const keyCode = event.keyCode;\r\n const isArrowKey =\r\n keyCode === DOWN_ARROW ||\r\n keyCode === UP_ARROW ||\r\n keyCode === LEFT_ARROW ||\r\n keyCode === RIGHT_ARROW;\r\n const isOpenKey = keyCode === ENTER || keyCode === SPACE;\r\n const manager = this._keyManager;\r\n\r\n // Open the select on ALT + arrow key to match the native \r\n event.preventDefault();\r\n this.close();\r\n } else if (\r\n (keyCode === ENTER || keyCode === SPACE) &&\r\n manager.activeItem &&\r\n !hasModifierKey(event)\r\n ) {\r\n event.preventDefault();\r\n manager.activeItem._selectViaInteraction();\r\n } else if (this._multiple && keyCode === A && event.ctrlKey) {\r\n event.preventDefault();\r\n this.handleCtrlKey();\r\n } else if (normalNavigationCheck) {\r\n // Check for non multiple select dropdown that the key pressed is not Tab, Space, Enter\r\n if (!this.isSearchFieldPresent) this.focus();\r\n this.handleScrolling(manager, event, isArrowKey, keyCode);\r\n }\r\n }\r\n\r\n /**\r\n * Handle ctrl key\r\n */\r\n private handleCtrlKey() {\r\n const hasDeselectedOptions = this.options.some(\r\n (opt) => !opt.disabled && !opt.selected\r\n );\r\n\r\n this.options.forEach((option) => {\r\n if (!option.disabled) {\r\n if (hasDeselectedOptions) {\r\n option.select();\r\n } else {\r\n option.deselect();\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @param manager\r\n * @param event\r\n * @param isArrowKey\r\n * @param keyCode\r\n */\r\n private handleScrolling(\r\n manager: ActiveDescendantKeyManager,\r\n event: KeyboardEvent,\r\n isArrowKey: boolean,\r\n keyCode: number\r\n ) {\r\n const previouslyFocusedIndex = manager.activeItemIndex;\r\n\r\n manager.onKeydown(event);\r\n\r\n if (\r\n this._multiple &&\r\n isArrowKey &&\r\n event.shiftKey &&\r\n manager.activeItem &&\r\n manager.activeItemIndex !== previouslyFocusedIndex\r\n ) {\r\n manager.activeItem._selectViaInteraction();\r\n }\r\n if (isArrowKey && manager.activeItemIndex !== previouslyFocusedIndex) {\r\n this._scrollToOption();\r\n } else {\r\n // First or last\r\n if (keyCode === DOWN_ARROW) {\r\n manager.setFirstItemActive();\r\n this._setScrollTop(0);\r\n }\r\n if (keyCode === UP_ARROW) {\r\n manager.setLastItemActive();\r\n this._scrollToOption();\r\n }\r\n }\r\n }\r\n\r\n _onFocus() {\r\n if (!this.disabled) {\r\n this._focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\r\n * \"blur\" to the panel when it opens, causing a false positive.\r\n */\r\n _onBlur() {\r\n this._focused = false;\r\n // this.isSearchFieldPresent = false;\r\n\r\n if (!this.disabled && !this.panelOpen) {\r\n this._onTouched();\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /**\r\n * Callback that is invoked when the overlay panel has been attached.\r\n */\r\n _onAttached(): void {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {\r\n this._setPseudoCheckboxPaddingSize();\r\n this._changeDetectorRef.detectChanges();\r\n this.panel.nativeElement.scrollTop = this._scrollTop;\r\n });\r\n }\r\n\r\n /** Returns the theme to be used on the panel. */\r\n _getPanelTheme(): string {\r\n return this._parentFormField ? `oui-${this._parentFormField.color}` : '';\r\n }\r\n\r\n // TODO(josephperrott): Remove after 2018 spec updates are fully merged.\r\n /** Sets the pseudo checkbox padding size based on the width of the pseudo checkbox. */\r\n private _setPseudoCheckboxPaddingSize() {\r\n if (!SELECT_MULTIPLE_PANEL_PADDING_X && this.multiple) {\r\n const pseudoCheckbox = this.panel.nativeElement.querySelector(\r\n '.oui-pseudo-checkbox'\r\n );\r\n if (pseudoCheckbox) {\r\n SELECT_MULTIPLE_PANEL_PADDING_X =\r\n SELECT_PANEL_PADDING_X * 1.5 + pseudoCheckbox.offsetWidth;\r\n }\r\n }\r\n }\r\n\r\n /** Whether the select has a value. */\r\n get empty(): boolean {\r\n return !this._selectionModel || this._selectionModel.isEmpty();\r\n }\r\n\r\n private _initializeSelection(): void {\r\n // Defer setting the value in order to avoid the \"Expression\r\n // has changed after it was checked\" errors from Angular.\r\n Promise.resolve().then(() => {\r\n this._setSelectionByValue(\r\n this.ngControl ? this.ngControl.value : this._value\r\n );\r\n this.savedValues = this.ngControl ? this.ngControl.value : this._value;\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Sets the selected option based on a value. If no option can be\r\n * found with the designated value, the select trigger is cleared.\r\n */\r\n private _setSelectionByValue(value: any): void {\r\n if (this.multiple && value) {\r\n if (!Array.isArray(value)) {\r\n throw getOuiSelectNonArrayValueError();\r\n }\r\n\r\n this._selectionModel.clear();\r\n value.forEach((currentValue: any) => this._selectValue(currentValue));\r\n this._sortValues();\r\n } else {\r\n this._selectionModel.clear();\r\n const correspondingOption = this._selectValue(value);\r\n // Shift focus to the active item. Note that we shouldn't do this in multiple\r\n // mode, because we don't know what option the user interacted with last.\r\n if (correspondingOption) {\r\n this._keyManager.setActiveItem(correspondingOption);\r\n }\r\n }\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /**\r\n * Finds and selects and option based on its value.\r\n *\r\n * @returns Option that has the corresponding value.\r\n */\r\n private _selectValue(value: any): OuiOption | undefined {\r\n const correspondingOption = this.options.find((option: OuiOption) => {\r\n try {\r\n // Treat null as a special reset value.\r\n return option.value != null && this._compareWith(option.value, value);\r\n } catch (error) {\r\n if (isDevMode()) {\r\n // Notify developers of errors in their comparator.\r\n console.warn(error);\r\n }\r\n return false;\r\n }\r\n });\r\n\r\n if (correspondingOption) {\r\n this._selectionModel.select(correspondingOption);\r\n }\r\n\r\n return correspondingOption;\r\n }\r\n\r\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\r\n private _initKeyManager() {\r\n this._keyManager = new ActiveDescendantKeyManager(this.options)\r\n .withTypeAhead()\r\n .withVerticalOrientation()\r\n .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')\r\n .withAllowedModifierKeys(['shiftKey']);\r\n\r\n this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n // Restore focus to the trigger before closing. Ensures that the focus\r\n // position won't be lost if the user got focus into the overlay.\r\n if (!this.singleActionItem) {\r\n this.focus();\r\n this.close();\r\n }\r\n });\r\n\r\n this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {\r\n if (this._panelOpen && this.panel) {\r\n // Panel is opened\r\n // Need not to scroll\r\n } else if (\r\n !this._panelOpen &&\r\n !this.multiple &&\r\n this._keyManager.activeItem\r\n ) {\r\n this._keyManager.activeItem._selectViaInteraction();\r\n }\r\n });\r\n }\r\n\r\n /** Drops current option subscriptions and IDs and resets from scratch. */\r\n private _resetOptions(): void {\r\n const changedOrDestroyed = merge(this.options.changes, this._destroy);\r\n\r\n this.optionSelectionChanges\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe((event) => {\r\n this._onSelect(event.source, event.isUserInput);\r\n\r\n if (event.isUserInput && !this.multiple && this._panelOpen) {\r\n this.close();\r\n this.focus();\r\n }\r\n });\r\n\r\n // Listen to changes in the internal state of the options and react accordingly.\r\n // Handles cases like the labels of the selected options changing.\r\n merge(...this.options.map((option) => option._stateChanges))\r\n .pipe(takeUntil(changedOrDestroyed))\r\n .subscribe(() => {\r\n this._changeDetectorRef.markForCheck();\r\n this.stateChanges.next();\r\n });\r\n\r\n this._setOptionIds();\r\n }\r\n\r\n /** Invoked when an option is clicked. */\r\n private _onSelect(option: OuiOption, isUserInput: boolean): void {\r\n const wasSelected = this._selectionModel.isSelected(option);\r\n\r\n if (option.value == null && !this._multiple) {\r\n option.deselect();\r\n this._selectionModel.clear();\r\n this._propagateChanges(option.value);\r\n } else {\r\n if (option.selected) {\r\n this._selectionModel.select(option);\r\n } else {\r\n this._selectionModel.deselect(option);\r\n }\r\n\r\n if (isUserInput) {\r\n this._keyManager.setActiveItem(option);\r\n }\r\n\r\n if (this.multiple) {\r\n this._sortValues();\r\n\r\n if (isUserInput) {\r\n // In case the user selected the option with their mouse, we\r\n // want to restore focus back to the trigger, in order to\r\n // prevent the select keyboard controls from clashing with\r\n // the ones from `oui-option`.\r\n this.focus();\r\n }\r\n }\r\n }\r\n\r\n if (wasSelected !== this._selectionModel.isSelected(option)) {\r\n this._propagateChanges();\r\n }\r\n if (this.multiple) {\r\n this.disableDoneButton = this._isDoneButtonDisabled();\r\n }\r\n this.stateChanges.next();\r\n }\r\n discardRecentChanges() {\r\n this.value = this.savedValues;\r\n this._setSelectionByValue(this.value);\r\n this.disableDoneButton = true;\r\n this.close();\r\n }\r\n doneRecentChanges() {\r\n this.savedValues = this.value;\r\n this.disableDoneButton = true;\r\n this.saveSelectionChange.emit(new OuiSelectChange(this, this.value));\r\n this.close();\r\n }\r\n\r\n handleSingleActionItemClick() {\r\n this.singleSelectionChange.emit();\r\n this.close();\r\n }\r\n\r\n /** Determine whether the \"Done\" button should be enabled or disabled based on the selection state */\r\n private _isDoneButtonDisabled(): boolean {\r\n const selectedItems = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n if (this.allowNoSelection) {\r\n return false;\r\n }\r\n return selectedItems.length === 0;\r\n }\r\n\r\n /** Sorts the selected values in the selected based on their order in the panel. */\r\n private _sortValues() {\r\n if (this.multiple) {\r\n const options = this.options.toArray();\r\n\r\n this._selectionModel.sort((a, b) =>\r\n this.sortComparator\r\n ? this.sortComparator(a, b, options)\r\n : options.indexOf(a) - options.indexOf(b)\r\n );\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Emits change event to set the model value. */\r\n private _propagateChanges(fallbackValue?: any): void {\r\n let valueToEmit: any = null;\r\n\r\n if (this.multiple) {\r\n valueToEmit = (this.selected as OuiOption[]).map(\r\n (option) => option.value\r\n );\r\n } else {\r\n valueToEmit = this.selected\r\n ? (this.selected as OuiOption).value\r\n : fallbackValue;\r\n }\r\n\r\n this._value = valueToEmit;\r\n this.valueChange.emit(valueToEmit);\r\n this._onChange(valueToEmit);\r\n this.selectionChange.emit(new OuiSelectChange(this, valueToEmit));\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n /** Records option IDs to pass to the aria-owns property. */\r\n private _setOptionIds() {\r\n this._optionIds = this.options.map((option) => option.id).join(' ');\r\n }\r\n\r\n /**\r\n * Highlights the selected item. If no option is selected, it will highlight\r\n * the first item instead.\r\n */\r\n private _highlightCorrectOption(): void {\r\n if (this.multiple) {\r\n this._highlightFirstFilteredOption();\r\n } else if (this._keyManager) {\r\n if (this.empty) {\r\n this._keyManager.setFirstItemActive();\r\n } else {\r\n this._keyManager.setActiveItem(this._selectionModel.selected[0]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Highlights the first of the filtered options if no element is currently highlighted\r\n */\r\n private _highlightFirstFilteredOption(): void {\r\n if (this._keyManager) {\r\n const activeElement = this._keyManager.activeItem?._getHostElement();\r\n // activeElement is not part of DOM if there is no parent element\r\n if (!activeElement || !activeElement.parentElement) {\r\n // highlight first element if there is no active element or active element is not part of DOM\r\n this._keyManager.setFirstItemActive();\r\n }\r\n }\r\n }\r\n\r\n /** Focuses the select element. */\r\n focus(): void {\r\n this._elementRef.nativeElement.focus();\r\n }\r\n\r\n /** Returns the aria-label of the select component. */\r\n _getAriaLabel(): string | null {\r\n // If an ariaLabelledby value has been set by the consumer, the select should not overwrite the\r\n // `aria-labelledby` value by setting the ariaLabel to the placeholder.\r\n return this.ariaLabelledby ? null : this.ariaLabel || this.placeholder;\r\n }\r\n\r\n /** Returns the aria-labelledby of the select component. */\r\n _getAriaLabelledby(): string | null {\r\n if (this.ariaLabelledby) {\r\n return this.ariaLabelledby;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Determines the `aria-activedescendant` to be set on the host. */\r\n _getAriaActiveDescendant(): string | null {\r\n if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\r\n return this._keyManager.activeItem.id;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n setDescribedByIds(ids: string[]) {\r\n this._ariaDescribedby = ids.join(' ');\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n onContainerClick() {\r\n this.focus();\r\n this.open();\r\n }\r\n\r\n /**\r\n * Implemented as part of OuiFormFieldControl.\r\n *\r\n * @docs-private\r\n */\r\n get shouldLabelFloat(): boolean {\r\n return this._panelOpen || !this.empty;\r\n }\r\n\r\n /**\r\n * Add outer class to perfect scrollbar\r\n * This is added only when there is a search field\r\n */\r\n ouiSelectInputOuter() {\r\n this.ouiSelectInputOuterClassName = 'oui-select-input-outer';\r\n }\r\n\r\n /**\r\n * Custom overlay class for cdk overlay container\r\n */\r\n openCdk() {\r\n this.overlayDir.positionChange.pipe(take(1)).subscribe((e) => {\r\n this.cdkConnectionOverlayPanel = '';\r\n if (e.connectionPair.originY === 'top') {\r\n this.cdkConnectionOverlayPanel = 'select-overlay-top';\r\n }\r\n this._changeDetectorRef.detectChanges();\r\n setTimeout((_) => this._scrollToOption());\r\n });\r\n\r\n const cdkOverLayContainer = this._document.querySelector(\r\n '.cdk-overlay-container'\r\n );\r\n const ouiSelectPanel = this._document.querySelector('.oui-select-panel');\r\n cdkOverLayContainer.classList.add('oui-select-overlay-container');\r\n const containerWidth = this._elementRef.nativeElement.offsetWidth;\r\n ouiSelectPanel.style.width = `${containerWidth}px`;\r\n const searchQueryString = '.oui-select-search-inner';\r\n if (this._document.querySelector(searchQueryString)) {\r\n this.scrollCalc(searchQueryString);\r\n }\r\n }\r\n scrollCalc(selectQueryString: string) {\r\n const searchInput = this._document.querySelector(selectQueryString);\r\n const outter = this._document.querySelector('.oui-select-panel');\r\n let inner = this._document.querySelector('.oui-option');\r\n if (inner === null) {\r\n inner = 0;\r\n }\r\n const scrollbarWidth = outter.offsetWidth - inner.offsetWidth;\r\n if (scrollbarWidth > 5) {\r\n searchInput.style.width = `${inner.offsetWidth}px`;\r\n } else {\r\n searchInput.style.width = '100%';\r\n }\r\n }\r\n\r\n /**\r\n * Given that we are not actually focusing active options, we must manually adjust scroll\r\n * to reveal options below the fold. First, we find the offset of the option from the top\r\n * of the panel. If that offset is below the fold, the new scrollTop will be the offset -\r\n * the panel height + the option height, so the active option will be just visible at the\r\n * bottom of the panel. If that offset is above the top of the visible panel, the new scrollTop\r\n * will become the offset. If that offset is visible within the panel already, the scrollTop is\r\n * not adjusted.\r\n */\r\n private _scrollToOption(): void {\r\n const manager = this._keyManager;\r\n const index = manager.activeItemIndex || 0;\r\n const labelCount = _countGroupLabelsBeforeOption(\r\n index,\r\n this.options,\r\n this.optionGroups\r\n );\r\n const selectedOption = manager.activeItem?._getHostElement();\r\n const selectActionWrapperElement = this._document.querySelector(\r\n '.oui-select-action-wrapper'\r\n ) as HTMLElement;\r\n const selectPanelElement = this._document.querySelector(\r\n '.oui-select-panel'\r\n ) as HTMLElement;\r\n const selectSearchBox = this._document.querySelector(\r\n '.oui-select-search-inner'\r\n ) as HTMLElement;\r\n const selectOptionsWrapper = this._document.querySelector(\r\n '.oui-select-options-wrapper'\r\n ) as HTMLElement;\r\n const labelHeight = labelCount ? (labelCount - 1) * 10 : 0;\r\n const optionHeight = selectedOption?.clientHeight || SELECT_OPTION_HEIGHT;\r\n const ouiSelectActionWrapperHeight =\r\n selectActionWrapperElement?.clientHeight ?? 0;\r\n const selectSearchBoxheight = selectSearchBox?.clientHeight - 10 || 0;\r\n const selectPanelHeight =\r\n selectPanelElement?.clientHeight -\r\n ouiSelectActionWrapperHeight -\r\n selectSearchBoxheight -\r\n 20 -\r\n labelHeight || SELECT_PANEL_HEIGHT;\r\n const selectOptionsWrapperRect =\r\n selectOptionsWrapper?.getBoundingClientRect();\r\n const selectedOptionRect = selectedOption?.getBoundingClientRect();\r\n const selectedOptionOffset =\r\n selectedOptionRect?.top -\r\n selectSearchBoxheight -\r\n selectOptionsWrapperRect?.top -\r\n 10;\r\n const scrollTop = this._getScrollTop();\r\n const newScrollPosition = _getOptionScrollPosition(\r\n index + labelCount,\r\n optionHeight,\r\n scrollTop,\r\n selectPanelHeight,\r\n selectedOptionOffset\r\n );\r\n this._setScrollTop(newScrollPosition);\r\n }\r\n\r\n /**\r\n * Sets the panel scrollTop. This allows us to manually scroll to display options\r\n * above or below the fold, as they are not actually being focused when active.\r\n */\r\n _setScrollTop(scrollTop: number): void {\r\n if (this.panel) {\r\n this.panel.nativeElement.querySelector('.oui-select-options').scrollTop =\r\n scrollTop;\r\n }\r\n }\r\n\r\n /** Returns the panel's scrollTop. */\r\n _getScrollTop(): number {\r\n return this.panel\r\n ? this.panel.nativeElement.querySelector('.oui-select-options').scrollTop\r\n : 0;\r\n }\r\n}\r\n", "assetsDirs": [], "styleUrlsData": [ { - "data": "@use 'sass:math';\r\n\r\n@import '../core/style/menu-common';\r\n@import '../core/style/list-common';\r\n@import '../core/style/variables';\r\n@import '../core/style/vendor-prefixes';\r\n$oui-select-arrow-size: 5px !default;\r\n$oui-select-arrow-margin: 4px !default;\r\n$oui-select-panel-max-height: 256px !default;\r\n$oui-select-item-height: 40px !default;\r\n$oui-select-placeholder-arrow-space: 2 *\r\n ($oui-select-arrow-size + $oui-select-arrow-margin);\r\n$gray-color: #eee;\r\n\r\n%placeholder {\r\n font-size: 14px;\r\n}\r\n\r\n.oui-error {\r\n @extend %placeholder;\r\n}\r\n.oui-select {\r\n display: inline-block;\r\n width: 100%;\r\n outline: none;\r\n div {\r\n margin: 0;\r\n vertical-align: middle;\r\n }\r\n .oui-select-value {\r\n @extend %placeholder;\r\n line-height: 19px;\r\n padding: 2px 8px 2px 0;\r\n }\r\n}\r\n\r\n.oui-select-trigger {\r\n display: inline-table;\r\n cursor: pointer;\r\n position: relative;\r\n box-sizing: border-box;\r\n\r\n .oui-select-disabled & {\r\n @include user-select(none);\r\n cursor: default;\r\n }\r\n}\r\n\r\n.oui-select-value {\r\n display: table-cell;\r\n max-width: 0;\r\n width: 100%;\r\n}\r\n\r\n.oui-select-value-text {\r\n display: inline-block;\r\n width: 100%;\r\n @include oui-truncate-line();\r\n span img {\r\n max-width: 20px;\r\n max-height: 20px;\r\n }\r\n}\r\n\r\n.oui-select-arrow-wrapper {\r\n display: inline-block;\r\n vertical-align: middle;\r\n\r\n // When used in a box appearance form-field the arrow should be shifted up 50%.\r\n .oui-form-field-appearance-fill & {\r\n transform: translateY(-50%);\r\n }\r\n\r\n // When used in a outline form-field the arrow should be shifted up 25%.\r\n .oui-form-field-appearance-outline & {\r\n transform: translateY(-25%);\r\n }\r\n\r\n // Animate the arrow position, but only when the transitioning to empty (animate the arrow down)\r\n // This is in line with the oui-form-field label animation\r\n .oui-form-field-appearance-standard .oui-select.oui-select-empty & {\r\n transition: transform $swift-ease-out-duration\r\n $swift-ease-out-timing-function;\r\n }\r\n\r\n ._oui-animation-noopable.oui-form-field-appearance-standard\r\n .oui-select.oui-select-empty\r\n & {\r\n transition: none;\r\n }\r\n}\r\n\r\n.oui-select-arrow {\r\n width: 12px;\r\n}\r\n\r\n.oui-focused {\r\n .oui-select-arrow {\r\n transform: rotate(180deg);\r\n }\r\n .oui-select.oui-input:not(.oui-select-list-options-opened) {\r\n .oui-select-arrow {\r\n transform: rotate(0deg);\r\n }\r\n }\r\n}\r\n\r\n.oui-select-large {\r\n max-height: 392px !important;\r\n}\r\n\r\n// Override optgroup and option to scale based on font-size of the trigger.\r\n.oui-select-panel {\r\n color: #333;\r\n -webkit-overflow-scrolling: touch; // for momentum scroll on mobile\r\n overflow-x: hidden;\r\n padding-bottom: 0;\r\n border: 1px solid #c8c8c8;\r\n background-color: #ffffff;\r\n max-height: 272px;\r\n margin: 6px 0 0 -10px;\r\n box-sizing: border-box;\r\n min-width: 100px;\r\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\r\n box-shadow: 0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14),\r\n 0 1px 10px 0 rgba(0, 0, 0, 0.12);\r\n padding-top: 10px;\r\n border-top: 0;\r\n &.oui-select-input-outer {\r\n padding-top: 0;\r\n }\r\n .oui-optgroup-label,\r\n .oui-option {\r\n line-height: $oui-select-item-height;\r\n height: $oui-select-item-height;\r\n padding: 0 10px;\r\n font-size: 14px;\r\n &.oui-active {\r\n background: $gray-color;\r\n color: #333;\r\n }\r\n &.oui-option-disabled {\r\n color: rgba(0, 0, 0, 0.38);\r\n }\r\n &:last-child {\r\n margin-bottom: 10px;\r\n }\r\n oui-checkbox {\r\n width: 100%;\r\n label {\r\n width: 100%;\r\n display: block;\r\n }\r\n }\r\n }\r\n .oui-option-multiple.oui-selected,\r\n .oui-option-multiple.oui-active {\r\n background: none;\r\n }\r\n .oui-optgroup-label {\r\n font-weight: 700;\r\n }\r\n}\r\n\r\n.oui-form-field-type-oui-select {\r\n &:not(.oui-form-field-disabled) .oui-form-field-flex {\r\n cursor: pointer;\r\n }\r\n\r\n .oui-form-field-label {\r\n width: calc(100% - #{$oui-select-placeholder-arrow-space});\r\n }\r\n}\r\n\r\n.oui-select-placeholder {\r\n // Delay the transition until the label has animated about a third of the way through, in\r\n // order to prevent the placeholder from overlapping for a split second.\r\n @include oui-truncate-line();\r\n display: inline-block;\r\n width: 100%;\r\n transition: color $swift-ease-out-duration\r\n math.div($swift-ease-out-duration, 3) $swift-ease-out-timing-function;\r\n color: #666;\r\n ._oui-animation-noopable & {\r\n transition: none;\r\n }\r\n\r\n .oui-form-field-hide-placeholder & {\r\n color: transparent;\r\n\r\n // Overwrite browser specific CSS properties that can overwrite the `color` property.\r\n // Some developers seem to use this approach to easily overwrite the placeholder / label color.\r\n -webkit-text-fill-color: transparent;\r\n\r\n // Remove the transition to prevent the placeholder\r\n // from overlapping when the label comes back down.\r\n transition: none;\r\n // Prevents the '...' from showing on the parent element.\r\n display: block;\r\n }\r\n}\r\n/*-- search dropdown --*/\r\n\r\n.oui-select-input-outer {\r\n box-sizing: border-box;\r\n}\r\n\r\n/*-- search dropdown --*/\r\n\r\n/*-- search ddropdown --*/\r\n.ui-select-overlay-container {\r\n position: absolute;\r\n}\r\n.oui-select-has-a-panel\r\n .oui-option.oui-selected:not(.oui-option-multiple):not(.oui-option-disabled) {\r\n background: rgba(0, 0, 0, 0.12);\r\n color: #3f51b5;\r\n font-weight: 500;\r\n}\r\n.oui-select-has-a-panel .oui-option:hover:not(.oui-option-disabled) {\r\n background: rgba(0, 0, 0, 0.04);\r\n}\r\n\r\n/*-- search ddropdown --*/\r\n\r\n/*-- search dropdown underline --*/\r\n.oui-form-field-appearance-underline {\r\n .oui-select-trigger {\r\n margin-left: 9px;\r\n .oui-select-value {\r\n overflow: visible;\r\n .oui-select-placeholder,\r\n .oui-select-value-text {\r\n width: 100%;\r\n @include oui-truncate-line();\r\n margin-left: -9px;\r\n display: block;\r\n height: 19px;\r\n }\r\n }\r\n }\r\n .oui-select.oui-input {\r\n border: 1px solid transparent;\r\n padding-left: 0;\r\n padding-right: 0;\r\n border-bottom: 1px solid #c8c8c8;\r\n > div {\r\n padding-right: 9px;\r\n }\r\n &:after {\r\n content: '';\r\n height: 1px;\r\n width: 100%;\r\n background: #c8c8c8;\r\n position: absolute;\r\n left: 0;\r\n bottom: 0;\r\n }\r\n }\r\n}\r\n\r\n.oui-form-field.oui-form-field-appearance-underline .oui-select.oui-input {\r\n &.oui-select-disabled {\r\n border: 1px solid transparent;\r\n border-bottom: 1px solid #e4e4e4;\r\n background: transparent;\r\n &:after {\r\n background: #e4e4e4;\r\n }\r\n }\r\n}\r\n.oui-form-field .oui-select.oui-input {\r\n &.oui-select-disabled {\r\n border: 1px solid #e4e4e4;\r\n background-color: #f9f9f9;\r\n color: #9b9b9b;\r\n cursor: default;\r\n .oui-select-arrow svg path {\r\n fill: #c8c8c8;\r\n }\r\n }\r\n &.oui-form-field-appearance-underline {\r\n .oui-select.oui-input {\r\n transition: border 0.5s, padding 0.5s;\r\n }\r\n }\r\n}\r\n\r\n/*-- search dropdown underline --*/\r\n\r\n.oui-option:focus:not(.oui-option-disabled),\r\n.oui-option:hover:not(.oui-option-disabled),\r\n.oui-option.oui-selected:not(.oui-option-multiple):not(.oui-option-disabled) {\r\n background: $gray-color;\r\n}\r\n\r\n.select-overlay-top.oui-select-panel {\r\n margin-bottom: 9px;\r\n border-top: 1px solid #c8c8c8;\r\n}\r\n\r\n.noResults {\r\n color: #333333;\r\n font-size: 14px;\r\n line-height: 22px;\r\n padding: 0 10px;\r\n margin: 17px 0 21px;\r\n word-break: break-all;\r\n}\r\n\r\noui-select-search {\r\n height: 60px;\r\n display: block;\r\n}\r\n.oui-select-disabled .oui-select-placeholder {\r\n color: #9b9b9b;\r\n}\r\n.oui-select-action-wrapper {\r\n height: 60px;\r\n display: block;\r\n margin-top: 10px;\r\n}\r\n\r\n.oui-select-action-items {\r\n position: absolute;\r\n background: #fff;\r\n bottom: 1px;\r\n border-top: 1px solid #ddd;\r\n padding: 12px 10px;\r\n z-index: 100;\r\n box-sizing: border-box;\r\n width: 100%;\r\n display: flex;\r\n justify-content: space-between;\r\n}\r\n", + "data": "@use 'sass:math';\n\n@import '../core/style/menu-common';\n@import '../core/style/list-common';\n@import '../core/style/variables';\n@import '../core/style/vendor-prefixes';\n$oui-select-arrow-size: 5px !default;\n$oui-select-arrow-margin: 4px !default;\n$oui-select-panel-max-height: 256px !default;\n$oui-select-item-height: 40px !default;\n$oui-select-placeholder-arrow-space: 2 *\n ($oui-select-arrow-size + $oui-select-arrow-margin);\n$gray-color: #eee;\n\n%placeholder {\n font-size: 14px;\n}\n\n.oui-error {\n @extend %placeholder;\n}\n.oui-select {\n display: inline-block;\n width: 100%;\n outline: none;\n div {\n margin: 0;\n vertical-align: middle;\n }\n .oui-select-value {\n @extend %placeholder;\n line-height: 19px;\n padding: 2px 8px 2px 0;\n }\n}\n\n.oui-select-trigger {\n display: inline-table;\n cursor: pointer;\n position: relative;\n box-sizing: border-box;\n\n .oui-select-disabled & {\n @include user-select(none);\n cursor: default;\n }\n}\n\n.oui-select-value {\n display: table-cell;\n max-width: 0;\n width: 100%;\n}\n\n.oui-select-value-text {\n display: inline-block;\n width: 100%;\n @include oui-truncate-line();\n span img {\n max-width: 20px;\n max-height: 20px;\n }\n}\n\n.oui-select-arrow-wrapper {\n display: inline-block;\n vertical-align: middle;\n\n // When used in a box appearance form-field the arrow should be shifted up 50%.\n .oui-form-field-appearance-fill & {\n transform: translateY(-50%);\n }\n\n // When used in a outline form-field the arrow should be shifted up 25%.\n .oui-form-field-appearance-outline & {\n transform: translateY(-25%);\n }\n\n // Animate the arrow position, but only when the transitioning to empty (animate the arrow down)\n // This is in line with the oui-form-field label animation\n .oui-form-field-appearance-standard .oui-select.oui-select-empty & {\n transition: transform $swift-ease-out-duration\n $swift-ease-out-timing-function;\n }\n\n ._oui-animation-noopable.oui-form-field-appearance-standard\n .oui-select.oui-select-empty\n & {\n transition: none;\n }\n}\n\n.oui-select-arrow {\n width: 12px;\n}\n\n.oui-focused {\n .oui-select-arrow {\n transform: rotate(180deg);\n }\n .oui-select.oui-input:not(.oui-select-list-options-opened) {\n .oui-select-arrow {\n transform: rotate(0deg);\n }\n }\n}\n\n.oui-select-large {\n max-height: 392px !important;\n}\n\n// Override optgroup and option to scale based on font-size of the trigger.\n.oui-select-panel {\n color: #333;\n -webkit-overflow-scrolling: touch; // for momentum scroll on mobile\n overflow-x: hidden;\n padding-bottom: 0;\n position: relative;\n border: 1px solid #c8c8c8;\n background-color: #ffffff;\n max-height: 272px;\n margin: 6px 0 0 -10px;\n box-sizing: border-box;\n min-width: 100px;\n font-family: 'Open Sans', Helvetica, Arial, sans-serif;\n box-shadow: 0 2px 4px -1px rgba(0, 0, 0, 0.2), 0 4px 5px 0 rgba(0, 0, 0, 0.14),\n 0 1px 10px 0 rgba(0, 0, 0, 0.12);\n border-top: 0;\n .oui-select-options {\n -webkit-overflow-scrolling: touch; // for momentum scroll on mobile\n overflow-x: hidden;\n height: 100%;\n padding-top: 10px;\n box-sizing: border-box;\n }\n &.oui-select-input-outer {\n .oui-select-options {\n padding-top: 0px;\n }\n }\n &.action-item,\n &.single-action-item {\n padding-bottom: 56px;\n }\n .oui-option {\n line-height: $oui-select-item-height;\n height: $oui-select-item-height;\n padding: 0 10px;\n font-size: 14px;\n &.oui-active {\n background: $gray-color;\n color: #333;\n }\n &.oui-option-disabled {\n color: rgba(0, 0, 0, 0.38);\n }\n &:last-child {\n margin-bottom: 10px;\n }\n oui-checkbox {\n width: 100%;\n label {\n width: 100%;\n display: block;\n }\n }\n }\n .oui-option-multiple.oui-selected,\n .oui-option-multiple.oui-active {\n background: none;\n }\n .oui-optgroup-label {\n font-weight: 700;\n display: block;\n padding: 0 10px;\n font-size: 14px;\n line-height: $oui-select-item-height;\n }\n}\n\n.oui-form-field-type-oui-select {\n &:not(.oui-form-field-disabled) .oui-form-field-flex {\n cursor: pointer;\n }\n\n .oui-form-field-label {\n width: calc(100% - #{$oui-select-placeholder-arrow-space});\n }\n}\n\n.oui-select-placeholder {\n // Delay the transition until the label has animated about a third of the way through, in\n // order to prevent the placeholder from overlapping for a split second.\n @include oui-truncate-line();\n display: inline-block;\n width: 100%;\n transition: color $swift-ease-out-duration\n math.div($swift-ease-out-duration, 3) $swift-ease-out-timing-function;\n color: #666;\n ._oui-animation-noopable & {\n transition: none;\n }\n\n .oui-form-field-hide-placeholder & {\n color: transparent;\n\n // Overwrite browser specific CSS properties that can overwrite the `color` property.\n // Some developers seem to use this approach to easily overwrite the placeholder / label color.\n -webkit-text-fill-color: transparent;\n\n // Remove the transition to prevent the placeholder\n // from overlapping when the label comes back down.\n transition: none;\n // Prevents the '...' from showing on the parent element.\n display: block;\n }\n}\n/*-- search dropdown --*/\n\n.oui-select-input-outer {\n box-sizing: border-box;\n}\n\n/*-- search dropdown --*/\n\n/*-- search ddropdown --*/\n.ui-select-overlay-container {\n position: absolute;\n}\n.oui-select-has-a-panel\n .oui-option.oui-selected:not(.oui-option-multiple):not(.oui-option-disabled) {\n background: rgba(0, 0, 0, 0.12);\n color: #3f51b5;\n font-weight: 500;\n}\n.oui-select-has-a-panel .oui-option:hover:not(.oui-option-disabled) {\n background: rgba(0, 0, 0, 0.04);\n}\n\n/*-- search ddropdown --*/\n\n/*-- search dropdown underline --*/\n.oui-form-field-appearance-underline {\n .oui-select-trigger {\n margin-left: 9px;\n .oui-select-value {\n overflow: visible;\n .oui-select-placeholder,\n .oui-select-value-text {\n width: 100%;\n @include oui-truncate-line();\n margin-left: -9px;\n display: block;\n height: 19px;\n }\n }\n }\n .oui-select.oui-input {\n border: 1px solid transparent;\n padding-left: 0;\n padding-right: 0;\n border-bottom: 1px solid #c8c8c8;\n > div {\n padding-right: 9px;\n }\n &:after {\n content: '';\n height: 1px;\n width: 100%;\n background: #c8c8c8;\n position: absolute;\n left: 0;\n bottom: 0;\n }\n }\n}\n\n.oui-form-field.oui-form-field-appearance-underline .oui-select.oui-input {\n &.oui-select-disabled {\n border: 1px solid transparent;\n border-bottom: 1px solid #e4e4e4;\n background: transparent;\n &:after {\n background: #e4e4e4;\n }\n }\n}\n.oui-form-field .oui-select.oui-input {\n &.oui-select-disabled {\n border: 1px solid #e4e4e4;\n background-color: #f9f9f9;\n color: #9b9b9b;\n cursor: default;\n .oui-select-arrow svg path {\n fill: #c8c8c8;\n }\n }\n &.oui-form-field-appearance-underline {\n .oui-select.oui-input {\n transition: border 0.5s, padding 0.5s;\n }\n }\n}\n\n/*-- search dropdown underline --*/\n\n.oui-option:focus:not(.oui-option-disabled),\n.oui-option:hover:not(.oui-option-disabled),\n.oui-option.oui-selected:not(.oui-option-multiple):not(.oui-option-disabled) {\n background: $gray-color;\n}\n\n.select-overlay-top.oui-select-panel {\n margin-bottom: 9px;\n border-top: 1px solid #c8c8c8;\n}\n\n.noResults {\n color: #333333;\n font-size: 14px;\n line-height: 22px;\n padding: 0 10px;\n margin: 17px 0 21px;\n word-break: break-all;\n}\n\noui-select-search {\n height: 60px;\n display: block;\n}\n.oui-select-disabled .oui-select-placeholder {\n color: #9b9b9b;\n}\n.oui-select-action-wrapper {\n height: 56px;\n box-sizing: border-box;\n background: #fff;\n display: block;\n width: 100%;\n position: absolute;\n bottom: 0px;\n left: 0px;\n}\n\n.oui-select-action-items {\n position: absolute;\n border-top: 1px solid #ddd;\n height: 100%;\n padding: 10px;\n background: #fff;\n bottom: 1px;\n z-index: 100;\n box-sizing: border-box;\n width: 100%;\n display: flex;\n justify-content: space-between;\n align-items: center;\n &.single-action-items {\n padding: 10px 0px !important;\n button {\n width: 100%;\n padding: 0px 10px !important;\n text-align: left;\n font-size: 14px;\n color: #333333 !important;\n border-radius: 0px;\n line-height: 40px;\n &:hover,\n &:focus {\n background-color: #eeeeee;\n box-shadow: none !important;\n text-decoration: none !important;\n }\n }\n }\n}\n", "styleUrl": "select.scss" } ], @@ -39841,7 +40199,7 @@ "deprecationMessage": "" } ], - "line": 548, + "line": 616, "jsdoctags": [ { "name": "_changeDetectorRef", @@ -40012,7 +40370,7 @@ } ], "returnType": "void", - "line": 350, + "line": 366, "jsdoctags": [ { "name": "value", @@ -40029,7 +40387,7 @@ "name": "large", "type": "boolean", "returnType": "boolean", - "line": 347, + "line": 363, "rawdescription": "\nWhether the oui-select is of large size.", "description": "

Whether the oui-select is of large size.

\n" } @@ -40050,7 +40408,7 @@ } ], "returnType": "void", - "line": 445, + "line": 465, "rawdescription": "\n\n", "description": "", "jsdoctags": [ @@ -40069,7 +40427,7 @@ "name": "focused", "type": "boolean", "returnType": "boolean", - "line": 439, + "line": 459, "rawdescription": "\nWhether the select is focused.", "description": "

Whether the select is focused.

\n" } @@ -40090,7 +40448,7 @@ } ], "returnType": "void", - "line": 459, + "line": 479, "jsdoctags": [ { "name": "value", @@ -40107,11 +40465,125 @@ "name": "placeholder", "type": "string", "returnType": "string", - "line": 456, + "line": 476, "rawdescription": "\nPlaceholder to be shown if no value has been selected.", "description": "

Placeholder to be shown if no value has been selected.

\n" } }, + "cancelLabel": { + "name": "cancelLabel", + "setSignature": { + "name": "cancelLabel", + "type": "void", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "void", + "line": 489, + "jsdoctags": [ + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "getSignature": { + "name": "cancelLabel", + "type": "string", + "returnType": "string", + "line": 486, + "rawdescription": "\nIn case of multiple the cancelLabel to be shown on cancel action button.", + "description": "

In case of multiple the cancelLabel to be shown on cancel action button.

\n" + } + }, + "doneLabel": { + "name": "doneLabel", + "setSignature": { + "name": "doneLabel", + "type": "void", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "void", + "line": 499, + "jsdoctags": [ + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "getSignature": { + "name": "doneLabel", + "type": "string", + "returnType": "string", + "line": 496, + "rawdescription": "\nIn case of multiple the doneLabel to be shown on apply action button.", + "description": "

In case of multiple the doneLabel to be shown on apply action button.

\n" + } + }, + "singleActionLabel": { + "name": "singleActionLabel", + "setSignature": { + "name": "singleActionLabel", + "type": "void", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "void", + "line": 509, + "jsdoctags": [ + { + "name": "value", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "getSignature": { + "name": "singleActionLabel", + "type": "string", + "returnType": "string", + "line": 506, + "rawdescription": "\nIn case of singleSelect and multiSelect the singleActionLabel to be shown on actionItem.", + "description": "

In case of singleSelect and multiSelect the singleActionLabel to be shown on actionItem.

\n" + } + }, "required": { "name": "required", "setSignature": { @@ -40128,7 +40600,7 @@ } ], "returnType": "void", - "line": 469, + "line": 519, "jsdoctags": [ { "name": "value", @@ -40145,7 +40617,7 @@ "name": "required", "type": "boolean", "returnType": "boolean", - "line": 466, + "line": 516, "rawdescription": "\nWhether the component is required.", "description": "

Whether the component is required.

\n" } @@ -40166,7 +40638,7 @@ } ], "returnType": "void", - "line": 479, + "line": 529, "jsdoctags": [ { "name": "value", @@ -40183,11 +40655,49 @@ "name": "multiple", "type": "boolean", "returnType": "boolean", - "line": 476, + "line": 526, "rawdescription": "\nWhether the user should be allowed to select multiple options.", "description": "

Whether the user should be allowed to select multiple options.

\n" } }, + "allowNoSelection": { + "name": "allowNoSelection", + "setSignature": { + "name": "allowNoSelection", + "type": "void", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "value", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "void", + "line": 542, + "jsdoctags": [ + { + "name": "value", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "getSignature": { + "name": "allowNoSelection", + "type": "boolean", + "returnType": "boolean", + "line": 539, + "rawdescription": "\nWhether the user should be allowed to select no option in case of multiple options.", + "description": "

Whether the user should be allowed to select no option in case of multiple options.

\n" + } + }, "actionItems": { "name": "actionItems", "setSignature": { @@ -40204,7 +40714,7 @@ } ], "returnType": "void", - "line": 492, + "line": 551, "jsdoctags": [ { "name": "value", @@ -40221,11 +40731,47 @@ "name": "actionItems", "type": "boolean", "returnType": "boolean", - "line": 489, + "line": 548, "rawdescription": "\nWhether the action items are required and use saveSelectionChange instead of selectionChange.", "description": "

Whether the action items are required and use saveSelectionChange instead of selectionChange.

\n" } }, + "singleActionItem": { + "name": "singleActionItem", + "setSignature": { + "name": "singleActionItem", + "type": "void", + "deprecated": false, + "deprecationMessage": "", + "args": [ + { + "name": "value", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "" + } + ], + "returnType": "void", + "line": 562, + "jsdoctags": [ + { + "name": "value", + "type": "boolean", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, + "getSignature": { + "name": "singleActionItem", + "type": "boolean", + "returnType": "boolean", + "line": 559 + } + }, "disableOptionCentering": { "name": "disableOptionCentering", "setSignature": { @@ -40242,7 +40788,7 @@ } ], "returnType": "void", - "line": 504, + "line": 572, "jsdoctags": [ { "name": "value", @@ -40259,7 +40805,7 @@ "name": "disableOptionCentering", "type": "boolean", "returnType": "boolean", - "line": 501, + "line": 569, "rawdescription": "\nWhether to center the active option over the trigger.", "description": "

Whether to center the active option over the trigger.

\n" } @@ -40294,7 +40840,7 @@ } ], "returnType": "void", - "line": 517, + "line": 585, "jsdoctags": [ { "name": "fn", @@ -40325,7 +40871,7 @@ "name": "compareWith", "type": "", "returnType": "", - "line": 514, + "line": 582, "rawdescription": "\n\nFunction to compare the option values with the selected values. The first argument\nis a value from an option. The second is a value from the selection. A boolean\nshould be returned.\n", "description": "

Function to compare the option values with the selected values. The first argument\nis a value from an option. The second is a value from the selection. A boolean\nshould be returned.

\n" } @@ -40346,7 +40892,7 @@ } ], "returnType": "void", - "line": 533, + "line": 601, "jsdoctags": [ { "name": "newValue", @@ -40363,7 +40909,7 @@ "name": "value", "type": "any", "returnType": "any", - "line": 530, + "line": 598, "rawdescription": "\nValue of the select control.", "description": "

Value of the select control.

\n" } @@ -40384,7 +40930,7 @@ } ], "returnType": "void", - "line": 545, + "line": 613, "jsdoctags": [ { "name": "value", @@ -40401,7 +40947,7 @@ "name": "id", "type": "string", "returnType": "string", - "line": 542, + "line": 610, "rawdescription": "\nUnique id of the element.", "description": "

Unique id of the element.

\n" } @@ -40412,7 +40958,7 @@ "name": "panelOpen", "type": "boolean", "returnType": "boolean", - "line": 746, + "line": 818, "rawdescription": "\nWhether or not the overlay panel is open.", "description": "

Whether or not the overlay panel is open.

\n" } @@ -40423,7 +40969,7 @@ "name": "selected", "type": "", "returnType": "OuiOption | []", - "line": 751, + "line": 823, "rawdescription": "\nThe currently selected option.", "description": "

The currently selected option.

\n" } @@ -40434,7 +40980,7 @@ "name": "triggerValue", "type": "string", "returnType": "string", - "line": 758, + "line": 830, "rawdescription": "\nThe value displayed in the trigger.", "description": "

The value displayed in the trigger.

\n" } @@ -40445,7 +40991,7 @@ "name": "empty", "type": "boolean", "returnType": "boolean", - "line": 1038, + "line": 1148, "rawdescription": "\nWhether the select has a value.", "description": "

Whether the select has a value.

\n" } @@ -40456,20 +41002,20 @@ "name": "shouldLabelFloat", "type": "boolean", "returnType": "boolean", - "line": 1335, + "line": 1468, "rawdescription": "\n\nImplemented as part of OuiFormFieldControl.\n\n", "description": "

Implemented as part of OuiFormFieldControl.

\n", "jsdoctags": [ { - "pos": 41320, - "end": 41338, + "pos": 45402, + "end": 45420, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, "kind": 334, "tagName": { - "pos": 41321, - "end": 41333, + "pos": 45403, + "end": 45415, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -40482,11 +41028,11 @@ } } }, - "templateData": "\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n\r\n \r\n \r\n
\r\n
\r\n \r\n Cancel\r\n Done\r\n \r\n
\r\n
\r\n \r\n
\r\n" + "templateData": "\n
\n \n \n \n \n \n \n \n
\n\n
\n \n
\n\n\n \n
\n
\n \n
\n
\n
\n
\n \n {{singleActionLabel}}\n \n
\n
\n
\n
\n \n {{cancelLabel}}\n {{doneLabel}}\n \n
\n
\n \n
\n" }, { "name": "OuiSelectSearchComponent", - "id": "component-OuiSelectSearchComponent-b5d4c942d8d465cd33b7e0ab034e1639b058da8de7ffbe5cfcd068b4fb84a6d15bef9387e48a64144b08ade938ddda170356d33b0931029d448ba35fc976c761", + "id": "component-OuiSelectSearchComponent-020fc213ffe283556978ee32a7ad7ddb66c2caa92d36feb9c76d2a59294bb24df326aced6005e081236e517d133a723cfd398fdd84a40b9eb51e40266c77c56d", "file": "ui/src/components/select/search/index.ts", "encapsulation": [], "entryComponents": [], @@ -40640,7 +41186,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 137, + "line": 133, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nFocuses the search input field\n", @@ -40663,7 +41209,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 150, + "line": 146, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nResets the current search value\nfocus whether to focus after resetting\n", @@ -40690,7 +41236,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 160, + "line": 156, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -40842,7 +41388,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 119, + "line": 115, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -40908,11 +41454,11 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import {\n Component,\n ElementRef,\n Inject,\n Input,\n OnInit,\n ViewChild,\n Optional,\n AfterViewChecked,\n forwardRef,\n OnDestroy,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { OuiSelect } from '../select.component';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\nimport { OuiOption } from '../../core/option/option';\n\n@Component({\n selector: 'oui-select-search',\n templateUrl: './option-search.html',\n styleUrls: ['./option-search.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OuiSelectSearchComponent),\n multi: true,\n },\n ],\n})\nexport class OuiSelectSearchComponent\n implements OnInit, AfterViewChecked, ControlValueAccessor, OnDestroy\n{\n /** Previously selected values when using */\n private previousSelectedValues: any[];\n\n /** Subject that emits when the component has been destroyed. */\n private _onDestroy = new Subject();\n\n @Input('aria-label') ariaLabel = 'Type to filter';\n\n /** Label of the search placeholder */\n @Input() placeholderLabel = '';\n\n /** Reference to the search input field */\n @ViewChild('searchSelectInput', { read: ElementRef, static: true })\n searchSelectInput: ElementRef;\n private _value: string;\n private onChange: (value: any) => void = () => {};\n onTouched = () => {};\n\n constructor(\n @Inject(OuiSelect) public ouiSelect: OuiSelect,\n @Optional() @Inject(DOCUMENT) private _document: any\n ) {}\n registerOnChange(fn: (value: any) => void) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n ngOnInit() {\n // when the select dropdown panel is opened or closed\n this.ouiSelect.openedChange.subscribe((opened) => {\n if (opened) {\n // focus the search field when opening\n this._focus();\n } else {\n // clear it when closing\n this._reset();\n }\n });\n this.initMultipleHandling();\n this.storeInitialValuesIntoPrevious();\n }\n\n private storeInitialValuesIntoPrevious() {\n this.ouiSelect._openedStream\n .pipe(\n takeUntil(this._onDestroy),\n filter(() => this.ouiSelect.multiple)\n )\n .subscribe(() => {\n this.previousSelectedValues = (\n this.ouiSelect.selected as OuiOption[]\n ).map((option) => option.value);\n });\n }\n\n ngOnDestroy() {\n this._onDestroy.next();\n this._onDestroy.complete();\n }\n\n writeValue(value: any): void {\n this.onChange(value);\n }\n\n onInputChange(value) {\n const valueChanged = value !== this._value;\n if (valueChanged) {\n this._value = value;\n this.onChange(value);\n }\n }\n ngAfterViewChecked() {\n const searchQueryString = '.oui-select-search-inner';\n if (this._document.querySelector(searchQueryString)) {\n this.scrollCalc(searchQueryString);\n }\n const actionItemsQueryString = '.oui-select-action-items';\n if (this._document.querySelector(actionItemsQueryString)) {\n this.scrollCalc(actionItemsQueryString);\n }\n }\n scrollCalc(selectQueryString: string) {\n const searchInput = this._document.querySelector(selectQueryString);\n const outter = this._document.querySelector('.oui-select-panel');\n let inner = this._document.querySelector('.oui-option');\n if (inner === null) {\n inner = 0;\n }\n const scrollbarWidth = outter.offsetWidth - inner.offsetWidth;\n if (scrollbarWidth > 5) {\n searchInput.style.width = `${inner.offsetWidth}px`;\n } else {\n searchInput.style.width = `calc(100% + 8px)`;\n }\n }\n\n /**\n * Focuses the search input field\n */\n public _focus() {\n if (!this.searchSelectInput) {\n return;\n }\n // focus\n setTimeout((_) => this.searchSelectInput.nativeElement.focus());\n this.ouiSelect.ouiSelectInputOuter();\n }\n\n /**\n * Resets the current search value\n * focus whether to focus after resetting\n */\n public _reset(focus?: boolean) {\n if (!this.searchSelectInput) {\n return;\n }\n this.searchSelectInput.nativeElement.value = '';\n this.onInputChange('');\n if (focus) {\n this._focus();\n }\n }\n private initMultipleHandling() {\n // In oui-search, if we filter something then the options which has disappeared, will be treated as deselected. To avoid this problem we can store the previously selected value and restore them if those values are not available in visible option.\n this.ouiSelect.valueChange\n .pipe(takeUntil(this._onDestroy))\n .subscribe((values) => {\n if (this.ouiSelect.multiple) {\n let restoreSelectedValues = false;\n if (\n this._value &&\n this._value.length &&\n this.previousSelectedValues &&\n Array.isArray(this.previousSelectedValues)\n ) {\n if (!values || !Array.isArray(values)) {\n values = [];\n }\n const optionValues = this.ouiSelect.options.map(\n (option) => option.value\n );\n this.previousSelectedValues.forEach((previousValue) => {\n if (\n values.indexOf(previousValue) === -1 &&\n optionValues.indexOf(previousValue) === -1\n ) {\n // if a value that was selected before is not found in the options due to filtering then it will be treated as deselected\n // to avoid this we can push them again.\n values.push(previousValue);\n restoreSelectedValues = true;\n }\n });\n }\n\n if (restoreSelectedValues) {\n this.ouiSelect._onChange(values);\n }\n\n this.previousSelectedValues = values;\n }\n });\n }\n}\n", + "sourceCode": "import {\n Component,\n ElementRef,\n Inject,\n Input,\n OnInit,\n ViewChild,\n Optional,\n AfterViewChecked,\n forwardRef,\n OnDestroy,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { OuiSelect } from '../select.component';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\nimport { OuiOption } from '../../core/option/option';\n\n@Component({\n selector: 'oui-select-search',\n templateUrl: './option-search.html',\n styleUrls: ['./option-search.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => OuiSelectSearchComponent),\n multi: true,\n },\n ],\n})\nexport class OuiSelectSearchComponent\n implements OnInit, AfterViewChecked, ControlValueAccessor, OnDestroy\n{\n /** Previously selected values when using */\n private previousSelectedValues: any[];\n\n /** Subject that emits when the component has been destroyed. */\n private _onDestroy = new Subject();\n\n @Input('aria-label') ariaLabel = 'Type to filter';\n\n /** Label of the search placeholder */\n @Input() placeholderLabel = '';\n\n /** Reference to the search input field */\n @ViewChild('searchSelectInput', { read: ElementRef, static: true })\n searchSelectInput: ElementRef;\n private _value: string;\n private onChange: (value: any) => void = () => {};\n onTouched = () => {};\n\n constructor(\n @Inject(OuiSelect) public ouiSelect: OuiSelect,\n @Optional() @Inject(DOCUMENT) private _document: any\n ) {}\n registerOnChange(fn: (value: any) => void) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n ngOnInit() {\n // when the select dropdown panel is opened or closed\n this.ouiSelect.openedChange.subscribe((opened) => {\n if (opened) {\n // focus the search field when opening\n this._focus();\n } else {\n // clear it when closing\n this._reset();\n }\n });\n this.initMultipleHandling();\n this.storeInitialValuesIntoPrevious();\n }\n\n private storeInitialValuesIntoPrevious() {\n this.ouiSelect._openedStream\n .pipe(\n takeUntil(this._onDestroy),\n filter(() => this.ouiSelect.multiple)\n )\n .subscribe(() => {\n this.previousSelectedValues = (\n this.ouiSelect.selected as OuiOption[]\n ).map((option) => option.value);\n });\n }\n\n ngOnDestroy() {\n this._onDestroy.next();\n this._onDestroy.complete();\n }\n\n writeValue(value: any): void {\n this.onChange(value);\n }\n\n onInputChange(value) {\n const valueChanged = value !== this._value;\n if (valueChanged) {\n this._value = value;\n this.onChange(value);\n }\n }\n ngAfterViewChecked() {\n const searchQueryString = '.oui-select-search-inner';\n if (this._document.querySelector(searchQueryString)) {\n this.scrollCalc(searchQueryString);\n }\n }\n scrollCalc(selectQueryString: string) {\n const searchInput = this._document.querySelector(selectQueryString);\n const outter = this._document.querySelector('.oui-select-panel');\n let inner = this._document.querySelector('.oui-option');\n if (inner === null) {\n inner = 0;\n }\n const scrollbarWidth = outter.offsetWidth - inner.offsetWidth;\n if (scrollbarWidth > 5) {\n searchInput.style.width = `${inner.offsetWidth}px`;\n } else {\n searchInput.style.width = '100%';\n }\n }\n\n /**\n * Focuses the search input field\n */\n public _focus() {\n if (!this.searchSelectInput) {\n return;\n }\n // focus\n setTimeout((_) => this.searchSelectInput.nativeElement.focus());\n this.ouiSelect.ouiSelectInputOuter();\n }\n\n /**\n * Resets the current search value\n * focus whether to focus after resetting\n */\n public _reset(focus?: boolean) {\n if (!this.searchSelectInput) {\n return;\n }\n this.searchSelectInput.nativeElement.value = '';\n this.onInputChange('');\n if (focus) {\n this._focus();\n }\n }\n private initMultipleHandling() {\n // In oui-search, if we filter something then the options which has disappeared, will be treated as deselected. To avoid this problem we can store the previously selected value and restore them if those values are not available in visible option.\n this.ouiSelect.valueChange\n .pipe(takeUntil(this._onDestroy))\n .subscribe((values) => {\n if (this.ouiSelect.multiple) {\n let restoreSelectedValues = false;\n if (\n this._value &&\n this._value.length &&\n this.previousSelectedValues &&\n Array.isArray(this.previousSelectedValues)\n ) {\n if (!values || !Array.isArray(values)) {\n values = [];\n }\n const optionValues = this.ouiSelect.options.map(\n (option) => option.value\n );\n this.previousSelectedValues.forEach((previousValue) => {\n if (\n values.indexOf(previousValue) === -1 &&\n optionValues.indexOf(previousValue) === -1\n ) {\n // if a value that was selected before is not found in the options due to filtering then it will be treated as deselected\n // to avoid this we can push them again.\n values.push(previousValue);\n restoreSelectedValues = true;\n }\n });\n }\n\n if (restoreSelectedValues) {\n this.ouiSelect._onChange(values);\n }\n\n this.previousSelectedValues = values;\n }\n });\n }\n}\n", "assetsDirs": [], "styleUrlsData": [ { - "data": "$oui-menu-side-padding: 16px !default;\r\n$scrollbar-width: 17px;\r\n$clear-button-width: 20px;\r\n$multiple-check-width: 33px;\r\n$defaul-color: #c8c8c8;\r\n\r\n.oui-select-search-hidden {\r\n visibility: hidden;\r\n}\r\n.oui-select-search-inner {\r\n position: absolute;\r\n background: #fff;\r\n top: 6px;\r\n left: -9px;\r\n width: 100%;\r\n z-index: 100;\r\n padding: 10px;\r\n box-sizing: border-box;\r\n &.oui-select-search-inner-multiple {\r\n width: calc(\r\n 100% + #{2 * $oui-menu-side-padding - $scrollbar-width +\r\n $multiple-check-width}\r\n );\r\n }\r\n .oui-select-search-input {\r\n &:focus {\r\n border-color: $defaul-color;\r\n }\r\n }\r\n}\r\n.oui-select-search-panel {\r\n /* allow absolute positioning relative to outer options container */\r\n transform: none !important;\r\n max-height: 150px;\r\n}\r\n.oui-select-search-no-entries-found {\r\n padding: $oui-menu-side-padding;\r\n}\r\n.oui-select-search-clear {\r\n position: absolute;\r\n right: 0;\r\n top: 4px;\r\n}\r\n", + "data": "$oui-menu-side-padding: 16px !default;\n$scrollbar-width: 17px;\n$clear-button-width: 20px;\n$multiple-check-width: 33px;\n$defaul-color: #c8c8c8;\n\n.oui-select-search-hidden {\n visibility: hidden;\n}\n.oui-select-search-inner {\n position: absolute;\n background: #fff;\n top: 0px;\n left: 0px;\n width: 100%;\n z-index: 100;\n padding: 10px;\n box-sizing: border-box;\n &.oui-select-search-inner-multiple {\n width: calc(\n 100% + #{2 * $oui-menu-side-padding - $scrollbar-width +\n $multiple-check-width}\n );\n }\n .oui-select-search-input {\n &:focus {\n border-color: $defaul-color;\n }\n }\n}\n.oui-select-search-panel {\n /* allow absolute positioning relative to outer options container */\n transform: none !important;\n max-height: 150px;\n}\n.oui-select-search-no-entries-found {\n padding: $oui-menu-side-padding;\n}\n.oui-select-search-clear {\n position: absolute;\n right: 0;\n top: 4px;\n}\n", "styleUrl": "./option-search.scss" } ], @@ -42081,7 +42627,7 @@ }, { "name": "OuiTab", - "id": "component-OuiTab-90101422686a726eb69c50499e9ec74197febce4088a5e86c3b704858597fd644e9b89a1b60a173f1983d03998f71c65913b11ac249b411b2c954bfd8a2e0b22", + "id": "component-OuiTab-f9918c233e7d4293aa9e22879315bdb9ca8cc124f70f811141a4d9ef7c41743fe96d94824c5a2460821ce9304c7ec8ad7a143a68cda612a8c9620e183ee42e13", "file": "ui/src/components/tabs/tab.ts", "changeDetection": "ChangeDetectionStrategy.Default", "encapsulation": [ @@ -42113,7 +42659,7 @@ "deprecationMessage": "", "rawdescription": "\nAria label for the tab.", "description": "

Aria label for the tab.

\n", - "line": 95, + "line": 96, "type": "string", "decorators": [] }, @@ -42123,7 +42669,7 @@ "deprecationMessage": "", "rawdescription": "\n\nReference to the element that the tab is labelled by.\nWill be cleared if `aria-label` is set at the same time.\n", "description": "

Reference to the element that the tab is labelled by.\nWill be cleared if aria-label is set at the same time.

\n", - "line": 103, + "line": 104, "type": "string", "decorators": [] }, @@ -42133,7 +42679,7 @@ "deprecationMessage": "", "rawdescription": "\n\nClasses to be passed to the tab oui-tab-body container.\nSupports string and string array values, same as `ngClass`.\n", "description": "

Classes to be passed to the tab oui-tab-body container.\nSupports string and string array values, same as ngClass.

\n", - "line": 115, + "line": 116, "type": "string | string[]", "decorators": [] }, @@ -42142,7 +42688,7 @@ "defaultValue": "'accent'", "deprecated": false, "deprecationMessage": "", - "line": 97, + "line": 98, "type": "string", "decorators": [] }, @@ -42153,7 +42699,7 @@ "deprecationMessage": "", "rawdescription": "\nPlain text label for the tab, used when there is no template label.", "description": "

Plain text label for the tab, used when there is no template label.

\n", - "line": 90, + "line": 91, "type": "string", "decorators": [] }, @@ -42163,18 +42709,9 @@ "deprecationMessage": "", "rawdescription": "\n\nClasses to be passed to the tab label inside the oui-tab-header container.\nSupports string and string array values, same as `ngClass`.\n", "description": "

Classes to be passed to the tab label inside the oui-tab-header container.\nSupports string and string array values, same as ngClass.

\n", - "line": 109, + "line": 110, "type": "string | string[]", "decorators": [] - }, - { - "name": "text", - "defaultValue": "''", - "deprecated": false, - "deprecationMessage": "", - "line": 92, - "type": "string", - "decorators": [] } ], "outputsClass": [], @@ -42186,7 +42723,7 @@ "type": "any", "optional": false, "description": "", - "line": 148, + "line": 149, "decorators": [ { "name": "Inject", @@ -42211,7 +42748,7 @@ "type": "TemplatePortal | null", "optional": false, "description": "

Portal that will be the hosted content of the tab

\n", - "line": 118, + "line": 119, "rawdescription": "\nPortal that will be the hosted content of the tab", "modifierKind": [ 123 @@ -42225,7 +42762,7 @@ "type": "TemplateRef", "optional": false, "description": "

Template provided in the tab content that will be used if present, used to enable lazy-loading

\n", - "line": 84, + "line": 85, "rawdescription": "\n\nTemplate provided in the tab content that will be used if present, used to enable lazy-loading\n", "decorators": [ { @@ -42245,7 +42782,7 @@ "type": "TemplateRef", "optional": false, "description": "

Template inside the OuiTab view that contains an <ng-content>.

\n", - "line": 87, + "line": 88, "rawdescription": "\nTemplate inside the OuiTab view that contains an ``.", "decorators": [ { @@ -42265,7 +42802,7 @@ "type": "", "optional": false, "description": "

Emits whenever the internal state of the tab changes.

\n", - "line": 126, + "line": 127, "rawdescription": "\nEmits whenever the internal state of the tab changes.", "modifierKind": [ 148 @@ -42278,7 +42815,7 @@ "type": "ElementRef", "optional": false, "description": "", - "line": 145, + "line": 146, "decorators": [ { "name": "ViewChild", @@ -42296,12 +42833,22 @@ "type": "OuiTabLabel", "optional": false, "description": "

Content for the tab label given by <ng-template oui-tab-label>.

\n", - "line": 69, + "line": 70, "rawdescription": "\nContent for the tab label given by ``.", "modifierKind": [ 123 ] }, + { + "name": "contentWithin", + "defaultValue": "''", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 93 + }, { "name": "disabled", "deprecated": false, @@ -42309,7 +42856,7 @@ "type": "any", "optional": false, "description": "", - "line": 70 + "line": 71 }, { "name": "isActive", @@ -42319,7 +42866,7 @@ "type": "", "optional": false, "description": "

Whether the tab is currently active.

\n", - "line": 143, + "line": 144, "rawdescription": "\n\nWhether the tab is currently active.\n" }, { @@ -42330,7 +42877,7 @@ "type": "number | null", "optional": false, "description": "

The initial relatively index origin of the tab if it was created and selected after there\nwas already a selected tab. Provides context of what position the tab should originate from.

\n", - "line": 138, + "line": 139, "rawdescription": "\n\nThe initial relatively index origin of the tab if it was created and selected after there\nwas already a selected tab. Provides context of what position the tab should originate from.\n" }, { @@ -42341,7 +42888,7 @@ "type": "number | null", "optional": false, "description": "

The relatively indexed position where 0 represents the center, negative is left, and positive\nrepresents the right.

\n", - "line": 132, + "line": 133, "rawdescription": "\n\nThe relatively indexed position where 0 represents the center, negative is left, and positive\nrepresents the right.\n" } ], @@ -42359,7 +42906,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 194, + "line": 208, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nThis has been extracted to a util because of TS 4 and VE.\nView Engine doesn't support property rename inheritance.\nTS 4.0 doesn't allow properties to override accessors or vice-versa.\n", @@ -42385,7 +42932,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 170, + "line": 178, "deprecated": false, "deprecationMessage": "" }, @@ -42402,7 +42949,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 155, + "line": 157, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -42423,7 +42970,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 176, + "line": 184, "deprecated": false, "deprecationMessage": "" }, @@ -42433,7 +42980,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 180, + "line": 188, "deprecated": false, "deprecationMessage": "" } @@ -42447,7 +42994,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ContentChild,\r\n ElementRef,\r\n Inject,\r\n InjectionToken,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n SimpleChanges,\r\n TemplateRef,\r\n ViewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { OuiTabContent } from './tab-content';\r\nimport { OUI_TAB, OuiTabLabel } from './tab-label';\r\nimport { CanDisable, mixinColor } from '../core';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport class OuiTabsBase {\r\n constructor(public _elementRef: ElementRef) {}\r\n}\r\n// Boilerplate for applying mixins to OuiTab.\r\n/** @docs-private */\r\nconst _OuiTabMixinBase: typeof OuiTabsBase = mixinColor(OuiTabsBase);\r\n\r\n/**\r\n * Used to provide a tab group to a tab without causing a circular dependency.\r\n * @docs-private\r\n */\r\nexport const OUI_TAB_GROUP = new InjectionToken('OUI_TAB_GROUP');\r\n\r\n/** Default color palette for the tab */\r\nconst DEFAULT_COLOR = 'primary';\r\n\r\n@Component({\r\n selector: 'oui-tab',\r\n\r\n // Note that usually we'd go through a bit more trouble and set up another class so that\r\n // the inlined template of `OuiTab` isn't duplicated, however the template is small enough\r\n // that creating the extra class will generate more code than just duplicating the template.\r\n templateUrl: 'tab.html',\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['disabled'],\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n encapsulation: ViewEncapsulation.None,\r\n exportAs: 'OuiTab',\r\n providers: [{ provide: OUI_TAB, useExisting: OuiTab }],\r\n})\r\nexport class OuiTab\r\n extends _OuiTabMixinBase\r\n implements CanDisable, OnInit, OnChanges, OnDestroy\r\n{\r\n /** Content for the tab label given by ``. */\r\n private _templateLabel: OuiTabLabel;\r\n disabled: any;\r\n @ContentChild(OuiTabLabel)\r\n get templateLabel(): OuiTabLabel {\r\n return this._templateLabel;\r\n }\r\n set templateLabel(value: OuiTabLabel) {\r\n this._setTemplateLabelInput(value);\r\n }\r\n\r\n /**\r\n * Template provided in the tab content that will be used if present, used to enable lazy-loading\r\n */\r\n @ContentChild(OuiTabContent, { read: TemplateRef, static: true })\r\n // We need an initializer here to avoid a TS error. The value will be set in `ngAfterViewInit`.\r\n private _explicitContent: TemplateRef = undefined!;\r\n\r\n /** Template inside the OuiTab view that contains an ``. */\r\n @ViewChild(TemplateRef, { static: true }) _implicitContent: TemplateRef;\r\n\r\n /** Plain text label for the tab, used when there is no template label. */\r\n @Input('label') textLabel = '';\r\n\r\n @Input('text') givenText = '';\r\n\r\n /** Aria label for the tab. */\r\n @Input('aria-label') ariaLabel: string;\r\n\r\n @Input() color = 'accent';\r\n\r\n /**\r\n * Reference to the element that the tab is labelled by.\r\n * Will be cleared if `aria-label` is set at the same time.\r\n */\r\n @Input('aria-labelledby') ariaLabelledby: string;\r\n\r\n /**\r\n * Classes to be passed to the tab label inside the oui-tab-header container.\r\n * Supports string and string array values, same as `ngClass`.\r\n */\r\n @Input() labelClass: string | string[];\r\n\r\n /**\r\n * Classes to be passed to the tab oui-tab-body container.\r\n * Supports string and string array values, same as `ngClass`.\r\n */\r\n @Input() bodyClass: string | string[];\r\n\r\n /** Portal that will be the hosted content of the tab */\r\n private _contentPortal: TemplatePortal | null = null;\r\n\r\n /** @docs-private */\r\n get content(): TemplatePortal | null {\r\n return this._contentPortal;\r\n }\r\n\r\n /** Emits whenever the internal state of the tab changes. */\r\n readonly _stateChanges = new Subject();\r\n\r\n /**\r\n * The relatively indexed position where 0 represents the center, negative is left, and positive\r\n * represents the right.\r\n */\r\n position: number | null = null;\r\n\r\n /**\r\n * The initial relatively index origin of the tab if it was created and selected after there\r\n * was already a selected tab. Provides context of what position the tab should originate from.\r\n */\r\n origin: number | null = null;\r\n\r\n /**\r\n * Whether the tab is currently active.\r\n */\r\n isActive = false;\r\n\r\n @ViewChild('tab1') _tab1: ElementRef;\r\n constructor(\r\n private _viewContainerRef: ViewContainerRef,\r\n @Inject(OUI_TAB_GROUP) @Optional() public _closestTabGroup: any,\r\n _elementRef: ElementRef\r\n ) {\r\n super(_elementRef);\r\n this.addThemeColor();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (\r\n Object.prototype.hasOwnProperty.call(changes, 'textLabel') ||\r\n Object.prototype.hasOwnProperty.call(changes, 'disabled')\r\n ) {\r\n this._stateChanges.next();\r\n }\r\n if (\r\n Object.prototype.hasOwnProperty.call(changes, '_tab2') ||\r\n Object.prototype.hasOwnProperty.call(changes, 'disabled')\r\n ) {\r\n this._stateChanges.next();\r\n }\r\n }\r\n\r\n addThemeColor() {\r\n if (!this.color) {\r\n this.color = DEFAULT_COLOR;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._stateChanges.complete();\r\n }\r\n\r\n ngOnInit(): void {\r\n this._contentPortal = new TemplatePortal(\r\n this._explicitContent || this._implicitContent,\r\n this._viewContainerRef,\r\n this._tab1\r\n );\r\n }\r\n\r\n /**\r\n * This has been extracted to a util because of TS 4 and VE.\r\n * View Engine doesn't support property rename inheritance.\r\n * TS 4.0 doesn't allow properties to override accessors or vice-versa.\r\n * @docs-private\r\n */\r\n private _setTemplateLabelInput(value: OuiTabLabel | undefined) {\r\n // Only update the label if the query managed to find one. This works around an issue where a\r\n // user may have manually set `templateLabel` during creation mode, which would then get\r\n // clobbered by `undefined` when the query resolves. Also note that we check that the closest\r\n // tab matches the current one so that we don't pick up labels from nested tabs.\r\n if (value && value._closestTab === this) {\r\n this._templateLabel = value;\r\n }\r\n }\r\n}\r\n", + "sourceCode": "import {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n ElementRef,\n Inject,\n InjectionToken,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { OuiTabContent } from './tab-content';\nimport { OUI_TAB, OuiTabLabel } from './tab-label';\nimport { CanDisable, mixinColor } from '../core';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { Subject } from 'rxjs';\nimport { DomSanitizer } from '@angular/platform-browser';\n\nexport class OuiTabsBase {\n constructor(public _elementRef: ElementRef) {}\n}\n// Boilerplate for applying mixins to OuiTab.\n/** @docs-private */\nconst _OuiTabMixinBase: typeof OuiTabsBase = mixinColor(OuiTabsBase);\n\n/**\n * Used to provide a tab group to a tab without causing a circular dependency.\n * @docs-private\n */\nexport const OUI_TAB_GROUP = new InjectionToken('OUI_TAB_GROUP');\n\n/** Default color palette for the tab */\nconst DEFAULT_COLOR = 'primary';\n\n@Component({\n selector: 'oui-tab',\n\n // Note that usually we'd go through a bit more trouble and set up another class so that\n // the inlined template of `OuiTab` isn't duplicated, however the template is small enough\n // that creating the extra class will generate more code than just duplicating the template.\n templateUrl: 'tab.html',\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['disabled'],\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n changeDetection: ChangeDetectionStrategy.Default,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'OuiTab',\n providers: [{ provide: OUI_TAB, useExisting: OuiTab }],\n})\nexport class OuiTab\n extends _OuiTabMixinBase\n implements CanDisable, OnInit, OnChanges, OnDestroy\n{\n /** Content for the tab label given by ``. */\n private _templateLabel: OuiTabLabel;\n disabled: any;\n @ContentChild(OuiTabLabel)\n get templateLabel(): OuiTabLabel {\n return this._templateLabel;\n }\n set templateLabel(value: OuiTabLabel) {\n this._setTemplateLabelInput(value);\n }\n\n /**\n * Template provided in the tab content that will be used if present, used to enable lazy-loading\n */\n @ContentChild(OuiTabContent, { read: TemplateRef, static: true })\n // We need an initializer here to avoid a TS error. The value will be set in `ngAfterViewInit`.\n private _explicitContent: TemplateRef = undefined!;\n\n /** Template inside the OuiTab view that contains an ``. */\n @ViewChild(TemplateRef, { static: true }) _implicitContent: TemplateRef;\n\n /** Plain text label for the tab, used when there is no template label. */\n @Input('label') textLabel = '';\n\n contentWithin = '';\n\n /** Aria label for the tab. */\n @Input('aria-label') ariaLabel: string;\n\n @Input() color = 'accent';\n\n /**\n * Reference to the element that the tab is labelled by.\n * Will be cleared if `aria-label` is set at the same time.\n */\n @Input('aria-labelledby') ariaLabelledby: string;\n\n /**\n * Classes to be passed to the tab label inside the oui-tab-header container.\n * Supports string and string array values, same as `ngClass`.\n */\n @Input() labelClass: string | string[];\n\n /**\n * Classes to be passed to the tab oui-tab-body container.\n * Supports string and string array values, same as `ngClass`.\n */\n @Input() bodyClass: string | string[];\n\n /** Portal that will be the hosted content of the tab */\n private _contentPortal: TemplatePortal | null = null;\n\n /** @docs-private */\n get content(): TemplatePortal | null {\n return this._contentPortal;\n }\n\n /** Emits whenever the internal state of the tab changes. */\n readonly _stateChanges = new Subject();\n\n /**\n * The relatively indexed position where 0 represents the center, negative is left, and positive\n * represents the right.\n */\n position: number | null = null;\n\n /**\n * The initial relatively index origin of the tab if it was created and selected after there\n * was already a selected tab. Provides context of what position the tab should originate from.\n */\n origin: number | null = null;\n\n /**\n * Whether the tab is currently active.\n */\n isActive = false;\n\n @ViewChild('tab1') _tab1: ElementRef;\n constructor(\n private _viewContainerRef: ViewContainerRef,\n @Inject(OUI_TAB_GROUP) @Optional() public _closestTabGroup: any,\n private sanitized: DomSanitizer,\n _elementRef: ElementRef\n ) {\n super(_elementRef);\n this.addThemeColor();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n Object.prototype.hasOwnProperty.call(changes, 'textLabel') ||\n Object.prototype.hasOwnProperty.call(changes, 'disabled')\n ) {\n setTimeout(() => {\n this.contentWithin = this.sanitized.bypassSecurityTrustHtml(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this._elementRef.nativeElement.innerHTML\n )['changingThisBreaksApplicationSecurity'];\n });\n this._stateChanges.next();\n }\n if (\n Object.prototype.hasOwnProperty.call(changes, '_tab2') ||\n Object.prototype.hasOwnProperty.call(changes, 'disabled')\n ) {\n this._stateChanges.next();\n }\n }\n\n addThemeColor() {\n if (!this.color) {\n this.color = DEFAULT_COLOR;\n }\n }\n\n ngOnDestroy(): void {\n this._stateChanges.complete();\n }\n\n ngOnInit(): void {\n setTimeout(() => {\n this.contentWithin = this.sanitized.bypassSecurityTrustHtml(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this._elementRef.nativeElement.innerHTML\n )['changingThisBreaksApplicationSecurity'];\n });\n this._contentPortal = new TemplatePortal(\n this._explicitContent || this._implicitContent,\n this._viewContainerRef,\n this._tab1\n );\n }\n\n /**\n * This has been extracted to a util because of TS 4 and VE.\n * View Engine doesn't support property rename inheritance.\n * TS 4.0 doesn't allow properties to override accessors or vice-versa.\n * @docs-private\n */\n private _setTemplateLabelInput(value: OuiTabLabel | undefined) {\n // Only update the label if the query managed to find one. This works around an issue where a\n // user may have manually set `templateLabel` during creation mode, which would then get\n // clobbered by `undefined` when the query resolves. Also note that we check that the closest\n // tab matches the current one so that we don't pick up labels from nested tabs.\n if (value && value._closestTab === this) {\n this._templateLabel = value;\n }\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -42469,6 +43016,12 @@ "deprecated": false, "deprecationMessage": "" }, + { + "name": "sanitized", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "" + }, { "name": "_elementRef", "type": "ElementRef", @@ -42476,7 +43029,7 @@ "deprecationMessage": "" } ], - "line": 145, + "line": 146, "jsdoctags": [ { "name": "_viewContainerRef", @@ -42496,6 +43049,15 @@ "text": "param" } }, + { + "name": "sanitized", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, { "name": "_elementRef", "type": "ElementRef", @@ -42533,7 +43095,7 @@ } ], "returnType": "void", - "line": 75, + "line": 76, "jsdoctags": [ { "name": "value", @@ -42550,7 +43112,7 @@ "name": "templateLabel", "type": "", "returnType": "OuiTabLabel", - "line": 72 + "line": 73 } }, "content": { @@ -42559,20 +43121,20 @@ "name": "content", "type": "", "returnType": "TemplatePortal | null", - "line": 121, + "line": 122, "rawdescription": "", "description": "", "jsdoctags": [ { - "pos": 3846, - "end": 3860, + "pos": 3774, + "end": 3788, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, "kind": 334, "tagName": { - "pos": 3847, - "end": 3859, + "pos": 3775, + "end": 3787, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -42585,11 +43147,11 @@ } } }, - "templateData": "\r\n\r\n" + "templateData": "\n\n" }, { "name": "OuiTabBody", - "id": "component-OuiTabBody-35910442aae2ae956d9d640aaca92c9ecb135a5b0cac0d799979fba8976ff19c4489f5f438564beb0bb143fbe9b12783c9ba692171c5c13d4e4497c1d052be96", + "id": "component-OuiTabBody-32c87b78cf2c723eb2f95bd15f8bdb35ebacacaef0d3b741592a3c2275f3ccebe4a8cba5a9d4c7fe78b26d90070c8a2aaa473301285701466fc87e26dcfe69ec", "file": "ui/src/components/tabs/tab-body.ts", "changeDetection": "ChangeDetectionStrategy.Default", "encapsulation": [ @@ -42616,7 +43178,7 @@ "deprecationMessage": "", "rawdescription": "\nDuration for the tab's animation.", "description": "

Duration for the tab's animation.

\n", - "line": 155, + "line": 158, "type": "string", "decorators": [] }, @@ -42626,8 +43188,8 @@ "deprecationMessage": "", "rawdescription": "\nThe tab body content to display.", "description": "

The tab body content to display.

\n", - "line": 147, - "type": "any", + "line": 150, + "type": "string", "decorators": [] }, { @@ -42636,7 +43198,7 @@ "deprecationMessage": "", "rawdescription": "\nPosition that will be used when the tab is immediately becoming visible after creation.", "description": "

Position that will be used when the tab is immediately becoming visible after creation.

\n", - "line": 150, + "line": 153, "type": "number | null", "decorators": [] }, @@ -42646,7 +43208,7 @@ "deprecationMessage": "", "rawdescription": "\nThe shifted index position of the tab body, where zero represents the active center tab.", "description": "

The shifted index position of the tab body, where zero represents the active center tab.

\n", - "line": 163, + "line": 166, "type": "number", "decorators": [] }, @@ -42657,7 +43219,7 @@ "deprecationMessage": "", "rawdescription": "\nWhether the tab's content should be kept in the DOM while it's off-screen.", "description": "

Whether the tab's content should be kept in the DOM while it's off-screen.

\n", - "line": 158, + "line": 161, "type": "boolean", "decorators": [] } @@ -42670,7 +43232,7 @@ "deprecationMessage": "", "rawdescription": "\nEvent emitted before the centering of the tab begins.", "description": "

Event emitted before the centering of the tab begins.

\n", - "line": 135, + "line": 138, "type": "EventEmitter" }, { @@ -42680,7 +43242,7 @@ "deprecationMessage": "", "rawdescription": "\nEvent emitted before the centering of the tab begins.", "description": "

Event emitted before the centering of the tab begins.

\n", - "line": 131, + "line": 134, "type": "EventEmitter" }, { @@ -42690,7 +43252,7 @@ "deprecationMessage": "", "rawdescription": "\nEvent emitted when the tab completes its animation towards the center.", "description": "

Event emitted when the tab completes its animation towards the center.

\n", - "line": 139, + "line": 142, "type": "EventEmitter" }, { @@ -42700,7 +43262,7 @@ "deprecationMessage": "", "rawdescription": "\nEvent emitted when the tab begins to animate towards the center as the active tab.", "description": "

Event emitted when the tab begins to animate towards the center as the active tab.

\n", - "line": 127, + "line": 130, "type": "EventEmitter" } ], @@ -42713,7 +43275,7 @@ "type": "", "optional": false, "description": "

Subscription to the directionality change observable.

\n", - "line": 118, + "line": 121, "rawdescription": "\nSubscription to the directionality change observable.", "modifierKind": [ 123 @@ -42726,7 +43288,7 @@ "type": "any", "optional": false, "description": "", - "line": 159 + "line": 162 }, { "name": "_portalHost", @@ -42735,7 +43297,7 @@ "type": "CdkPortalOutlet", "optional": false, "description": "

The portal host inside of this container into which the tab body content will be loaded.

\n", - "line": 144, + "line": 147, "rawdescription": "\nThe portal host inside of this container into which the tab body content will be loaded.", "decorators": [ { @@ -42754,7 +43316,7 @@ "type": "OuiTabBodyPositionState", "optional": false, "description": "

Tab body position state. Used by the animation trigger for the current state.

\n", - "line": 121, + "line": 124, "rawdescription": "\nTab body position state. Used by the animation trigger for the current state." }, { @@ -42764,7 +43326,7 @@ "type": "number", "optional": false, "description": "

Current position of the tab-body in the tab-group. Zero means that the tab is visible.

\n", - "line": 115, + "line": 118, "rawdescription": "\nCurrent position of the tab-body in the tab-group. Zero means that the tab is visible.", "modifierKind": [ 123 @@ -42778,7 +43340,7 @@ "type": "", "optional": false, "description": "

Emits when an animation on the tab is complete.

\n", - "line": 124, + "line": 127, "rawdescription": "\nEmits when an animation on the tab is complete.", "modifierKind": [ 148 @@ -42800,7 +43362,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 245, + "line": 261, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nComputes the position state that will be used for the tab-body animation trigger.", @@ -42834,7 +43396,7 @@ "optional": false, "returnType": "OuiTabBodyPositionState", "typeParameters": [], - "line": 261, + "line": 277, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nComputes the position state based on the specified origin position. This is used if the\ntab is becoming visible immediately after creation.\n", @@ -42860,7 +43422,7 @@ "optional": false, "returnType": "Direction", "typeParameters": [], - "line": 231, + "line": 246, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nThe text direction of the containing app.", @@ -42879,7 +43441,7 @@ "optional": false, "returnType": "boolean", "typeParameters": [], - "line": 236, + "line": 252, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nWhether the provided position state is considered center, regardless of origin.", @@ -42909,7 +43471,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 222, + "line": 237, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -42924,13 +43486,41 @@ } ] }, + { + "name": "ngOnChanges", + "args": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 223, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "changes", + "type": "SimpleChanges", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + }, { "name": "ngOnDestroy", "args": [], "optional": false, "returnType": "void", "typeParameters": [], - "line": 217, + "line": 232, "deprecated": false, "deprecationMessage": "" }, @@ -42940,7 +43530,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 210, + "line": 214, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nAfter initialized, check if the content is centered and has an origin. If so, set the\nspecial position states that transition the tab from the left or right before centering.\n", @@ -42956,7 +43546,7 @@ "description": "

Wrapper for the contents of a tab.

\n", "rawdescription": "\n\nWrapper for the contents of a tab.\n", "type": "component", - "sourceCode": "import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ComponentFactoryResolver,\r\n Directive,\r\n ElementRef,\r\n EventEmitter,\r\n // forwardRef,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n ViewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\r\nimport { Direction, Directionality } from '@angular/cdk/bidi';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n // startWith\r\n} from 'rxjs/operators';\r\nimport { AnimationEvent } from '@angular/animations';\r\nimport { ouiTabsAnimations } from './tabs-animations';\r\n\r\n/**\r\n * The portal host directive for the contents of the tab.\r\n * @docs-private\r\n */\r\n\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: `OuiTabBodyHost`,\r\n})\r\nexport class OuiTabBodyPortal\r\n extends CdkPortalOutlet\r\n implements OnInit, OnDestroy\r\n{\r\n /** Subscription to events for when the tab body begins centering. */\r\n private _centeringSub = Subscription.EMPTY;\r\n /** Subscription to events for when the tab body finishes leaving from center position. */\r\n private _leavingSub = Subscription.EMPTY;\r\n\r\n constructor(\r\n componentFactoryResolver: ComponentFactoryResolver,\r\n viewContainerRef: ViewContainerRef,\r\n // @Inject(forwardRef(() => OuiTabBody)) private _host: OuiTabBody,\r\n @Inject(DOCUMENT) _document: any\r\n ) {\r\n super(componentFactoryResolver, viewContainerRef, _document);\r\n }\r\n\r\n /** Set initial visibility or set up subscription for changing visibility. */\r\n override ngOnInit(): void {\r\n super.ngOnInit();\r\n }\r\n\r\n /** Clean up centering subscription. */\r\n override ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n this._centeringSub.unsubscribe();\r\n this._leavingSub.unsubscribe();\r\n }\r\n}\r\n\r\n/**\r\n * These position states are used internally as animation states for the tab body. Setting the\r\n * position state to left, right, or center will transition the tab body from its current\r\n * position to its respective state. If there is not current position (void, in the case of a new\r\n * tab body), then there will be no transition animation to its state.\r\n *\r\n * In the case of a new tab body that should immediately be centered with an animating transition,\r\n * then left-origin-center or right-origin-center can be used, which will use left or right as its\r\n * pseudo-prior state.\r\n */\r\nexport type OuiTabBodyPositionState =\r\n | 'left'\r\n | 'center'\r\n | 'right'\r\n | 'left-origin-center'\r\n | 'right-origin-center';\r\n\r\n/**\r\n * Wrapper for the contents of a tab.\r\n * @docs-private\r\n */\r\n@Component({\r\n selector: 'oui-tab-body',\r\n templateUrl: 'tab-body.html',\r\n // styleUrls: ['tab-body.css'],\r\n encapsulation: ViewEncapsulation.None,\r\n // tslint:disable-next-line:validate-decorators\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n animations: [ouiTabsAnimations.translateTab],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n class: 'oui-mdc-tab-body',\r\n },\r\n})\r\nexport class OuiTabBody implements OnInit, OnDestroy {\r\n /** Current position of the tab-body in the tab-group. Zero means that the tab is visible. */\r\n private _positionIndex: number;\r\n\r\n /** Subscription to the directionality change observable. */\r\n private _dirChangeSubscription = Subscription.EMPTY;\r\n\r\n /** Tab body position state. Used by the animation trigger for the current state. */\r\n _position: OuiTabBodyPositionState;\r\n\r\n /** Emits when an animation on the tab is complete. */\r\n readonly _translateTabComplete = new Subject();\r\n\r\n /** Event emitted when the tab begins to animate towards the center as the active tab. */\r\n @Output() readonly _onCentering: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted before the centering of the tab begins. */\r\n @Output() readonly _beforeCentering: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted before the centering of the tab begins. */\r\n @Output() readonly _afterLeavingCenter: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the tab completes its animation towards the center. */\r\n @Output() readonly _onCentered: EventEmitter = new EventEmitter(\r\n true\r\n );\r\n\r\n /** The portal host inside of this container into which the tab body content will be loaded. */\r\n @ViewChild(CdkPortalOutlet) _portalHost: CdkPortalOutlet;\r\n\r\n /** The tab body content to display. */\r\n @Input('content') _content: any;\r\n\r\n /** Position that will be used when the tab is immediately becoming visible after creation. */\r\n @Input() origin: number | null;\r\n\r\n // Note that the default value will always be overwritten by `OuiTabBody`, but we need one\r\n // anyway to prevent the animations module from throwing an error if the body is used on its own.\r\n /** Duration for the tab's animation. */\r\n @Input() animationDuration = '0';\r\n\r\n /** Whether the tab's content should be kept in the DOM while it's off-screen. */\r\n @Input() preserveContent = false;\r\n _innerContent: any;\r\n\r\n /** The shifted index position of the tab body, where zero represents the active center tab. */\r\n @Input()\r\n set position(position: number) {\r\n this._positionIndex = position;\r\n this._computePositionAnimationState();\r\n }\r\n\r\n constructor(\r\n private _elementRef: ElementRef,\r\n @Optional() private _dir: Directionality,\r\n changeDetectorRef: ChangeDetectorRef\r\n ) {\r\n if (_dir) {\r\n this._dirChangeSubscription = _dir.change.subscribe((dir: Direction) => {\r\n this._computePositionAnimationState(dir);\r\n changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n // Ensure that we get unique animation events, because the `.done` callback can get\r\n // invoked twice in some browsers. See https://github.com/angular/angular/issues/24084.\r\n this._translateTabComplete\r\n .pipe(\r\n distinctUntilChanged((x, y) => {\r\n return x.fromState === y.fromState && x.toState === y.toState;\r\n })\r\n )\r\n .subscribe((event) => {\r\n // If the transition to the center is complete, emit an event.\r\n if (\r\n this._isCenterPosition(event.toState) &&\r\n this._isCenterPosition(this._position)\r\n ) {\r\n this._onCentered.emit();\r\n }\r\n\r\n if (\r\n this._isCenterPosition(event.fromState) &&\r\n !this._isCenterPosition(this._position)\r\n ) {\r\n this._afterLeavingCenter.emit();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * After initialized, check if the content is centered and has an origin. If so, set the\r\n * special position states that transition the tab from the left or right before centering.\r\n */\r\n ngOnInit() {\r\n if (this._position == 'center' && this.origin != null) {\r\n this._position = this._computePositionFromOrigin(this.origin);\r\n }\r\n this._innerContent = this._content ? this._content : '';\r\n }\r\n\r\n ngOnDestroy() {\r\n this._dirChangeSubscription.unsubscribe();\r\n this._translateTabComplete.complete();\r\n }\r\n\r\n _onTranslateTabStarted(event: AnimationEvent): void {\r\n const isCentering = this._isCenterPosition(event.toState);\r\n this._beforeCentering.emit(isCentering);\r\n if (isCentering) {\r\n this._onCentering.emit(this._elementRef.nativeElement.clientHeight);\r\n }\r\n }\r\n\r\n /** The text direction of the containing app. */\r\n _getLayoutDirection(): Direction {\r\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\r\n }\r\n\r\n /** Whether the provided position state is considered center, regardless of origin. */\r\n _isCenterPosition(position: OuiTabBodyPositionState | string): boolean {\r\n return (\r\n position == 'center' ||\r\n position == 'left-origin-center' ||\r\n position == 'right-origin-center'\r\n );\r\n }\r\n\r\n /** Computes the position state that will be used for the tab-body animation trigger. */\r\n private _computePositionAnimationState(\r\n dir: Direction = this._getLayoutDirection()\r\n ) {\r\n if (this._positionIndex < 0) {\r\n this._position = dir == 'ltr' ? 'left' : 'right';\r\n } else if (this._positionIndex > 0) {\r\n this._position = dir == 'ltr' ? 'right' : 'left';\r\n } else {\r\n this._position = 'center';\r\n }\r\n }\r\n\r\n /**\r\n * Computes the position state based on the specified origin position. This is used if the\r\n * tab is becoming visible immediately after creation.\r\n */\r\n private _computePositionFromOrigin(origin: number): OuiTabBodyPositionState {\r\n const dir = this._getLayoutDirection();\r\n\r\n if ((dir == 'ltr' && origin <= 0) || (dir == 'rtl' && origin > 0)) {\r\n return 'left-origin-center';\r\n }\r\n\r\n return 'right-origin-center';\r\n }\r\n}\r\n\r\n/**\r\n * The origin state is an internally used state that is set on a new tab body indicating if it\r\n * began to the left or right of the prior selected index. For example, if the selected index was\r\n * set to 1, and a new tab is created and selected at index 2, then the tab body would have an\r\n * origin of right because its index was greater than the prior selected index.\r\n */\r\nexport type OuiTabBodyOriginState = 'left' | 'right';\r\n", + "sourceCode": "import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ComponentFactoryResolver,\r\n Directive,\r\n ElementRef,\r\n EventEmitter,\r\n // forwardRef,\r\n Inject,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n Output,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CdkPortalOutlet } from '@angular/cdk/portal';\r\nimport { Direction, Directionality } from '@angular/cdk/bidi';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Subject, Subscription } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n // startWith\r\n} from 'rxjs/operators';\r\nimport { AnimationEvent } from '@angular/animations';\r\nimport { ouiTabsAnimations } from './tabs-animations';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n/**\r\n * The portal host directive for the contents of the tab.\r\n * @docs-private\r\n */\r\n\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: `OuiTabBodyHost`,\r\n})\r\nexport class OuiTabBodyPortal\r\n extends CdkPortalOutlet\r\n implements OnInit, OnDestroy\r\n{\r\n /** Subscription to events for when the tab body begins centering. */\r\n private _centeringSub = Subscription.EMPTY;\r\n /** Subscription to events for when the tab body finishes leaving from center position. */\r\n private _leavingSub = Subscription.EMPTY;\r\n\r\n constructor(\r\n componentFactoryResolver: ComponentFactoryResolver,\r\n viewContainerRef: ViewContainerRef,\r\n // @Inject(forwardRef(() => OuiTabBody)) private _host: OuiTabBody,\r\n @Inject(DOCUMENT) _document: any\r\n ) {\r\n super(componentFactoryResolver, viewContainerRef, _document);\r\n }\r\n\r\n /** Set initial visibility or set up subscription for changing visibility. */\r\n override ngOnInit(): void {\r\n super.ngOnInit();\r\n }\r\n\r\n /** Clean up centering subscription. */\r\n override ngOnDestroy(): void {\r\n super.ngOnDestroy();\r\n this._centeringSub.unsubscribe();\r\n this._leavingSub.unsubscribe();\r\n }\r\n}\r\n\r\n/**\r\n * These position states are used internally as animation states for the tab body. Setting the\r\n * position state to left, right, or center will transition the tab body from its current\r\n * position to its respective state. If there is not current position (void, in the case of a new\r\n * tab body), then there will be no transition animation to its state.\r\n *\r\n * In the case of a new tab body that should immediately be centered with an animating transition,\r\n * then left-origin-center or right-origin-center can be used, which will use left or right as its\r\n * pseudo-prior state.\r\n */\r\nexport type OuiTabBodyPositionState =\r\n | 'left'\r\n | 'center'\r\n | 'right'\r\n | 'left-origin-center'\r\n | 'right-origin-center';\r\n\r\n/**\r\n * Wrapper for the contents of a tab.\r\n * @docs-private\r\n */\r\n@Component({\r\n selector: 'oui-tab-body',\r\n templateUrl: 'tab-body.html',\r\n // styleUrls: ['tab-body.css'],\r\n encapsulation: ViewEncapsulation.None,\r\n // tslint:disable-next-line:validate-decorators\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n animations: [ouiTabsAnimations.translateTab],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n class: 'oui-mdc-tab-body',\r\n },\r\n})\r\nexport class OuiTabBody implements OnInit, OnDestroy, OnChanges {\r\n /** Current position of the tab-body in the tab-group. Zero means that the tab is visible. */\r\n private _positionIndex: number;\r\n\r\n /** Subscription to the directionality change observable. */\r\n private _dirChangeSubscription = Subscription.EMPTY;\r\n\r\n /** Tab body position state. Used by the animation trigger for the current state. */\r\n _position: OuiTabBodyPositionState;\r\n\r\n /** Emits when an animation on the tab is complete. */\r\n readonly _translateTabComplete = new Subject();\r\n\r\n /** Event emitted when the tab begins to animate towards the center as the active tab. */\r\n @Output() readonly _onCentering: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted before the centering of the tab begins. */\r\n @Output() readonly _beforeCentering: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted before the centering of the tab begins. */\r\n @Output() readonly _afterLeavingCenter: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the tab completes its animation towards the center. */\r\n @Output() readonly _onCentered: EventEmitter = new EventEmitter(\r\n true\r\n );\r\n\r\n /** The portal host inside of this container into which the tab body content will be loaded. */\r\n @ViewChild(CdkPortalOutlet) _portalHost: CdkPortalOutlet;\r\n\r\n /** The tab body content to display. */\r\n @Input('content') _content: string;\r\n\r\n /** Position that will be used when the tab is immediately becoming visible after creation. */\r\n @Input() origin: number | null;\r\n\r\n // Note that the default value will always be overwritten by `OuiTabBody`, but we need one\r\n // anyway to prevent the animations module from throwing an error if the body is used on its own.\r\n /** Duration for the tab's animation. */\r\n @Input() animationDuration = '0';\r\n\r\n /** Whether the tab's content should be kept in the DOM while it's off-screen. */\r\n @Input() preserveContent = false;\r\n _innerContent: any;\r\n\r\n /** The shifted index position of the tab body, where zero represents the active center tab. */\r\n @Input()\r\n set position(position: number) {\r\n this._positionIndex = position;\r\n this._computePositionAnimationState();\r\n }\r\n\r\n constructor(\r\n private _elementRef: ElementRef,\r\n @Optional() private _dir: Directionality,\r\n changeDetectorRef: ChangeDetectorRef,\r\n private sanitized: DomSanitizer\r\n ) {\r\n if (_dir) {\r\n this._dirChangeSubscription = _dir.change.subscribe((dir: Direction) => {\r\n this._computePositionAnimationState(dir);\r\n changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n // Ensure that we get unique animation events, because the `.done` callback can get\r\n // invoked twice in some browsers. See https://github.com/angular/angular/issues/24084.\r\n this._translateTabComplete\r\n .pipe(\r\n distinctUntilChanged((x, y) => {\r\n return x.fromState === y.fromState && x.toState === y.toState;\r\n })\r\n )\r\n .subscribe((event) => {\r\n // If the transition to the center is complete, emit an event.\r\n if (\r\n this._isCenterPosition(event.toState) &&\r\n this._isCenterPosition(this._position)\r\n ) {\r\n this._onCentered.emit();\r\n }\r\n\r\n if (\r\n this._isCenterPosition(event.fromState) &&\r\n !this._isCenterPosition(this._position)\r\n ) {\r\n this._afterLeavingCenter.emit();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * After initialized, check if the content is centered and has an origin. If so, set the\r\n * special position states that transition the tab from the left or right before centering.\r\n */\r\n ngOnInit() {\r\n if (this._position == 'center' && this.origin != null) {\r\n this._position = this._computePositionFromOrigin(this.origin);\r\n }\r\n this._innerContent = this.sanitized.bypassSecurityTrustHtml(\r\n this._content ? this._content : ''\r\n );\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes._content && changes._content.currentValue) {\r\n this._innerContent = this.sanitized.bypassSecurityTrustHtml(\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n changes._content.currentValue ? changes._content.currentValue : ''\r\n );\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this._dirChangeSubscription.unsubscribe();\r\n this._translateTabComplete.complete();\r\n }\r\n\r\n _onTranslateTabStarted(event: AnimationEvent): void {\r\n const isCentering = this._isCenterPosition(event.toState);\r\n this._beforeCentering.emit(isCentering);\r\n if (isCentering) {\r\n this._onCentering.emit(this._elementRef.nativeElement.clientHeight);\r\n }\r\n }\r\n\r\n /** The text direction of the containing app. */\r\n _getLayoutDirection(): Direction {\r\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\r\n }\r\n\r\n /** Whether the provided position state is considered center, regardless of origin. */\r\n // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\r\n _isCenterPosition(position: OuiTabBodyPositionState | string): boolean {\r\n return (\r\n position == 'center' ||\r\n position == 'left-origin-center' ||\r\n position == 'right-origin-center'\r\n );\r\n }\r\n\r\n /** Computes the position state that will be used for the tab-body animation trigger. */\r\n private _computePositionAnimationState(\r\n dir: Direction = this._getLayoutDirection()\r\n ) {\r\n if (this._positionIndex < 0) {\r\n this._position = dir == 'ltr' ? 'left' : 'right';\r\n } else if (this._positionIndex > 0) {\r\n this._position = dir == 'ltr' ? 'right' : 'left';\r\n } else {\r\n this._position = 'center';\r\n }\r\n }\r\n\r\n /**\r\n * Computes the position state based on the specified origin position. This is used if the\r\n * tab is becoming visible immediately after creation.\r\n */\r\n private _computePositionFromOrigin(origin: number): OuiTabBodyPositionState {\r\n const dir = this._getLayoutDirection();\r\n\r\n if ((dir == 'ltr' && origin <= 0) || (dir == 'rtl' && origin > 0)) {\r\n return 'left-origin-center';\r\n }\r\n\r\n return 'right-origin-center';\r\n }\r\n}\r\n\r\n/**\r\n * The origin state is an internally used state that is set on a new tab body indicating if it\r\n * began to the left or right of the prior selected index. For example, if the selected index was\r\n * set to 1, and a new tab is created and selected at index 2, then the tab body would have an\r\n * origin of right because its index was greater than the prior selected index.\r\n */\r\nexport type OuiTabBodyOriginState = 'left' | 'right';\r\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -42983,9 +43573,15 @@ "type": "ChangeDetectorRef", "deprecated": false, "deprecationMessage": "" + }, + { + "name": "sanitized", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "" } ], - "line": 166, + "line": 169, "jsdoctags": [ { "name": "_elementRef", @@ -43013,13 +43609,23 @@ "tagName": { "text": "param" } + }, + { + "name": "sanitized", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } } ] }, "extends": [], "implements": [ "OnInit", - "OnDestroy" + "OnDestroy", + "OnChanges" ], "accessors": { "position": { @@ -43038,7 +43644,7 @@ } ], "returnType": "void", - "line": 163, + "line": 166, "rawdescription": "\nThe shifted index position of the tab body, where zero represents the active center tab.", "description": "

The shifted index position of the tab body, where zero represents the active center tab.

\n", "jsdoctags": [ @@ -43055,11 +43661,11 @@ } } }, - "templateData": "
\r\n \r\n \r\n
\r\n" + "templateData": "
\n \n \n
\n" }, { "name": "ouiTabGroup", - "id": "component-ouiTabGroup-589c514ba2f48297f4aa02fd4ced821bdcbc822779026ff6c817d949a12f81fcb79562a1d57b8975a29ae4b3cacdebafe77cf4a4035a5d582aa823ca4fafe395", + "id": "component-ouiTabGroup-5bd712f791fcc0aa86c1f30b4ab9a43fe36ad1157ee38633b43b2e446555c539737ee10ef0e2a6280f11add0546aaaf896f547e6f902967170c5e7a0d762b311", "file": "ui/src/components/tabs/tab-group.ts", "changeDetection": "ChangeDetectionStrategy.Default", "encapsulation": [ @@ -43553,7 +44159,7 @@ "optional": false, "returnType": "number", "typeParameters": [], - "line": 519, + "line": 520, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nClamps the given index to the bounds of 0 and the tabs length.", @@ -43586,7 +44192,7 @@ "optional": false, "returnType": "OuiTabChangeEvent", "typeParameters": [], - "line": 488, + "line": 489, "deprecated": false, "deprecationMessage": "", "modifierKind": [ @@ -43617,7 +44223,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 483, + "line": 484, "deprecated": false, "deprecationMessage": "", "jsdoctags": [ @@ -43645,7 +44251,7 @@ "optional": false, "returnType": "string", "typeParameters": [], - "line": 532, + "line": 533, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReturns a unique id for each tab content element", @@ -43675,7 +44281,7 @@ "optional": false, "returnType": "number", "typeParameters": [], - "line": 576, + "line": 577, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nRetrieves the tabindex for the tab.", @@ -43705,7 +44311,7 @@ "optional": false, "returnType": "string", "typeParameters": [], - "line": 527, + "line": 528, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nReturns a unique id for each tab label element", @@ -43747,7 +44353,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 566, + "line": 567, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nHandle click events, setting new selected index if appropriate.", @@ -43788,7 +44394,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 498, + "line": 499, "deprecated": false, "deprecationMessage": "" }, @@ -43798,7 +44404,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 558, + "line": 559, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nRemoves the height of the tab body wrapper.", @@ -43817,7 +44423,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 540, + "line": 541, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nSets the height of the body wrapper to the height of the activating tab if dynamic\nheight property is true.\n", @@ -43840,7 +44446,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 427, + "line": 428, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nListens to changes in all of the tabs.", @@ -43855,7 +44461,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 508, + "line": 509, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nSubscribes to changes in the tab labels. This is needed, because the @Input for the label is\non the OuiTab component, whereas the data binding is inside the ouiTabGroup. In order for the\nbinding to be updated, we need to subscribe to changes in it and trigger change detection\nmanually.\n", @@ -43884,7 +44490,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 582, + "line": 583, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nCallback for when the focused state of a tab has changed.", @@ -43923,7 +44529,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 475, + "line": 476, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nSets focus to a particular tab.\n", @@ -43931,8 +44537,8 @@ "jsdoctags": [ { "name": { - "pos": 16108, - "end": 16113, + "pos": 15675, + "end": 15680, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -43943,8 +44549,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 16102, - "end": 16107, + "pos": 15669, + "end": 15674, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -43973,7 +44579,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 385, + "line": 384, "deprecated": false, "deprecationMessage": "" }, @@ -43983,7 +44589,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 445, + "line": 446, "deprecated": false, "deprecationMessage": "" }, @@ -43993,7 +44599,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 452, + "line": 453, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nRe-aligns the ink bar to the selected tab element.", @@ -44005,7 +44611,7 @@ "optional": false, "returnType": "void", "typeParameters": [], - "line": 465, + "line": 466, "deprecated": false, "deprecationMessage": "", "rawdescription": "\n\nRecalculates the tab group's pagination dimensions.\n\nWARNING: Calling this method can be very costly in terms of performance. It should be called\nas infrequently as possible from outside of the Tabs component as it causes a reflow of the\npage.\n", @@ -44021,11 +44627,11 @@ "description": "

Material design tab-group component. Supports basic tab pairs (label + content) and includes\nanimated ink-bar, keyboard navigation, and screen reader.\nSee: https://material.io/design/components/tabs.html

\n", "rawdescription": "\n\nMaterial design tab-group component. Supports basic tab pairs (label + content) and includes\nanimated ink-bar, keyboard navigation, and screen reader.\nSee: https://material.io/design/components/tabs.html\n", "type": "component", - "sourceCode": "import {\r\n AfterContentChecked,\r\n AfterContentInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChildren,\r\n ElementRef,\r\n EventEmitter,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n Optional,\r\n Output,\r\n QueryList,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\r\nimport { OUI_TAB_GROUP, OuiTab } from './tab';\r\nimport { OuiTabHeader } from './tab-header';\r\nimport {\r\n BooleanInput,\r\n coerceBooleanProperty,\r\n coerceNumberProperty,\r\n NumberInput,\r\n} from '@angular/cdk/coercion';\r\nimport {\r\n CanColor,\r\n CanDisableRipple,\r\n mixinColor,\r\n mixinDisableRipple,\r\n ThemePalette,\r\n} from '../core';\r\nimport { merge, Subscription } from 'rxjs';\r\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from './tab-config';\r\nimport { startWith } from 'rxjs/operators';\r\nimport { FocusOrigin } from '@angular/cdk/a11y';\r\n\r\n/** Used to generate unique ID's for each tab component */\r\nlet nextId = 0;\r\n\r\n// Boilerplate for applying mixins to ouiTabGroup.\r\n/** @docs-private */\r\nconst _OuiTabGroupMixinBase = mixinColor(\r\n mixinDisableRipple(\r\n class {\r\n constructor(public _elementRef: ElementRef) {}\r\n }\r\n ),\r\n 'primary'\r\n);\r\n\r\n/** @docs-private */\r\nexport interface OuiTabGroupBaseHeader {\r\n _alignInkBarToSelectedTab(): void;\r\n updatePagination(): void;\r\n focusIndex: number;\r\n}\r\n\r\n/** Possible positions for the tab header. */\r\nexport type OuiTabHeaderPosition = 'above' | 'below';\r\n\r\n/**\r\n * Material design tab-group component. Supports basic tab pairs (label + content) and includes\r\n * animated ink-bar, keyboard navigation, and screen reader.\r\n * See: https://material.io/design/components/tabs.html\r\n */\r\n@Component({\r\n selector: 'oui-tab-group',\r\n exportAs: 'ouiTabGroup',\r\n templateUrl: 'tab-group.html',\r\n styleUrls: ['tab-group.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n // tslint:disable-next-line:validate-decorators\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n // eslint-disable-next-line\r\n inputs: ['color', 'disableRipple'],\r\n providers: [\r\n {\r\n provide: OUI_TAB_GROUP,\r\n useExisting: ouiTabGroup,\r\n },\r\n ],\r\n // eslint-disable-next-line\r\n host: {\r\n ngSkipHydration: '',\r\n class: 'oui-mdc-tab-group oui-tab',\r\n '[class.oui-mdc-tab-group-dynamic-height]': 'dynamicHeight',\r\n '[class.oui-mdc-tab-group-inverted-header]': 'headerPosition === \"below\"',\r\n '[class.oui-mdc-tab-group-stretch-tabs]': 'stretchTabs',\r\n '[style.--oui-tab-animation-duration]': 'animationDuration',\r\n },\r\n})\r\nexport class ouiTabGroup\r\n extends _OuiTabGroupMixinBase\r\n implements\r\n AfterContentInit,\r\n AfterContentChecked,\r\n OnDestroy,\r\n CanColor,\r\n CanDisableRipple\r\n{\r\n /**\r\n * All tabs inside the tab group. This includes tabs that belong to groups that are nested\r\n * inside the current one. We filter out only the tabs that belong to this group in `_tabs`.\r\n */\r\n @ContentChildren(OuiTab, { descendants: true }) _allTabs: QueryList;\r\n @ViewChild('tabBodyWrapper') _tabBodyWrapper: ElementRef;\r\n @ViewChild('tabHeader') _tabHeader: OuiTabHeader;\r\n\r\n /** All of the tabs that belong to the group. */\r\n _tabs: QueryList = new QueryList();\r\n\r\n /** The tab index that should be selected after the content has been checked. */\r\n private _indexToSelect: number | null = 0;\r\n\r\n /** Index of the tab that was focused last. */\r\n private _lastFocusedTabIndex: number | null = null;\r\n\r\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\r\n private _tabBodyWrapperHeight = 0;\r\n\r\n /** Subscription to tabs being added/removed. */\r\n private _tabsSubscription = Subscription.EMPTY;\r\n\r\n /** Subscription to changes in the tab labels. */\r\n private _tabLabelSubscription = Subscription.EMPTY;\r\n\r\n /** Whether the ink bar should fit its width to the size of the tab label content. */\r\n @Input()\r\n get fitInkBarToContent(): boolean {\r\n return this._fitInkBarToContent;\r\n }\r\n set fitInkBarToContent(v: BooleanInput) {\r\n this._fitInkBarToContent = coerceBooleanProperty(v);\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n private _fitInkBarToContent = false;\r\n\r\n /** Whether tabs should be stretched to fill the header. */\r\n @Input('oui-stretch-tabs')\r\n get stretchTabs(): boolean {\r\n return this._stretchTabs;\r\n }\r\n set stretchTabs(v: BooleanInput) {\r\n this._stretchTabs = coerceBooleanProperty(v);\r\n }\r\n private _stretchTabs = true;\r\n\r\n /** Whether the tab group should grow to the size of the active tab. */\r\n @Input()\r\n get dynamicHeight(): boolean {\r\n return this._dynamicHeight;\r\n }\r\n\r\n set dynamicHeight(value: BooleanInput) {\r\n this._dynamicHeight = coerceBooleanProperty(value);\r\n }\r\n\r\n private _dynamicHeight = false;\r\n\r\n /** The index of the active tab. */\r\n @Input()\r\n get selectedIndex(): number | null {\r\n return this._selectedIndex;\r\n }\r\n\r\n set selectedIndex(value: NumberInput) {\r\n this._indexToSelect = coerceNumberProperty(value, null);\r\n }\r\n\r\n private _selectedIndex: number | null = null;\r\n\r\n /** Position of the tab header. */\r\n @Input() headerPosition: OuiTabHeaderPosition = 'above';\r\n\r\n /** Duration for the tab animation. Will be normalized to milliseconds if no units are set. */\r\n @Input()\r\n get animationDuration(): string {\r\n return this._animationDuration;\r\n }\r\n\r\n set animationDuration(value: NumberInput) {\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n ? value + 'ms'\r\n : (value as string);\r\n }\r\n\r\n private _animationDuration: string;\r\n\r\n /**\r\n * `tabindex` to be set on the inner element that wraps the tab content. Can be used for improved\r\n * accessibility when the tab does not have focusable elements or if it has scrollable content.\r\n * The `tabindex` will be removed automatically for inactive tabs.\r\n * Read more at https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-2/tabs.html\r\n */\r\n @Input()\r\n get contentTabIndex(): number | null {\r\n return this._contentTabIndex;\r\n }\r\n\r\n set contentTabIndex(value: NumberInput) {\r\n this._contentTabIndex = coerceNumberProperty(value, null);\r\n }\r\n\r\n private _contentTabIndex: number | null;\r\n\r\n /**\r\n * Whether pagination should be disabled. This can be used to avoid unnecessary\r\n * layout recalculations if it's known that pagination won't be required.\r\n */\r\n @Input()\r\n get disablePagination(): boolean {\r\n return this._disablePagination;\r\n }\r\n\r\n set disablePagination(value: BooleanInput) {\r\n this._disablePagination = coerceBooleanProperty(value);\r\n }\r\n\r\n private _disablePagination = false;\r\n\r\n /**\r\n * By default tabs remove their content from the DOM while it's off-screen.\r\n * Setting this to `true` will keep it in the DOM which will prevent elements\r\n * like iframes and videos from reloading next time it comes back into the view.\r\n */\r\n @Input()\r\n get preserveContent(): boolean {\r\n return this._preserveContent;\r\n }\r\n\r\n set preserveContent(value: BooleanInput) {\r\n this._preserveContent = coerceBooleanProperty(value);\r\n }\r\n\r\n private _preserveContent = false;\r\n\r\n /** Background color of the tab group. */\r\n @Input()\r\n get backgroundColor(): ThemePalette {\r\n return this._backgroundColor;\r\n }\r\n\r\n set backgroundColor(value: ThemePalette) {\r\n const classList: DOMTokenList = this._elementRef.nativeElement.classList;\r\n\r\n classList.remove(\r\n 'oui-tabs-with-background',\r\n `oui-background-${this.backgroundColor}`\r\n );\r\n\r\n if (value) {\r\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\r\n }\r\n\r\n this._backgroundColor = value;\r\n }\r\n\r\n private _backgroundColor: ThemePalette;\r\n\r\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\r\n @Output() readonly selectedIndexChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when focus has changed within a tab group. */\r\n @Output() readonly focusChange: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the body animation has completed */\r\n @Output() readonly animationDone: EventEmitter =\r\n new EventEmitter();\r\n\r\n /** Event emitted when the tab selection has changed. */\r\n @Output() readonly selectedTabChange: EventEmitter =\r\n new EventEmitter(true);\r\n\r\n private _groupId: number;\r\n getHTMLText: any;\r\n updatedTabHTML: any;\r\n\r\n constructor(\r\n elementRef: ElementRef,\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n @Inject(OUI_TABS_CONFIG) @Optional() defaultConfig?: OuiTabsConfig,\r\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string\r\n ) {\r\n super(elementRef);\r\n this._groupId = nextId++;\r\n this.animationDuration =\r\n defaultConfig && defaultConfig.animationDuration\r\n ? defaultConfig.animationDuration\r\n : '500ms';\r\n this.disablePagination =\r\n defaultConfig && defaultConfig.disablePagination != null\r\n ? defaultConfig.disablePagination\r\n : false;\r\n this.dynamicHeight =\r\n defaultConfig && defaultConfig.dynamicHeight != null\r\n ? defaultConfig.dynamicHeight\r\n : false;\r\n this.contentTabIndex = defaultConfig?.contentTabIndex ?? null;\r\n this.preserveContent = !!defaultConfig?.preserveContent;\r\n this.fitInkBarToContent =\r\n defaultConfig && defaultConfig.fitInkBarToContent != null\r\n ? defaultConfig.fitInkBarToContent\r\n : false;\r\n this.stretchTabs =\r\n defaultConfig && defaultConfig.stretchTabs != null\r\n ? defaultConfig.stretchTabs\r\n : true;\r\n }\r\n\r\n /**\r\n * After the content is checked, this component knows what tabs have been defined\r\n * and what the selected index should be. This is where we can know exactly what position\r\n * each tab should be in according to the new selected index, and additionally we know how\r\n * a new selected tab should transition in (from the left or right).\r\n */\r\n ngAfterContentChecked() {\r\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\r\n // the amount of tabs changes before the actual change detection runs.\r\n const indexToSelect = (this._indexToSelect = this._clampTabIndex(\r\n this._indexToSelect\r\n ));\r\n\r\n // If there is a change in selected index, emit a change event. Should not trigger if\r\n // the selected index has not yet been initialized.\r\n if (this._selectedIndex != indexToSelect) {\r\n const isFirstRun = this._selectedIndex == null;\r\n\r\n if (!isFirstRun) {\r\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\r\n // Preserve the height so page doesn't scroll up during tab change.\r\n // Fixes https://stackblitz.com/edit/mat-tabs-scroll-page-top-on-tab-change\r\n const wrapper = this._tabBodyWrapper.nativeElement;\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n wrapper.style.minHeight = wrapper.clientHeight + 'px';\r\n }\r\n\r\n // Changing these values after change detection has run\r\n // since the checked content may contain references to them.\r\n Promise.resolve().then(() => {\r\n this._tabs.forEach(\r\n (tab, index) => (tab.isActive = index === indexToSelect)\r\n );\r\n\r\n if (!isFirstRun) {\r\n this.selectedIndexChange.emit(indexToSelect);\r\n // Clear the min-height, this was needed during tab change to avoid\r\n // unnecessary scrolling.\r\n this._tabBodyWrapper.nativeElement.style.minHeight = '';\r\n }\r\n });\r\n }\r\n\r\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\r\n this._tabs.forEach((tab: OuiTab, index: number) => {\r\n tab.position = index - indexToSelect;\r\n\r\n // If there is already a selected tab, then set up an origin for the next selected tab\r\n // if it doesn't have one already.\r\n if (this._selectedIndex != null && tab.position == 0 && !tab.origin) {\r\n tab.origin = indexToSelect - this._selectedIndex;\r\n }\r\n });\r\n\r\n if (this._selectedIndex !== indexToSelect) {\r\n this._selectedIndex = indexToSelect;\r\n this._lastFocusedTabIndex = null;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n ngAfterContentInit() {\r\n this._subscribeToAllTabChanges();\r\n this._subscribeToTabLabels();\r\n // Subscribe to changes in the amount of tabs, in order to be\r\n // able to re-render the content as new tabs are added or removed.\r\n this._tabsSubscription = this._tabs.changes.subscribe(() => {\r\n const indexToSelect = this._clampTabIndex(this._indexToSelect);\r\n\r\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\r\n // explicit change that selects a different tab.\r\n if (indexToSelect === this._selectedIndex) {\r\n const tabs = this._tabs.toArray();\r\n let selectedTab: OuiTab | undefined;\r\n\r\n for (let i = 0; i < tabs.length; i++) {\r\n if (tabs[i].isActive) {\r\n // Assign both to the `_indexToSelect` and `_selectedIndex` so we don't fire a changed\r\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\r\n // adding a tab within the `selectedIndexChange` event.\r\n this._indexToSelect = this._selectedIndex = i;\r\n this._lastFocusedTabIndex = null;\r\n selectedTab = tabs[i];\r\n break;\r\n }\r\n }\r\n\r\n // If we haven't found an active tab and a tab exists at the selected index, it means\r\n // that the active tab was swapped out. Since this won't be picked up by the rendering\r\n // loop in `ngAfterContentChecked`, we need to sync it up manually.\r\n if (!selectedTab && tabs[indexToSelect]) {\r\n Promise.resolve().then(() => {\r\n tabs[indexToSelect].isActive = true;\r\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\r\n });\r\n }\r\n }\r\n\r\n this._changeDetectorRef.markForCheck();\r\n });\r\n }\r\n\r\n /** Listens to changes in all of the tabs. */\r\n private _subscribeToAllTabChanges() {\r\n // Since we use a query with `descendants: true` to pick up the tabs, we may end up catching\r\n // some that are inside of nested tab groups. We filter them out manually by checking that\r\n // the closest group to the tab is the current one.\r\n this.getHTMLText = this._allTabs['_results'][0].givenText;\r\n this.updatedTabHTML = this.getHTMLText;\r\n this._allTabs.changes\r\n .pipe(startWith(this._allTabs))\r\n .subscribe((tabs: QueryList) => {\r\n this._tabs.reset(\r\n tabs.filter((tab) => {\r\n return tab._closestTabGroup === this || !tab._closestTabGroup;\r\n })\r\n );\r\n this._tabs.notifyOnChanges();\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this._tabs.destroy();\r\n this._tabsSubscription.unsubscribe();\r\n this._tabLabelSubscription.unsubscribe();\r\n }\r\n\r\n /** Re-aligns the ink bar to the selected tab element. */\r\n realignInkBar() {\r\n if (this._tabHeader) {\r\n this._tabHeader._alignInkBarToSelectedTab();\r\n }\r\n }\r\n\r\n /**\r\n * Recalculates the tab group's pagination dimensions.\r\n *\r\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\r\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\r\n * page.\r\n */\r\n updatePagination() {\r\n if (this._tabHeader) {\r\n this._tabHeader.updatePagination();\r\n }\r\n }\r\n\r\n /**\r\n * Sets focus to a particular tab.\r\n * @param index Index of the tab to be focused.\r\n */\r\n focusTab(index: number) {\r\n const header = this._tabHeader;\r\n\r\n if (header) {\r\n header.focusIndex = index;\r\n }\r\n }\r\n\r\n _focusChanged(index: number) {\r\n this._lastFocusedTabIndex = index;\r\n this.focusChange.emit(this._createChangeEvent(index));\r\n }\r\n\r\n private _createChangeEvent(index: number): OuiTabChangeEvent {\r\n const event = new OuiTabChangeEvent();\r\n event.index = index;\r\n if (this._tabs && this._tabs.length) {\r\n event.tab = this._tabs.toArray()[index];\r\n this.updatedTabHTML = event.tab.givenText;\r\n }\r\n return event;\r\n }\r\n\r\n _handleEnter() {\r\n this.getHTMLText = this.updatedTabHTML;\r\n }\r\n\r\n /**\r\n * Subscribes to changes in the tab labels. This is needed, because the @Input for the label is\r\n * on the OuiTab component, whereas the data binding is inside the ouiTabGroup. In order for the\r\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\r\n * manually.\r\n */\r\n private _subscribeToTabLabels() {\r\n if (this._tabLabelSubscription) {\r\n this._tabLabelSubscription.unsubscribe();\r\n }\r\n\r\n this._tabLabelSubscription = merge(\r\n ...this._tabs.map((tab) => tab._stateChanges)\r\n ).subscribe(() => this._changeDetectorRef.markForCheck());\r\n }\r\n\r\n /** Clamps the given index to the bounds of 0 and the tabs length. */\r\n private _clampTabIndex(index: number | null): number {\r\n // Note the `|| 0`, which ensures that values like NaN can't get through\r\n // and which would otherwise throw the component into an infinite loop\r\n // (since Math.max(NaN, 0) === NaN).\r\n return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));\r\n }\r\n\r\n /** Returns a unique id for each tab label element */\r\n _getTabLabelId(i: number): string {\r\n return `oui-tab-label-${this._groupId}-${i}`;\r\n }\r\n\r\n /** Returns a unique id for each tab content element */\r\n _getTabContentId(i: number): string {\r\n return `oui-tab-content-${this._groupId}-${i}`;\r\n }\r\n\r\n /**\r\n * Sets the height of the body wrapper to the height of the activating tab if dynamic\r\n * height property is true.\r\n */\r\n _setTabBodyWrapperHeight(tabHeight: number): void {\r\n if (!this._dynamicHeight || !this._tabBodyWrapperHeight) {\r\n return;\r\n }\r\n\r\n const wrapper: HTMLElement = this._tabBodyWrapper.nativeElement;\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n wrapper.style.height = this._tabBodyWrapperHeight + 'px';\r\n\r\n // This conditional forces the browser to paint the height so that\r\n // the animation to the new height can have an origin.\r\n if (this._tabBodyWrapper.nativeElement.offsetHeight) {\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n wrapper.style.height = tabHeight + 'px';\r\n }\r\n }\r\n\r\n /** Removes the height of the tab body wrapper. */\r\n _removeTabBodyWrapperHeight(): void {\r\n const wrapper = this._tabBodyWrapper.nativeElement;\r\n this._tabBodyWrapperHeight = wrapper.clientHeight;\r\n wrapper.style.height = '';\r\n this.animationDone.emit();\r\n }\r\n\r\n /** Handle click events, setting new selected index if appropriate. */\r\n _handleClick(tab: OuiTab, tabHeader: OuiTabGroupBaseHeader, index: number) {\r\n tabHeader.focusIndex = index;\r\n this.getHTMLText = this.updatedTabHTML;\r\n\r\n if (!tab.disabled) {\r\n this.selectedIndex = index;\r\n }\r\n }\r\n\r\n /** Retrieves the tabindex for the tab. */\r\n _getTabIndex(index: number): number {\r\n const targetIndex = this._lastFocusedTabIndex ?? this.selectedIndex;\r\n return index === targetIndex ? 0 : -1;\r\n }\r\n\r\n /** Callback for when the focused state of a tab has changed. */\r\n _tabFocusChanged(focusOrigin: FocusOrigin, index: number) {\r\n // Mouse/touch focus happens during the `mousedown`/`touchstart` phase which\r\n // can cause the tab to be moved out from under the pointer, interrupting the\r\n // click sequence (see #21898). We don't need to scroll the tab into view for\r\n // such cases anyway, because it will be done when the tab becomes selected.\r\n if (focusOrigin && focusOrigin !== 'mouse' && focusOrigin !== 'touch') {\r\n this._tabHeader.focusIndex = index;\r\n }\r\n }\r\n}\r\n\r\n/** A simple change event emitted on focus or selection changes. */\r\nexport class OuiTabChangeEvent {\r\n /** Index of the currently-selected tab. */\r\n index: number;\r\n /** Reference to the currently-selected tab. */\r\n tab: OuiTab;\r\n event: Event;\r\n}\r\n", + "sourceCode": "import {\n AfterContentChecked,\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { OUI_TAB_GROUP, OuiTab } from './tab';\nimport { OuiTabHeader } from './tab-header';\nimport {\n BooleanInput,\n coerceBooleanProperty,\n coerceNumberProperty,\n NumberInput,\n} from '@angular/cdk/coercion';\nimport {\n CanColor,\n CanDisableRipple,\n mixinColor,\n mixinDisableRipple,\n ThemePalette,\n} from '../core';\nimport { merge, Subscription } from 'rxjs';\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from './tab-config';\nimport { startWith } from 'rxjs/operators';\nimport { FocusOrigin } from '@angular/cdk/a11y';\n\n/** Used to generate unique ID's for each tab component */\nlet nextId = 0;\n\n// Boilerplate for applying mixins to ouiTabGroup.\n/** @docs-private */\nconst _OuiTabGroupMixinBase = mixinColor(\n mixinDisableRipple(\n class {\n constructor(public _elementRef: ElementRef) {}\n }\n ),\n 'primary'\n);\n\n/** @docs-private */\nexport interface OuiTabGroupBaseHeader {\n _alignInkBarToSelectedTab(): void;\n updatePagination(): void;\n focusIndex: number;\n}\n\n/** Possible positions for the tab header. */\nexport type OuiTabHeaderPosition = 'above' | 'below';\n\n/**\n * Material design tab-group component. Supports basic tab pairs (label + content) and includes\n * animated ink-bar, keyboard navigation, and screen reader.\n * See: https://material.io/design/components/tabs.html\n */\n@Component({\n selector: 'oui-tab-group',\n exportAs: 'ouiTabGroup',\n templateUrl: 'tab-group.html',\n styleUrls: ['tab-group.scss'],\n encapsulation: ViewEncapsulation.None,\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n // eslint-disable-next-line\n inputs: ['color', 'disableRipple'],\n providers: [\n {\n provide: OUI_TAB_GROUP,\n useExisting: ouiTabGroup,\n },\n ],\n // eslint-disable-next-line\n host: {\n ngSkipHydration: '',\n class: 'oui-mdc-tab-group oui-tab',\n '[class.oui-mdc-tab-group-dynamic-height]': 'dynamicHeight',\n '[class.oui-mdc-tab-group-inverted-header]': 'headerPosition === \"below\"',\n '[class.oui-mdc-tab-group-stretch-tabs]': 'stretchTabs',\n '[style.--oui-tab-animation-duration]': 'animationDuration',\n },\n})\nexport class ouiTabGroup\n extends _OuiTabGroupMixinBase\n implements\n AfterContentInit,\n AfterContentChecked,\n OnDestroy,\n CanColor,\n CanDisableRipple\n{\n /**\n * All tabs inside the tab group. This includes tabs that belong to groups that are nested\n * inside the current one. We filter out only the tabs that belong to this group in `_tabs`.\n */\n @ContentChildren(OuiTab, { descendants: true }) _allTabs: QueryList;\n @ViewChild('tabBodyWrapper') _tabBodyWrapper: ElementRef;\n @ViewChild('tabHeader') _tabHeader: OuiTabHeader;\n\n /** All of the tabs that belong to the group. */\n _tabs: QueryList = new QueryList();\n\n /** The tab index that should be selected after the content has been checked. */\n private _indexToSelect: number | null = 0;\n\n /** Index of the tab that was focused last. */\n private _lastFocusedTabIndex: number | null = null;\n\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\n private _tabBodyWrapperHeight = 0;\n\n /** Subscription to tabs being added/removed. */\n private _tabsSubscription = Subscription.EMPTY;\n\n /** Subscription to changes in the tab labels. */\n private _tabLabelSubscription = Subscription.EMPTY;\n\n /** Whether the ink bar should fit its width to the size of the tab label content. */\n @Input()\n get fitInkBarToContent(): boolean {\n return this._fitInkBarToContent;\n }\n set fitInkBarToContent(v: BooleanInput) {\n this._fitInkBarToContent = coerceBooleanProperty(v);\n this._changeDetectorRef.markForCheck();\n }\n private _fitInkBarToContent = false;\n\n /** Whether tabs should be stretched to fill the header. */\n @Input('oui-stretch-tabs')\n get stretchTabs(): boolean {\n return this._stretchTabs;\n }\n set stretchTabs(v: BooleanInput) {\n this._stretchTabs = coerceBooleanProperty(v);\n }\n private _stretchTabs = true;\n\n /** Whether the tab group should grow to the size of the active tab. */\n @Input()\n get dynamicHeight(): boolean {\n return this._dynamicHeight;\n }\n\n set dynamicHeight(value: BooleanInput) {\n this._dynamicHeight = coerceBooleanProperty(value);\n }\n\n private _dynamicHeight = false;\n\n /** The index of the active tab. */\n @Input()\n get selectedIndex(): number | null {\n return this._selectedIndex;\n }\n\n set selectedIndex(value: NumberInput) {\n this._indexToSelect = coerceNumberProperty(value, null);\n }\n\n private _selectedIndex: number | null = null;\n\n /** Position of the tab header. */\n @Input() headerPosition: OuiTabHeaderPosition = 'above';\n\n /** Duration for the tab animation. Will be normalized to milliseconds if no units are set. */\n @Input()\n get animationDuration(): string {\n return this._animationDuration;\n }\n\n set animationDuration(value: NumberInput) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n ? value + 'ms'\n : (value as string);\n }\n\n private _animationDuration: string;\n\n /**\n * `tabindex` to be set on the inner element that wraps the tab content. Can be used for improved\n * accessibility when the tab does not have focusable elements or if it has scrollable content.\n * The `tabindex` will be removed automatically for inactive tabs.\n * Read more at https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-2/tabs.html\n */\n @Input()\n get contentTabIndex(): number | null {\n return this._contentTabIndex;\n }\n\n set contentTabIndex(value: NumberInput) {\n this._contentTabIndex = coerceNumberProperty(value, null);\n }\n\n private _contentTabIndex: number | null;\n\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n */\n @Input()\n get disablePagination(): boolean {\n return this._disablePagination;\n }\n\n set disablePagination(value: BooleanInput) {\n this._disablePagination = coerceBooleanProperty(value);\n }\n\n private _disablePagination = false;\n\n /**\n * By default tabs remove their content from the DOM while it's off-screen.\n * Setting this to `true` will keep it in the DOM which will prevent elements\n * like iframes and videos from reloading next time it comes back into the view.\n */\n @Input()\n get preserveContent(): boolean {\n return this._preserveContent;\n }\n\n set preserveContent(value: BooleanInput) {\n this._preserveContent = coerceBooleanProperty(value);\n }\n\n private _preserveContent = false;\n\n /** Background color of the tab group. */\n @Input()\n get backgroundColor(): ThemePalette {\n return this._backgroundColor;\n }\n\n set backgroundColor(value: ThemePalette) {\n const classList: DOMTokenList = this._elementRef.nativeElement.classList;\n\n classList.remove(\n 'oui-tabs-with-background',\n `oui-background-${this.backgroundColor}`\n );\n\n if (value) {\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n\n private _backgroundColor: ThemePalette;\n\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\n @Output() readonly selectedIndexChange: EventEmitter =\n new EventEmitter();\n\n /** Event emitted when focus has changed within a tab group. */\n @Output() readonly focusChange: EventEmitter =\n new EventEmitter();\n\n /** Event emitted when the body animation has completed */\n @Output() readonly animationDone: EventEmitter =\n new EventEmitter();\n\n /** Event emitted when the tab selection has changed. */\n @Output() readonly selectedTabChange: EventEmitter =\n new EventEmitter(true);\n\n private _groupId: number;\n getHTMLText: any;\n updatedTabHTML: any;\n\n constructor(\n elementRef: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n @Inject(OUI_TABS_CONFIG) @Optional() defaultConfig?: OuiTabsConfig,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string\n ) {\n super(elementRef);\n this._groupId = nextId++;\n this.animationDuration =\n defaultConfig && defaultConfig.animationDuration\n ? defaultConfig.animationDuration\n : '500ms';\n this.disablePagination =\n defaultConfig && defaultConfig.disablePagination != null\n ? defaultConfig.disablePagination\n : false;\n this.dynamicHeight =\n defaultConfig && defaultConfig.dynamicHeight != null\n ? defaultConfig.dynamicHeight\n : false;\n this.contentTabIndex = defaultConfig?.contentTabIndex ?? null;\n this.preserveContent = !!defaultConfig?.preserveContent;\n this.fitInkBarToContent =\n defaultConfig && defaultConfig.fitInkBarToContent != null\n ? defaultConfig.fitInkBarToContent\n : false;\n this.stretchTabs =\n defaultConfig && defaultConfig.stretchTabs != null\n ? defaultConfig.stretchTabs\n : false;\n }\n\n /**\n * After the content is checked, this component knows what tabs have been defined\n * and what the selected index should be. This is where we can know exactly what position\n * each tab should be in according to the new selected index, and additionally we know how\n * a new selected tab should transition in (from the left or right).\n */\n ngAfterContentChecked() {\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\n // the amount of tabs changes before the actual change detection runs.\n const indexToSelect = (this._indexToSelect = this._clampTabIndex(\n this._indexToSelect\n ));\n\n // If there is a change in selected index, emit a change event. Should not trigger if\n // the selected index has not yet been initialized.\n if (this._selectedIndex != indexToSelect) {\n const isFirstRun = this._selectedIndex == null;\n\n if (!isFirstRun) {\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\n // Preserve the height so page doesn't scroll up during tab change.\n // Fixes https://stackblitz.com/edit/mat-tabs-scroll-page-top-on-tab-change\n const wrapper = this._tabBodyWrapper.nativeElement;\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n wrapper.style.minHeight = wrapper.clientHeight + 'px';\n }\n\n // Changing these values after change detection has run\n // since the checked content may contain references to them.\n Promise.resolve().then(() => {\n this._tabs.forEach(\n (tab, index) => (tab.isActive = index === indexToSelect)\n );\n\n if (!isFirstRun) {\n this.selectedIndexChange.emit(indexToSelect);\n // Clear the min-height, this was needed during tab change to avoid\n // unnecessary scrolling.\n this._tabBodyWrapper.nativeElement.style.minHeight = '';\n }\n });\n }\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\n this._tabs.forEach((tab: OuiTab, index: number) => {\n tab.position = index - indexToSelect;\n\n // If there is already a selected tab, then set up an origin for the next selected tab\n // if it doesn't have one already.\n if (this._selectedIndex != null && tab.position == 0 && !tab.origin) {\n tab.origin = indexToSelect - this._selectedIndex;\n }\n });\n\n if (this._selectedIndex !== indexToSelect) {\n this._selectedIndex = indexToSelect;\n this._lastFocusedTabIndex = null;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n ngAfterContentInit() {\n setTimeout(() => {\n this._subscribeToAllTabChanges();\n this._subscribeToTabLabels();\n });\n // Subscribe to changes in the amount of tabs, in order to be\n // able to re-render the content as new tabs are added or removed.\n this._tabsSubscription = this._tabs.changes.subscribe(() => {\n const indexToSelect = this._clampTabIndex(this._indexToSelect);\n\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\n // explicit change that selects a different tab.\n if (indexToSelect === this._selectedIndex) {\n const tabs = this._tabs.toArray();\n let selectedTab: OuiTab | undefined;\n\n for (let i = 0; i < tabs.length; i++) {\n if (tabs[i].isActive) {\n // Assign both to the `_indexToSelect` and `_selectedIndex` so we don't fire a changed\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\n // adding a tab within the `selectedIndexChange` event.\n this._indexToSelect = this._selectedIndex = i;\n this._lastFocusedTabIndex = null;\n selectedTab = tabs[i];\n break;\n }\n }\n\n // If we haven't found an active tab and a tab exists at the selected index, it means\n // that the active tab was swapped out. Since this won't be picked up by the rendering\n // loop in `ngAfterContentChecked`, we need to sync it up manually.\n if (!selectedTab && tabs[indexToSelect]) {\n Promise.resolve().then(() => {\n tabs[indexToSelect].isActive = true;\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\n });\n }\n }\n\n this._changeDetectorRef.markForCheck();\n });\n }\n\n /** Listens to changes in all of the tabs. */\n private _subscribeToAllTabChanges() {\n // Since we use a query with `descendants: true` to pick up the tabs, we may end up catching\n // some that are inside of nested tab groups. We filter them out manually by checking that\n // the closest group to the tab is the current one.\n this.getHTMLText = this._allTabs['_results'][0].contentWithin;\n this.updatedTabHTML = this.getHTMLText;\n this._allTabs.changes\n .pipe(startWith(this._allTabs))\n .subscribe((tabs: QueryList) => {\n this._tabs.reset(\n tabs.filter((tab) => {\n return tab._closestTabGroup === this || !tab._closestTabGroup;\n })\n );\n this._tabs.notifyOnChanges();\n });\n }\n\n ngOnDestroy() {\n this._tabs.destroy();\n this._tabsSubscription.unsubscribe();\n this._tabLabelSubscription.unsubscribe();\n }\n\n /** Re-aligns the ink bar to the selected tab element. */\n realignInkBar() {\n if (this._tabHeader) {\n this._tabHeader._alignInkBarToSelectedTab();\n }\n }\n\n /**\n * Recalculates the tab group's pagination dimensions.\n *\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\n * page.\n */\n updatePagination() {\n if (this._tabHeader) {\n this._tabHeader.updatePagination();\n }\n }\n\n /**\n * Sets focus to a particular tab.\n * @param index Index of the tab to be focused.\n */\n focusTab(index: number) {\n const header = this._tabHeader;\n\n if (header) {\n header.focusIndex = index;\n }\n }\n\n _focusChanged(index: number) {\n this._lastFocusedTabIndex = index;\n this.focusChange.emit(this._createChangeEvent(index));\n }\n\n private _createChangeEvent(index: number): OuiTabChangeEvent {\n const event = new OuiTabChangeEvent();\n event.index = index;\n if (this._tabs && this._tabs.length) {\n event.tab = this._tabs.toArray()[index];\n this.updatedTabHTML = event.tab.contentWithin;\n }\n return event;\n }\n\n _handleEnter() {\n this.getHTMLText = this.updatedTabHTML;\n }\n\n /**\n * Subscribes to changes in the tab labels. This is needed, because the @Input for the label is\n * on the OuiTab component, whereas the data binding is inside the ouiTabGroup. In order for the\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\n * manually.\n */\n private _subscribeToTabLabels() {\n if (this._tabLabelSubscription) {\n this._tabLabelSubscription.unsubscribe();\n }\n\n this._tabLabelSubscription = merge(\n ...this._tabs.map((tab) => tab._stateChanges)\n ).subscribe(() => this._changeDetectorRef.markForCheck());\n }\n\n /** Clamps the given index to the bounds of 0 and the tabs length. */\n private _clampTabIndex(index: number | null): number {\n // Note the `|| 0`, which ensures that values like NaN can't get through\n // and which would otherwise throw the component into an infinite loop\n // (since Math.max(NaN, 0) === NaN).\n return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));\n }\n\n /** Returns a unique id for each tab label element */\n _getTabLabelId(i: number): string {\n return `oui-tab-label-${this._groupId}-${i}`;\n }\n\n /** Returns a unique id for each tab content element */\n _getTabContentId(i: number): string {\n return `oui-tab-content-${this._groupId}-${i}`;\n }\n\n /**\n * Sets the height of the body wrapper to the height of the activating tab if dynamic\n * height property is true.\n */\n _setTabBodyWrapperHeight(tabHeight: number): void {\n if (!this._dynamicHeight || !this._tabBodyWrapperHeight) {\n return;\n }\n\n const wrapper: HTMLElement = this._tabBodyWrapper.nativeElement;\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n wrapper.style.height = this._tabBodyWrapperHeight + 'px';\n\n // This conditional forces the browser to paint the height so that\n // the animation to the new height can have an origin.\n if (this._tabBodyWrapper.nativeElement.offsetHeight) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n wrapper.style.height = tabHeight + 'px';\n }\n }\n\n /** Removes the height of the tab body wrapper. */\n _removeTabBodyWrapperHeight(): void {\n const wrapper = this._tabBodyWrapper.nativeElement;\n this._tabBodyWrapperHeight = wrapper.clientHeight;\n wrapper.style.height = '';\n this.animationDone.emit();\n }\n\n /** Handle click events, setting new selected index if appropriate. */\n _handleClick(tab: OuiTab, tabHeader: OuiTabGroupBaseHeader, index: number) {\n tabHeader.focusIndex = index;\n this.getHTMLText = this.updatedTabHTML;\n\n if (!tab.disabled) {\n this.selectedIndex = index;\n }\n }\n\n /** Retrieves the tabindex for the tab. */\n _getTabIndex(index: number): number {\n const targetIndex = this._lastFocusedTabIndex ?? this.selectedIndex;\n return index === targetIndex ? 0 : -1;\n }\n\n /** Callback for when the focused state of a tab has changed. */\n _tabFocusChanged(focusOrigin: FocusOrigin, index: number) {\n // Mouse/touch focus happens during the `mousedown`/`touchstart` phase which\n // can cause the tab to be moved out from under the pointer, interrupting the\n // click sequence (see #21898). We don't need to scroll the tab into view for\n // such cases anyway, because it will be done when the tab becomes selected.\n if (focusOrigin && focusOrigin !== 'mouse' && focusOrigin !== 'touch') {\n this._tabHeader.focusIndex = index;\n }\n }\n}\n\n/** A simple change event emitted on focus or selection changes. */\nexport class OuiTabChangeEvent {\n /** Index of the currently-selected tab. */\n index: number;\n /** Reference to the currently-selected tab. */\n tab: OuiTab;\n event: Event;\n}\n", "assetsDirs": [], "styleUrlsData": [ { - "data": "@use '../core/style/variables';\r\n@use './tabs-common';\r\n\r\n@include tabs-common.structural-styles;\r\n\r\n.oui-mdc-tab {\r\n @include tabs-common.tab;\r\n\r\n // Note that we only want to target direct descendant tabs.\r\n .oui-mdc-tab-group.oui-mdc-tab-group-stretch-tabs > .oui-mdc-tab-header & {\r\n flex-grow: 1;\r\n }\r\n}\r\n\r\n.oui-mdc-focus-indicator {\r\n position: relative;\r\n}\r\n\r\n.oui-mdc-tab-body {\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n position: absolute;\r\n display: none;\r\n overflow: hidden;\r\n flex-basis: 100%;\r\n &.oui-mdc-tab-body-active {\r\n display: block;\r\n position: relative;\r\n overflow-x: hidden;\r\n overflow-y: auto;\r\n z-index: 1;\r\n }\r\n}\r\n\r\n.mdc-tab__content {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n height: inherit;\r\n pointer-events: none;\r\n}\r\n\r\n.oui-mdc-tab.mdc-tab--active .mdc-tab__text-label {\r\n color: #333;\r\n}\r\n\r\n.oui-mdc-tab-group {\r\n display: flex;\r\n flex-direction: column;\r\n\r\n // Fixes pagination issues inside flex containers (see #23157).\r\n max-width: 100%;\r\n\r\n &.oui-mdc-tab-group-inverted-header {\r\n flex-direction: column-reverse;\r\n\r\n .mdc-tab-indicator__content--underline {\r\n align-self: flex-start;\r\n }\r\n }\r\n}\r\n\r\n// The bottom section of the view; contains the tab bodies\r\n.oui-mdc-tab-body-wrapper {\r\n position: relative;\r\n overflow: hidden;\r\n display: flex;\r\n}\r\n", + "data": "@use '../core/style/variables';\n@use './tabs-common';\n\n@include tabs-common.structural-styles;\n\n.oui-mdc-tab {\n @include tabs-common.tab;\n\n // Note that we only want to target direct descendant tabs.\n .oui-mdc-tab-group.oui-mdc-tab-group-stretch-tabs > .oui-mdc-tab-header & {\n flex-grow: 1;\n }\n}\n\n.oui-mdc-focus-indicator {\n position: relative;\n}\n\n.oui-mdc-tab-body {\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n position: absolute;\n display: none;\n overflow: hidden;\n flex-basis: 100%;\n &.oui-mdc-tab-body-active {\n display: block;\n position: relative;\n overflow-x: hidden;\n overflow-y: auto;\n z-index: 1;\n }\n}\n\n.mdc-tab__content {\n display: flex;\n align-items: center;\n justify-content: center;\n height: inherit;\n pointer-events: none;\n}\n\n.oui-mdc-tab.mdc-tab--active .mdc-tab__text-label {\n color: #333;\n}\n\n.oui-mdc-tab-group {\n display: flex;\n flex-direction: column;\n\n // Fixes pagination issues inside flex containers (see #23157).\n max-width: 100%;\n\n &.oui-mdc-tab-group-inverted-header {\n flex-direction: column-reverse;\n\n .mdc-tab-indicator__content--underline {\n align-self: flex-start;\n }\n }\n}\n\n// The bottom section of the view; contains the tab bodies\n.oui-mdc-tab-body-wrapper {\n position: relative;\n overflow: hidden;\n display: flex;\n}\n", "styleUrl": "tab-group.scss" } ], @@ -44459,11 +45065,11 @@ } } }, - "templateData": "\r\n \r\n \r\n\r\n \r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n {{tab.textLabel}}\r\n \r\n \r\n \r\n\r\n\r\n\r\n \r\n \r\n\r\n" + "templateData": "\n \n \n\n \n
\n\n \n \n \n \n \n \n\n \n {{tab.textLabel}}\n \n \n \n\n\n\n \n \n\n" }, { "name": "OuiTabHeader", - "id": "component-OuiTabHeader-c7dc741f7c2a8bcba88b76014c267c6698772ef8e37a7613a2ac8cb5b71f7452a57d169ca63fa90bece0006bd1fbbf1b20f01c6286eb5eaa52982204cb7f1baf", + "id": "component-OuiTabHeader-016c84d32f793bb577e51ca07fba9eae5162e3b232180331299c5914da31606429b5232b2773508750b0346b48522fcaba57e4caa71245e5932ae709e33d2df4", "file": "ui/src/components/tabs/tab-header.ts", "changeDetection": "ChangeDetectionStrategy.Default", "encapsulation": [ @@ -45156,8 +45762,8 @@ "jsdoctags": [ { "name": { - "pos": 23371, - "end": 23380, + "pos": 22708, + "end": 22717, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -45168,8 +45774,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 23365, - "end": 23370, + "pos": 22702, + "end": 22707, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -45316,8 +45922,8 @@ "jsdoctags": [ { "name": { - "pos": 24539, - "end": 24547, + "pos": 23848, + "end": 23856, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -45328,8 +45934,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 24533, - "end": 24538, + "pos": 23842, + "end": 23847, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -45340,8 +45946,8 @@ }, { "tagName": { - "pos": 24584, - "end": 24591, + "pos": 23892, + "end": 23899, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -45515,11 +46121,11 @@ "description": "

The header of the tab group which displays a list of all the tabs in the tab group. Includes\nan ink bar that follows the currently selected tab. When the tabs list's width exceeds the\nwidth of the header container, then arrows will be displayed to allow the user to scroll\nleft and right across the header.

\n", "rawdescription": "\n\nThe header of the tab group which displays a list of all the tabs in the tab group. Includes\nan ink bar that follows the currently selected tab. When the tabs list's width exceeds the\nwidth of the header container, then arrows will be displayed to allow the user to scroll\nleft and right across the header.\n", "type": "component", - "sourceCode": "import {\r\n AfterContentChecked,\r\n AfterContentInit,\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChildren,\r\n ElementRef,\r\n Inject,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Optional,\r\n QueryList,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { ViewportRuler } from '@angular/cdk/scrolling';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\r\nimport { ouiTabLabelWrapper } from './tab-label-wrapper';\r\nimport { OuiInkBar } from './ink-bar';\r\nimport { OuiPaginatedTabHeader } from './paginated-tab-header';\r\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\r\n\r\n/**\r\n * The header of the tab group which displays a list of all the tabs in the tab group. Includes\r\n * an ink bar that follows the currently selected tab. When the tabs list's width exceeds the\r\n * width of the header container, then arrows will be displayed to allow the user to scroll\r\n * left and right across the header.\r\n * @docs-private\r\n */\r\n@Component({\r\n selector: 'oui-tab-header',\r\n templateUrl: 'tab-header.html',\r\n styleUrls: ['tab-header.scss'],\r\n // eslint-disable-next-line\r\n inputs: ['selectedIndex'],\r\n // eslint-disable-next-line\r\n outputs: ['selectFocusedIndex', 'indexFocused'],\r\n encapsulation: ViewEncapsulation.None,\r\n // tslint:disable-next-line\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n // eslint-disable-next-line\r\n host: {\r\n class: 'oui-mdc-tab-header',\r\n '[class.oui-mdc-tab-header-pagination-controls-enabled]':\r\n '_showPaginationControls',\r\n '[class.oui-mdc-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\r\n },\r\n})\r\nexport class OuiTabHeader\r\n extends OuiPaginatedTabHeader\r\n implements AfterContentChecked, AfterContentInit, AfterViewInit, OnDestroy\r\n{\r\n @ContentChildren(ouiTabLabelWrapper, { descendants: false })\r\n _items: QueryList;\r\n @ViewChild('tabListContainer', { static: true })\r\n _tabListContainer: ElementRef;\r\n @ViewChild('tabList', { static: true }) _tabList: ElementRef;\r\n @ViewChild('tabListInner', { static: true }) _tabListInner: ElementRef;\r\n @ViewChild('nextPaginator') _nextPaginator: ElementRef;\r\n @ViewChild('previousPaginator') _previousPaginator: ElementRef;\r\n _inkBar: OuiInkBar;\r\n\r\n /** Whether the ripple effect is disabled or not. */\r\n @Input()\r\n get disableRipple(): boolean {\r\n return this._disableRipple;\r\n }\r\n\r\n set disableRipple(value: BooleanInput) {\r\n this._disableRipple = coerceBooleanProperty(value);\r\n }\r\n\r\n private _disableRipple = false;\r\n\r\n constructor(\r\n elementRef: ElementRef,\r\n changeDetectorRef: ChangeDetectorRef,\r\n viewportRuler: ViewportRuler,\r\n @Optional() dir: Directionality,\r\n ngZone: NgZone,\r\n platform: Platform,\r\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string\r\n ) {\r\n super(\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n elementRef,\r\n changeDetectorRef,\r\n viewportRuler,\r\n dir,\r\n ngZone,\r\n platform,\r\n animationMode\r\n );\r\n }\r\n\r\n override ngAfterContentInit() {\r\n this._inkBar = new OuiInkBar(this._items);\r\n super.ngAfterContentInit();\r\n }\r\n\r\n protected _itemSelected(event: KeyboardEvent) {\r\n event.preventDefault();\r\n }\r\n}\r\n", + "sourceCode": "import {\n AfterContentChecked,\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ViewportRuler } from '@angular/cdk/scrolling';\nimport { Platform } from '@angular/cdk/platform';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport { ouiTabLabelWrapper } from './tab-label-wrapper';\nimport { OuiInkBar } from './ink-bar';\nimport { OuiPaginatedTabHeader } from './paginated-tab-header';\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\n\n/**\n * The header of the tab group which displays a list of all the tabs in the tab group. Includes\n * an ink bar that follows the currently selected tab. When the tabs list's width exceeds the\n * width of the header container, then arrows will be displayed to allow the user to scroll\n * left and right across the header.\n * @docs-private\n */\n@Component({\n selector: 'oui-tab-header',\n templateUrl: 'tab-header.html',\n styleUrls: ['tab-header.scss'],\n // eslint-disable-next-line\n inputs: ['selectedIndex'],\n // eslint-disable-next-line\n outputs: ['selectFocusedIndex', 'indexFocused'],\n encapsulation: ViewEncapsulation.None,\n // tslint:disable-next-line\n changeDetection: ChangeDetectionStrategy.Default,\n // eslint-disable-next-line\n host: {\n class: 'oui-mdc-tab-header',\n '[class.oui-mdc-tab-header-pagination-controls-enabled]':\n '_showPaginationControls',\n '[class.oui-mdc-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n },\n})\nexport class OuiTabHeader\n extends OuiPaginatedTabHeader\n implements AfterContentChecked, AfterContentInit, AfterViewInit, OnDestroy\n{\n @ContentChildren(ouiTabLabelWrapper, { descendants: false })\n _items: QueryList;\n @ViewChild('tabListContainer', { static: true })\n _tabListContainer: ElementRef;\n @ViewChild('tabList', { static: true }) _tabList: ElementRef;\n @ViewChild('tabListInner', { static: true }) _tabListInner: ElementRef;\n @ViewChild('nextPaginator') _nextPaginator: ElementRef;\n @ViewChild('previousPaginator') _previousPaginator: ElementRef;\n _inkBar: OuiInkBar;\n\n /** Whether the ripple effect is disabled or not. */\n @Input()\n get disableRipple(): boolean {\n return this._disableRipple;\n }\n\n set disableRipple(value: BooleanInput) {\n this._disableRipple = coerceBooleanProperty(value);\n }\n\n private _disableRipple = false;\n\n constructor(\n elementRef: ElementRef,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n platform: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string\n ) {\n super(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n elementRef,\n changeDetectorRef,\n viewportRuler,\n dir,\n ngZone,\n platform,\n animationMode\n );\n }\n\n override ngAfterContentInit() {\n this._inkBar = new OuiInkBar(this._items);\n super.ngAfterContentInit();\n }\n\n protected _itemSelected(event: KeyboardEvent) {\n event.preventDefault();\n }\n}\n", "assetsDirs": [], "styleUrlsData": [ { - "data": "@use '@angular/cdk';\r\n@use './tabs-theme';\r\n@use './tabs-common';\r\n\r\n@include tabs-common.paginated-tab-header;\r\n\r\n.oui-mdc-tab-label-container {\r\n @include tabs-common.paginated-tab-header-container;\r\n}\r\n\r\n.oui-tab-labels-container {\r\n @include tabs-common.paginated-tab-header-item-wrapper('.oui-mdc-tab-header');\r\n}\r\n\r\n.oui-mdc-tab {\r\n // For the tab element, default inset/offset values are necessary to ensure that\r\n // the focus indicator is sufficiently contrastive and renders appropriately.\r\n &::before {\r\n margin: 5px;\r\n }\r\n\r\n @include cdk.high-contrast(active, off) {\r\n // When a tab is disabled in high contrast mode, set the text color to the disabled\r\n // color, which is (unintuitively) named \"GrayText\".\r\n &[aria-disabled='true'] {\r\n color: GrayText;\r\n }\r\n }\r\n}\r\n", + "data": "@use '@angular/cdk';\n@use './tabs-theme';\n@use './tabs-common';\n\n@include tabs-common.paginated-tab-header;\n\n.oui-mdc-tab-label-container {\n @include tabs-common.paginated-tab-header-container;\n}\n\n.oui-tab-labels-container {\n @include tabs-common.paginated-tab-header-item-wrapper('.oui-mdc-tab-header');\n}\n\n.oui-mdc-tab {\n // For the tab element, default inset/offset values are necessary to ensure that\n // the focus indicator is sufficiently contrastive and renders appropriately.\n &::before {\n margin: 5px;\n }\n\n @include cdk.high-contrast(active, off) {\n // When a tab is disabled in high contrast mode, set the text color to the disabled\n // color, which is (unintuitively) named \"GrayText\".\n &[aria-disabled='true'] {\n color: GrayText;\n }\n }\n}\n", "styleUrl": "tab-header.scss" } ], @@ -45691,7 +46297,7 @@ } } }, - "templateData": "\r\n\r\n
\r\n\r\n\r\n\r\n \r\n
\r\n \r\n
\r\n \r\n\r\n\r\n\r\n\r\n
\r\n\r\n" + "templateData": "\n\n
\n\n\n\n \n
\n \n
\n \n\n\n\n\n
\n\n" }, { "name": "OuiTable", @@ -46116,7 +46722,7 @@ }, { "name": "OuiTabLink", - "id": "component-OuiTabLink-6ce7108d054f1ce731fb3fdfd386c2252b009425dd05e2318aa5d6e1a34d06858b72f8ec2278d0b20e6242ef7a9e6be288d99d19c36c6712b85c978bf5907722", + "id": "component-OuiTabLink-4eda8dfe52f55e2f9ce5dd15f92f8927d2bbef62cb382fc4fb67dabbe48482054802acb523bdd4cb5a0c32c0a1e06d449a72eec6498bcb7d09d92d1f0c524cad", "file": "ui/src/components/tabs/tab-nav-bar/tab-nav-bar.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -46130,7 +46736,8 @@ "disableRipple", "tabIndex", "active", - "id" + "id", + "routerLink" ], "outputs": [], "providers": [], @@ -46332,11 +46939,11 @@ "description": "

Link inside a oui-tab-nav-bar.

\n", "rawdescription": "\n\nLink inside a `oui-tab-nav-bar`.\n", "type": "component", - "sourceCode": "import {\r\n AfterContentChecked,\r\n AfterContentInit,\r\n AfterViewInit,\r\n Attribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChildren,\r\n ElementRef,\r\n forwardRef,\r\n Inject,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Optional,\r\n QueryList,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\r\nimport {\r\n CanDisable,\r\n CanDisableRipple,\r\n HasTabIndex,\r\n mixinDisabled,\r\n mixinDisableRipple,\r\n mixinTabIndex,\r\n ThemePalette,\r\n} from '../../core';\r\nimport { FocusableOption, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { ViewportRuler } from '@angular/cdk/scrolling';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { OuiInkBar, mixinInkBarItem } from '../ink-bar';\r\nimport {\r\n BooleanInput,\r\n coerceBooleanProperty,\r\n NumberInput,\r\n} from '@angular/cdk/coercion';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\nimport { startWith, takeUntil } from 'rxjs/operators';\r\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\r\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from '../tab-config';\r\nimport { OuiPaginatedTabHeader } from '../paginated-tab-header';\r\nimport { isDevMode } from '@angular/core';\r\n\r\n// Increasing integer for generating unique ids for tab nav components.\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * Navigation component matching the styles of the tab group header.\r\n * Provides anchored navigation with animated ink bar.\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: '[oui-tab-nav-bar]',\r\n exportAs: 'OuiTabNavBar, OuiTabNav',\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['color'],\r\n templateUrl: 'tab-nav-bar.html',\r\n styleUrls: ['tab-nav-bar.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '[attr.role]': '_getRole()',\r\n class: 'oui-mdc-tab-nav-bar oui-mdc-tab-header',\r\n '[class.oui-mdc-tab-header-pagination-controls-enabled]':\r\n '_showPaginationControls',\r\n '[class.oui-mdc-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\r\n '[class.oui-mdc-tab-nav-bar-stretch-tabs]': 'stretchTabs',\r\n '[class.mat-primary]': 'color !== \"warn\" && color !== \"accent\"',\r\n '[class.mat-accent]': 'color === \"accent\"',\r\n '[class.mat-warn]': 'color === \"warn\"',\r\n '[class._oui-animation-noopable]': '_animationMode === \"NoopAnimations\"',\r\n '[style.--oui-tab-animation-duration]': 'animationDuration',\r\n },\r\n encapsulation: ViewEncapsulation.None,\r\n // tslint:disable-next-line:validate-decorators\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n})\r\nexport class OuiTabNav\r\n extends OuiPaginatedTabHeader\r\n implements AfterContentChecked, AfterContentInit, OnDestroy, AfterViewInit\r\n{\r\n /** Whether the ink bar should fit its width to the size of the tab label content. */\r\n @Input()\r\n get fitInkBarToContent(): boolean {\r\n return this._fitInkBarToContent.value;\r\n }\r\n set fitInkBarToContent(v: BooleanInput) {\r\n this._fitInkBarToContent.next(coerceBooleanProperty(v));\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n _fitInkBarToContent = new BehaviorSubject(false);\r\n\r\n /** Whether tabs should be stretched to fill the header. */\r\n @Input('oui-stretch-tabs')\r\n get stretchTabs(): boolean {\r\n return this._stretchTabs;\r\n }\r\n set stretchTabs(v: BooleanInput) {\r\n this._stretchTabs = coerceBooleanProperty(v);\r\n }\r\n private _stretchTabs = true;\r\n\r\n @Input()\r\n get animationDuration(): string {\r\n return this._animationDuration;\r\n }\r\n\r\n set animationDuration(value: NumberInput) {\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n ? value + 'ms'\r\n : (value as string);\r\n }\r\n\r\n private _animationDuration: string;\r\n\r\n /** Query list of all tab links of the tab navigation. */\r\n @ContentChildren(forwardRef(() => OuiTabLink), { descendants: true })\r\n _items: QueryList;\r\n\r\n /** Background color of the tab nav. */\r\n @Input()\r\n get backgroundColor(): ThemePalette {\r\n return this._backgroundColor;\r\n }\r\n\r\n set backgroundColor(value: ThemePalette) {\r\n const classList = this._elementRef.nativeElement.classList;\r\n classList.remove(\r\n 'oui-tabs-with-background',\r\n `oui-background-${this.backgroundColor}`\r\n );\r\n\r\n if (value) {\r\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\r\n }\r\n\r\n this._backgroundColor = value;\r\n }\r\n\r\n private _backgroundColor: ThemePalette;\r\n\r\n /** Whether the ripple effect is disabled or not. */\r\n @Input()\r\n get disableRipple(): boolean {\r\n return this._disableRipple;\r\n }\r\n\r\n set disableRipple(value: BooleanInput) {\r\n this._disableRipple = coerceBooleanProperty(value);\r\n }\r\n\r\n private _disableRipple = false;\r\n\r\n /** Theme color of the nav bar. */\r\n @Input() color: ThemePalette = 'accent';\r\n\r\n /**\r\n * Associated tab panel controlled by the nav bar. If not provided, then the nav bar\r\n * follows the ARIA link / navigation landmark pattern. If provided, it follows the\r\n * ARIA tabs design pattern.\r\n */\r\n @Input() tabPanel?: ouiTabNavPanel;\r\n\r\n @ViewChild('tabListContainer', { static: true })\r\n _tabListContainer: ElementRef;\r\n @ViewChild('tabList', { static: true }) _tabList: ElementRef;\r\n @ViewChild('tabListInner', { static: true }) _tabListInner: ElementRef;\r\n @ViewChild('nextPaginator') _nextPaginator: ElementRef;\r\n @ViewChild('previousPaginator') _previousPaginator: ElementRef;\r\n _inkBar: OuiInkBar;\r\n\r\n constructor(\r\n elementRef: ElementRef,\r\n @Optional() dir: Directionality,\r\n ngZone: NgZone,\r\n changeDetectorRef: ChangeDetectorRef,\r\n viewportRuler: ViewportRuler,\r\n platform: Platform,\r\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string,\r\n @Optional() @Inject(OUI_TABS_CONFIG) defaultConfig?: OuiTabsConfig\r\n ) {\r\n super(\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n elementRef,\r\n changeDetectorRef,\r\n viewportRuler,\r\n dir,\r\n ngZone,\r\n platform,\r\n animationMode\r\n );\r\n this.disablePagination =\r\n defaultConfig && defaultConfig.disablePagination != null\r\n ? defaultConfig.disablePagination\r\n : false;\r\n this.fitInkBarToContent =\r\n defaultConfig && defaultConfig.fitInkBarToContent != null\r\n ? defaultConfig.fitInkBarToContent\r\n : false;\r\n this.stretchTabs =\r\n defaultConfig && defaultConfig.stretchTabs != null\r\n ? defaultConfig.stretchTabs\r\n : true;\r\n }\r\n\r\n protected _itemSelected() {\r\n // noop\r\n }\r\n\r\n override ngAfterContentInit() {\r\n this._inkBar = new OuiInkBar(this._items);\r\n // We need this to run before the `changes` subscription in parent to ensure that the\r\n // selectedIndex is up-to-date by the time the super class starts looking for it.\r\n this._items.changes\r\n .pipe(startWith(null), takeUntil(this._destroyed))\r\n .subscribe(() => {\r\n this.updateActiveLink();\r\n });\r\n\r\n super.ngAfterContentInit();\r\n }\r\n\r\n override ngAfterViewInit() {\r\n if (!this.tabPanel && (typeof isDevMode === 'undefined' || isDevMode)) {\r\n throw new Error('A oui-tab-nav-panel must be specified via [tabPanel].');\r\n }\r\n super.ngAfterViewInit();\r\n }\r\n\r\n /** Notifies the component that the active link has been changed. */\r\n updateActiveLink() {\r\n if (!this._items) {\r\n return;\r\n }\r\n\r\n const items = this._items.toArray();\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n if (items[i].active) {\r\n this.selectedIndex = i;\r\n this._changeDetectorRef.markForCheck();\r\n\r\n if (this.tabPanel) {\r\n this.tabPanel._activeTabId = items[i].id;\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n // The ink bar should hide itself if no items are active.\r\n this.selectedIndex = -1;\r\n this._inkBar.hide();\r\n }\r\n\r\n _getRole(): string | null {\r\n return this.tabPanel\r\n ? 'tablist'\r\n : this._elementRef.nativeElement.getAttribute('role');\r\n }\r\n}\r\n\r\n// Boilerplate for applying mixins to OuiTabLink.\r\nconst _OuiTabLinkMixinBase = mixinInkBarItem(\r\n mixinTabIndex(\r\n mixinDisableRipple(\r\n mixinDisabled(\r\n class {\r\n elementRef: ElementRef;\r\n }\r\n )\r\n )\r\n )\r\n);\r\n\r\n/**\r\n * Link inside a `oui-tab-nav-bar`.\r\n */\r\n@Component({\r\n // eslint-disable-next-line\r\n selector: '[oui-tab-link], [OuiTabLink]',\r\n exportAs: 'OuiTabLink',\r\n // eslint-disable-next-line\r\n inputs: ['disabled', 'disableRipple', 'tabIndex', 'active', 'id'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: 'tab-link.html',\r\n styleUrls: ['tab-link.scss'],\r\n // eslint-disable-next-line\r\n host: {\r\n class: 'mdc-tab oui-mdc-tab-link oui-mdc-focus-indicator',\r\n '[attr.aria-controls]': '_getAriaControls()',\r\n '[attr.aria-current]': '_getAriaCurrent()',\r\n '[attr.aria-disabled]': 'disabled',\r\n '[attr.aria-selected]': '_getAriaSelected()',\r\n '[attr.id]': 'id',\r\n '[attr.tabIndex]': '_getTabIndex()',\r\n '[attr.role]': '_getRole()',\r\n '[class.oui-mdc-tab-disabled]': 'disabled',\r\n '[class.mdc-tab--active]': 'active',\r\n '(focus)': '_handleFocus()',\r\n '(keydown)': '_handleKeydown($event)',\r\n },\r\n})\r\nexport class OuiTabLink\r\n extends _OuiTabLinkMixinBase\r\n implements\r\n AfterViewInit,\r\n OnDestroy,\r\n CanDisable,\r\n CanDisableRipple,\r\n HasTabIndex,\r\n FocusableOption\r\n{\r\n private readonly _destroyed = new Subject();\r\n\r\n /** Whether the tab link is active or not. */\r\n protected _isActive = false;\r\n\r\n /** Whether the link is active. */\r\n @Input()\r\n get active(): boolean {\r\n return this._isActive;\r\n }\r\n\r\n set active(value: BooleanInput) {\r\n const newValue = coerceBooleanProperty(value);\r\n\r\n if (newValue !== this._isActive) {\r\n this._isActive = newValue;\r\n this._tabNavBar.updateActiveLink();\r\n }\r\n }\r\n\r\n /**\r\n * Whether ripples are disabled on interaction.\r\n * @docs-private\r\n */\r\n get rippleDisabled(): boolean {\r\n return this.disabled || this.disableRipple || this._tabNavBar.disableRipple;\r\n }\r\n\r\n /** Unique id for the tab. */\r\n @Input() id = `oui-tab-link-${nextUniqueId++}`;\r\n\r\n constructor(\r\n private _tabNavBar: OuiTabNav,\r\n /** @docs-private */\r\n override elementRef: ElementRef,\r\n @Attribute('tabindex') tabIndex: string,\r\n private _focusMonitor: FocusMonitor,\r\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string\r\n ) {\r\n super();\r\n\r\n this.tabIndex = parseInt(tabIndex) || 0;\r\n\r\n if (animationMode === 'NoopAnimations') {\r\n // this.rippleConfig.animation = { enterDuration: 0, exitDuration: 0 };\r\n }\r\n\r\n _tabNavBar._fitInkBarToContent\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe((fitInkBarToContent) => {\r\n this.fitInkBarToContent = fitInkBarToContent;\r\n });\r\n }\r\n\r\n /** Focuses the tab link. */\r\n focus() {\r\n this.elementRef.nativeElement.focus();\r\n }\r\n\r\n ngAfterViewInit() {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n this._focusMonitor.monitor(this.elementRef);\r\n }\r\n\r\n override ngOnDestroy() {\r\n this._destroyed.next();\r\n this._destroyed.complete();\r\n super.ngOnDestroy();\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n this._focusMonitor.stopMonitoring(this.elementRef);\r\n }\r\n\r\n _handleFocus() {\r\n // Since we allow navigation through tabbing in the nav bar, we\r\n // have to update the focused index whenever the link receives focus.\r\n this._tabNavBar.focusIndex = this._tabNavBar._items.toArray().indexOf(this);\r\n }\r\n\r\n _handleKeydown(event: KeyboardEvent) {\r\n if (this.disabled && (event.keyCode === SPACE || event.keyCode === ENTER)) {\r\n event.preventDefault();\r\n } else if (this._tabNavBar.tabPanel && event.keyCode === SPACE) {\r\n this.elementRef.nativeElement.click();\r\n }\r\n }\r\n\r\n _getAriaControls(): string | null {\r\n return this._tabNavBar.tabPanel\r\n ? this._tabNavBar.tabPanel?.id\r\n : this.elementRef.nativeElement.getAttribute('aria-controls');\r\n }\r\n\r\n _getAriaSelected(): string | null {\r\n if (this._tabNavBar.tabPanel) {\r\n return this.active ? 'true' : 'false';\r\n } else {\r\n return this.elementRef.nativeElement.getAttribute('aria-selected');\r\n }\r\n }\r\n\r\n _getAriaCurrent(): string | null {\r\n return this.active && !this._tabNavBar.tabPanel ? 'page' : null;\r\n }\r\n\r\n _getRole(): string | null {\r\n return this._tabNavBar.tabPanel\r\n ? 'tab'\r\n : this.elementRef.nativeElement.getAttribute('role');\r\n }\r\n\r\n _getTabIndex(): number {\r\n if (this._tabNavBar.tabPanel) {\r\n return this._isActive && !this.disabled ? 0 : -1;\r\n } else {\r\n return this.tabIndex;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Tab panel component associated with OuiTabNav.\r\n */\r\n@Component({\r\n selector: 'oui-tab-nav-panel',\r\n exportAs: 'ouiTabNavPanel',\r\n template: '',\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '[attr.aria-labelledby]': '_activeTabId',\r\n '[attr.id]': 'id',\r\n class: 'oui-mdc-tab-nav-panel',\r\n role: 'tabpanel',\r\n },\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ouiTabNavPanel {\r\n /** Unique id for the tab panel. */\r\n @Input() id = `oui-tab-nav-panel-${nextUniqueId++}`;\r\n\r\n /** Id of the active tab in the nav bar. */\r\n _activeTabId?: string;\r\n}\r\n", + "sourceCode": "import {\n AfterContentChecked,\n AfterContentInit,\n AfterViewInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n forwardRef,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport {\n CanDisable,\n CanDisableRipple,\n HasTabIndex,\n mixinDisabled,\n mixinDisableRipple,\n mixinTabIndex,\n ThemePalette,\n} from '../../core';\nimport { FocusableOption, FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { ViewportRuler } from '@angular/cdk/scrolling';\nimport { Platform } from '@angular/cdk/platform';\nimport { OuiInkBar, mixinInkBarItem } from '../ink-bar';\nimport {\n BooleanInput,\n coerceBooleanProperty,\n NumberInput,\n} from '@angular/cdk/coercion';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { startWith, takeUntil } from 'rxjs/operators';\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from '../tab-config';\nimport { OuiPaginatedTabHeader } from '../paginated-tab-header';\n// import { isDevMode } from '@angular/core';\n\n// Increasing integer for generating unique ids for tab nav components.\nlet nextUniqueId = 0;\n\n/**\n * Navigation component matching the styles of the tab group header.\n * Provides anchored navigation with animated ink bar.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-tab-nav-bar]',\n exportAs: 'OuiTabNavBar, OuiTabNav',\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['color'],\n templateUrl: 'tab-nav-bar.html',\n styleUrls: ['tab-nav-bar.scss'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.role]': '_getRole()',\n class: 'oui-mdc-tab-nav-bar oui-mdc-tab-header oui-tab',\n '[class.oui-mdc-tab-header-pagination-controls-enabled]':\n '_showPaginationControls',\n '[class.oui-mdc-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n '[class.oui-mdc-tab-nav-bar-stretch-tabs]': 'stretchTabs',\n '[class.oui-primary]': 'color !== \"warn\" && color !== \"accent\"',\n '[class.oui-accent]': 'color === \"accent\"',\n '[class.oui-warn]': 'color === \"warn\"',\n '[class._oui-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n '[style.--oui-tab-animation-duration]': 'animationDuration',\n },\n encapsulation: ViewEncapsulation.None,\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n})\nexport class OuiTabNav\n extends OuiPaginatedTabHeader\n implements AfterContentChecked, AfterContentInit, OnDestroy, AfterViewInit\n{\n /** Whether the ink bar should fit its width to the size of the tab label content. */\n @Input()\n get fitInkBarToContent(): boolean {\n return this._fitInkBarToContent.value;\n }\n set fitInkBarToContent(v: BooleanInput) {\n this._fitInkBarToContent.next(coerceBooleanProperty(v));\n this._changeDetectorRef.markForCheck();\n }\n _fitInkBarToContent = new BehaviorSubject(false);\n\n /** Whether tabs should be stretched to fill the header. */\n @Input('oui-stretch-tabs')\n get stretchTabs(): boolean {\n return this._stretchTabs;\n }\n set stretchTabs(v: BooleanInput) {\n this._stretchTabs = coerceBooleanProperty(v);\n }\n private _stretchTabs = true;\n\n @Input()\n get animationDuration(): string {\n return this._animationDuration;\n }\n\n set animationDuration(value: NumberInput) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n ? value + 'ms'\n : (value as string);\n }\n\n private _animationDuration: string;\n\n /** Query list of all tab links of the tab navigation. */\n @ContentChildren(forwardRef(() => OuiTabLink), { descendants: true })\n _items: QueryList;\n\n /** Background color of the tab nav. */\n @Input()\n get backgroundColor(): ThemePalette {\n return this._backgroundColor;\n }\n\n set backgroundColor(value: ThemePalette) {\n const classList = this._elementRef.nativeElement.classList;\n classList.remove(\n 'oui-tabs-with-background',\n `oui-background-${this.backgroundColor}`\n );\n\n if (value) {\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n\n private _backgroundColor: ThemePalette;\n\n /** Whether the ripple effect is disabled or not. */\n @Input()\n get disableRipple(): boolean {\n return this._disableRipple;\n }\n\n set disableRipple(value: BooleanInput) {\n this._disableRipple = coerceBooleanProperty(value);\n }\n\n private _disableRipple = false;\n\n /** Theme color of the nav bar. */\n @Input() color: ThemePalette = 'primary';\n\n /**\n * Associated tab panel controlled by the nav bar. If not provided, then the nav bar\n * follows the ARIA link / navigation landmark pattern. If provided, it follows the\n * ARIA tabs design pattern.\n */\n @Input() tabPanel?: ouiTabNavPanel;\n\n @ViewChild('tabListContainer', { static: true })\n _tabListContainer: ElementRef;\n @ViewChild('tabList', { static: true }) _tabList: ElementRef;\n @ViewChild('tabListInner', { static: true }) _tabListInner: ElementRef;\n @ViewChild('nextPaginator') _nextPaginator: ElementRef;\n @ViewChild('previousPaginator') _previousPaginator: ElementRef;\n _inkBar: OuiInkBar;\n\n constructor(\n elementRef: ElementRef,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n platform: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string,\n @Optional() @Inject(OUI_TABS_CONFIG) defaultConfig?: OuiTabsConfig\n ) {\n super(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n elementRef,\n changeDetectorRef,\n viewportRuler,\n dir,\n ngZone,\n platform,\n animationMode\n );\n this.disablePagination =\n defaultConfig && defaultConfig.disablePagination != null\n ? defaultConfig.disablePagination\n : false;\n this.fitInkBarToContent =\n defaultConfig && defaultConfig.fitInkBarToContent != null\n ? defaultConfig.fitInkBarToContent\n : false;\n this.stretchTabs =\n defaultConfig && defaultConfig.stretchTabs != null\n ? defaultConfig.stretchTabs\n : true;\n }\n\n protected _itemSelected() {\n // noop\n }\n\n override ngAfterContentInit() {\n this._inkBar = new OuiInkBar(this._items);\n // We need this to run before the `changes` subscription in parent to ensure that the\n // selectedIndex is up-to-date by the time the super class starts looking for it.\n this._items.changes\n .pipe(startWith(null), takeUntil(this._destroyed))\n .subscribe(() => {\n this.updateActiveLink();\n });\n\n super.ngAfterContentInit();\n }\n\n /** Notifies the component that the active link has been changed. */\n updateActiveLink() {\n if (!this._items) {\n return;\n }\n\n const items = this._items.toArray();\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].active) {\n this.selectedIndex = i;\n this._changeDetectorRef.markForCheck();\n\n if (this.tabPanel) {\n this.tabPanel._activeTabId = items[i].id;\n }\n\n return;\n }\n }\n\n // The ink bar should hide itself if no items are active.\n this.selectedIndex = -1;\n this._inkBar.hide();\n }\n\n _getRole(): string | null {\n return this.tabPanel\n ? 'tablist'\n : this._elementRef.nativeElement.getAttribute('role');\n }\n}\n\n// Boilerplate for applying mixins to OuiTabLink.\nconst _OuiTabLinkMixinBase = mixinInkBarItem(\n mixinTabIndex(\n mixinDisableRipple(\n mixinDisabled(\n class {\n elementRef: ElementRef;\n }\n )\n )\n )\n);\n\n/**\n * Link inside a `oui-tab-nav-bar`.\n */\n@Component({\n // eslint-disable-next-line\n selector: '[oui-tab-link], [OuiTabLink]',\n exportAs: 'OuiTabLink',\n // eslint-disable-next-line\n inputs: [\n 'disabled',\n 'disableRipple',\n 'tabIndex',\n 'active',\n 'id',\n 'routerLink',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: 'tab-link.html',\n styleUrls: ['tab-link.scss'],\n // eslint-disable-next-line\n host: {\n class: 'mdc-tab oui-mdc-tab-link oui-mdc-focus-indicator',\n '[attr.aria-controls]': '_getAriaControls()',\n '[attr.aria-current]': '_getAriaCurrent()',\n '[attr.aria-disabled]': 'disabled',\n '[attr.aria-selected]': '_getAriaSelected()',\n '[attr.id]': 'id',\n '[attr.tabIndex]': '_getTabIndex()',\n '[attr.role]': '_getRole()',\n '[class.oui-mdc-tab-disabled]': 'disabled',\n '[class.mdc-tab--active]': 'active',\n '(focus)': '_handleFocus()',\n '(keydown)': '_handleKeydown($event)',\n },\n})\nexport class OuiTabLink\n extends _OuiTabLinkMixinBase\n implements\n AfterViewInit,\n OnDestroy,\n CanDisable,\n CanDisableRipple,\n HasTabIndex,\n FocusableOption\n{\n private readonly _destroyed = new Subject();\n\n /** Whether the tab link is active or not. */\n protected _isActive = false;\n\n /** Whether the link is active. */\n @Input()\n get active(): boolean {\n return this._isActive;\n }\n\n set active(value: BooleanInput) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this._isActive) {\n this._isActive = newValue;\n this._tabNavBar.updateActiveLink();\n }\n }\n\n /**\n * Whether ripples are disabled on interaction.\n * @docs-private\n */\n get rippleDisabled(): boolean {\n return this.disabled || this.disableRipple || this._tabNavBar.disableRipple;\n }\n\n /** Unique id for the tab. */\n @Input() id = `oui-tab-link-${nextUniqueId++}`;\n\n constructor(\n private _tabNavBar: OuiTabNav,\n /** @docs-private */\n override elementRef: ElementRef,\n @Attribute('tabindex') tabIndex: string,\n private _focusMonitor: FocusMonitor,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string\n ) {\n super();\n\n this.tabIndex = parseInt(tabIndex) || 0;\n\n if (animationMode === 'NoopAnimations') {\n // this.rippleConfig.animation = { enterDuration: 0, exitDuration: 0 };\n }\n\n _tabNavBar._fitInkBarToContent\n .pipe(takeUntil(this._destroyed))\n .subscribe((fitInkBarToContent) => {\n this.fitInkBarToContent = fitInkBarToContent;\n });\n }\n\n /** Focuses the tab link. */\n focus() {\n this.elementRef.nativeElement.focus();\n }\n\n ngAfterViewInit() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this._focusMonitor.monitor(this.elementRef);\n }\n\n override ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n super.ngOnDestroy();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n\n _handleFocus() {\n // Since we allow navigation through tabbing in the nav bar, we\n // have to update the focused index whenever the link receives focus.\n this._tabNavBar.focusIndex = this._tabNavBar._items.toArray().indexOf(this);\n }\n\n _handleKeydown(event: KeyboardEvent) {\n if (this.disabled && (event.keyCode === SPACE || event.keyCode === ENTER)) {\n event.preventDefault();\n } else if (this._tabNavBar.tabPanel && event.keyCode === SPACE) {\n this.elementRef.nativeElement.click();\n }\n }\n\n _getAriaControls(): string | null {\n return this._tabNavBar.tabPanel\n ? this._tabNavBar.tabPanel?.id\n : this.elementRef.nativeElement.getAttribute('aria-controls');\n }\n\n _getAriaSelected(): string | null {\n if (this._tabNavBar.tabPanel) {\n return this.active ? 'true' : 'false';\n } else {\n return this.elementRef.nativeElement.getAttribute('aria-selected');\n }\n }\n\n _getAriaCurrent(): string | null {\n return this.active && !this._tabNavBar.tabPanel ? 'page' : null;\n }\n\n _getRole(): string | null {\n return this._tabNavBar.tabPanel\n ? 'tab'\n : this.elementRef.nativeElement.getAttribute('role');\n }\n\n _getTabIndex(): number {\n if (this._tabNavBar.tabPanel) {\n return this._isActive && !this.disabled ? 0 : -1;\n } else {\n return this.tabIndex;\n }\n }\n}\n\n/**\n * Tab panel component associated with OuiTabNav.\n */\n@Component({\n selector: 'oui-tab-nav-panel',\n exportAs: 'ouiTabNavPanel',\n template: '',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.aria-labelledby]': '_activeTabId',\n '[attr.id]': 'id',\n class: 'oui-mdc-tab-nav-panel',\n role: 'tabpanel',\n },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ouiTabNavPanel {\n /** Unique id for the tab panel. */\n @Input() id = `oui-tab-nav-panel-${nextUniqueId++}`;\n\n /** Id of the active tab in the nav bar. */\n _activeTabId?: string;\n}\n", "assetsDirs": [], "styleUrlsData": [ { - "data": "@use '../../core/style/variables';\r\n@use '../tabs-common';\r\n\r\n// Wraps each link in the header\r\n.oui-mdc-tab-link {\r\n // @include tabs-common.tab;\r\n\r\n // Note that we only want to target direct descendant tabs.\r\n .oui-mdc-tab-header.oui-mdc-tab-nav-bar-stretch-tabs & {\r\n flex-grow: 1;\r\n }\r\n\r\n // For the tab-link element, default inset/offset values are necessary to ensure that\r\n // the focus indicator is sufficiently contrastive and renders appropriately.\r\n &::before {\r\n margin: 5px;\r\n }\r\n}\r\n\r\n// @media (variables.$xsmall) {\r\n// .oui-mdc-tab-link {\r\n// min-width: 72px;\r\n// }\r\n// }\r\n", + "data": "@use '../../core/style/variables';\n@use '../tabs-common';\n\n// Wraps each link in the header\n.oui-mdc-tab-link {\n // @include tabs-common.tab;\n\n // Note that we only want to target direct descendant tabs.\n .oui-mdc-tab-header.oui-mdc-tab-nav-bar-stretch-tabs & {\n flex-grow: 1;\n }\n\n // For the tab-link element, default inset/offset values are necessary to ensure that\n // the focus indicator is sufficiently contrastive and renders appropriately.\n &::before {\n margin: 5px;\n }\n}\n.oui-mdc-tab-nav-bar {\n display: flex;\n a.oui-mdc-tab-link {\n min-width: 90px;\n justify-content: center;\n box-sizing: border-box;\n outline: none;\n text-align: center;\n white-space: nowrap;\n margin: 0 5px;\n cursor: pointer;\n -webkit-appearance: none;\n z-index: 1;\n flex-grow: 0;\n border: 1px solid transparent !important;\n border-bottom: 0 !important;\n padding: 19px 20px 10px;\n display: inline-flex;\n position: relative;\n &.cdk-keyboard-focused {\n border: 1px solid #006bb1 !important;\n border-bottom: 0 !important;\n }\n &.active {\n .mdc-tab__content .mdc-tab__text-label {\n color: #333;\n }\n }\n &:first-child {\n margin-left: 0;\n }\n &:last-child {\n margin-right: 0;\n }\n }\n .mdc-tab-indicator {\n display: flex;\n position: absolute;\n top: 0;\n left: 0;\n justify-content: center;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 1;\n .mdc-tab-indicator__content--underline {\n align-self: flex-end;\n box-sizing: border-box;\n width: 100%;\n border-top-style: solid;\n }\n }\n .mdc-tab__content {\n display: flex;\n align-items: center;\n justify-content: center;\n height: inherit;\n pointer-events: none;\n .mdc-tab__text-label {\n transition: 0.15s color linear;\n display: inline-block;\n line-height: 1;\n z-index: 2;\n font-size: 16px;\n line-height: 22px;\n font-weight: 600;\n color: #666;\n display: inline-flex;\n align-items: center;\n }\n }\n .oui-mdc-tab-header-pagination {\n display: none;\n }\n}\n", "styleUrl": "tab-link.scss" } ], @@ -46490,15 +47097,15 @@ "description": "

Whether ripples are disabled on interaction.

\n", "jsdoctags": [ { - "pos": 10484, - "end": 10502, + "pos": 9964, + "end": 9981, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, "kind": 334, "tagName": { - "pos": 10485, - "end": 10497, + "pos": 9965, + "end": 9977, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -46511,11 +47118,11 @@ } } }, - "templateData": "\r\n\r\n
\r\n\r\n\r\n \r\n \r\n \r\n\r\n" + "templateData": "\n\n
\n\n\n \n \n \n\n" }, { "name": "OuiTabNav", - "id": "component-OuiTabNav-6ce7108d054f1ce731fb3fdfd386c2252b009425dd05e2318aa5d6e1a34d06858b72f8ec2278d0b20e6242ef7a9e6be288d99d19c36c6712b85c978bf5907722", + "id": "component-OuiTabNav-4eda8dfe52f55e2f9ce5dd15f92f8927d2bbef62cb382fc4fb67dabbe48482054802acb523bdd4cb5a0c32c0a1e06d449a72eec6498bcb7d09d92d1f0c524cad", "file": "ui/src/components/tabs/tab-nav-bar/tab-nav-bar.ts", "changeDetection": "ChangeDetectionStrategy.Default", "encapsulation": [ @@ -46560,7 +47167,7 @@ }, { "name": "color", - "defaultValue": "'accent'", + "defaultValue": "'primary'", "deprecated": false, "deprecationMessage": "", "rawdescription": "\nTheme color of the nav bar.", @@ -47100,7 +47707,7 @@ "optional": false, "returnType": "string | null", "typeParameters": [], - "line": 267, + "line": 260, "deprecated": false, "deprecationMessage": "" }, @@ -47136,29 +47743,13 @@ "file": "OuiPaginatedTabHeader" } }, - { - "name": "ngAfterViewInit", - "args": [], - "optional": false, - "returnType": "void", - "typeParameters": [], - "line": 234, - "deprecated": false, - "deprecationMessage": "", - "modifierKind": [ - 164 - ], - "inheritance": { - "file": "OuiPaginatedTabHeader" - } - }, { "name": "updateActiveLink", "args": [], "optional": false, "returnType": "void", "typeParameters": [], - "line": 242, + "line": 235, "deprecated": false, "deprecationMessage": "", "rawdescription": "\nNotifies the component that the active link has been changed.", @@ -47333,8 +47924,8 @@ "jsdoctags": [ { "name": { - "pos": 23371, - "end": 23380, + "pos": 22708, + "end": 22717, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -47345,8 +47936,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 23365, - "end": 23370, + "pos": 22702, + "end": 22707, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -47493,8 +48084,8 @@ "jsdoctags": [ { "name": { - "pos": 24539, - "end": 24547, + "pos": 23848, + "end": 23856, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -47505,8 +48096,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 24533, - "end": 24538, + "pos": 23842, + "end": 23847, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -47517,8 +48108,8 @@ }, { "tagName": { - "pos": 24584, - "end": 24591, + "pos": 23892, + "end": 23899, "flags": 16842752, "modifierFlagsCache": 0, "transformFlags": 0, @@ -47641,6 +48232,19 @@ "file": "OuiPaginatedTabHeader" } }, + { + "name": "ngAfterViewInit", + "args": [], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 202, + "deprecated": false, + "deprecationMessage": "", + "inheritance": { + "file": "OuiPaginatedTabHeader" + } + }, { "name": "ngOnDestroy", "args": [], @@ -47679,11 +48283,11 @@ "description": "

Navigation component matching the styles of the tab group header.\nProvides anchored navigation with animated ink bar.

\n", "rawdescription": "\n\nNavigation component matching the styles of the tab group header.\nProvides anchored navigation with animated ink bar.\n", "type": "component", - "sourceCode": "import {\r\n AfterContentChecked,\r\n AfterContentInit,\r\n AfterViewInit,\r\n Attribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChildren,\r\n ElementRef,\r\n forwardRef,\r\n Inject,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Optional,\r\n QueryList,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\r\nimport {\r\n CanDisable,\r\n CanDisableRipple,\r\n HasTabIndex,\r\n mixinDisabled,\r\n mixinDisableRipple,\r\n mixinTabIndex,\r\n ThemePalette,\r\n} from '../../core';\r\nimport { FocusableOption, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { ViewportRuler } from '@angular/cdk/scrolling';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { OuiInkBar, mixinInkBarItem } from '../ink-bar';\r\nimport {\r\n BooleanInput,\r\n coerceBooleanProperty,\r\n NumberInput,\r\n} from '@angular/cdk/coercion';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\nimport { startWith, takeUntil } from 'rxjs/operators';\r\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\r\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from '../tab-config';\r\nimport { OuiPaginatedTabHeader } from '../paginated-tab-header';\r\nimport { isDevMode } from '@angular/core';\r\n\r\n// Increasing integer for generating unique ids for tab nav components.\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * Navigation component matching the styles of the tab group header.\r\n * Provides anchored navigation with animated ink bar.\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: '[oui-tab-nav-bar]',\r\n exportAs: 'OuiTabNavBar, OuiTabNav',\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['color'],\r\n templateUrl: 'tab-nav-bar.html',\r\n styleUrls: ['tab-nav-bar.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '[attr.role]': '_getRole()',\r\n class: 'oui-mdc-tab-nav-bar oui-mdc-tab-header',\r\n '[class.oui-mdc-tab-header-pagination-controls-enabled]':\r\n '_showPaginationControls',\r\n '[class.oui-mdc-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\r\n '[class.oui-mdc-tab-nav-bar-stretch-tabs]': 'stretchTabs',\r\n '[class.mat-primary]': 'color !== \"warn\" && color !== \"accent\"',\r\n '[class.mat-accent]': 'color === \"accent\"',\r\n '[class.mat-warn]': 'color === \"warn\"',\r\n '[class._oui-animation-noopable]': '_animationMode === \"NoopAnimations\"',\r\n '[style.--oui-tab-animation-duration]': 'animationDuration',\r\n },\r\n encapsulation: ViewEncapsulation.None,\r\n // tslint:disable-next-line:validate-decorators\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n})\r\nexport class OuiTabNav\r\n extends OuiPaginatedTabHeader\r\n implements AfterContentChecked, AfterContentInit, OnDestroy, AfterViewInit\r\n{\r\n /** Whether the ink bar should fit its width to the size of the tab label content. */\r\n @Input()\r\n get fitInkBarToContent(): boolean {\r\n return this._fitInkBarToContent.value;\r\n }\r\n set fitInkBarToContent(v: BooleanInput) {\r\n this._fitInkBarToContent.next(coerceBooleanProperty(v));\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n _fitInkBarToContent = new BehaviorSubject(false);\r\n\r\n /** Whether tabs should be stretched to fill the header. */\r\n @Input('oui-stretch-tabs')\r\n get stretchTabs(): boolean {\r\n return this._stretchTabs;\r\n }\r\n set stretchTabs(v: BooleanInput) {\r\n this._stretchTabs = coerceBooleanProperty(v);\r\n }\r\n private _stretchTabs = true;\r\n\r\n @Input()\r\n get animationDuration(): string {\r\n return this._animationDuration;\r\n }\r\n\r\n set animationDuration(value: NumberInput) {\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n ? value + 'ms'\r\n : (value as string);\r\n }\r\n\r\n private _animationDuration: string;\r\n\r\n /** Query list of all tab links of the tab navigation. */\r\n @ContentChildren(forwardRef(() => OuiTabLink), { descendants: true })\r\n _items: QueryList;\r\n\r\n /** Background color of the tab nav. */\r\n @Input()\r\n get backgroundColor(): ThemePalette {\r\n return this._backgroundColor;\r\n }\r\n\r\n set backgroundColor(value: ThemePalette) {\r\n const classList = this._elementRef.nativeElement.classList;\r\n classList.remove(\r\n 'oui-tabs-with-background',\r\n `oui-background-${this.backgroundColor}`\r\n );\r\n\r\n if (value) {\r\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\r\n }\r\n\r\n this._backgroundColor = value;\r\n }\r\n\r\n private _backgroundColor: ThemePalette;\r\n\r\n /** Whether the ripple effect is disabled or not. */\r\n @Input()\r\n get disableRipple(): boolean {\r\n return this._disableRipple;\r\n }\r\n\r\n set disableRipple(value: BooleanInput) {\r\n this._disableRipple = coerceBooleanProperty(value);\r\n }\r\n\r\n private _disableRipple = false;\r\n\r\n /** Theme color of the nav bar. */\r\n @Input() color: ThemePalette = 'accent';\r\n\r\n /**\r\n * Associated tab panel controlled by the nav bar. If not provided, then the nav bar\r\n * follows the ARIA link / navigation landmark pattern. If provided, it follows the\r\n * ARIA tabs design pattern.\r\n */\r\n @Input() tabPanel?: ouiTabNavPanel;\r\n\r\n @ViewChild('tabListContainer', { static: true })\r\n _tabListContainer: ElementRef;\r\n @ViewChild('tabList', { static: true }) _tabList: ElementRef;\r\n @ViewChild('tabListInner', { static: true }) _tabListInner: ElementRef;\r\n @ViewChild('nextPaginator') _nextPaginator: ElementRef;\r\n @ViewChild('previousPaginator') _previousPaginator: ElementRef;\r\n _inkBar: OuiInkBar;\r\n\r\n constructor(\r\n elementRef: ElementRef,\r\n @Optional() dir: Directionality,\r\n ngZone: NgZone,\r\n changeDetectorRef: ChangeDetectorRef,\r\n viewportRuler: ViewportRuler,\r\n platform: Platform,\r\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string,\r\n @Optional() @Inject(OUI_TABS_CONFIG) defaultConfig?: OuiTabsConfig\r\n ) {\r\n super(\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n elementRef,\r\n changeDetectorRef,\r\n viewportRuler,\r\n dir,\r\n ngZone,\r\n platform,\r\n animationMode\r\n );\r\n this.disablePagination =\r\n defaultConfig && defaultConfig.disablePagination != null\r\n ? defaultConfig.disablePagination\r\n : false;\r\n this.fitInkBarToContent =\r\n defaultConfig && defaultConfig.fitInkBarToContent != null\r\n ? defaultConfig.fitInkBarToContent\r\n : false;\r\n this.stretchTabs =\r\n defaultConfig && defaultConfig.stretchTabs != null\r\n ? defaultConfig.stretchTabs\r\n : true;\r\n }\r\n\r\n protected _itemSelected() {\r\n // noop\r\n }\r\n\r\n override ngAfterContentInit() {\r\n this._inkBar = new OuiInkBar(this._items);\r\n // We need this to run before the `changes` subscription in parent to ensure that the\r\n // selectedIndex is up-to-date by the time the super class starts looking for it.\r\n this._items.changes\r\n .pipe(startWith(null), takeUntil(this._destroyed))\r\n .subscribe(() => {\r\n this.updateActiveLink();\r\n });\r\n\r\n super.ngAfterContentInit();\r\n }\r\n\r\n override ngAfterViewInit() {\r\n if (!this.tabPanel && (typeof isDevMode === 'undefined' || isDevMode)) {\r\n throw new Error('A oui-tab-nav-panel must be specified via [tabPanel].');\r\n }\r\n super.ngAfterViewInit();\r\n }\r\n\r\n /** Notifies the component that the active link has been changed. */\r\n updateActiveLink() {\r\n if (!this._items) {\r\n return;\r\n }\r\n\r\n const items = this._items.toArray();\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n if (items[i].active) {\r\n this.selectedIndex = i;\r\n this._changeDetectorRef.markForCheck();\r\n\r\n if (this.tabPanel) {\r\n this.tabPanel._activeTabId = items[i].id;\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n // The ink bar should hide itself if no items are active.\r\n this.selectedIndex = -1;\r\n this._inkBar.hide();\r\n }\r\n\r\n _getRole(): string | null {\r\n return this.tabPanel\r\n ? 'tablist'\r\n : this._elementRef.nativeElement.getAttribute('role');\r\n }\r\n}\r\n\r\n// Boilerplate for applying mixins to OuiTabLink.\r\nconst _OuiTabLinkMixinBase = mixinInkBarItem(\r\n mixinTabIndex(\r\n mixinDisableRipple(\r\n mixinDisabled(\r\n class {\r\n elementRef: ElementRef;\r\n }\r\n )\r\n )\r\n )\r\n);\r\n\r\n/**\r\n * Link inside a `oui-tab-nav-bar`.\r\n */\r\n@Component({\r\n // eslint-disable-next-line\r\n selector: '[oui-tab-link], [OuiTabLink]',\r\n exportAs: 'OuiTabLink',\r\n // eslint-disable-next-line\r\n inputs: ['disabled', 'disableRipple', 'tabIndex', 'active', 'id'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: 'tab-link.html',\r\n styleUrls: ['tab-link.scss'],\r\n // eslint-disable-next-line\r\n host: {\r\n class: 'mdc-tab oui-mdc-tab-link oui-mdc-focus-indicator',\r\n '[attr.aria-controls]': '_getAriaControls()',\r\n '[attr.aria-current]': '_getAriaCurrent()',\r\n '[attr.aria-disabled]': 'disabled',\r\n '[attr.aria-selected]': '_getAriaSelected()',\r\n '[attr.id]': 'id',\r\n '[attr.tabIndex]': '_getTabIndex()',\r\n '[attr.role]': '_getRole()',\r\n '[class.oui-mdc-tab-disabled]': 'disabled',\r\n '[class.mdc-tab--active]': 'active',\r\n '(focus)': '_handleFocus()',\r\n '(keydown)': '_handleKeydown($event)',\r\n },\r\n})\r\nexport class OuiTabLink\r\n extends _OuiTabLinkMixinBase\r\n implements\r\n AfterViewInit,\r\n OnDestroy,\r\n CanDisable,\r\n CanDisableRipple,\r\n HasTabIndex,\r\n FocusableOption\r\n{\r\n private readonly _destroyed = new Subject();\r\n\r\n /** Whether the tab link is active or not. */\r\n protected _isActive = false;\r\n\r\n /** Whether the link is active. */\r\n @Input()\r\n get active(): boolean {\r\n return this._isActive;\r\n }\r\n\r\n set active(value: BooleanInput) {\r\n const newValue = coerceBooleanProperty(value);\r\n\r\n if (newValue !== this._isActive) {\r\n this._isActive = newValue;\r\n this._tabNavBar.updateActiveLink();\r\n }\r\n }\r\n\r\n /**\r\n * Whether ripples are disabled on interaction.\r\n * @docs-private\r\n */\r\n get rippleDisabled(): boolean {\r\n return this.disabled || this.disableRipple || this._tabNavBar.disableRipple;\r\n }\r\n\r\n /** Unique id for the tab. */\r\n @Input() id = `oui-tab-link-${nextUniqueId++}`;\r\n\r\n constructor(\r\n private _tabNavBar: OuiTabNav,\r\n /** @docs-private */\r\n override elementRef: ElementRef,\r\n @Attribute('tabindex') tabIndex: string,\r\n private _focusMonitor: FocusMonitor,\r\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string\r\n ) {\r\n super();\r\n\r\n this.tabIndex = parseInt(tabIndex) || 0;\r\n\r\n if (animationMode === 'NoopAnimations') {\r\n // this.rippleConfig.animation = { enterDuration: 0, exitDuration: 0 };\r\n }\r\n\r\n _tabNavBar._fitInkBarToContent\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe((fitInkBarToContent) => {\r\n this.fitInkBarToContent = fitInkBarToContent;\r\n });\r\n }\r\n\r\n /** Focuses the tab link. */\r\n focus() {\r\n this.elementRef.nativeElement.focus();\r\n }\r\n\r\n ngAfterViewInit() {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n this._focusMonitor.monitor(this.elementRef);\r\n }\r\n\r\n override ngOnDestroy() {\r\n this._destroyed.next();\r\n this._destroyed.complete();\r\n super.ngOnDestroy();\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n this._focusMonitor.stopMonitoring(this.elementRef);\r\n }\r\n\r\n _handleFocus() {\r\n // Since we allow navigation through tabbing in the nav bar, we\r\n // have to update the focused index whenever the link receives focus.\r\n this._tabNavBar.focusIndex = this._tabNavBar._items.toArray().indexOf(this);\r\n }\r\n\r\n _handleKeydown(event: KeyboardEvent) {\r\n if (this.disabled && (event.keyCode === SPACE || event.keyCode === ENTER)) {\r\n event.preventDefault();\r\n } else if (this._tabNavBar.tabPanel && event.keyCode === SPACE) {\r\n this.elementRef.nativeElement.click();\r\n }\r\n }\r\n\r\n _getAriaControls(): string | null {\r\n return this._tabNavBar.tabPanel\r\n ? this._tabNavBar.tabPanel?.id\r\n : this.elementRef.nativeElement.getAttribute('aria-controls');\r\n }\r\n\r\n _getAriaSelected(): string | null {\r\n if (this._tabNavBar.tabPanel) {\r\n return this.active ? 'true' : 'false';\r\n } else {\r\n return this.elementRef.nativeElement.getAttribute('aria-selected');\r\n }\r\n }\r\n\r\n _getAriaCurrent(): string | null {\r\n return this.active && !this._tabNavBar.tabPanel ? 'page' : null;\r\n }\r\n\r\n _getRole(): string | null {\r\n return this._tabNavBar.tabPanel\r\n ? 'tab'\r\n : this.elementRef.nativeElement.getAttribute('role');\r\n }\r\n\r\n _getTabIndex(): number {\r\n if (this._tabNavBar.tabPanel) {\r\n return this._isActive && !this.disabled ? 0 : -1;\r\n } else {\r\n return this.tabIndex;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Tab panel component associated with OuiTabNav.\r\n */\r\n@Component({\r\n selector: 'oui-tab-nav-panel',\r\n exportAs: 'ouiTabNavPanel',\r\n template: '',\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '[attr.aria-labelledby]': '_activeTabId',\r\n '[attr.id]': 'id',\r\n class: 'oui-mdc-tab-nav-panel',\r\n role: 'tabpanel',\r\n },\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ouiTabNavPanel {\r\n /** Unique id for the tab panel. */\r\n @Input() id = `oui-tab-nav-panel-${nextUniqueId++}`;\r\n\r\n /** Id of the active tab in the nav bar. */\r\n _activeTabId?: string;\r\n}\r\n", + "sourceCode": "import {\n AfterContentChecked,\n AfterContentInit,\n AfterViewInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n forwardRef,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport {\n CanDisable,\n CanDisableRipple,\n HasTabIndex,\n mixinDisabled,\n mixinDisableRipple,\n mixinTabIndex,\n ThemePalette,\n} from '../../core';\nimport { FocusableOption, FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { ViewportRuler } from '@angular/cdk/scrolling';\nimport { Platform } from '@angular/cdk/platform';\nimport { OuiInkBar, mixinInkBarItem } from '../ink-bar';\nimport {\n BooleanInput,\n coerceBooleanProperty,\n NumberInput,\n} from '@angular/cdk/coercion';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { startWith, takeUntil } from 'rxjs/operators';\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from '../tab-config';\nimport { OuiPaginatedTabHeader } from '../paginated-tab-header';\n// import { isDevMode } from '@angular/core';\n\n// Increasing integer for generating unique ids for tab nav components.\nlet nextUniqueId = 0;\n\n/**\n * Navigation component matching the styles of the tab group header.\n * Provides anchored navigation with animated ink bar.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-tab-nav-bar]',\n exportAs: 'OuiTabNavBar, OuiTabNav',\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['color'],\n templateUrl: 'tab-nav-bar.html',\n styleUrls: ['tab-nav-bar.scss'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.role]': '_getRole()',\n class: 'oui-mdc-tab-nav-bar oui-mdc-tab-header oui-tab',\n '[class.oui-mdc-tab-header-pagination-controls-enabled]':\n '_showPaginationControls',\n '[class.oui-mdc-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n '[class.oui-mdc-tab-nav-bar-stretch-tabs]': 'stretchTabs',\n '[class.oui-primary]': 'color !== \"warn\" && color !== \"accent\"',\n '[class.oui-accent]': 'color === \"accent\"',\n '[class.oui-warn]': 'color === \"warn\"',\n '[class._oui-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n '[style.--oui-tab-animation-duration]': 'animationDuration',\n },\n encapsulation: ViewEncapsulation.None,\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n})\nexport class OuiTabNav\n extends OuiPaginatedTabHeader\n implements AfterContentChecked, AfterContentInit, OnDestroy, AfterViewInit\n{\n /** Whether the ink bar should fit its width to the size of the tab label content. */\n @Input()\n get fitInkBarToContent(): boolean {\n return this._fitInkBarToContent.value;\n }\n set fitInkBarToContent(v: BooleanInput) {\n this._fitInkBarToContent.next(coerceBooleanProperty(v));\n this._changeDetectorRef.markForCheck();\n }\n _fitInkBarToContent = new BehaviorSubject(false);\n\n /** Whether tabs should be stretched to fill the header. */\n @Input('oui-stretch-tabs')\n get stretchTabs(): boolean {\n return this._stretchTabs;\n }\n set stretchTabs(v: BooleanInput) {\n this._stretchTabs = coerceBooleanProperty(v);\n }\n private _stretchTabs = true;\n\n @Input()\n get animationDuration(): string {\n return this._animationDuration;\n }\n\n set animationDuration(value: NumberInput) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n ? value + 'ms'\n : (value as string);\n }\n\n private _animationDuration: string;\n\n /** Query list of all tab links of the tab navigation. */\n @ContentChildren(forwardRef(() => OuiTabLink), { descendants: true })\n _items: QueryList;\n\n /** Background color of the tab nav. */\n @Input()\n get backgroundColor(): ThemePalette {\n return this._backgroundColor;\n }\n\n set backgroundColor(value: ThemePalette) {\n const classList = this._elementRef.nativeElement.classList;\n classList.remove(\n 'oui-tabs-with-background',\n `oui-background-${this.backgroundColor}`\n );\n\n if (value) {\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n\n private _backgroundColor: ThemePalette;\n\n /** Whether the ripple effect is disabled or not. */\n @Input()\n get disableRipple(): boolean {\n return this._disableRipple;\n }\n\n set disableRipple(value: BooleanInput) {\n this._disableRipple = coerceBooleanProperty(value);\n }\n\n private _disableRipple = false;\n\n /** Theme color of the nav bar. */\n @Input() color: ThemePalette = 'primary';\n\n /**\n * Associated tab panel controlled by the nav bar. If not provided, then the nav bar\n * follows the ARIA link / navigation landmark pattern. If provided, it follows the\n * ARIA tabs design pattern.\n */\n @Input() tabPanel?: ouiTabNavPanel;\n\n @ViewChild('tabListContainer', { static: true })\n _tabListContainer: ElementRef;\n @ViewChild('tabList', { static: true }) _tabList: ElementRef;\n @ViewChild('tabListInner', { static: true }) _tabListInner: ElementRef;\n @ViewChild('nextPaginator') _nextPaginator: ElementRef;\n @ViewChild('previousPaginator') _previousPaginator: ElementRef;\n _inkBar: OuiInkBar;\n\n constructor(\n elementRef: ElementRef,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n platform: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string,\n @Optional() @Inject(OUI_TABS_CONFIG) defaultConfig?: OuiTabsConfig\n ) {\n super(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n elementRef,\n changeDetectorRef,\n viewportRuler,\n dir,\n ngZone,\n platform,\n animationMode\n );\n this.disablePagination =\n defaultConfig && defaultConfig.disablePagination != null\n ? defaultConfig.disablePagination\n : false;\n this.fitInkBarToContent =\n defaultConfig && defaultConfig.fitInkBarToContent != null\n ? defaultConfig.fitInkBarToContent\n : false;\n this.stretchTabs =\n defaultConfig && defaultConfig.stretchTabs != null\n ? defaultConfig.stretchTabs\n : true;\n }\n\n protected _itemSelected() {\n // noop\n }\n\n override ngAfterContentInit() {\n this._inkBar = new OuiInkBar(this._items);\n // We need this to run before the `changes` subscription in parent to ensure that the\n // selectedIndex is up-to-date by the time the super class starts looking for it.\n this._items.changes\n .pipe(startWith(null), takeUntil(this._destroyed))\n .subscribe(() => {\n this.updateActiveLink();\n });\n\n super.ngAfterContentInit();\n }\n\n /** Notifies the component that the active link has been changed. */\n updateActiveLink() {\n if (!this._items) {\n return;\n }\n\n const items = this._items.toArray();\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].active) {\n this.selectedIndex = i;\n this._changeDetectorRef.markForCheck();\n\n if (this.tabPanel) {\n this.tabPanel._activeTabId = items[i].id;\n }\n\n return;\n }\n }\n\n // The ink bar should hide itself if no items are active.\n this.selectedIndex = -1;\n this._inkBar.hide();\n }\n\n _getRole(): string | null {\n return this.tabPanel\n ? 'tablist'\n : this._elementRef.nativeElement.getAttribute('role');\n }\n}\n\n// Boilerplate for applying mixins to OuiTabLink.\nconst _OuiTabLinkMixinBase = mixinInkBarItem(\n mixinTabIndex(\n mixinDisableRipple(\n mixinDisabled(\n class {\n elementRef: ElementRef;\n }\n )\n )\n )\n);\n\n/**\n * Link inside a `oui-tab-nav-bar`.\n */\n@Component({\n // eslint-disable-next-line\n selector: '[oui-tab-link], [OuiTabLink]',\n exportAs: 'OuiTabLink',\n // eslint-disable-next-line\n inputs: [\n 'disabled',\n 'disableRipple',\n 'tabIndex',\n 'active',\n 'id',\n 'routerLink',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: 'tab-link.html',\n styleUrls: ['tab-link.scss'],\n // eslint-disable-next-line\n host: {\n class: 'mdc-tab oui-mdc-tab-link oui-mdc-focus-indicator',\n '[attr.aria-controls]': '_getAriaControls()',\n '[attr.aria-current]': '_getAriaCurrent()',\n '[attr.aria-disabled]': 'disabled',\n '[attr.aria-selected]': '_getAriaSelected()',\n '[attr.id]': 'id',\n '[attr.tabIndex]': '_getTabIndex()',\n '[attr.role]': '_getRole()',\n '[class.oui-mdc-tab-disabled]': 'disabled',\n '[class.mdc-tab--active]': 'active',\n '(focus)': '_handleFocus()',\n '(keydown)': '_handleKeydown($event)',\n },\n})\nexport class OuiTabLink\n extends _OuiTabLinkMixinBase\n implements\n AfterViewInit,\n OnDestroy,\n CanDisable,\n CanDisableRipple,\n HasTabIndex,\n FocusableOption\n{\n private readonly _destroyed = new Subject();\n\n /** Whether the tab link is active or not. */\n protected _isActive = false;\n\n /** Whether the link is active. */\n @Input()\n get active(): boolean {\n return this._isActive;\n }\n\n set active(value: BooleanInput) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this._isActive) {\n this._isActive = newValue;\n this._tabNavBar.updateActiveLink();\n }\n }\n\n /**\n * Whether ripples are disabled on interaction.\n * @docs-private\n */\n get rippleDisabled(): boolean {\n return this.disabled || this.disableRipple || this._tabNavBar.disableRipple;\n }\n\n /** Unique id for the tab. */\n @Input() id = `oui-tab-link-${nextUniqueId++}`;\n\n constructor(\n private _tabNavBar: OuiTabNav,\n /** @docs-private */\n override elementRef: ElementRef,\n @Attribute('tabindex') tabIndex: string,\n private _focusMonitor: FocusMonitor,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string\n ) {\n super();\n\n this.tabIndex = parseInt(tabIndex) || 0;\n\n if (animationMode === 'NoopAnimations') {\n // this.rippleConfig.animation = { enterDuration: 0, exitDuration: 0 };\n }\n\n _tabNavBar._fitInkBarToContent\n .pipe(takeUntil(this._destroyed))\n .subscribe((fitInkBarToContent) => {\n this.fitInkBarToContent = fitInkBarToContent;\n });\n }\n\n /** Focuses the tab link. */\n focus() {\n this.elementRef.nativeElement.focus();\n }\n\n ngAfterViewInit() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this._focusMonitor.monitor(this.elementRef);\n }\n\n override ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n super.ngOnDestroy();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n\n _handleFocus() {\n // Since we allow navigation through tabbing in the nav bar, we\n // have to update the focused index whenever the link receives focus.\n this._tabNavBar.focusIndex = this._tabNavBar._items.toArray().indexOf(this);\n }\n\n _handleKeydown(event: KeyboardEvent) {\n if (this.disabled && (event.keyCode === SPACE || event.keyCode === ENTER)) {\n event.preventDefault();\n } else if (this._tabNavBar.tabPanel && event.keyCode === SPACE) {\n this.elementRef.nativeElement.click();\n }\n }\n\n _getAriaControls(): string | null {\n return this._tabNavBar.tabPanel\n ? this._tabNavBar.tabPanel?.id\n : this.elementRef.nativeElement.getAttribute('aria-controls');\n }\n\n _getAriaSelected(): string | null {\n if (this._tabNavBar.tabPanel) {\n return this.active ? 'true' : 'false';\n } else {\n return this.elementRef.nativeElement.getAttribute('aria-selected');\n }\n }\n\n _getAriaCurrent(): string | null {\n return this.active && !this._tabNavBar.tabPanel ? 'page' : null;\n }\n\n _getRole(): string | null {\n return this._tabNavBar.tabPanel\n ? 'tab'\n : this.elementRef.nativeElement.getAttribute('role');\n }\n\n _getTabIndex(): number {\n if (this._tabNavBar.tabPanel) {\n return this._isActive && !this.disabled ? 0 : -1;\n } else {\n return this.tabIndex;\n }\n }\n}\n\n/**\n * Tab panel component associated with OuiTabNav.\n */\n@Component({\n selector: 'oui-tab-nav-panel',\n exportAs: 'ouiTabNavPanel',\n template: '',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.aria-labelledby]': '_activeTabId',\n '[attr.id]': 'id',\n class: 'oui-mdc-tab-nav-panel',\n role: 'tabpanel',\n },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ouiTabNavPanel {\n /** Unique id for the tab panel. */\n @Input() id = `oui-tab-nav-panel-${nextUniqueId++}`;\n\n /** Id of the active tab in the nav bar. */\n _activeTabId?: string;\n}\n", "assetsDirs": [], "styleUrlsData": [ { - "data": "// @use '../tabs-common';\r\n\r\n// @include tabs-common.structural-styles;\r\n// @include tabs-common.paginated-tab-header;\r\n\r\n// .oui-mdc-tab-links {\r\n// @include tabs-common.paginated-tab-header-item-wrapper('.oui-mdc-tab-link-container');\r\n// }\r\n\r\n// .oui-mdc-tab-link-container {\r\n// @include tabs-common.paginated-tab-header-container;\r\n// }\r\n\r\n// .oui-mdc-tab-nav-bar {\r\n// @include tabs-common.paginated-tab-header-with-background('.oui-mdc-tab-link-container',\r\n// '.oui-mdc-tab-link');\r\n// }\r\n", + "data": ".oui-mdc-tab-header {\n display: flex;\n overflow: hidden;\n position: relative;\n flex-shrink: 0;\n min-height: 48px;\n padding-top: 0;\n border-bottom: 1px solid #c8c8c8;\n justify-content: center;\n}\n.mdc-tab-indicator__content {\n transform-origin: left;\n opacity: 0;\n}\n\n.oui-mdc-tab-link.active .mdc-tab-indicator__content {\n opacity: 1;\n}\n\n.oui-mdc-tab-nav-bar[oui-align-tabs='start'] {\n justify-content: flex-start;\n}\n.oui-mdc-tab-nav-bar[oui-align-tabs='end'] {\n justify-content: flex-end;\n}\n\n.oui-mdc-tab-nav-bar[oui-stretch-tabs] {\n .oui-mdc-tab-links {\n display: flex;\n }\n .oui-mdc-tab-link-container {\n width: 100%;\n }\n}\n", "styleUrl": "tab-nav-bar.scss" } ], @@ -48022,11 +48626,11 @@ } } }, - "templateData": "\r\n\r\n
\r\n\r\n\r\n\r\n \r\n
\r\n \r\n
\r\n \r\n\r\n\r\n\r\n\r\n
\r\n\r\n" + "templateData": "\n\n
\n\n\n\n \n
\n \n
\n \n\n\n\n\n
\n\n" }, { "name": "ouiTabNavPanel", - "id": "component-ouiTabNavPanel-6ce7108d054f1ce731fb3fdfd386c2252b009425dd05e2318aa5d6e1a34d06858b72f8ec2278d0b20e6242ef7a9e6be288d99d19c36c6712b85c978bf5907722", + "id": "component-ouiTabNavPanel-4eda8dfe52f55e2f9ce5dd15f92f8927d2bbef62cb382fc4fb67dabbe48482054802acb523bdd4cb5a0c32c0a1e06d449a72eec6498bcb7d09d92d1f0c524cad", "file": "ui/src/components/tabs/tab-nav-bar/tab-nav-bar.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -48081,7 +48685,7 @@ "description": "

Tab panel component associated with OuiTabNav.

\n", "rawdescription": "\n\nTab panel component associated with OuiTabNav.\n", "type": "component", - "sourceCode": "import {\r\n AfterContentChecked,\r\n AfterContentInit,\r\n AfterViewInit,\r\n Attribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChildren,\r\n ElementRef,\r\n forwardRef,\r\n Inject,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Optional,\r\n QueryList,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\r\nimport {\r\n CanDisable,\r\n CanDisableRipple,\r\n HasTabIndex,\r\n mixinDisabled,\r\n mixinDisableRipple,\r\n mixinTabIndex,\r\n ThemePalette,\r\n} from '../../core';\r\nimport { FocusableOption, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { ViewportRuler } from '@angular/cdk/scrolling';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { OuiInkBar, mixinInkBarItem } from '../ink-bar';\r\nimport {\r\n BooleanInput,\r\n coerceBooleanProperty,\r\n NumberInput,\r\n} from '@angular/cdk/coercion';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\nimport { startWith, takeUntil } from 'rxjs/operators';\r\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\r\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from '../tab-config';\r\nimport { OuiPaginatedTabHeader } from '../paginated-tab-header';\r\nimport { isDevMode } from '@angular/core';\r\n\r\n// Increasing integer for generating unique ids for tab nav components.\r\nlet nextUniqueId = 0;\r\n\r\n/**\r\n * Navigation component matching the styles of the tab group header.\r\n * Provides anchored navigation with animated ink bar.\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: '[oui-tab-nav-bar]',\r\n exportAs: 'OuiTabNavBar, OuiTabNav',\r\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\r\n inputs: ['color'],\r\n templateUrl: 'tab-nav-bar.html',\r\n styleUrls: ['tab-nav-bar.scss'],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '[attr.role]': '_getRole()',\r\n class: 'oui-mdc-tab-nav-bar oui-mdc-tab-header',\r\n '[class.oui-mdc-tab-header-pagination-controls-enabled]':\r\n '_showPaginationControls',\r\n '[class.oui-mdc-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\r\n '[class.oui-mdc-tab-nav-bar-stretch-tabs]': 'stretchTabs',\r\n '[class.mat-primary]': 'color !== \"warn\" && color !== \"accent\"',\r\n '[class.mat-accent]': 'color === \"accent\"',\r\n '[class.mat-warn]': 'color === \"warn\"',\r\n '[class._oui-animation-noopable]': '_animationMode === \"NoopAnimations\"',\r\n '[style.--oui-tab-animation-duration]': 'animationDuration',\r\n },\r\n encapsulation: ViewEncapsulation.None,\r\n // tslint:disable-next-line:validate-decorators\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n})\r\nexport class OuiTabNav\r\n extends OuiPaginatedTabHeader\r\n implements AfterContentChecked, AfterContentInit, OnDestroy, AfterViewInit\r\n{\r\n /** Whether the ink bar should fit its width to the size of the tab label content. */\r\n @Input()\r\n get fitInkBarToContent(): boolean {\r\n return this._fitInkBarToContent.value;\r\n }\r\n set fitInkBarToContent(v: BooleanInput) {\r\n this._fitInkBarToContent.next(coerceBooleanProperty(v));\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n _fitInkBarToContent = new BehaviorSubject(false);\r\n\r\n /** Whether tabs should be stretched to fill the header. */\r\n @Input('oui-stretch-tabs')\r\n get stretchTabs(): boolean {\r\n return this._stretchTabs;\r\n }\r\n set stretchTabs(v: BooleanInput) {\r\n this._stretchTabs = coerceBooleanProperty(v);\r\n }\r\n private _stretchTabs = true;\r\n\r\n @Input()\r\n get animationDuration(): string {\r\n return this._animationDuration;\r\n }\r\n\r\n set animationDuration(value: NumberInput) {\r\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\r\n ? value + 'ms'\r\n : (value as string);\r\n }\r\n\r\n private _animationDuration: string;\r\n\r\n /** Query list of all tab links of the tab navigation. */\r\n @ContentChildren(forwardRef(() => OuiTabLink), { descendants: true })\r\n _items: QueryList;\r\n\r\n /** Background color of the tab nav. */\r\n @Input()\r\n get backgroundColor(): ThemePalette {\r\n return this._backgroundColor;\r\n }\r\n\r\n set backgroundColor(value: ThemePalette) {\r\n const classList = this._elementRef.nativeElement.classList;\r\n classList.remove(\r\n 'oui-tabs-with-background',\r\n `oui-background-${this.backgroundColor}`\r\n );\r\n\r\n if (value) {\r\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\r\n }\r\n\r\n this._backgroundColor = value;\r\n }\r\n\r\n private _backgroundColor: ThemePalette;\r\n\r\n /** Whether the ripple effect is disabled or not. */\r\n @Input()\r\n get disableRipple(): boolean {\r\n return this._disableRipple;\r\n }\r\n\r\n set disableRipple(value: BooleanInput) {\r\n this._disableRipple = coerceBooleanProperty(value);\r\n }\r\n\r\n private _disableRipple = false;\r\n\r\n /** Theme color of the nav bar. */\r\n @Input() color: ThemePalette = 'accent';\r\n\r\n /**\r\n * Associated tab panel controlled by the nav bar. If not provided, then the nav bar\r\n * follows the ARIA link / navigation landmark pattern. If provided, it follows the\r\n * ARIA tabs design pattern.\r\n */\r\n @Input() tabPanel?: ouiTabNavPanel;\r\n\r\n @ViewChild('tabListContainer', { static: true })\r\n _tabListContainer: ElementRef;\r\n @ViewChild('tabList', { static: true }) _tabList: ElementRef;\r\n @ViewChild('tabListInner', { static: true }) _tabListInner: ElementRef;\r\n @ViewChild('nextPaginator') _nextPaginator: ElementRef;\r\n @ViewChild('previousPaginator') _previousPaginator: ElementRef;\r\n _inkBar: OuiInkBar;\r\n\r\n constructor(\r\n elementRef: ElementRef,\r\n @Optional() dir: Directionality,\r\n ngZone: NgZone,\r\n changeDetectorRef: ChangeDetectorRef,\r\n viewportRuler: ViewportRuler,\r\n platform: Platform,\r\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string,\r\n @Optional() @Inject(OUI_TABS_CONFIG) defaultConfig?: OuiTabsConfig\r\n ) {\r\n super(\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n elementRef,\r\n changeDetectorRef,\r\n viewportRuler,\r\n dir,\r\n ngZone,\r\n platform,\r\n animationMode\r\n );\r\n this.disablePagination =\r\n defaultConfig && defaultConfig.disablePagination != null\r\n ? defaultConfig.disablePagination\r\n : false;\r\n this.fitInkBarToContent =\r\n defaultConfig && defaultConfig.fitInkBarToContent != null\r\n ? defaultConfig.fitInkBarToContent\r\n : false;\r\n this.stretchTabs =\r\n defaultConfig && defaultConfig.stretchTabs != null\r\n ? defaultConfig.stretchTabs\r\n : true;\r\n }\r\n\r\n protected _itemSelected() {\r\n // noop\r\n }\r\n\r\n override ngAfterContentInit() {\r\n this._inkBar = new OuiInkBar(this._items);\r\n // We need this to run before the `changes` subscription in parent to ensure that the\r\n // selectedIndex is up-to-date by the time the super class starts looking for it.\r\n this._items.changes\r\n .pipe(startWith(null), takeUntil(this._destroyed))\r\n .subscribe(() => {\r\n this.updateActiveLink();\r\n });\r\n\r\n super.ngAfterContentInit();\r\n }\r\n\r\n override ngAfterViewInit() {\r\n if (!this.tabPanel && (typeof isDevMode === 'undefined' || isDevMode)) {\r\n throw new Error('A oui-tab-nav-panel must be specified via [tabPanel].');\r\n }\r\n super.ngAfterViewInit();\r\n }\r\n\r\n /** Notifies the component that the active link has been changed. */\r\n updateActiveLink() {\r\n if (!this._items) {\r\n return;\r\n }\r\n\r\n const items = this._items.toArray();\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n if (items[i].active) {\r\n this.selectedIndex = i;\r\n this._changeDetectorRef.markForCheck();\r\n\r\n if (this.tabPanel) {\r\n this.tabPanel._activeTabId = items[i].id;\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n // The ink bar should hide itself if no items are active.\r\n this.selectedIndex = -1;\r\n this._inkBar.hide();\r\n }\r\n\r\n _getRole(): string | null {\r\n return this.tabPanel\r\n ? 'tablist'\r\n : this._elementRef.nativeElement.getAttribute('role');\r\n }\r\n}\r\n\r\n// Boilerplate for applying mixins to OuiTabLink.\r\nconst _OuiTabLinkMixinBase = mixinInkBarItem(\r\n mixinTabIndex(\r\n mixinDisableRipple(\r\n mixinDisabled(\r\n class {\r\n elementRef: ElementRef;\r\n }\r\n )\r\n )\r\n )\r\n);\r\n\r\n/**\r\n * Link inside a `oui-tab-nav-bar`.\r\n */\r\n@Component({\r\n // eslint-disable-next-line\r\n selector: '[oui-tab-link], [OuiTabLink]',\r\n exportAs: 'OuiTabLink',\r\n // eslint-disable-next-line\r\n inputs: ['disabled', 'disableRipple', 'tabIndex', 'active', 'id'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n templateUrl: 'tab-link.html',\r\n styleUrls: ['tab-link.scss'],\r\n // eslint-disable-next-line\r\n host: {\r\n class: 'mdc-tab oui-mdc-tab-link oui-mdc-focus-indicator',\r\n '[attr.aria-controls]': '_getAriaControls()',\r\n '[attr.aria-current]': '_getAriaCurrent()',\r\n '[attr.aria-disabled]': 'disabled',\r\n '[attr.aria-selected]': '_getAriaSelected()',\r\n '[attr.id]': 'id',\r\n '[attr.tabIndex]': '_getTabIndex()',\r\n '[attr.role]': '_getRole()',\r\n '[class.oui-mdc-tab-disabled]': 'disabled',\r\n '[class.mdc-tab--active]': 'active',\r\n '(focus)': '_handleFocus()',\r\n '(keydown)': '_handleKeydown($event)',\r\n },\r\n})\r\nexport class OuiTabLink\r\n extends _OuiTabLinkMixinBase\r\n implements\r\n AfterViewInit,\r\n OnDestroy,\r\n CanDisable,\r\n CanDisableRipple,\r\n HasTabIndex,\r\n FocusableOption\r\n{\r\n private readonly _destroyed = new Subject();\r\n\r\n /** Whether the tab link is active or not. */\r\n protected _isActive = false;\r\n\r\n /** Whether the link is active. */\r\n @Input()\r\n get active(): boolean {\r\n return this._isActive;\r\n }\r\n\r\n set active(value: BooleanInput) {\r\n const newValue = coerceBooleanProperty(value);\r\n\r\n if (newValue !== this._isActive) {\r\n this._isActive = newValue;\r\n this._tabNavBar.updateActiveLink();\r\n }\r\n }\r\n\r\n /**\r\n * Whether ripples are disabled on interaction.\r\n * @docs-private\r\n */\r\n get rippleDisabled(): boolean {\r\n return this.disabled || this.disableRipple || this._tabNavBar.disableRipple;\r\n }\r\n\r\n /** Unique id for the tab. */\r\n @Input() id = `oui-tab-link-${nextUniqueId++}`;\r\n\r\n constructor(\r\n private _tabNavBar: OuiTabNav,\r\n /** @docs-private */\r\n override elementRef: ElementRef,\r\n @Attribute('tabindex') tabIndex: string,\r\n private _focusMonitor: FocusMonitor,\r\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string\r\n ) {\r\n super();\r\n\r\n this.tabIndex = parseInt(tabIndex) || 0;\r\n\r\n if (animationMode === 'NoopAnimations') {\r\n // this.rippleConfig.animation = { enterDuration: 0, exitDuration: 0 };\r\n }\r\n\r\n _tabNavBar._fitInkBarToContent\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe((fitInkBarToContent) => {\r\n this.fitInkBarToContent = fitInkBarToContent;\r\n });\r\n }\r\n\r\n /** Focuses the tab link. */\r\n focus() {\r\n this.elementRef.nativeElement.focus();\r\n }\r\n\r\n ngAfterViewInit() {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n this._focusMonitor.monitor(this.elementRef);\r\n }\r\n\r\n override ngOnDestroy() {\r\n this._destroyed.next();\r\n this._destroyed.complete();\r\n super.ngOnDestroy();\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\r\n this._focusMonitor.stopMonitoring(this.elementRef);\r\n }\r\n\r\n _handleFocus() {\r\n // Since we allow navigation through tabbing in the nav bar, we\r\n // have to update the focused index whenever the link receives focus.\r\n this._tabNavBar.focusIndex = this._tabNavBar._items.toArray().indexOf(this);\r\n }\r\n\r\n _handleKeydown(event: KeyboardEvent) {\r\n if (this.disabled && (event.keyCode === SPACE || event.keyCode === ENTER)) {\r\n event.preventDefault();\r\n } else if (this._tabNavBar.tabPanel && event.keyCode === SPACE) {\r\n this.elementRef.nativeElement.click();\r\n }\r\n }\r\n\r\n _getAriaControls(): string | null {\r\n return this._tabNavBar.tabPanel\r\n ? this._tabNavBar.tabPanel?.id\r\n : this.elementRef.nativeElement.getAttribute('aria-controls');\r\n }\r\n\r\n _getAriaSelected(): string | null {\r\n if (this._tabNavBar.tabPanel) {\r\n return this.active ? 'true' : 'false';\r\n } else {\r\n return this.elementRef.nativeElement.getAttribute('aria-selected');\r\n }\r\n }\r\n\r\n _getAriaCurrent(): string | null {\r\n return this.active && !this._tabNavBar.tabPanel ? 'page' : null;\r\n }\r\n\r\n _getRole(): string | null {\r\n return this._tabNavBar.tabPanel\r\n ? 'tab'\r\n : this.elementRef.nativeElement.getAttribute('role');\r\n }\r\n\r\n _getTabIndex(): number {\r\n if (this._tabNavBar.tabPanel) {\r\n return this._isActive && !this.disabled ? 0 : -1;\r\n } else {\r\n return this.tabIndex;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Tab panel component associated with OuiTabNav.\r\n */\r\n@Component({\r\n selector: 'oui-tab-nav-panel',\r\n exportAs: 'ouiTabNavPanel',\r\n template: '',\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '[attr.aria-labelledby]': '_activeTabId',\r\n '[attr.id]': 'id',\r\n class: 'oui-mdc-tab-nav-panel',\r\n role: 'tabpanel',\r\n },\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ouiTabNavPanel {\r\n /** Unique id for the tab panel. */\r\n @Input() id = `oui-tab-nav-panel-${nextUniqueId++}`;\r\n\r\n /** Id of the active tab in the nav bar. */\r\n _activeTabId?: string;\r\n}\r\n", + "sourceCode": "import {\n AfterContentChecked,\n AfterContentInit,\n AfterViewInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n forwardRef,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';\nimport {\n CanDisable,\n CanDisableRipple,\n HasTabIndex,\n mixinDisabled,\n mixinDisableRipple,\n mixinTabIndex,\n ThemePalette,\n} from '../../core';\nimport { FocusableOption, FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { ViewportRuler } from '@angular/cdk/scrolling';\nimport { Platform } from '@angular/cdk/platform';\nimport { OuiInkBar, mixinInkBarItem } from '../ink-bar';\nimport {\n BooleanInput,\n coerceBooleanProperty,\n NumberInput,\n} from '@angular/cdk/coercion';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { startWith, takeUntil } from 'rxjs/operators';\nimport { ENTER, SPACE } from '@angular/cdk/keycodes';\nimport { OUI_TABS_CONFIG, OuiTabsConfig } from '../tab-config';\nimport { OuiPaginatedTabHeader } from '../paginated-tab-header';\n// import { isDevMode } from '@angular/core';\n\n// Increasing integer for generating unique ids for tab nav components.\nlet nextUniqueId = 0;\n\n/**\n * Navigation component matching the styles of the tab group header.\n * Provides anchored navigation with animated ink bar.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: '[oui-tab-nav-bar]',\n exportAs: 'OuiTabNavBar, OuiTabNav',\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['color'],\n templateUrl: 'tab-nav-bar.html',\n styleUrls: ['tab-nav-bar.scss'],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.role]': '_getRole()',\n class: 'oui-mdc-tab-nav-bar oui-mdc-tab-header oui-tab',\n '[class.oui-mdc-tab-header-pagination-controls-enabled]':\n '_showPaginationControls',\n '[class.oui-mdc-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n '[class.oui-mdc-tab-nav-bar-stretch-tabs]': 'stretchTabs',\n '[class.oui-primary]': 'color !== \"warn\" && color !== \"accent\"',\n '[class.oui-accent]': 'color === \"accent\"',\n '[class.oui-warn]': 'color === \"warn\"',\n '[class._oui-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n '[style.--oui-tab-animation-duration]': 'animationDuration',\n },\n encapsulation: ViewEncapsulation.None,\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n})\nexport class OuiTabNav\n extends OuiPaginatedTabHeader\n implements AfterContentChecked, AfterContentInit, OnDestroy, AfterViewInit\n{\n /** Whether the ink bar should fit its width to the size of the tab label content. */\n @Input()\n get fitInkBarToContent(): boolean {\n return this._fitInkBarToContent.value;\n }\n set fitInkBarToContent(v: BooleanInput) {\n this._fitInkBarToContent.next(coerceBooleanProperty(v));\n this._changeDetectorRef.markForCheck();\n }\n _fitInkBarToContent = new BehaviorSubject(false);\n\n /** Whether tabs should be stretched to fill the header. */\n @Input('oui-stretch-tabs')\n get stretchTabs(): boolean {\n return this._stretchTabs;\n }\n set stretchTabs(v: BooleanInput) {\n this._stretchTabs = coerceBooleanProperty(v);\n }\n private _stretchTabs = true;\n\n @Input()\n get animationDuration(): string {\n return this._animationDuration;\n }\n\n set animationDuration(value: NumberInput) {\n // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n this._animationDuration = /^\\d+$/.test(value + '') // eslint-disable-next-line @typescript-eslint/restrict-plus-operands\n ? value + 'ms'\n : (value as string);\n }\n\n private _animationDuration: string;\n\n /** Query list of all tab links of the tab navigation. */\n @ContentChildren(forwardRef(() => OuiTabLink), { descendants: true })\n _items: QueryList;\n\n /** Background color of the tab nav. */\n @Input()\n get backgroundColor(): ThemePalette {\n return this._backgroundColor;\n }\n\n set backgroundColor(value: ThemePalette) {\n const classList = this._elementRef.nativeElement.classList;\n classList.remove(\n 'oui-tabs-with-background',\n `oui-background-${this.backgroundColor}`\n );\n\n if (value) {\n classList.add('oui-tabs-with-background', `oui-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n\n private _backgroundColor: ThemePalette;\n\n /** Whether the ripple effect is disabled or not. */\n @Input()\n get disableRipple(): boolean {\n return this._disableRipple;\n }\n\n set disableRipple(value: BooleanInput) {\n this._disableRipple = coerceBooleanProperty(value);\n }\n\n private _disableRipple = false;\n\n /** Theme color of the nav bar. */\n @Input() color: ThemePalette = 'primary';\n\n /**\n * Associated tab panel controlled by the nav bar. If not provided, then the nav bar\n * follows the ARIA link / navigation landmark pattern. If provided, it follows the\n * ARIA tabs design pattern.\n */\n @Input() tabPanel?: ouiTabNavPanel;\n\n @ViewChild('tabListContainer', { static: true })\n _tabListContainer: ElementRef;\n @ViewChild('tabList', { static: true }) _tabList: ElementRef;\n @ViewChild('tabListInner', { static: true }) _tabListInner: ElementRef;\n @ViewChild('nextPaginator') _nextPaginator: ElementRef;\n @ViewChild('previousPaginator') _previousPaginator: ElementRef;\n _inkBar: OuiInkBar;\n\n constructor(\n elementRef: ElementRef,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n platform: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string,\n @Optional() @Inject(OUI_TABS_CONFIG) defaultConfig?: OuiTabsConfig\n ) {\n super(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n elementRef,\n changeDetectorRef,\n viewportRuler,\n dir,\n ngZone,\n platform,\n animationMode\n );\n this.disablePagination =\n defaultConfig && defaultConfig.disablePagination != null\n ? defaultConfig.disablePagination\n : false;\n this.fitInkBarToContent =\n defaultConfig && defaultConfig.fitInkBarToContent != null\n ? defaultConfig.fitInkBarToContent\n : false;\n this.stretchTabs =\n defaultConfig && defaultConfig.stretchTabs != null\n ? defaultConfig.stretchTabs\n : true;\n }\n\n protected _itemSelected() {\n // noop\n }\n\n override ngAfterContentInit() {\n this._inkBar = new OuiInkBar(this._items);\n // We need this to run before the `changes` subscription in parent to ensure that the\n // selectedIndex is up-to-date by the time the super class starts looking for it.\n this._items.changes\n .pipe(startWith(null), takeUntil(this._destroyed))\n .subscribe(() => {\n this.updateActiveLink();\n });\n\n super.ngAfterContentInit();\n }\n\n /** Notifies the component that the active link has been changed. */\n updateActiveLink() {\n if (!this._items) {\n return;\n }\n\n const items = this._items.toArray();\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].active) {\n this.selectedIndex = i;\n this._changeDetectorRef.markForCheck();\n\n if (this.tabPanel) {\n this.tabPanel._activeTabId = items[i].id;\n }\n\n return;\n }\n }\n\n // The ink bar should hide itself if no items are active.\n this.selectedIndex = -1;\n this._inkBar.hide();\n }\n\n _getRole(): string | null {\n return this.tabPanel\n ? 'tablist'\n : this._elementRef.nativeElement.getAttribute('role');\n }\n}\n\n// Boilerplate for applying mixins to OuiTabLink.\nconst _OuiTabLinkMixinBase = mixinInkBarItem(\n mixinTabIndex(\n mixinDisableRipple(\n mixinDisabled(\n class {\n elementRef: ElementRef;\n }\n )\n )\n )\n);\n\n/**\n * Link inside a `oui-tab-nav-bar`.\n */\n@Component({\n // eslint-disable-next-line\n selector: '[oui-tab-link], [OuiTabLink]',\n exportAs: 'OuiTabLink',\n // eslint-disable-next-line\n inputs: [\n 'disabled',\n 'disableRipple',\n 'tabIndex',\n 'active',\n 'id',\n 'routerLink',\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n templateUrl: 'tab-link.html',\n styleUrls: ['tab-link.scss'],\n // eslint-disable-next-line\n host: {\n class: 'mdc-tab oui-mdc-tab-link oui-mdc-focus-indicator',\n '[attr.aria-controls]': '_getAriaControls()',\n '[attr.aria-current]': '_getAriaCurrent()',\n '[attr.aria-disabled]': 'disabled',\n '[attr.aria-selected]': '_getAriaSelected()',\n '[attr.id]': 'id',\n '[attr.tabIndex]': '_getTabIndex()',\n '[attr.role]': '_getRole()',\n '[class.oui-mdc-tab-disabled]': 'disabled',\n '[class.mdc-tab--active]': 'active',\n '(focus)': '_handleFocus()',\n '(keydown)': '_handleKeydown($event)',\n },\n})\nexport class OuiTabLink\n extends _OuiTabLinkMixinBase\n implements\n AfterViewInit,\n OnDestroy,\n CanDisable,\n CanDisableRipple,\n HasTabIndex,\n FocusableOption\n{\n private readonly _destroyed = new Subject();\n\n /** Whether the tab link is active or not. */\n protected _isActive = false;\n\n /** Whether the link is active. */\n @Input()\n get active(): boolean {\n return this._isActive;\n }\n\n set active(value: BooleanInput) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this._isActive) {\n this._isActive = newValue;\n this._tabNavBar.updateActiveLink();\n }\n }\n\n /**\n * Whether ripples are disabled on interaction.\n * @docs-private\n */\n get rippleDisabled(): boolean {\n return this.disabled || this.disableRipple || this._tabNavBar.disableRipple;\n }\n\n /** Unique id for the tab. */\n @Input() id = `oui-tab-link-${nextUniqueId++}`;\n\n constructor(\n private _tabNavBar: OuiTabNav,\n /** @docs-private */\n override elementRef: ElementRef,\n @Attribute('tabindex') tabIndex: string,\n private _focusMonitor: FocusMonitor,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string\n ) {\n super();\n\n this.tabIndex = parseInt(tabIndex) || 0;\n\n if (animationMode === 'NoopAnimations') {\n // this.rippleConfig.animation = { enterDuration: 0, exitDuration: 0 };\n }\n\n _tabNavBar._fitInkBarToContent\n .pipe(takeUntil(this._destroyed))\n .subscribe((fitInkBarToContent) => {\n this.fitInkBarToContent = fitInkBarToContent;\n });\n }\n\n /** Focuses the tab link. */\n focus() {\n this.elementRef.nativeElement.focus();\n }\n\n ngAfterViewInit() {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this._focusMonitor.monitor(this.elementRef);\n }\n\n override ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n super.ngOnDestroy();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n\n _handleFocus() {\n // Since we allow navigation through tabbing in the nav bar, we\n // have to update the focused index whenever the link receives focus.\n this._tabNavBar.focusIndex = this._tabNavBar._items.toArray().indexOf(this);\n }\n\n _handleKeydown(event: KeyboardEvent) {\n if (this.disabled && (event.keyCode === SPACE || event.keyCode === ENTER)) {\n event.preventDefault();\n } else if (this._tabNavBar.tabPanel && event.keyCode === SPACE) {\n this.elementRef.nativeElement.click();\n }\n }\n\n _getAriaControls(): string | null {\n return this._tabNavBar.tabPanel\n ? this._tabNavBar.tabPanel?.id\n : this.elementRef.nativeElement.getAttribute('aria-controls');\n }\n\n _getAriaSelected(): string | null {\n if (this._tabNavBar.tabPanel) {\n return this.active ? 'true' : 'false';\n } else {\n return this.elementRef.nativeElement.getAttribute('aria-selected');\n }\n }\n\n _getAriaCurrent(): string | null {\n return this.active && !this._tabNavBar.tabPanel ? 'page' : null;\n }\n\n _getRole(): string | null {\n return this._tabNavBar.tabPanel\n ? 'tab'\n : this.elementRef.nativeElement.getAttribute('role');\n }\n\n _getTabIndex(): number {\n if (this._tabNavBar.tabPanel) {\n return this._isActive && !this.disabled ? 0 : -1;\n } else {\n return this.tabIndex;\n }\n }\n}\n\n/**\n * Tab panel component associated with OuiTabNav.\n */\n@Component({\n selector: 'oui-tab-nav-panel',\n exportAs: 'ouiTabNavPanel',\n template: '',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '[attr.aria-labelledby]': '_activeTabId',\n '[attr.id]': 'id',\n class: 'oui-mdc-tab-nav-panel',\n role: 'tabpanel',\n },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ouiTabNavPanel {\n /** Unique id for the tab panel. */\n @Input() id = `oui-tab-nav-panel-${nextUniqueId++}`;\n\n /** Id of the active tab in the nav bar. */\n _activeTabId?: string;\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -48089,7 +48693,7 @@ }, { "name": "OuiTabStorybook", - "id": "component-OuiTabStorybook-f9856f14bebcb279e79e4f4062a35d5df5668ec4160537fd69ecb8b5e5f3997c6b97904ae2b1576d94db8e0ee178b4d1f0d1ada97c129bac4693f13181f277e8", + "id": "component-OuiTabStorybook-bf30fcf2663274a1aebf92d498b1ee1fe705d6c3dcad4a1c2ce601adf2a460489f12bfdc78b68b21cbc4cf8e722912fc50e5ee22383c7ddc344228d39a1a51b5", "file": "ui/src/stories/tabs/tabs.component.ts", "encapsulation": [], "entryComponents": [], @@ -48099,14 +48703,54 @@ "selector": "oui-tab-storybook", "styleUrls": [], "styles": [], - "template": "\n Content in tab 1\">\n Content in tab 2\">\n Content in tab 3\">\n\n", + "template": "\n\n\n \n \n First tab selected\n \n \n Second tab selected\n \n\n", "templateUrl": [], "viewProviders": [], "hostDirectives": [], "inputsClass": [], "outputsClass": [], - "propertiesClass": [], - "methodsClass": [], + "propertiesClass": [ + { + "name": "selectedTab", + "defaultValue": "'first'", + "deprecated": false, + "deprecationMessage": "", + "type": "string", + "optional": false, + "description": "", + "line": 47 + } + ], + "methodsClass": [ + { + "name": "onTabChange", + "args": [ + { + "name": "id", + "type": "string", + "deprecated": false, + "deprecationMessage": "" + } + ], + "optional": false, + "returnType": "void", + "typeParameters": [], + "line": 59, + "deprecated": false, + "deprecationMessage": "", + "jsdoctags": [ + { + "name": "id", + "type": "string", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] + } + ], "deprecated": false, "deprecationMessage": "", "hostBindings": [], @@ -48116,7 +48760,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'oui-tab-storybook',\r\n template: `\r\n \r\n Content in tab 1\">\r\n Content in tab 2\">\r\n Content in tab 3\">\r\n \r\n `,\r\n})\r\nexport class OuiTabStorybook {\r\n constructor() {}\r\n}\r\n", + "sourceCode": "import { Component } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { OuiIconRegistry } from '../../components';\n\n@Component({\n selector: 'oui-tab-storybook',\n template: `\n \n\n \n \n \n First tab selected\n \n \n Second tab selected\n \n \n `,\n})\nexport class OuiTabStorybook {\n selectedTab = 'first';\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?81ot1f'\n )\n );\n }\n\n onTabChange(id: string) {\n this.selectedTab = id;\n }\n}\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -48125,14 +48769,47 @@ "description": "", "deprecated": false, "deprecationMessage": "", - "args": [], - "line": 13 + "args": [ + { + "name": "ouiIconRegistry", + "type": "OuiIconRegistry", + "deprecated": false, + "deprecationMessage": "" + }, + { + "name": "domSanitizer", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "" + } + ], + "line": 47, + "jsdoctags": [ + { + "name": "ouiIconRegistry", + "type": "OuiIconRegistry", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + }, + { + "name": "domSanitizer", + "type": "DomSanitizer", + "deprecated": false, + "deprecationMessage": "", + "tagName": { + "text": "param" + } + } + ] }, "extends": [] }, { "name": "OuiTooltipStorybook", - "id": "component-OuiTooltipStorybook-fdfdd389ca4d09a87e29a1680147bfb98c3a1faad64988471d3c258b01013735a4c96ec423da901739be495b18d771ca8aa9fe967b18e9da63218adee6922306", + "id": "component-OuiTooltipStorybook-56f8d5c5146c539902c6051e72e64fef3163ba403707422675fd095f18ec1e90ca19d58506a875db50b94e8c9714528464c23e0bd42c7f58ee4334e4484a00b2", "file": "ui/src/stories/tooltip/tooltip.component.ts", "encapsulation": [], "entryComponents": [], @@ -48187,7 +48864,7 @@ "description": "", "rawdescription": "\n", "type": "component", - "sourceCode": "import { OuiIconRegistry } from '../../components';\nimport { Input, Component } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@Component({\n selector: 'oui-tooltip-storybook',\n template: `\n \n `,\n})\nexport class OuiTooltipStorybook {\n @Input() disabled = false;\n @Input() _ouiTooltip = 'This is a tooltip';\n @Input() _ouiTooltipPosition = 'above';\n constructor(\n private ouiIconRegistry: OuiIconRegistry,\n private domSanitizer: DomSanitizer\n ) {\n this.ouiIconRegistry.addSvgIcon(\n `local`,\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n `/assets/images/v-green.svg`\n )\n );\n\n this.ouiIconRegistry.addSvgIconSet(\n this.domSanitizer.bypassSecurityTrustResourceUrl(\n 'https://d1azc1qln24ryf.cloudfront.net/135790/oncehub-20/symbol-defs.svg?hn1bl5'\n )\n );\n }\n}\n", + "sourceCode": "import { OuiIconRegistry } from '../../components';\r\nimport { Input, Component } from '@angular/core';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'oui-tooltip-storybook',\r\n template: `\r\n \r\n `,\r\n})\r\nexport class OuiTooltipStorybook {\r\n @Input() disabled = false;\r\n @Input() _ouiTooltip = 'This is a tooltip';\r\n @Input() _ouiTooltipPosition = 'above';\r\n constructor(\r\n private ouiIconRegistry: OuiIconRegistry,\r\n private domSanitizer: DomSanitizer\r\n ) {\r\n this.ouiIconRegistry.addSvgIcon(\r\n `local`,\r\n this.domSanitizer.bypassSecurityTrustResourceUrl(\r\n `/assets/images/v-green.svg`\r\n )\r\n );\r\n\r\n this.ouiIconRegistry.addSvgIconSet(\r\n this.domSanitizer.bypassSecurityTrustResourceUrl(\r\n 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?dfx71h'\r\n )\r\n );\r\n }\r\n}\r\n", "assetsDirs": [], "styleUrlsData": "", "stylesData": "", @@ -49096,7 +49773,7 @@ }, { "name": "TooltipComponent", - "id": "component-TooltipComponent-ffb93a0366a6db45703111c4fe658119cf87b8d44e269ec2926a30e8ecd94bebfb4adcfd399aeca78af8a2424610392ab8cece9c0abb63c2a560ad78706daebd", + "id": "component-TooltipComponent-e9697def10890f47a95cf9f3bc5b2f98679be923c51d88410413d049b9f0d1aa747f42f5904aa817dc83a1c560c44b1ca4996f4759598c8e0196872f3ec3df70", "file": "ui/src/components/tooltip/tooltip.ts", "changeDetection": "ChangeDetectionStrategy.OnPush", "encapsulation": [ @@ -49146,7 +49823,7 @@ }, { "name": "_isHandset", - "defaultValue": "this._breakpointObserver.observe(\n Breakpoints.Handset\n )", + "defaultValue": "this._breakpointObserver.observe(\r\n Breakpoints.Handset\r\n )", "deprecated": false, "deprecationMessage": "", "type": "Observable", @@ -49335,7 +50012,7 @@ "description": "

Internal component that wraps the tooltip's content.

\n", "rawdescription": "\n\nInternal component that wraps the tooltip's content.\n\n", "type": "component", - "sourceCode": "import { AnimationEvent } from '@angular/animations';\nimport { AriaDescriber, FocusMonitor } from '@angular/cdk/a11y';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport {\n BreakpointObserver,\n Breakpoints,\n BreakpointState,\n} from '@angular/cdk/layout';\nimport {\n FlexibleConnectedPositionStrategy,\n HorizontalConnectionPos,\n OriginConnectionPosition,\n Overlay,\n OverlayConnectionPosition,\n OverlayRef,\n VerticalConnectionPos,\n ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport { ScrollDispatcher } from '@angular/cdk/scrolling';\nimport { Platform } from '@angular/cdk/platform';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { take, takeUntil } from 'rxjs/operators';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Directive,\n ElementRef,\n Inject,\n InjectionToken,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { Subject, Observable } from 'rxjs';\nimport { ouiTooltipAnimations } from './tooltip-animations';\nimport { CanDisable } from '../core';\n\nexport type TooltipPosition = 'left' | 'right' | 'above' | 'below';\n\n/** Time in ms to throttle repositioning after scroll events. */\nexport const SCROLL_THROTTLE_MS = 20;\n\n/** CSS class that will be attached to the overlay panel. */\nexport const TOOLTIP_PANEL_CLASS = 'oui-tooltip-panel';\n\n/**\n * Creates an error to be thrown if the user supplied an invalid tooltip position.\n *\n * @docs-private\n */\nexport function getOuiTooltipInvalidPositionError(position: string) {\n return Error(`Tooltip position \"${position}\" is invalid.`);\n}\n\n/** Injection token that determines the scroll handling while a tooltip is visible. */\nexport const OUI_TOOLTIP_SCROLL_STRATEGY = new InjectionToken<\n () => ScrollStrategy\n>('oui-tooltip-scroll-strategy');\n\n/** @docs-private */\nexport function OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY(\n overlay: Overlay\n): () => ScrollStrategy {\n return () =>\n overlay.scrollStrategies.reposition({ scrollThrottle: SCROLL_THROTTLE_MS });\n}\n\n/** @docs-private */\nexport const OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\n};\n\n/** Default `ouiTooltip` options that can be overridden. */\nexport interface OuiTooltipDefaultOptions {\n showDelay: number;\n hideDelay: number;\n touchendHideDelay: number;\n}\n\nexport interface NewCSSStyleDeclaration extends CSSStyleDeclaration {\n msUserSelect: string;\n}\n\n/** Injection token to be used to override the default options for `ouiTooltip`. */\nexport const OUI_TOOLTIP_DEFAULT_OPTIONS =\n new InjectionToken('oui-tooltip-default-options', {\n providedIn: 'root',\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\n });\n\n/** @docs-private */\nexport function OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY(): OuiTooltipDefaultOptions {\n return {\n showDelay: 0,\n hideDelay: 0,\n touchendHideDelay: 1500,\n };\n}\n\nexport type TooltipVisibility = 'initial' | 'visible' | 'hidden';\n\n/**\n * Internal component that wraps the tooltip's content.\n *\n * @docs-private\n */\n@Component({\n selector: 'oui-tooltip-component',\n templateUrl: 'tooltip.html',\n styleUrls: ['tooltip.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [ouiTooltipAnimations.tooltipState],\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n // Forces the element to have a layout in IE and Edge. This fixes issues where the element\n // won't be rendered if the animations are disabled or there is no web animations polyfill.\n '[style.zoom]': '_visibility === \"visible\" ? 1 : null',\n '(body:click)': 'this._handleBodyInteraction()',\n 'aria-hidden': 'true',\n },\n})\nexport class TooltipComponent {\n /** Message to display in the tooltip */\n message: string;\n /** Classes to be added to the tooltip. Supports the same syntax as `ngClass`. */\n tooltipClass: string | string[] | Set | { [key: string]: any };\n\n /** The timeout ID of any current timer set to show the tooltip */\n _showTimeoutId: number | null;\n\n /** The timeout ID of any current timer set to hide the tooltip */\n _hideTimeoutId: number | null;\n\n /** Property watched by the animation framework to show or hide the tooltip */\n _visibility: TooltipVisibility = 'initial';\n\n /** Whether interactions on the page should close the tooltip */\n private _closeOnInteraction = false;\n\n /** Subject for notifying that the tooltip has been hidden from the view */\n private readonly _onHide: Subject = new Subject();\n\n /** Stream that emits whether the user has a handset-sized display. */\n _isHandset: Observable = this._breakpointObserver.observe(\n Breakpoints.Handset\n );\n\n constructor(\n private _changeDetectorRef: ChangeDetectorRef,\n private _breakpointObserver: BreakpointObserver\n ) {}\n\n /**\n * Shows the tooltip with an animation originating from the provided origin\n *\n * @param delay Amount of milliseconds to the delay showing the tooltip.\n */\n show(): void {\n // Cancel the delayed hide if it is scheduled\n if (this._hideTimeoutId) {\n clearTimeout(this._hideTimeoutId);\n this._hideTimeoutId = null;\n }\n\n // Body interactions should cancel the tooltip if there is a delay in showing.\n this._closeOnInteraction = true;\n setTimeout(() => {\n this._visibility = 'visible';\n this._showTimeoutId = null;\n\n // Mark for check so if any parent component has set the\n // ChangeDetectionStrategy to OnPush it will be checked anyways\n this._markForCheck();\n }, 0);\n }\n\n /**\n * Begins the animation to hide the tooltip after the provided delay in ms.\n *\n * @param delay Amount of milliseconds to delay showing the tooltip.\n */\n hide(): void {\n // Cancel the delayed show if it is scheduled\n if (this._showTimeoutId) {\n clearTimeout(this._showTimeoutId);\n this._showTimeoutId = null;\n }\n setTimeout(() => {\n this._visibility = 'hidden';\n this._hideTimeoutId = null;\n // Mark for check so if any parent component has set the\n // ChangeDetectionStrategy to OnPush it will be checked anyways\n this._markForCheck();\n }, 0);\n }\n\n /** Returns an observable that notifies when the tooltip has been hidden from view. */\n afterHidden(): Observable {\n return this._onHide.asObservable();\n }\n\n /** Whether the tooltip is being displayed. */\n isVisible(): boolean {\n return this._visibility === 'visible';\n }\n\n _animationStart() {\n this._closeOnInteraction = false;\n }\n\n _animationDone(event: AnimationEvent): void {\n const toState = event.toState as TooltipVisibility;\n\n if (toState === 'hidden' && !this.isVisible()) {\n this._onHide.next();\n }\n\n if (toState === 'visible' || toState === 'hidden') {\n this._closeOnInteraction = true;\n }\n }\n\n /**\n * Interactions on the HTML body should close the tooltip immediately\n */\n _handleBodyInteraction(): void {\n if (this._closeOnInteraction) {\n this.hide();\n }\n }\n\n /**\n * Marks that the tooltip needs to be checked in the next change detection run.\n * Mainly used for rendering the initial text before positioning a tooltip, which\n * can be problematic in components with OnPush change detection.\n */\n _markForCheck(): void {\n this._changeDetectorRef.markForCheck();\n }\n}\n\n/**\n * Directive that attaches a tooltip to the host element. Animates the showing and\n * hiding of a tooltip provided position (defaults to below the element).\n */\n@Directive({\n selector: '[ouiTooltip]',\n exportAs: 'ouiTooltip',\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\n host: {\n '(longpress)': 'show()',\n '(keydown)': '_handleKeydown($event)',\n '(touchend)': '_handleTouchend()',\n '[attr.tabindex]': 'disabled ? -1 : 0',\n '[attr.aria-hidden]': 'false',\n },\n})\nexport class OuiTooltip implements OnDestroy, CanDisable {\n _overlayRef: OverlayRef | null;\n _tooltipInstance: TooltipComponent | null;\n\n private _portal: ComponentPortal;\n private _position: TooltipPosition = 'below';\n private _disabled = false;\n private _tooltipClass:\n | string\n | string[]\n | Set\n | { [key: string]: any };\n private _scrollStrategy: () => ScrollStrategy;\n\n /** Allows the user to define the position of the tooltip relative to the parent element */\n @Input('ouiTooltipPosition')\n get position(): TooltipPosition {\n return this._position;\n }\n set position(value: TooltipPosition) {\n if (value !== this._position) {\n this._position = value;\n if (this._overlayRef) {\n this._updatePosition();\n\n if (this._tooltipInstance) {\n this._tooltipInstance!.show();\n }\n\n this._overlayRef.updatePosition();\n }\n }\n }\n\n /** Disables the display of the tooltip. */\n @Input('ouiTooltipDisabled')\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n\n // If tooltip is disabled, hide immediately.\n if (this._disabled) {\n this.hide();\n }\n }\n\n private _message = '';\n\n /** The message to be displayed in the tooltip */\n @Input('ouiTooltip')\n get message() {\n return this._message;\n }\n set message(value: string) {\n this._ariaDescriber.removeDescription(\n this._elementRef.nativeElement,\n this._message\n );\n\n // If the message is not a string (e.g. number), convert it to a string and trim it.\n this._message = value != null ? `${value}`.trim() : '';\n\n if (!this._message && this._isTooltipVisible()) {\n this.hide();\n } else {\n this._updateTooltipMessage();\n this._ariaDescriber.describe(\n this._elementRef.nativeElement,\n this.message\n );\n }\n }\n\n /** Classes to be passed to the tooltip. Supports the same syntax as `ngClass`. */\n @Input('ouiTooltipClass')\n get tooltipClass() {\n return this._tooltipClass;\n }\n set tooltipClass(\n value: string | string[] | Set | { [key: string]: any }\n ) {\n this._tooltipClass = value;\n if (this._tooltipInstance) {\n this._tooltipInstance._markForCheck();\n this._setTooltipClass(this._tooltipClass);\n }\n }\n\n private _manualListeners = new Map<\n string,\n EventListenerOrEventListenerObject\n >();\n\n /** Emits when the component is destroyed. */\n private readonly _destroyed = new Subject();\n\n constructor(\n private _overlay: Overlay,\n private _elementRef: ElementRef,\n private _scrollDispatcher: ScrollDispatcher,\n private _viewContainerRef: ViewContainerRef,\n private _ngZone: NgZone,\n platform: Platform,\n private _ariaDescriber: AriaDescriber,\n private _focusMonitor: FocusMonitor,\n @Inject(OUI_TOOLTIP_SCROLL_STRATEGY) scrollStrategy: any,\n @Optional() private _dir: Directionality\n ) {\n this._scrollStrategy = scrollStrategy;\n const element: HTMLElement = _elementRef.nativeElement;\n const elementStyle = element.style as NewCSSStyleDeclaration & {\n webkitUserDrag: string;\n };\n const hasGestures = typeof window === 'undefined' || (window as any).Hammer;\n\n // The mouse events shouldn't be bound on mobile devices, because they can prevent the\n // first tap from firing its click event or can cause the tooltip to open for clicks.\n if (!platform.IOS && !platform.ANDROID) {\n this._manualListeners\n .set('mouseenter', () => this.show())\n .set('mouseleave', () => this.hide());\n } else if (!hasGestures) {\n // there's no way for the user to trigger the tooltip on a touch device.\n this._manualListeners.set('touchstart', () => this.show());\n }\n\n this._manualListeners.forEach((listener, event) =>\n element.addEventListener(event, listener)\n );\n\n if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n elementStyle.webkitUserSelect =\n elementStyle.userSelect =\n elementStyle.msUserSelect =\n '';\n }\n\n // Hammer applies `-webkit-user-drag: none` on all elements by default,\n // which breaks the native drag&drop. If the consumer explicitly made\n // the element draggable, clear the `-webkit-user-drag`.\n if (element.draggable && elementStyle.webkitUserDrag === 'none') {\n elementStyle.webkitUserDrag = '';\n }\n\n _focusMonitor\n .monitor(_elementRef)\n .pipe(takeUntil(this._destroyed))\n .subscribe((origin) => {\n // Note that the focus monitor runs outside the Angular zone.\n if (!origin) {\n _ngZone.run(() => this.hide());\n } else if (origin === 'keyboard') {\n _ngZone.run(() => this.show());\n }\n });\n }\n\n /**\n * Dispose the tooltip when destroyed.\n */\n ngOnDestroy() {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._tooltipInstance = null;\n }\n\n // Clean up the event listeners set in the constructor\n this._manualListeners.forEach((listener, event) => {\n this._elementRef.nativeElement.removeEventListener(event, listener);\n });\n this._manualListeners.clear();\n\n this._destroyed.next();\n this._destroyed.complete();\n\n this._ariaDescriber.removeDescription(\n this._elementRef.nativeElement,\n this.message\n );\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n /** Shows the tooltip after the delay in ms, defaults to tooltip-delay-show or 0ms if no input */\n show(): void {\n if (\n this.disabled ||\n !this.message ||\n (this._isTooltipVisible() &&\n !this._tooltipInstance!._showTimeoutId &&\n !this._tooltipInstance!._hideTimeoutId)\n ) {\n return;\n }\n\n const overlayRef = this._createOverlay();\n\n this._detach();\n this._portal =\n this._portal ||\n new ComponentPortal(TooltipComponent, this._viewContainerRef);\n this._tooltipInstance = overlayRef.attach(this._portal).instance;\n this._tooltipInstance\n .afterHidden()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._detach());\n this._setTooltipClass(this._tooltipClass);\n this._updateTooltipMessage();\n this._tooltipInstance!.show();\n }\n\n /** Hides the tooltip after the delay in ms, defaults to tooltip-delay-hide or 0ms if no input */\n hide(): void {\n if (this._tooltipInstance) {\n this._tooltipInstance.hide();\n }\n }\n\n /** Shows/hides the tooltip */\n toggle(): void {\n this._isTooltipVisible() ? this.hide() : this.show();\n }\n\n /** Returns true if the tooltip is currently visible to the user */\n _isTooltipVisible(): boolean {\n return !!this._tooltipInstance && this._tooltipInstance.isVisible();\n }\n\n /** Handles the keydown events on the host element. */\n _handleKeydown(e: KeyboardEvent) {\n if (this._isTooltipVisible() && e.key === 'Escape') {\n e.stopPropagation();\n this.hide();\n }\n }\n\n /** Handles the touchend events on the host element. */\n _handleTouchend() {\n this.hide();\n }\n\n /** Create the overlay config and position strategy */\n private _createOverlay(): OverlayRef {\n if (this._overlayRef) {\n return this._overlayRef;\n }\n\n // Create connected position strategy that listens for scroll events to reposition.\n const strategy = this._overlay\n .position()\n .flexibleConnectedTo(this._elementRef)\n .withTransformOriginOn('.oui-tooltip')\n .withFlexibleDimensions(false)\n .withViewportMargin(8);\n\n const scrollableAncestors =\n this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);\n\n strategy.withScrollableContainers(scrollableAncestors);\n\n strategy.positionChanges\n .pipe(takeUntil(this._destroyed))\n .subscribe((change) => {\n if (this._tooltipInstance) {\n if (\n change.scrollableViewProperties.isOverlayClipped &&\n this._tooltipInstance.isVisible()\n ) {\n // After position changes occur and the overlay is clipped by\n // a parent scrollable then close the tooltip.\n this._ngZone.run(() => this.hide());\n }\n }\n });\n\n this._overlayRef = this._overlay.create({\n direction: this._dir,\n positionStrategy: strategy,\n panelClass: TOOLTIP_PANEL_CLASS,\n scrollStrategy: this._scrollStrategy(),\n });\n\n this._updatePosition();\n\n this._overlayRef\n .detachments()\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => this._detach());\n\n return this._overlayRef;\n }\n\n /** Detaches the currently-attached tooltip. */\n private _detach() {\n if (this._overlayRef && this._overlayRef.hasAttached()) {\n this._overlayRef.detach();\n }\n\n this._tooltipInstance = null;\n }\n\n /** Updates the position of the current tooltip. */\n private _updatePosition() {\n const position = this._overlayRef!.getConfig()\n .positionStrategy as FlexibleConnectedPositionStrategy;\n const origin = this._getOrigin();\n const overlay = this._getOverlayPosition();\n\n position.withPositions([\n { ...origin.main, ...overlay.main },\n { ...origin.fallback, ...overlay.fallback },\n ]);\n }\n\n /**\n * Returns the origin position and a fallback position based on the user's position preference.\n * The fallback position is the inverse of the origin (e.g. `'below' -> 'above'`).\n */\n _getOrigin(): {\n main: OriginConnectionPosition;\n fallback: OriginConnectionPosition;\n } {\n const isLtr = !this._dir || this._dir.value === 'ltr';\n const position = this.position;\n let originPosition: OriginConnectionPosition;\n\n if (position === 'above' || position === 'below') {\n originPosition = {\n originX: 'center',\n originY: position === 'above' ? 'top' : 'bottom',\n };\n } else if (\n (position === 'left' && isLtr) ||\n (position === 'right' && !isLtr)\n ) {\n originPosition = { originX: 'start', originY: 'center' };\n } else if (\n (position === 'right' && isLtr) ||\n (position === 'left' && !isLtr)\n ) {\n originPosition = { originX: 'end', originY: 'center' };\n } else {\n throw getOuiTooltipInvalidPositionError(position);\n }\n\n const { x, y } = this._invertPosition(\n originPosition.originX,\n originPosition.originY\n );\n\n return {\n main: originPosition,\n fallback: { originX: x, originY: y },\n };\n }\n\n /** Returns the overlay position and a fallback position based on the user's preference */\n _getOverlayPosition(): {\n main: OverlayConnectionPosition;\n fallback: OverlayConnectionPosition;\n } {\n const isLtr = !this._dir || this._dir.value === 'ltr';\n const position = this.position;\n let overlayPosition: OverlayConnectionPosition;\n\n if (position === 'above') {\n overlayPosition = { overlayX: 'center', overlayY: 'bottom' };\n } else if (position === 'below') {\n overlayPosition = { overlayX: 'center', overlayY: 'top' };\n } else if (\n (position === 'left' && isLtr) ||\n (position === 'right' && !isLtr)\n ) {\n overlayPosition = { overlayX: 'end', overlayY: 'center' };\n } else if (\n (position === 'right' && isLtr) ||\n (position === 'left' && !isLtr)\n ) {\n overlayPosition = { overlayX: 'start', overlayY: 'center' };\n } else {\n throw getOuiTooltipInvalidPositionError(position);\n }\n\n const { x, y } = this._invertPosition(\n overlayPosition.overlayX,\n overlayPosition.overlayY\n );\n\n return {\n main: overlayPosition,\n fallback: { overlayX: x, overlayY: y },\n };\n }\n\n /** Updates the tooltip message and repositions the overlay according to the new message length */\n private _updateTooltipMessage() {\n // Must wait for the message to be painted to the tooltip so that the overlay can properly\n // calculate the correct positioning based on the size of the text.\n if (this._tooltipInstance) {\n this._tooltipInstance.message = this.message;\n this._tooltipInstance._markForCheck();\n\n this._ngZone.onMicrotaskEmpty\n .asObservable()\n .pipe(take(1), takeUntil(this._destroyed))\n .subscribe(() => {\n if (this._tooltipInstance) {\n this._overlayRef!.updatePosition();\n }\n });\n }\n }\n\n /** Updates the tooltip class */\n private _setTooltipClass(\n tooltipClass: string | string[] | Set | { [key: string]: any }\n ) {\n if (this._tooltipInstance) {\n this._tooltipInstance.tooltipClass = tooltipClass;\n this._tooltipInstance._markForCheck();\n }\n }\n\n /** Inverts an overlay position. */\n private _invertPosition(\n x: HorizontalConnectionPos,\n y: VerticalConnectionPos\n ) {\n if (this.position === 'above' || this.position === 'below') {\n if (y === 'top') {\n y = 'bottom';\n } else if (y === 'bottom') {\n y = 'top';\n }\n } else {\n if (x === 'end') {\n x = 'start';\n } else if (x === 'start') {\n x = 'end';\n }\n }\n\n return { x, y };\n }\n}\n", + "sourceCode": "import { AnimationEvent } from '@angular/animations';\r\nimport { AriaDescriber, FocusMonitor } from '@angular/cdk/a11y';\r\nimport { Directionality } from '@angular/cdk/bidi';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport {\r\n BreakpointObserver,\r\n Breakpoints,\r\n BreakpointState,\r\n} from '@angular/cdk/layout';\r\nimport {\r\n FlexibleConnectedPositionStrategy,\r\n HorizontalConnectionPos,\r\n OriginConnectionPosition,\r\n Overlay,\r\n OverlayConnectionPosition,\r\n OverlayRef,\r\n VerticalConnectionPos,\r\n ScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { ScrollDispatcher } from '@angular/cdk/scrolling';\r\nimport { Platform } from '@angular/cdk/platform';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { take, takeUntil } from 'rxjs/operators';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Directive,\r\n ElementRef,\r\n Inject,\r\n InjectionToken,\r\n Input,\r\n NgZone,\r\n OnDestroy,\r\n Optional,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\nimport { ouiTooltipAnimations } from './tooltip-animations';\r\nimport { CanDisable } from '../core';\r\n\r\nexport type TooltipPosition = 'left' | 'right' | 'above' | 'below';\r\n\r\n/** Time in ms to throttle repositioning after scroll events. */\r\nexport const SCROLL_THROTTLE_MS = 20;\r\n\r\n/** CSS class that will be attached to the overlay panel. */\r\nexport const TOOLTIP_PANEL_CLASS = 'oui-tooltip-panel';\r\n\r\n/**\r\n * Creates an error to be thrown if the user supplied an invalid tooltip position.\r\n *\r\n * @docs-private\r\n */\r\nexport function getOuiTooltipInvalidPositionError(position: string) {\r\n return Error(`Tooltip position \"${position}\" is invalid.`);\r\n}\r\n\r\n/** Injection token that determines the scroll handling while a tooltip is visible. */\r\nexport const OUI_TOOLTIP_SCROLL_STRATEGY = new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-tooltip-scroll-strategy');\r\n\r\n/** @docs-private */\r\nexport function OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY(\r\n overlay: Overlay\r\n): () => ScrollStrategy {\r\n return () =>\r\n overlay.scrollStrategies.reposition({ scrollThrottle: SCROLL_THROTTLE_MS });\r\n}\r\n\r\n/** @docs-private */\r\nexport const OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY_PROVIDER = {\r\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\r\n};\r\n\r\n/** Default `ouiTooltip` options that can be overridden. */\r\nexport interface OuiTooltipDefaultOptions {\r\n showDelay: number;\r\n hideDelay: number;\r\n touchendHideDelay: number;\r\n}\r\n\r\nexport interface NewCSSStyleDeclaration extends CSSStyleDeclaration {\r\n msUserSelect: string;\r\n}\r\n\r\n/** Injection token to be used to override the default options for `ouiTooltip`. */\r\nexport const OUI_TOOLTIP_DEFAULT_OPTIONS =\r\n new InjectionToken('oui-tooltip-default-options', {\r\n providedIn: 'root',\r\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\r\n });\r\n\r\n/** @docs-private */\r\nexport function OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY(): OuiTooltipDefaultOptions {\r\n return {\r\n showDelay: 0,\r\n hideDelay: 0,\r\n touchendHideDelay: 1500,\r\n };\r\n}\r\n\r\nexport type TooltipVisibility = 'initial' | 'visible' | 'hidden';\r\n\r\n/**\r\n * Internal component that wraps the tooltip's content.\r\n *\r\n * @docs-private\r\n */\r\n@Component({\r\n selector: 'oui-tooltip-component',\r\n templateUrl: 'tooltip.html',\r\n styleUrls: ['tooltip.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [ouiTooltipAnimations.tooltipState],\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n // Forces the element to have a layout in IE and Edge. This fixes issues where the element\r\n // won't be rendered if the animations are disabled or there is no web animations polyfill.\r\n '[style.zoom]': '_visibility === \"visible\" ? 1 : null',\r\n '(body:click)': 'this._handleBodyInteraction()',\r\n 'aria-hidden': 'true',\r\n },\r\n})\r\nexport class TooltipComponent {\r\n /** Message to display in the tooltip */\r\n message: string;\r\n /** Classes to be added to the tooltip. Supports the same syntax as `ngClass`. */\r\n tooltipClass: string | string[] | Set | { [key: string]: any };\r\n\r\n /** The timeout ID of any current timer set to show the tooltip */\r\n _showTimeoutId: number | null;\r\n\r\n /** The timeout ID of any current timer set to hide the tooltip */\r\n _hideTimeoutId: number | null;\r\n\r\n /** Property watched by the animation framework to show or hide the tooltip */\r\n _visibility: TooltipVisibility = 'initial';\r\n\r\n /** Whether interactions on the page should close the tooltip */\r\n private _closeOnInteraction = false;\r\n\r\n /** Subject for notifying that the tooltip has been hidden from the view */\r\n private readonly _onHide: Subject = new Subject();\r\n\r\n /** Stream that emits whether the user has a handset-sized display. */\r\n _isHandset: Observable = this._breakpointObserver.observe(\r\n Breakpoints.Handset\r\n );\r\n\r\n constructor(\r\n private _changeDetectorRef: ChangeDetectorRef,\r\n private _breakpointObserver: BreakpointObserver\r\n ) {}\r\n\r\n /**\r\n * Shows the tooltip with an animation originating from the provided origin\r\n *\r\n * @param delay Amount of milliseconds to the delay showing the tooltip.\r\n */\r\n show(): void {\r\n // Cancel the delayed hide if it is scheduled\r\n if (this._hideTimeoutId) {\r\n clearTimeout(this._hideTimeoutId);\r\n this._hideTimeoutId = null;\r\n }\r\n\r\n // Body interactions should cancel the tooltip if there is a delay in showing.\r\n this._closeOnInteraction = true;\r\n setTimeout(() => {\r\n this._visibility = 'visible';\r\n this._showTimeoutId = null;\r\n\r\n // Mark for check so if any parent component has set the\r\n // ChangeDetectionStrategy to OnPush it will be checked anyways\r\n this._markForCheck();\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Begins the animation to hide the tooltip after the provided delay in ms.\r\n *\r\n * @param delay Amount of milliseconds to delay showing the tooltip.\r\n */\r\n hide(): void {\r\n // Cancel the delayed show if it is scheduled\r\n if (this._showTimeoutId) {\r\n clearTimeout(this._showTimeoutId);\r\n this._showTimeoutId = null;\r\n }\r\n setTimeout(() => {\r\n this._visibility = 'hidden';\r\n this._hideTimeoutId = null;\r\n // Mark for check so if any parent component has set the\r\n // ChangeDetectionStrategy to OnPush it will be checked anyways\r\n this._markForCheck();\r\n }, 0);\r\n }\r\n\r\n /** Returns an observable that notifies when the tooltip has been hidden from view. */\r\n afterHidden(): Observable {\r\n return this._onHide.asObservable();\r\n }\r\n\r\n /** Whether the tooltip is being displayed. */\r\n isVisible(): boolean {\r\n return this._visibility === 'visible';\r\n }\r\n\r\n _animationStart() {\r\n this._closeOnInteraction = false;\r\n }\r\n\r\n _animationDone(event: AnimationEvent): void {\r\n const toState = event.toState as TooltipVisibility;\r\n\r\n if (toState === 'hidden' && !this.isVisible()) {\r\n this._onHide.next();\r\n }\r\n\r\n if (toState === 'visible' || toState === 'hidden') {\r\n this._closeOnInteraction = true;\r\n }\r\n }\r\n\r\n /**\r\n * Interactions on the HTML body should close the tooltip immediately\r\n */\r\n _handleBodyInteraction(): void {\r\n if (this._closeOnInteraction) {\r\n this.hide();\r\n }\r\n }\r\n\r\n /**\r\n * Marks that the tooltip needs to be checked in the next change detection run.\r\n * Mainly used for rendering the initial text before positioning a tooltip, which\r\n * can be problematic in components with OnPush change detection.\r\n */\r\n _markForCheck(): void {\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n}\r\n\r\n/**\r\n * Directive that attaches a tooltip to the host element. Animates the showing and\r\n * hiding of a tooltip provided position (defaults to below the element).\r\n */\r\n@Directive({\r\n selector: '[ouiTooltip]',\r\n exportAs: 'ouiTooltip',\r\n // eslint-disable-next-line @angular-eslint/no-host-metadata-property\r\n host: {\r\n '(longpress)': 'show()',\r\n '(keydown)': '_handleKeydown($event)',\r\n '(touchend)': '_handleTouchend()',\r\n '[attr.tabindex]': 'disabled ? -1 : 0',\r\n '[attr.aria-hidden]': 'false',\r\n },\r\n})\r\nexport class OuiTooltip implements OnDestroy, CanDisable {\r\n _overlayRef: OverlayRef | null;\r\n _tooltipInstance: TooltipComponent | null;\r\n\r\n private _portal: ComponentPortal;\r\n private _position: TooltipPosition = 'below';\r\n private _disabled = false;\r\n private _tooltipClass:\r\n | string\r\n | string[]\r\n | Set\r\n | { [key: string]: any };\r\n private _scrollStrategy: () => ScrollStrategy;\r\n\r\n /** Allows the user to define the position of the tooltip relative to the parent element */\r\n @Input('ouiTooltipPosition')\r\n get position(): TooltipPosition {\r\n return this._position;\r\n }\r\n set position(value: TooltipPosition) {\r\n if (value !== this._position) {\r\n this._position = value;\r\n if (this._overlayRef) {\r\n this._updatePosition();\r\n\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance!.show();\r\n }\r\n\r\n this._overlayRef.updatePosition();\r\n }\r\n }\r\n }\r\n\r\n /** Disables the display of the tooltip. */\r\n @Input('ouiTooltipDisabled')\r\n get disabled(): boolean {\r\n return this._disabled;\r\n }\r\n set disabled(value) {\r\n this._disabled = coerceBooleanProperty(value);\r\n\r\n // If tooltip is disabled, hide immediately.\r\n if (this._disabled) {\r\n this.hide();\r\n }\r\n }\r\n\r\n private _message = '';\r\n\r\n /** The message to be displayed in the tooltip */\r\n @Input('ouiTooltip')\r\n get message() {\r\n return this._message;\r\n }\r\n set message(value: string) {\r\n this._ariaDescriber.removeDescription(\r\n this._elementRef.nativeElement,\r\n this._message\r\n );\r\n\r\n // If the message is not a string (e.g. number), convert it to a string and trim it.\r\n this._message = value != null ? `${value}`.trim() : '';\r\n\r\n if (!this._message && this._isTooltipVisible()) {\r\n this.hide();\r\n } else {\r\n this._updateTooltipMessage();\r\n this._ariaDescriber.describe(\r\n this._elementRef.nativeElement,\r\n this.message\r\n );\r\n }\r\n }\r\n\r\n /** Classes to be passed to the tooltip. Supports the same syntax as `ngClass`. */\r\n @Input('ouiTooltipClass')\r\n get tooltipClass() {\r\n return this._tooltipClass;\r\n }\r\n set tooltipClass(\r\n value: string | string[] | Set | { [key: string]: any }\r\n ) {\r\n this._tooltipClass = value;\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance._markForCheck();\r\n this._setTooltipClass(this._tooltipClass);\r\n }\r\n }\r\n\r\n private _manualListeners = new Map<\r\n string,\r\n EventListenerOrEventListenerObject\r\n >();\r\n\r\n /** Emits when the component is destroyed. */\r\n private readonly _destroyed = new Subject();\r\n\r\n constructor(\r\n private _overlay: Overlay,\r\n private _elementRef: ElementRef,\r\n private _scrollDispatcher: ScrollDispatcher,\r\n private _viewContainerRef: ViewContainerRef,\r\n private _ngZone: NgZone,\r\n platform: Platform,\r\n private _ariaDescriber: AriaDescriber,\r\n private _focusMonitor: FocusMonitor,\r\n @Inject(OUI_TOOLTIP_SCROLL_STRATEGY) scrollStrategy: any,\r\n @Optional() private _dir: Directionality\r\n ) {\r\n this._scrollStrategy = scrollStrategy;\r\n const element: HTMLElement = _elementRef.nativeElement;\r\n const elementStyle = element.style as NewCSSStyleDeclaration & {\r\n webkitUserDrag: string;\r\n };\r\n const hasGestures = typeof window === 'undefined' || (window as any).Hammer;\r\n\r\n // The mouse events shouldn't be bound on mobile devices, because they can prevent the\r\n // first tap from firing its click event or can cause the tooltip to open for clicks.\r\n if (!platform.IOS && !platform.ANDROID) {\r\n this._manualListeners\r\n .set('mouseenter', () => this.show())\r\n .set('mouseleave', () => this.hide());\r\n } else if (!hasGestures) {\r\n // there's no way for the user to trigger the tooltip on a touch device.\r\n this._manualListeners.set('touchstart', () => this.show());\r\n }\r\n\r\n this._manualListeners.forEach((listener, event) =>\r\n element.addEventListener(event, listener)\r\n );\r\n\r\n if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\r\n elementStyle.webkitUserSelect =\r\n elementStyle.userSelect =\r\n elementStyle.msUserSelect =\r\n '';\r\n }\r\n\r\n // Hammer applies `-webkit-user-drag: none` on all elements by default,\r\n // which breaks the native drag&drop. If the consumer explicitly made\r\n // the element draggable, clear the `-webkit-user-drag`.\r\n if (element.draggable && elementStyle.webkitUserDrag === 'none') {\r\n elementStyle.webkitUserDrag = '';\r\n }\r\n\r\n _focusMonitor\r\n .monitor(_elementRef)\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe((origin) => {\r\n // Note that the focus monitor runs outside the Angular zone.\r\n if (!origin) {\r\n _ngZone.run(() => this.hide());\r\n } else if (origin === 'keyboard') {\r\n _ngZone.run(() => this.show());\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Dispose the tooltip when destroyed.\r\n */\r\n ngOnDestroy() {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._tooltipInstance = null;\r\n }\r\n\r\n // Clean up the event listeners set in the constructor\r\n this._manualListeners.forEach((listener, event) => {\r\n this._elementRef.nativeElement.removeEventListener(event, listener);\r\n });\r\n this._manualListeners.clear();\r\n\r\n this._destroyed.next();\r\n this._destroyed.complete();\r\n\r\n this._ariaDescriber.removeDescription(\r\n this._elementRef.nativeElement,\r\n this.message\r\n );\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n }\r\n\r\n /** Shows the tooltip after the delay in ms, defaults to tooltip-delay-show or 0ms if no input */\r\n show(): void {\r\n if (\r\n this.disabled ||\r\n !this.message ||\r\n (this._isTooltipVisible() &&\r\n !this._tooltipInstance!._showTimeoutId &&\r\n !this._tooltipInstance!._hideTimeoutId)\r\n ) {\r\n return;\r\n }\r\n\r\n const overlayRef = this._createOverlay();\r\n\r\n this._detach();\r\n this._portal =\r\n this._portal ||\r\n new ComponentPortal(TooltipComponent, this._viewContainerRef);\r\n this._tooltipInstance = overlayRef.attach(this._portal).instance;\r\n this._tooltipInstance\r\n .afterHidden()\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => this._detach());\r\n this._setTooltipClass(this._tooltipClass);\r\n this._updateTooltipMessage();\r\n this._tooltipInstance!.show();\r\n }\r\n\r\n /** Hides the tooltip after the delay in ms, defaults to tooltip-delay-hide or 0ms if no input */\r\n hide(): void {\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.hide();\r\n } else {\r\n if (this._overlayRef) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n }\r\n }\r\n\r\n /** Shows/hides the tooltip */\r\n toggle(): void {\r\n if (this._isTooltipVisible()) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n /** Returns true if the tooltip is currently visible to the user */\r\n _isTooltipVisible(): boolean {\r\n return !!this._tooltipInstance && this._tooltipInstance.isVisible();\r\n }\r\n\r\n /** Handles the keydown events on the host element. */\r\n _handleKeydown(e: KeyboardEvent) {\r\n if (this._isTooltipVisible() && e.key === 'Escape') {\r\n e.stopPropagation();\r\n this.hide();\r\n }\r\n }\r\n\r\n /** Handles the touchend events on the host element. */\r\n _handleTouchend() {\r\n this.hide();\r\n }\r\n\r\n /** Create the overlay config and position strategy */\r\n private _createOverlay(): OverlayRef {\r\n if (this._overlayRef) {\r\n return this._overlayRef;\r\n }\r\n\r\n // Create connected position strategy that listens for scroll events to reposition.\r\n const strategy = this._overlay\r\n .position()\r\n .flexibleConnectedTo(this._elementRef)\r\n .withTransformOriginOn('.oui-tooltip')\r\n .withFlexibleDimensions(false)\r\n .withViewportMargin(8);\r\n\r\n const scrollableAncestors =\r\n this._scrollDispatcher.getAncestorScrollContainers(this._elementRef);\r\n\r\n strategy.withScrollableContainers(scrollableAncestors);\r\n\r\n strategy.positionChanges\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe((change) => {\r\n if (this._tooltipInstance) {\r\n if (\r\n change.scrollableViewProperties.isOverlayClipped &&\r\n this._tooltipInstance.isVisible()\r\n ) {\r\n // After position changes occur and the overlay is clipped by\r\n // a parent scrollable then close the tooltip.\r\n this._ngZone.run(() => this.hide());\r\n }\r\n }\r\n });\r\n\r\n this._overlayRef = this._overlay.create({\r\n direction: this._dir,\r\n positionStrategy: strategy,\r\n panelClass: TOOLTIP_PANEL_CLASS,\r\n scrollStrategy: this._scrollStrategy(),\r\n });\r\n\r\n this._updatePosition();\r\n\r\n this._overlayRef\r\n .detachments()\r\n .pipe(takeUntil(this._destroyed))\r\n .subscribe(() => this._detach());\r\n\r\n return this._overlayRef;\r\n }\r\n\r\n /** Detaches the currently-attached tooltip. */\r\n private _detach() {\r\n if (this._overlayRef && this._overlayRef.hasAttached()) {\r\n this._overlayRef.dispose();\r\n this._overlayRef = null;\r\n }\r\n\r\n this._tooltipInstance = null;\r\n }\r\n\r\n /** Updates the position of the current tooltip. */\r\n private _updatePosition() {\r\n const position = this._overlayRef!.getConfig()\r\n .positionStrategy as FlexibleConnectedPositionStrategy;\r\n const origin = this._getOrigin();\r\n const overlay = this._getOverlayPosition();\r\n\r\n position.withPositions([\r\n { ...origin.main, ...overlay.main },\r\n { ...origin.fallback, ...overlay.fallback },\r\n ]);\r\n }\r\n\r\n /**\r\n * Returns the origin position and a fallback position based on the user's position preference.\r\n * The fallback position is the inverse of the origin (e.g. `'below' -> 'above'`).\r\n */\r\n _getOrigin(): {\r\n main: OriginConnectionPosition;\r\n fallback: OriginConnectionPosition;\r\n } {\r\n const isLtr = !this._dir || this._dir.value === 'ltr';\r\n const position = this.position;\r\n let originPosition: OriginConnectionPosition;\r\n\r\n if (position === 'above' || position === 'below') {\r\n originPosition = {\r\n originX: 'center',\r\n originY: position === 'above' ? 'top' : 'bottom',\r\n };\r\n } else if (\r\n (position === 'left' && isLtr) ||\r\n (position === 'right' && !isLtr)\r\n ) {\r\n originPosition = { originX: 'start', originY: 'center' };\r\n } else if (\r\n (position === 'right' && isLtr) ||\r\n (position === 'left' && !isLtr)\r\n ) {\r\n originPosition = { originX: 'end', originY: 'center' };\r\n } else {\r\n throw getOuiTooltipInvalidPositionError(position);\r\n }\r\n\r\n const { x, y } = this._invertPosition(\r\n originPosition.originX,\r\n originPosition.originY\r\n );\r\n\r\n return {\r\n main: originPosition,\r\n fallback: { originX: x, originY: y },\r\n };\r\n }\r\n\r\n /** Returns the overlay position and a fallback position based on the user's preference */\r\n _getOverlayPosition(): {\r\n main: OverlayConnectionPosition;\r\n fallback: OverlayConnectionPosition;\r\n } {\r\n const isLtr = !this._dir || this._dir.value === 'ltr';\r\n const position = this.position;\r\n let overlayPosition: OverlayConnectionPosition;\r\n\r\n if (position === 'above') {\r\n overlayPosition = { overlayX: 'center', overlayY: 'bottom' };\r\n } else if (position === 'below') {\r\n overlayPosition = { overlayX: 'center', overlayY: 'top' };\r\n } else if (\r\n (position === 'left' && isLtr) ||\r\n (position === 'right' && !isLtr)\r\n ) {\r\n overlayPosition = { overlayX: 'end', overlayY: 'center' };\r\n } else if (\r\n (position === 'right' && isLtr) ||\r\n (position === 'left' && !isLtr)\r\n ) {\r\n overlayPosition = { overlayX: 'start', overlayY: 'center' };\r\n } else {\r\n throw getOuiTooltipInvalidPositionError(position);\r\n }\r\n\r\n const { x, y } = this._invertPosition(\r\n overlayPosition.overlayX,\r\n overlayPosition.overlayY\r\n );\r\n\r\n return {\r\n main: overlayPosition,\r\n fallback: { overlayX: x, overlayY: y },\r\n };\r\n }\r\n\r\n /** Updates the tooltip message and repositions the overlay according to the new message length */\r\n private _updateTooltipMessage() {\r\n // Must wait for the message to be painted to the tooltip so that the overlay can properly\r\n // calculate the correct positioning based on the size of the text.\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.message = this.message;\r\n this._tooltipInstance._markForCheck();\r\n\r\n this._ngZone.onMicrotaskEmpty\r\n .asObservable()\r\n .pipe(take(1), takeUntil(this._destroyed))\r\n .subscribe(() => {\r\n if (this._tooltipInstance) {\r\n this._overlayRef!.updatePosition();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Updates the tooltip class */\r\n private _setTooltipClass(\r\n tooltipClass: string | string[] | Set | { [key: string]: any }\r\n ) {\r\n if (this._tooltipInstance) {\r\n this._tooltipInstance.tooltipClass = tooltipClass;\r\n this._tooltipInstance._markForCheck();\r\n }\r\n }\r\n\r\n /** Inverts an overlay position. */\r\n private _invertPosition(\r\n x: HorizontalConnectionPos,\r\n y: VerticalConnectionPos\r\n ) {\r\n if (this.position === 'above' || this.position === 'below') {\r\n if (y === 'top') {\r\n y = 'bottom';\r\n } else if (y === 'bottom') {\r\n y = 'top';\r\n }\r\n } else {\r\n if (x === 'end') {\r\n x = 'start';\r\n } else if (x === 'start') {\r\n x = 'end';\r\n }\r\n }\r\n\r\n return { x, y };\r\n }\r\n}\r\n", "assetsDirs": [], "styleUrlsData": [ { @@ -49585,7 +50262,7 @@ }, { "name": "OuiCommonModule", - "id": "module-OuiCommonModule-ef22db41367b2c08b13c523be66ebd594c90c986a94f6990f23d6414cbbfc4a9e9dfe943acf905441d9051e0e19202026192cb30f79f93da1f2c6830ab030985", + "id": "module-OuiCommonModule-faf3c2d5fa6ebca28372c7cb5b8112d9d13108d2e2811f5e27b343cdad3e494640760104bebf9faa35deae7c62ab89021cce2b1ce16b785f1cd5bd3271ba0044", "description": "

Module that captures anything that should be loaded and/or run for all Angular Material\ncomponents. This includes Bidi, etc.

\n

This module should be imported to each top-level component module (e.g., OuiTabsModule).

\n", "deprecationMessage": "", "deprecated": false, @@ -49625,7 +50302,7 @@ ] } ], - "sourceCode": "/**\r\n * @license\r\n * Copyright Google LLC All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\nimport { HighContrastModeDetector } from '@angular/cdk/a11y';\r\nimport { BidiModule } from '@angular/cdk/bidi';\r\nimport {\r\n inject,\r\n Inject,\r\n InjectionToken,\r\n NgModule,\r\n Optional,\r\n} from '@angular/core';\r\nimport { VERSION as CDK_VERSION } from '@angular/cdk';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { Platform, _isTestEnvironment } from '@angular/cdk/platform';\r\nimport { VERSION } from '../version';\r\nimport { isDevMode } from '@angular/core';\r\n\r\n/** @docs-private */\r\nexport function MATERIAL_SANITY_CHECKS_FACTORY(): SanityChecks {\r\n return true;\r\n}\r\n\r\n/** Injection token that configures whether the Material sanity checks are enabled. */\r\nexport const MATERIAL_SANITY_CHECKS = new InjectionToken(\r\n 'mat-sanity-checks',\r\n {\r\n providedIn: 'root',\r\n factory: MATERIAL_SANITY_CHECKS_FACTORY,\r\n }\r\n);\r\n\r\n/**\r\n * Possible sanity checks that can be enabled. If set to\r\n * true/false, all checks will be enabled/disabled.\r\n */\r\nexport type SanityChecks = boolean | GranularSanityChecks;\r\n\r\n/** Object that can be used to configure the sanity checks granularly. */\r\nexport interface GranularSanityChecks {\r\n doctype: boolean;\r\n theme: boolean;\r\n version: boolean;\r\n}\r\n\r\n/**\r\n * Module that captures anything that should be loaded and/or run for *all* Angular Material\r\n * components. This includes Bidi, etc.\r\n *\r\n * This module should be imported to each top-level component module (e.g., OuiTabsModule).\r\n */\r\n@NgModule({\r\n imports: [BidiModule],\r\n exports: [BidiModule],\r\n})\r\nexport class OuiCommonModule {\r\n /** Whether we've done the global sanity checks (e.g. a theme is loaded, there is a doctype). */\r\n private _hasDoneGlobalChecks = false;\r\n\r\n constructor(\r\n highContrastModeDetector: HighContrastModeDetector,\r\n @Optional()\r\n @Inject(MATERIAL_SANITY_CHECKS)\r\n private _sanityChecks: SanityChecks,\r\n @Inject(DOCUMENT) private _document: Document\r\n ) {\r\n // While A11yModule also does this, we repeat it here to avoid importing A11yModule\r\n // in OuiCommonModule.\r\n highContrastModeDetector._applyBodyHighContrastModeCssClasses();\r\n\r\n if (!this._hasDoneGlobalChecks) {\r\n this._hasDoneGlobalChecks = true;\r\n\r\n if (typeof isDevMode === 'undefined' || isDevMode) {\r\n // Inject in here so the reference to `Platform` can be removed in production mode.\r\n const platform = inject(Platform, { optional: true });\r\n\r\n if (this._checkIsEnabled('doctype')) {\r\n _checkDoctypeIsDefined(this._document);\r\n }\r\n\r\n if (this._checkIsEnabled('theme')) {\r\n _checkThemeIsPresent(this._document, !!platform?.isBrowser);\r\n }\r\n\r\n if (this._checkIsEnabled('version')) {\r\n _checkCdkVersionMatch();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Gets whether a specific sanity check is enabled. */\r\n private _checkIsEnabled(name: keyof GranularSanityChecks): boolean {\r\n if (_isTestEnvironment()) {\r\n return false;\r\n }\r\n\r\n if (typeof this._sanityChecks === 'boolean') {\r\n return this._sanityChecks;\r\n }\r\n\r\n return !!this._sanityChecks[name];\r\n }\r\n}\r\n\r\n/** Checks that the page has a doctype. */\r\nfunction _checkDoctypeIsDefined(doc: Document): void {\r\n if (!doc.doctype) {\r\n console.warn(\r\n 'Current document does not have a doctype. This may cause ' +\r\n 'some Angular Material components not to behave as expected.'\r\n );\r\n }\r\n}\r\n\r\n/** Checks that a theme has been included. */\r\nfunction _checkThemeIsPresent(doc: Document, isBrowser: boolean): void {\r\n // We need to assert that the `body` is defined, because these checks run very early\r\n // and the `body` won't be defined if the consumer put their scripts in the `head`.\r\n if (!doc.body || !isBrowser) {\r\n return;\r\n }\r\n\r\n const testElement = doc.createElement('div');\r\n testElement.classList.add('mat-theme-loaded-marker');\r\n doc.body.appendChild(testElement);\r\n\r\n const computedStyle = getComputedStyle(testElement);\r\n\r\n // In some situations the computed style of the test element can be null. For example in\r\n // Firefox, the computed style is null if an application is running inside of a hidden iframe.\r\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=548397\r\n if (computedStyle && computedStyle.display !== 'none') {\r\n console.warn(\r\n 'Could not find Angular Material core theme. Most Material ' +\r\n 'components may not work as expected. For more info refer ' +\r\n 'to the theming guide: https://material.angular.io/guide/theming'\r\n );\r\n }\r\n\r\n testElement.remove();\r\n}\r\n\r\n/** Checks whether the Material version matches the CDK version. */\r\nfunction _checkCdkVersionMatch(): void {\r\n if (VERSION.full !== CDK_VERSION.full) {\r\n console.warn(\r\n 'The Angular Material version (' +\r\n VERSION.full +\r\n ') does not match ' +\r\n 'the Angular CDK version (' +\r\n CDK_VERSION.full +\r\n ').\\n' +\r\n 'Please ensure the versions of these two packages exactly match.'\r\n );\r\n }\r\n}\r\n", + "sourceCode": "/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport { HighContrastModeDetector } from '@angular/cdk/a11y';\nimport { BidiModule } from '@angular/cdk/bidi';\nimport {\n inject,\n Inject,\n InjectionToken,\n NgModule,\n Optional,\n} from '@angular/core';\nimport { VERSION as CDK_VERSION } from '@angular/cdk';\nimport { DOCUMENT } from '@angular/common';\nimport { Platform, _isTestEnvironment } from '@angular/cdk/platform';\nimport { VERSION } from '../version';\nimport { isDevMode } from '@angular/core';\n\n/** @docs-private */\nexport function MATERIAL_SANITY_CHECKS_FACTORY(): SanityChecks {\n return true;\n}\n\n/** Injection token that configures whether the Material sanity checks are enabled. */\nexport const MATERIAL_SANITY_CHECKS = new InjectionToken(\n 'mat-sanity-checks',\n {\n providedIn: 'root',\n factory: MATERIAL_SANITY_CHECKS_FACTORY,\n }\n);\n\n/**\n * Possible sanity checks that can be enabled. If set to\n * true/false, all checks will be enabled/disabled.\n */\nexport type SanityChecks = boolean | GranularSanityChecks;\n\n/** Object that can be used to configure the sanity checks granularly. */\nexport interface GranularSanityChecks {\n doctype: boolean;\n theme: boolean;\n version: boolean;\n}\n\n/**\n * Module that captures anything that should be loaded and/or run for *all* Angular Material\n * components. This includes Bidi, etc.\n *\n * This module should be imported to each top-level component module (e.g., OuiTabsModule).\n */\n@NgModule({\n imports: [BidiModule],\n exports: [BidiModule],\n})\nexport class OuiCommonModule {\n /** Whether we've done the global sanity checks (e.g. a theme is loaded, there is a doctype). */\n private _hasDoneGlobalChecks = false;\n\n constructor(\n highContrastModeDetector: HighContrastModeDetector,\n @Optional()\n @Inject(MATERIAL_SANITY_CHECKS)\n private _sanityChecks: SanityChecks,\n @Inject(DOCUMENT) private _document: Document\n ) {\n // While A11yModule also does this, we repeat it here to avoid importing A11yModule\n // in OuiCommonModule.\n highContrastModeDetector._applyBodyHighContrastModeCssClasses();\n\n if (!this._hasDoneGlobalChecks) {\n this._hasDoneGlobalChecks = true;\n\n if (typeof isDevMode === 'undefined' || isDevMode) {\n // Inject in here so the reference to `Platform` can be removed in production mode.\n const platform = inject(Platform, { optional: true });\n\n if (this._checkIsEnabled('doctype')) {\n _checkDoctypeIsDefined(this._document);\n }\n\n if (this._checkIsEnabled('theme')) {\n _checkThemeIsPresent(this._document, !!platform?.isBrowser);\n }\n\n if (this._checkIsEnabled('version')) {\n _checkCdkVersionMatch();\n }\n }\n }\n }\n\n /** Gets whether a specific sanity check is enabled. */\n private _checkIsEnabled(name: keyof GranularSanityChecks): boolean {\n if (_isTestEnvironment()) {\n return false;\n }\n\n if (typeof this._sanityChecks === 'boolean') {\n return this._sanityChecks;\n }\n\n return !!this._sanityChecks[name];\n }\n}\n\n/** Checks that the page has a doctype. */\nfunction _checkDoctypeIsDefined(doc: Document): void {\n if (!doc.doctype) {\n console.warn(\n 'Current document does not have a doctype. This may cause ' +\n 'some Angular Material components not to behave as expected.'\n );\n }\n}\n\n/** Checks that a theme has been included. */\nfunction _checkThemeIsPresent(doc: Document, isBrowser: boolean): void {\n // We need to assert that the `body` is defined, because these checks run very early\n // and the `body` won't be defined if the consumer put their scripts in the `head`.\n if (!doc.body || !isBrowser) {\n return;\n }\n\n const testElement = doc.createElement('div');\n testElement.classList.add('mat-theme-loaded-marker');\n doc.body.appendChild(testElement);\n\n const computedStyle = getComputedStyle(testElement);\n\n // In some situations the computed style of the test element can be null. For example in\n // Firefox, the computed style is null if an application is running inside of a hidden iframe.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n if (computedStyle && computedStyle.display !== 'none') {\n console.warn(\n 'Could not find Angular Material core theme. Most Material ' +\n 'components may not work as expected. For more info refer ' +\n 'to the theming guide: https://material.angular.io/guide/theming'\n );\n }\n\n testElement.remove();\n}\n\n/** Checks whether the Material version matches the CDK version. */\nfunction _checkCdkVersionMatch(): void {\n if (VERSION.full !== CDK_VERSION.full) {\n console.warn(\n 'The Angular Material version (' +\n VERSION.full +\n ') does not match ' +\n 'the Angular CDK version (' +\n CDK_VERSION.full +\n ').\\n' +\n 'Please ensure the versions of these two packages exactly match.'\n );\n }\n}\n", "children": [ { "type": "providers", @@ -50901,13 +51578,13 @@ }, { "name": "OuiTabsModule", - "id": "module-OuiTabsModule-bfa49801c59d126ca70f295adfca55a8db3e821ec755d268e3eb74900a718668b86e3356b088854d6b94c0203c43664807fce61ce7b3455b1c9a74153afa9ecd", + "id": "module-OuiTabsModule-f3299d4f0f78dd7372a1f9f64d79165be29e4960e5b8ca975b7ab5352e24a9012ec17c5838afd27393cbd2d4ba5620a441a1b747ac70c8a2ec105526ef305c6d", "description": "", "deprecationMessage": "", "deprecated": false, "file": "ui/src/components/tabs/module.ts", "methods": [], - "sourceCode": "/**\r\n * @license\r\n * Copyright Google LLC All Rights Reserved.\r\n *\r\n * Use of this source code is governed by an MIT-style license that can be\r\n * found in the LICENSE file at https://angular.io/license\r\n */\r\n\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { PortalModule } from '@angular/cdk/portal';\r\nimport { ObserversModule } from '@angular/cdk/observers';\r\nimport { A11yModule } from '@angular/cdk/a11y';\r\nimport { OuiTabBodyPortal } from './tab-body';\r\nimport { OuiTabContent } from './tab-content';\r\nimport { OuiTabLabel } from './tab-label';\r\nimport { ouiTabLabelWrapper } from './tab-label-wrapper';\r\nimport { OuiTab } from './tab';\r\nimport { OuiTabHeader } from './tab-header';\r\nimport { ouiTabGroup } from './tab-group';\r\nimport {\r\n OuiTabNav,\r\n ouiTabNavPanel,\r\n OuiTabLink,\r\n} from './tab-nav-bar/tab-nav-bar';\r\nimport { OuiTabBody } from './tab-body';\r\n\r\n@NgModule({\r\n imports: [CommonModule, PortalModule, ObserversModule, A11yModule],\r\n exports: [\r\n OuiTabContent,\r\n OuiTabLabel,\r\n OuiTab,\r\n ouiTabGroup,\r\n OuiTabNav,\r\n ouiTabNavPanel,\r\n OuiTabLink,\r\n OuiTabBodyPortal,\r\n OuiTabBody,\r\n ],\r\n declarations: [\r\n OuiTabContent,\r\n OuiTabLabel,\r\n OuiTab,\r\n ouiTabGroup,\r\n OuiTabNav,\r\n ouiTabNavPanel,\r\n OuiTabLink,\r\n\r\n // Private directives, should not be exported.\r\n ouiTabLabelWrapper,\r\n OuiTabHeader,\r\n OuiTabBody,\r\n OuiTabBodyPortal,\r\n ],\r\n})\r\nexport class OuiTabsModule {}\r\n", + "sourceCode": "/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { PortalModule } from '@angular/cdk/portal';\nimport { ObserversModule } from '@angular/cdk/observers';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { OuiTabBodyPortal } from './tab-body';\nimport { OuiTabContent } from './tab-content';\nimport { OuiTabLabel } from './tab-label';\nimport { ouiTabLabelWrapper } from './tab-label-wrapper';\nimport { OuiTab } from './tab';\nimport { OuiTabHeader } from './tab-header';\nimport { ouiTabGroup } from './tab-group';\nimport {\n OuiTabNav,\n ouiTabNavPanel,\n OuiTabLink,\n} from './tab-nav-bar/tab-nav-bar';\nimport { OuiTabBody } from './tab-body';\n\n@NgModule({\n imports: [CommonModule, PortalModule, ObserversModule, A11yModule],\n exports: [\n OuiTabContent,\n OuiTabLabel,\n OuiTab,\n ouiTabGroup,\n OuiTabNav,\n ouiTabNavPanel,\n OuiTabLink,\n OuiTabBodyPortal,\n OuiTabBody,\n ],\n declarations: [\n OuiTabContent,\n OuiTabLabel,\n OuiTab,\n ouiTabGroup,\n OuiTabNav,\n ouiTabNavPanel,\n OuiTabLink,\n\n // Private directives, should not be exported.\n ouiTabLabelWrapper,\n OuiTabHeader,\n OuiTabBody,\n OuiTabBodyPortal,\n ],\n})\nexport class OuiTabsModule {}\n", "children": [ { "type": "providers", @@ -51068,7 +51745,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken<_OuiInkBarPositioner>(\r\n 'MatInkBarPositioner',\r\n {\r\n providedIn: 'root',\r\n factory: _OUI_INK_BAR_POSITIONER_FACTORY,\r\n }\r\n)", + "defaultValue": "new InjectionToken<_OuiInkBarPositioner>(\n 'MatInkBarPositioner',\n {\n providedIn: 'root',\n factory: _OUI_INK_BAR_POSITIONER_FACTORY,\n }\n)", "rawdescription": "Injection token for the OuiInkBar's Positioner.", "description": "

Injection token for the OuiInkBar's Positioner.

\n" }, @@ -51212,7 +51889,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "mixinColor(\r\n mixinDisableRipple(\r\n class {\r\n constructor(public _elementRef: ElementRef) {}\r\n }\r\n ),\r\n 'primary'\r\n)" + "defaultValue": "mixinColor(\n mixinDisableRipple(\n class {\n constructor(public _elementRef: ElementRef) {}\n }\n ),\n 'primary'\n)" }, { "name": "_OuiTabLabelWrapperMixinBase", @@ -51222,7 +51899,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "mixinInkBarItem(\r\n mixinDisabled(\r\n class {\r\n elementRef: ElementRef;\r\n }\r\n )\r\n)" + "defaultValue": "mixinInkBarItem(\n mixinDisabled(\n class {\n elementRef: ElementRef;\n }\n )\n)" }, { "name": "_OuiTabLinkMixinBase", @@ -51232,7 +51909,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "mixinInkBarItem(\r\n mixinTabIndex(\r\n mixinDisableRipple(\r\n mixinDisabled(\r\n class {\r\n elementRef: ElementRef;\r\n }\r\n )\r\n )\r\n )\r\n)" + "defaultValue": "mixinInkBarItem(\n mixinTabIndex(\n mixinDisableRipple(\n mixinDisabled(\n class {\n elementRef: ElementRef;\n }\n )\n )\n )\n)" }, { "name": "_OuiTabMixinBase", @@ -51508,7 +52185,7 @@ "deprecated": false, "deprecationMessage": "", "type": "object", - "defaultValue": "{\n long: [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ],\n short: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n narrow: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sat'],\n}", + "defaultValue": "{\r\n long: [\r\n 'Sunday',\r\n 'Monday',\r\n 'Tuesday',\r\n 'Wednesday',\r\n 'Thursday',\r\n 'Friday',\r\n 'Saturday',\r\n ],\r\n short: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\r\n narrow: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sat'],\r\n}", "rawdescription": "The default day of the week names to use if Intl API is not available.", "description": "

The default day of the week names to use if Intl API is not available.

\n" }, @@ -51520,7 +52197,7 @@ "deprecated": false, "deprecationMessage": "", "type": "object", - "defaultValue": "{\n long: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n short: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ],\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n}", + "defaultValue": "{\r\n long: [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n ],\r\n short: [\r\n 'Jan',\r\n 'Feb',\r\n 'Mar',\r\n 'Apr',\r\n 'May',\r\n 'Jun',\r\n 'Jul',\r\n 'Aug',\r\n 'Sep',\r\n 'Oct',\r\n 'Nov',\r\n 'Dec',\r\n ],\r\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\r\n}", "rawdescription": "The default month names to use if Intl API is not available.", "description": "

The default month names to use if Intl API is not available.

\n" }, @@ -51577,7 +52254,7 @@ "deprecationMessage": "", "type": "number", "defaultValue": "650", - "rawdescription": "Amount of milliseconds to wait before starting to scroll the header automatically.\r\nSet a little conservatively in order to handle fake events dispatched on touch devices.", + "rawdescription": "Amount of milliseconds to wait before starting to scroll the header automatically.\nSet a little conservatively in order to handle fake events dispatched on touch devices.", "description": "

Amount of milliseconds to wait before starting to scroll the header automatically.\nSet a little conservatively in order to handle fake events dispatched on touch devices.

\n" }, { @@ -51589,7 +52266,7 @@ "deprecationMessage": "", "type": "number", "defaultValue": "100", - "rawdescription": "Interval in milliseconds at which to scroll the header\r\nwhile the user is holding their pointer.", + "rawdescription": "Interval in milliseconds at which to scroll the header\nwhile the user is holding their pointer.", "description": "

Interval in milliseconds at which to scroll the header\nwhile the user is holding their pointer.

\n" }, { @@ -51643,7 +52320,7 @@ "deprecationMessage": "", "type": "", "defaultValue": "/^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|(?:(?:\\+|-)\\d{2}:\\d{2}))?)?$/", - "rawdescription": "Matches strings that have the form of a valid RFC 3339 string\n(https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date\nbecause the regex will match strings an with out of bounds month, date, etc.", + "rawdescription": "Matches strings that have the form of a valid RFC 3339 string\r\n(https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date\r\nbecause the regex will match strings an with out of bounds month, date, etc.", "description": "

Matches strings that have the form of a valid RFC 3339 string\n(https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date\nbecause the regex will match strings an with out of bounds month, date, etc.

\n" }, { @@ -51664,7 +52341,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken(\r\n 'mat-sanity-checks',\r\n {\r\n providedIn: 'root',\r\n factory: MATERIAL_SANITY_CHECKS_FACTORY,\r\n }\r\n)", + "defaultValue": "new InjectionToken(\n 'mat-sanity-checks',\n {\n providedIn: 'root',\n factory: MATERIAL_SANITY_CHECKS_FACTORY,\n }\n)", "rawdescription": "Injection token that configures whether the Material sanity checks are enabled.", "description": "

Injection token that configures whether the Material sanity checks are enabled.

\n" }, @@ -51882,7 +52559,7 @@ "deprecated": false, "deprecationMessage": "", "type": "OuiDateFormats", - "defaultValue": "{\r\n parse: {\r\n dateInput: null,\r\n },\r\n display: {\r\n dateInput: {\r\n year: 'numeric',\r\n day: '2-digit',\r\n month: '2-digit',\r\n },\r\n monthYearLabel: { year: 'numeric', month: 'short' },\r\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\r\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\r\n },\r\n}" + "defaultValue": "{\n parse: {\n dateInput: null,\n },\n display: {\n dateInput: {\n year: 'numeric',\n day: '2-digit',\n month: '2-digit',\n },\n monthYearLabel: { year: 'numeric', month: 'short' },\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\n },\n}" }, { "name": "OUI_DATE_FORMATS", @@ -51926,7 +52603,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken<\n () => ScrollStrategy\n>('oui-datepicker-scroll-strategy')", + "defaultValue": "new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-datepicker-scroll-strategy')", "rawdescription": "Injection token that determines the scroll handling while the calendar is open.", "description": "

Injection token that determines the scroll handling while the calendar is open.

\n" }, @@ -51938,7 +52615,7 @@ "deprecated": false, "deprecationMessage": "", "type": "object", - "defaultValue": "{\n provide: OUI_DATEPICKER_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY,\n}" + "defaultValue": "{\r\n provide: OUI_DATEPICKER_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY,\r\n}" }, { "name": "OUI_DATEPICKER_VALIDATORS", @@ -52084,7 +52761,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken<\n () => ScrollStrategy\n>('oui-menu-scroll-strategy')", + "defaultValue": "new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-menu-scroll-strategy')", "rawdescription": "Injection token that determines the scroll handling while the menu is open.", "description": "

Injection token that determines the scroll handling while the menu is open.

\n" }, @@ -52096,7 +52773,7 @@ "deprecated": false, "deprecationMessage": "", "type": "object", - "defaultValue": "{\n provide: OUI_MENU_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_MENU_SCROLL_STRATEGY_FACTORY,\n}" + "defaultValue": "{\r\n provide: OUI_MENU_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_MENU_SCROLL_STRATEGY_FACTORY,\r\n}" }, { "name": "OUI_NATIVE_DATE_FORMATS", @@ -52230,8 +52907,8 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken(\r\n 'OuiTabContent'\r\n)", - "rawdescription": "Injection token that can be used to reference instances of `OuiTabContent`. It serves as\r\nalternative token to the actual `OuiTabContent` class which could cause unnecessary\r\nretention of the class and its directive metadata.", + "defaultValue": "new InjectionToken(\n 'OuiTabContent'\n)", + "rawdescription": "Injection token that can be used to reference instances of `OuiTabContent`. It serves as\nalternative token to the actual `OuiTabContent` class which could cause unnecessary\nretention of the class and its directive metadata.", "description": "

Injection token that can be used to reference instances of OuiTabContent. It serves as\nalternative token to the actual OuiTabContent class which could cause unnecessary\nretention of the class and its directive metadata.

\n" }, { @@ -52255,7 +52932,7 @@ "deprecationMessage": "", "type": "", "defaultValue": "new InjectionToken('OuiTabLabel')", - "rawdescription": "Injection token that can be used to reference instances of `OuiTabLabel`. It serves as\r\nalternative token to the actual `OuiTabLabel` class which could cause unnecessary\r\nretention of the class and its directive metadata.", + "rawdescription": "Injection token that can be used to reference instances of `OuiTabLabel`. It serves as\nalternative token to the actual `OuiTabLabel` class which could cause unnecessary\nretention of the class and its directive metadata.", "description": "

Injection token that can be used to reference instances of OuiTabLabel. It serves as\nalternative token to the actual OuiTabLabel class which could cause unnecessary\nretention of the class and its directive metadata.

\n" }, { @@ -52266,7 +52943,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken(\r\n 'OUI_TABS_CONFIG'\r\n)", + "defaultValue": "new InjectionToken(\n 'OUI_TABS_CONFIG'\n)", "rawdescription": "Injection token that can be used to provide the default options the tabs module.", "description": "

Injection token that can be used to provide the default options the tabs module.

\n" }, @@ -52278,7 +52955,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken('oui-tooltip-default-options', {\n providedIn: 'root',\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\n })", + "defaultValue": "new InjectionToken('oui-tooltip-default-options', {\r\n providedIn: 'root',\r\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\r\n })", "rawdescription": "Injection token to be used to override the default options for `ouiTooltip`.", "description": "

Injection token to be used to override the default options for ouiTooltip.

\n" }, @@ -52290,7 +52967,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken<\n () => ScrollStrategy\n>('oui-tooltip-scroll-strategy')", + "defaultValue": "new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-tooltip-scroll-strategy')", "rawdescription": "Injection token that determines the scroll handling while a tooltip is visible.", "description": "

Injection token that determines the scroll handling while a tooltip is visible.

\n" }, @@ -52302,7 +52979,7 @@ "deprecated": false, "deprecationMessage": "", "type": "object", - "defaultValue": "{\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\n}" + "defaultValue": "{\r\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\r\n}" }, { "name": "OuiButtonMixinBase", @@ -52376,7 +53053,7 @@ "deprecated": false, "deprecationMessage": "", "type": "literal type", - "defaultValue": "{\r\n /** Animation translates a tab along the X axis. */\r\n translateTab: trigger('translateTab', [\r\n // Transitions to `none` instead of 0, because some browsers might blur the content.\r\n state(\r\n 'center, void, left-origin-center, right-origin-center',\r\n style({ transform: 'none' })\r\n ),\r\n\r\n // If the tab is either on the left or right, we additionally add a `min-height` of 1px\r\n // in order to ensure that the element has a height before its state changes. This is\r\n // necessary because Chrome does seem to skip the transition in RTL mode if the element does\r\n // not have a static height and is not rendered. See related issue: #9465\r\n state(\r\n 'left',\r\n style({\r\n transform: 'translate3d(-100%, 0, 0)',\r\n minHeight: '1px',\r\n\r\n // Normally this is redundant since we detach the content from the DOM, but if the user\r\n // opted into keeping the content in the DOM, we have to hide it so it isn't focusable.\r\n visibility: 'hidden',\r\n })\r\n ),\r\n state(\r\n 'right',\r\n style({\r\n transform: 'translate3d(100%, 0, 0)',\r\n minHeight: '1px',\r\n visibility: 'hidden',\r\n })\r\n ),\r\n\r\n transition(\r\n '* => left, * => right, left => center, right => center',\r\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')\r\n ),\r\n transition('void => left-origin-center', [\r\n style({ transform: 'translate3d(-100%, 0, 0)', visibility: 'hidden' }),\r\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),\r\n ]),\r\n transition('void => right-origin-center', [\r\n style({ transform: 'translate3d(100%, 0, 0)', visibility: 'hidden' }),\r\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),\r\n ]),\r\n ]),\r\n}", + "defaultValue": "{\n /** Animation translates a tab along the X axis. */\n translateTab: trigger('translateTab', [\n // Transitions to `none` instead of 0, because some browsers might blur the content.\n state(\n 'center, void, left-origin-center, right-origin-center',\n style({ transform: 'none' })\n ),\n\n // If the tab is either on the left or right, we additionally add a `min-height` of 1px\n // in order to ensure that the element has a height before its state changes. This is\n // necessary because Chrome does seem to skip the transition in RTL mode if the element does\n // not have a static height and is not rendered. See related issue: #9465\n state(\n 'left',\n style({\n transform: 'translate3d(-100%, 0, 0)',\n minHeight: '1px',\n\n // Normally this is redundant since we detach the content from the DOM, but if the user\n // opted into keeping the content in the DOM, we have to hide it so it isn't focusable.\n visibility: 'hidden',\n })\n ),\n state(\n 'right',\n style({\n transform: 'translate3d(100%, 0, 0)',\n minHeight: '1px',\n visibility: 'hidden',\n })\n ),\n\n transition(\n '* => left, * => right, left => center, right => center',\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')\n ),\n transition('void => left-origin-center', [\n style({ transform: 'translate3d(-100%, 0, 0)', visibility: 'hidden' }),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),\n ]),\n transition('void => right-origin-center', [\n style({ transform: 'translate3d(100%, 0, 0)', visibility: 'hidden' }),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),\n ]),\n ]),\n}", "rawdescription": "Animations used by the Material tabs.", "description": "

Animations used by the Material tabs.

\n" }, @@ -52418,7 +53095,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "normalizePassiveListenerOptions({\n passive: true,\n})", + "defaultValue": "normalizePassiveListenerOptions({\r\n passive: true,\r\n})", "rawdescription": "Options for binding a passive event listener.", "description": "

Options for binding a passive event listener.

\n" }, @@ -52430,7 +53107,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "normalizePassiveListenerOptions({\r\n passive: true,\r\n}) as EventListenerOptions", + "defaultValue": "normalizePassiveListenerOptions({\n passive: true,\n}) as EventListenerOptions", "rawdescription": "Config used to bind passive event listeners", "description": "

Config used to bind passive event listeners

\n" }, @@ -52444,6 +53121,16 @@ "type": "", "defaultValue": "(props) => ({\n moduleMetadata: {\n imports: [\n OuiDatepickerModule,\n OuiFormFieldModule,\n OuiInputModule,\n BrowserAnimationsModule,\n ],\n schemas: [],\n declarations: [OuiDatepickerStorybook],\n },\n template: ``,\n props: {\n ...props,\n closed: action('closed'),\n monthSelected: action('monthSelected'),\n datepickeropened: action('opened'),\n yearSelected: action('yearSelected'),\n dateChange: action('dateChange'),\n },\n})" }, + { + "name": "Regular", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "ui/src/stories/tooltip/tooltip.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "object", + "defaultValue": "{\r\n render: (props) => ({\r\n moduleMetadata: {\r\n imports: [OuiTooltipModule, OuiIconModule, BrowserAnimationsModule],\r\n schemas: [],\r\n declarations: [OuiTooltipStorybook],\r\n },\r\n\r\n template: ``,\r\n\r\n props: {\r\n ...props,\r\n changed: action('change'),\r\n },\r\n }),\r\n\r\n name: 'Regular',\r\n\r\n parameters: {\r\n docs: {\r\n source: {\r\n code: ``,\r\n },\r\n },\r\n },\r\n\r\n args: {\r\n theme: THEME[0],\r\n disabled: false,\r\n ouiTooltip: 'This is a tooltip',\r\n ouiTooltipPosition: TOOLTIPPOSITION[0],\r\n },\r\n\r\n argTypes: {\r\n theme: {\r\n options: THEME,\r\n\r\n control: {\r\n type: 'select',\r\n },\r\n },\r\n\r\n ouiTooltipPosition: {\r\n options: TOOLTIPPOSITION,\r\n\r\n control: {\r\n type: 'select',\r\n },\r\n },\r\n },\r\n}" + }, { "name": "SCROLL_THROTTLE_MS", "ctype": "miscellaneous", @@ -52894,8 +53581,8 @@ "jsdoctags": [ { "name": { - "pos": 8577, - "end": 8588, + "pos": 9019, + "end": 9030, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -52906,8 +53593,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 8571, - "end": 8576, + "pos": 9013, + "end": 9018, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -52918,8 +53605,8 @@ }, { "name": { - "pos": 8647, - "end": 8654, + "pos": 9089, + "end": 9096, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -52930,8 +53617,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 8641, - "end": 8646, + "pos": 9083, + "end": 9088, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -52942,8 +53629,8 @@ }, { "name": { - "pos": 8698, - "end": 8710, + "pos": 9140, + "end": 9152, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -52954,8 +53641,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 8692, - "end": 8697, + "pos": 9134, + "end": 9139, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -52998,14 +53685,21 @@ "type": "number", "deprecated": false, "deprecationMessage": "" + }, + { + "name": "selectedOptionOffset", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "optional": true } ], "returnType": "number", "jsdoctags": [ { "name": { - "pos": 9417, - "end": 9428, + "pos": 9859, + "end": 9870, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -53016,8 +53710,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 9411, - "end": 9416, + "pos": 9853, + "end": 9858, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -53028,8 +53722,8 @@ }, { "name": { - "pos": 9489, - "end": 9501, + "pos": 9931, + "end": 9943, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -53040,8 +53734,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 9483, - "end": 9488, + "pos": 9925, + "end": 9930, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -53052,8 +53746,8 @@ }, { "name": { - "pos": 9535, - "end": 9556, + "pos": 9977, + "end": 9998, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -53064,8 +53758,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 9529, - "end": 9534, + "pos": 9971, + "end": 9976, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -53076,8 +53770,8 @@ }, { "name": { - "pos": 9605, - "end": 9616, + "pos": 10047, + "end": 10058, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -53088,8 +53782,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 9599, - "end": 9604, + "pos": 10041, + "end": 10046, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -53097,6 +53791,16 @@ "escapedText": "param" }, "comment": "

Height of the panel.

\n" + }, + { + "name": "selectedOptionOffset", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } } ] }, @@ -53682,8 +54386,8 @@ "jsdoctags": [ { "name": { - "pos": 10099, - "end": 10106, + "pos": 10143, + "end": 10150, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -53694,8 +54398,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 10093, - "end": 10098, + "pos": 10137, + "end": 10142, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -53706,8 +54410,8 @@ }, { "name": { - "pos": 10165, - "end": 10176, + "pos": 10209, + "end": 10220, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -53717,8 +54421,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 10159, - "end": 10164, + "pos": 10203, + "end": 10208, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -55403,7 +56107,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken<_OuiInkBarPositioner>(\r\n 'MatInkBarPositioner',\r\n {\r\n providedIn: 'root',\r\n factory: _OUI_INK_BAR_POSITIONER_FACTORY,\r\n }\r\n)", + "defaultValue": "new InjectionToken<_OuiInkBarPositioner>(\n 'MatInkBarPositioner',\n {\n providedIn: 'root',\n factory: _OUI_INK_BAR_POSITIONER_FACTORY,\n }\n)", "rawdescription": "Injection token for the OuiInkBar's Positioner.", "description": "

Injection token for the OuiInkBar's Positioner.

\n" }, @@ -55463,7 +56167,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken<\n () => ScrollStrategy\n>('oui-datepicker-scroll-strategy')", + "defaultValue": "new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-datepicker-scroll-strategy')", "rawdescription": "Injection token that determines the scroll handling while the calendar is open.", "description": "

Injection token that determines the scroll handling while the calendar is open.

\n" }, @@ -55475,7 +56179,7 @@ "deprecated": false, "deprecationMessage": "", "type": "object", - "defaultValue": "{\n provide: OUI_DATEPICKER_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY,\n}" + "defaultValue": "{\r\n provide: OUI_DATEPICKER_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_DATEPICKER_SCROLL_STRATEGY_FACTORY,\r\n}" } ], "ui/src/components/form-field/form-field.ts": [ @@ -55859,7 +56563,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "mixinColor(\r\n mixinDisableRipple(\r\n class {\r\n constructor(public _elementRef: ElementRef) {}\r\n }\r\n ),\r\n 'primary'\r\n)" + "defaultValue": "mixinColor(\n mixinDisableRipple(\n class {\n constructor(public _elementRef: ElementRef) {}\n }\n ),\n 'primary'\n)" }, { "name": "nextId", @@ -55883,7 +56587,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "mixinInkBarItem(\r\n mixinDisabled(\r\n class {\r\n elementRef: ElementRef;\r\n }\r\n )\r\n)" + "defaultValue": "mixinInkBarItem(\n mixinDisabled(\n class {\n elementRef: ElementRef;\n }\n )\n)" } ], "ui/src/components/tabs/tab-nav-bar/tab-nav-bar.ts": [ @@ -55895,7 +56599,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "mixinInkBarItem(\r\n mixinTabIndex(\r\n mixinDisableRipple(\r\n mixinDisabled(\r\n class {\r\n elementRef: ElementRef;\r\n }\r\n )\r\n )\r\n )\r\n)" + "defaultValue": "mixinInkBarItem(\n mixinTabIndex(\n mixinDisableRipple(\n mixinDisabled(\n class {\n elementRef: ElementRef;\n }\n )\n )\n )\n)" }, { "name": "nextUniqueId", @@ -56353,7 +57057,7 @@ "deprecated": false, "deprecationMessage": "", "type": "object", - "defaultValue": "{\n long: [\n 'Sunday',\n 'Monday',\n 'Tuesday',\n 'Wednesday',\n 'Thursday',\n 'Friday',\n 'Saturday',\n ],\n short: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n narrow: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sat'],\n}", + "defaultValue": "{\r\n long: [\r\n 'Sunday',\r\n 'Monday',\r\n 'Tuesday',\r\n 'Wednesday',\r\n 'Thursday',\r\n 'Friday',\r\n 'Saturday',\r\n ],\r\n short: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\r\n narrow: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sat'],\r\n}", "rawdescription": "The default day of the week names to use if Intl API is not available.", "description": "

The default day of the week names to use if Intl API is not available.

\n" }, @@ -56365,7 +57069,7 @@ "deprecated": false, "deprecationMessage": "", "type": "object", - "defaultValue": "{\n long: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n short: [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ],\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n}", + "defaultValue": "{\r\n long: [\r\n 'January',\r\n 'February',\r\n 'March',\r\n 'April',\r\n 'May',\r\n 'June',\r\n 'July',\r\n 'August',\r\n 'September',\r\n 'October',\r\n 'November',\r\n 'December',\r\n ],\r\n short: [\r\n 'Jan',\r\n 'Feb',\r\n 'Mar',\r\n 'Apr',\r\n 'May',\r\n 'Jun',\r\n 'Jul',\r\n 'Aug',\r\n 'Sep',\r\n 'Oct',\r\n 'Nov',\r\n 'Dec',\r\n ],\r\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\r\n}", "rawdescription": "The default month names to use if Intl API is not available.", "description": "

The default month names to use if Intl API is not available.

\n" }, @@ -56378,7 +57082,7 @@ "deprecationMessage": "", "type": "", "defaultValue": "/^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|(?:(?:\\+|-)\\d{2}:\\d{2}))?)?$/", - "rawdescription": "Matches strings that have the form of a valid RFC 3339 string\n(https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date\nbecause the regex will match strings an with out of bounds month, date, etc.", + "rawdescription": "Matches strings that have the form of a valid RFC 3339 string\r\n(https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date\r\nbecause the regex will match strings an with out of bounds month, date, etc.", "description": "

Matches strings that have the form of a valid RFC 3339 string\n(https://tools.ietf.org/html/rfc3339). Note that the string may not actually be a valid date\nbecause the regex will match strings an with out of bounds month, date, etc.

\n" }, { @@ -56430,7 +57134,7 @@ "deprecationMessage": "", "type": "number", "defaultValue": "650", - "rawdescription": "Amount of milliseconds to wait before starting to scroll the header automatically.\r\nSet a little conservatively in order to handle fake events dispatched on touch devices.", + "rawdescription": "Amount of milliseconds to wait before starting to scroll the header automatically.\nSet a little conservatively in order to handle fake events dispatched on touch devices.", "description": "

Amount of milliseconds to wait before starting to scroll the header automatically.\nSet a little conservatively in order to handle fake events dispatched on touch devices.

\n" }, { @@ -56442,7 +57146,7 @@ "deprecationMessage": "", "type": "number", "defaultValue": "100", - "rawdescription": "Interval in milliseconds at which to scroll the header\r\nwhile the user is holding their pointer.", + "rawdescription": "Interval in milliseconds at which to scroll the header\nwhile the user is holding their pointer.", "description": "

Interval in milliseconds at which to scroll the header\nwhile the user is holding their pointer.

\n" }, { @@ -56453,7 +57157,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "normalizePassiveListenerOptions({\r\n passive: true,\r\n}) as EventListenerOptions", + "defaultValue": "normalizePassiveListenerOptions({\n passive: true,\n}) as EventListenerOptions", "rawdescription": "Config used to bind passive event listeners", "description": "

Config used to bind passive event listeners

\n" } @@ -56479,7 +57183,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken(\r\n 'mat-sanity-checks',\r\n {\r\n providedIn: 'root',\r\n factory: MATERIAL_SANITY_CHECKS_FACTORY,\r\n }\r\n)", + "defaultValue": "new InjectionToken(\n 'mat-sanity-checks',\n {\n providedIn: 'root',\n factory: MATERIAL_SANITY_CHECKS_FACTORY,\n }\n)", "rawdescription": "Injection token that configures whether the Material sanity checks are enabled.", "description": "

Injection token that configures whether the Material sanity checks are enabled.

\n" } @@ -56531,7 +57235,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken<\n () => ScrollStrategy\n>('oui-menu-scroll-strategy')", + "defaultValue": "new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-menu-scroll-strategy')", "rawdescription": "Injection token that determines the scroll handling while the menu is open.", "description": "

Injection token that determines the scroll handling while the menu is open.

\n" }, @@ -56543,7 +57247,7 @@ "deprecated": false, "deprecationMessage": "", "type": "object", - "defaultValue": "{\n provide: OUI_MENU_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_MENU_SCROLL_STRATEGY_FACTORY,\n}" + "defaultValue": "{\r\n provide: OUI_MENU_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_MENU_SCROLL_STRATEGY_FACTORY,\r\n}" }, { "name": "passiveEventListenerOptions", @@ -56553,7 +57257,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "normalizePassiveListenerOptions({\n passive: true,\n})", + "defaultValue": "normalizePassiveListenerOptions({\r\n passive: true,\r\n})", "rawdescription": "Options for binding a passive event listener.", "description": "

Options for binding a passive event listener.

\n" } @@ -56657,7 +57361,7 @@ "deprecated": false, "deprecationMessage": "", "type": "OuiDateFormats", - "defaultValue": "{\r\n parse: {\r\n dateInput: null,\r\n },\r\n display: {\r\n dateInput: {\r\n year: 'numeric',\r\n day: '2-digit',\r\n month: '2-digit',\r\n },\r\n monthYearLabel: { year: 'numeric', month: 'short' },\r\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\r\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\r\n },\r\n}" + "defaultValue": "{\n parse: {\n dateInput: null,\n },\n display: {\n dateInput: {\n year: 'numeric',\n day: '2-digit',\n month: '2-digit',\n },\n monthYearLabel: { year: 'numeric', month: 'short' },\n dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },\n monthYearA11yLabel: { year: 'numeric', month: 'long' },\n },\n}" } ], "ui/src/components/datepicker/date-formats.ts": [ @@ -56922,7 +57626,7 @@ "deprecationMessage": "", "type": "", "defaultValue": "new InjectionToken('OuiTabLabel')", - "rawdescription": "Injection token that can be used to reference instances of `OuiTabLabel`. It serves as\r\nalternative token to the actual `OuiTabLabel` class which could cause unnecessary\r\nretention of the class and its directive metadata.", + "rawdescription": "Injection token that can be used to reference instances of `OuiTabLabel`. It serves as\nalternative token to the actual `OuiTabLabel` class which could cause unnecessary\nretention of the class and its directive metadata.", "description": "

Injection token that can be used to reference instances of OuiTabLabel. It serves as\nalternative token to the actual OuiTabLabel class which could cause unnecessary\nretention of the class and its directive metadata.

\n" } ], @@ -56935,8 +57639,8 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken(\r\n 'OuiTabContent'\r\n)", - "rawdescription": "Injection token that can be used to reference instances of `OuiTabContent`. It serves as\r\nalternative token to the actual `OuiTabContent` class which could cause unnecessary\r\nretention of the class and its directive metadata.", + "defaultValue": "new InjectionToken(\n 'OuiTabContent'\n)", + "rawdescription": "Injection token that can be used to reference instances of `OuiTabContent`. It serves as\nalternative token to the actual `OuiTabContent` class which could cause unnecessary\nretention of the class and its directive metadata.", "description": "

Injection token that can be used to reference instances of OuiTabContent. It serves as\nalternative token to the actual OuiTabContent class which could cause unnecessary\nretention of the class and its directive metadata.

\n" } ], @@ -56949,7 +57653,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken(\r\n 'OUI_TABS_CONFIG'\r\n)", + "defaultValue": "new InjectionToken(\n 'OUI_TABS_CONFIG'\n)", "rawdescription": "Injection token that can be used to provide the default options the tabs module.", "description": "

Injection token that can be used to provide the default options the tabs module.

\n" } @@ -56963,7 +57667,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken('oui-tooltip-default-options', {\n providedIn: 'root',\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\n })", + "defaultValue": "new InjectionToken('oui-tooltip-default-options', {\r\n providedIn: 'root',\r\n factory: OUI_TOOLTIP_DEFAULT_OPTIONS_FACTORY,\r\n })", "rawdescription": "Injection token to be used to override the default options for `ouiTooltip`.", "description": "

Injection token to be used to override the default options for ouiTooltip.

\n" }, @@ -56975,7 +57679,7 @@ "deprecated": false, "deprecationMessage": "", "type": "", - "defaultValue": "new InjectionToken<\n () => ScrollStrategy\n>('oui-tooltip-scroll-strategy')", + "defaultValue": "new InjectionToken<\r\n () => ScrollStrategy\r\n>('oui-tooltip-scroll-strategy')", "rawdescription": "Injection token that determines the scroll handling while a tooltip is visible.", "description": "

Injection token that determines the scroll handling while a tooltip is visible.

\n" }, @@ -56987,7 +57691,7 @@ "deprecated": false, "deprecationMessage": "", "type": "object", - "defaultValue": "{\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\n}" + "defaultValue": "{\r\n provide: OUI_TOOLTIP_SCROLL_STRATEGY,\r\n deps: [Overlay],\r\n useFactory: OUI_TOOLTIP_SCROLL_STRATEGY_FACTORY,\r\n}" }, { "name": "SCROLL_THROTTLE_MS", @@ -57061,7 +57765,7 @@ "deprecated": false, "deprecationMessage": "", "type": "literal type", - "defaultValue": "{\r\n /** Animation translates a tab along the X axis. */\r\n translateTab: trigger('translateTab', [\r\n // Transitions to `none` instead of 0, because some browsers might blur the content.\r\n state(\r\n 'center, void, left-origin-center, right-origin-center',\r\n style({ transform: 'none' })\r\n ),\r\n\r\n // If the tab is either on the left or right, we additionally add a `min-height` of 1px\r\n // in order to ensure that the element has a height before its state changes. This is\r\n // necessary because Chrome does seem to skip the transition in RTL mode if the element does\r\n // not have a static height and is not rendered. See related issue: #9465\r\n state(\r\n 'left',\r\n style({\r\n transform: 'translate3d(-100%, 0, 0)',\r\n minHeight: '1px',\r\n\r\n // Normally this is redundant since we detach the content from the DOM, but if the user\r\n // opted into keeping the content in the DOM, we have to hide it so it isn't focusable.\r\n visibility: 'hidden',\r\n })\r\n ),\r\n state(\r\n 'right',\r\n style({\r\n transform: 'translate3d(100%, 0, 0)',\r\n minHeight: '1px',\r\n visibility: 'hidden',\r\n })\r\n ),\r\n\r\n transition(\r\n '* => left, * => right, left => center, right => center',\r\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')\r\n ),\r\n transition('void => left-origin-center', [\r\n style({ transform: 'translate3d(-100%, 0, 0)', visibility: 'hidden' }),\r\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),\r\n ]),\r\n transition('void => right-origin-center', [\r\n style({ transform: 'translate3d(100%, 0, 0)', visibility: 'hidden' }),\r\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),\r\n ]),\r\n ]),\r\n}", + "defaultValue": "{\n /** Animation translates a tab along the X axis. */\n translateTab: trigger('translateTab', [\n // Transitions to `none` instead of 0, because some browsers might blur the content.\n state(\n 'center, void, left-origin-center, right-origin-center',\n style({ transform: 'none' })\n ),\n\n // If the tab is either on the left or right, we additionally add a `min-height` of 1px\n // in order to ensure that the element has a height before its state changes. This is\n // necessary because Chrome does seem to skip the transition in RTL mode if the element does\n // not have a static height and is not rendered. See related issue: #9465\n state(\n 'left',\n style({\n transform: 'translate3d(-100%, 0, 0)',\n minHeight: '1px',\n\n // Normally this is redundant since we detach the content from the DOM, but if the user\n // opted into keeping the content in the DOM, we have to hide it so it isn't focusable.\n visibility: 'hidden',\n })\n ),\n state(\n 'right',\n style({\n transform: 'translate3d(100%, 0, 0)',\n minHeight: '1px',\n visibility: 'hidden',\n })\n ),\n\n transition(\n '* => left, * => right, left => center, right => center',\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')\n ),\n transition('void => left-origin-center', [\n style({ transform: 'translate3d(-100%, 0, 0)', visibility: 'hidden' }),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),\n ]),\n transition('void => right-origin-center', [\n style({ transform: 'translate3d(100%, 0, 0)', visibility: 'hidden' }),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),\n ]),\n ]),\n}", "rawdescription": "Animations used by the Material tabs.", "description": "

Animations used by the Material tabs.

\n" } @@ -57100,6 +57804,18 @@ "defaultValue": "34" } ], + "ui/src/stories/tooltip/tooltip.stories.ts": [ + { + "name": "Regular", + "ctype": "miscellaneous", + "subtype": "variable", + "file": "ui/src/stories/tooltip/tooltip.stories.ts", + "deprecated": false, + "deprecationMessage": "", + "type": "object", + "defaultValue": "{\r\n render: (props) => ({\r\n moduleMetadata: {\r\n imports: [OuiTooltipModule, OuiIconModule, BrowserAnimationsModule],\r\n schemas: [],\r\n declarations: [OuiTooltipStorybook],\r\n },\r\n\r\n template: ``,\r\n\r\n props: {\r\n ...props,\r\n changed: action('change'),\r\n },\r\n }),\r\n\r\n name: 'Regular',\r\n\r\n parameters: {\r\n docs: {\r\n source: {\r\n code: ``,\r\n },\r\n },\r\n },\r\n\r\n args: {\r\n theme: THEME[0],\r\n disabled: false,\r\n ouiTooltip: 'This is a tooltip',\r\n ouiTooltipPosition: TOOLTIPPOSITION[0],\r\n },\r\n\r\n argTypes: {\r\n theme: {\r\n options: THEME,\r\n\r\n control: {\r\n type: 'select',\r\n },\r\n },\r\n\r\n ouiTooltipPosition: {\r\n options: TOOLTIPPOSITION,\r\n\r\n control: {\r\n type: 'select',\r\n },\r\n },\r\n },\r\n}" + } + ], "ui/src/components/dialog/dialog-ref.ts": [ { "name": "uniqueId", @@ -57430,8 +58146,8 @@ "jsdoctags": [ { "name": { - "pos": 8577, - "end": 8588, + "pos": 9019, + "end": 9030, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57442,8 +58158,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 8571, - "end": 8576, + "pos": 9013, + "end": 9018, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57454,8 +58170,8 @@ }, { "name": { - "pos": 8647, - "end": 8654, + "pos": 9089, + "end": 9096, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57466,8 +58182,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 8641, - "end": 8646, + "pos": 9083, + "end": 9088, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57478,8 +58194,8 @@ }, { "name": { - "pos": 8698, - "end": 8710, + "pos": 9140, + "end": 9152, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57490,8 +58206,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 8692, - "end": 8697, + "pos": 9134, + "end": 9139, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57534,14 +58250,21 @@ "type": "number", "deprecated": false, "deprecationMessage": "" + }, + { + "name": "selectedOptionOffset", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "optional": true } ], "returnType": "number", "jsdoctags": [ { "name": { - "pos": 9417, - "end": 9428, + "pos": 9859, + "end": 9870, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57552,8 +58275,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 9411, - "end": 9416, + "pos": 9853, + "end": 9858, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57564,8 +58287,8 @@ }, { "name": { - "pos": 9489, - "end": 9501, + "pos": 9931, + "end": 9943, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57576,8 +58299,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 9483, - "end": 9488, + "pos": 9925, + "end": 9930, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57588,8 +58311,8 @@ }, { "name": { - "pos": 9535, - "end": 9556, + "pos": 9977, + "end": 9998, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57600,8 +58323,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 9529, - "end": 9534, + "pos": 9971, + "end": 9976, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57612,8 +58335,8 @@ }, { "name": { - "pos": 9605, - "end": 9616, + "pos": 10047, + "end": 10058, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57624,8 +58347,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 9599, - "end": 9604, + "pos": 10041, + "end": 10046, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -57633,6 +58356,16 @@ "escapedText": "param" }, "comment": "

Height of the panel.

\n" + }, + { + "name": "selectedOptionOffset", + "type": "number", + "deprecated": false, + "deprecationMessage": "", + "optional": true, + "tagName": { + "text": "param" + } } ] } @@ -58483,8 +59216,8 @@ "jsdoctags": [ { "name": { - "pos": 10099, - "end": 10106, + "pos": 10143, + "end": 10150, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -58495,8 +59228,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 10093, - "end": 10098, + "pos": 10137, + "end": 10142, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -58507,8 +59240,8 @@ }, { "name": { - "pos": 10165, - "end": 10176, + "pos": 10209, + "end": 10220, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -58518,8 +59251,8 @@ "deprecated": false, "deprecationMessage": "", "tagName": { - "pos": 10159, - "end": 10164, + "pos": 10203, + "end": 10208, "flags": 16777216, "modifierFlagsCache": 0, "transformFlags": 0, @@ -61158,8 +61891,8 @@ "type": "component", "linktype": "component", "name": "OuiDialogContainer", - "coveragePercent": 70, - "coverageCount": "12/17", + "coveragePercent": 73, + "coverageCount": "14/19", "status": "good" }, { @@ -61314,8 +62047,8 @@ "type": "class", "linktype": "classe", "name": "OuiDialogRef", - "coveragePercent": 84, - "coverageCount": "16/19", + "coveragePercent": 85, + "coverageCount": "17/20", "status": "very-good" }, { @@ -62417,7 +63150,7 @@ "linktype": "component", "name": "OuiSelect", "coveragePercent": 82, - "coverageCount": "98/119", + "coverageCount": "110/134", "status": "very-good" }, { @@ -63061,8 +63794,8 @@ "type": "component", "linktype": "component", "name": "OuiTabBody", - "coveragePercent": 83, - "coverageCount": "20/24", + "coveragePercent": 80, + "coverageCount": "20/25", "status": "very-good" }, { @@ -63453,7 +64186,7 @@ "linktype": "component", "name": "OuiAutocompleteGroupStorybook", "coveragePercent": 0, - "coverageCount": "0/8", + "coverageCount": "0/10", "status": "low" }, { @@ -63462,7 +64195,7 @@ "linktype": "component", "name": "OuiAutocompleteStorybook", "coveragePercent": 0, - "coverageCount": "0/7", + "coverageCount": "0/9", "status": "low" }, { @@ -63510,7 +64243,7 @@ "linktype": "component", "name": "OuiIconButtonStorybook", "coveragePercent": 0, - "coverageCount": "0/2", + "coverageCount": "0/4", "status": "low" }, { @@ -63846,7 +64579,7 @@ "linktype": "component", "name": "OuiTabStorybook", "coveragePercent": 0, - "coverageCount": "0/2", + "coverageCount": "0/4", "status": "low" }, { @@ -63857,6 +64590,16 @@ "coveragePercent": 0, "coverageCount": "0/5", "status": "low" + }, + { + "filePath": "ui/src/stories/tooltip/tooltip.stories.ts", + "type": "variable", + "linktype": "miscellaneous", + "linksubtype": "variable", + "name": "Regular", + "coveragePercent": 0, + "coverageCount": "0/1", + "status": "low" } ] } diff --git a/migration-storybook.log b/migration-storybook.log index 187920231..a21a8d94f 100644 --- a/migration-storybook.log +++ b/migration-storybook.log @@ -230,3 +230,237 @@ SyntaxError: .eslintrc.json: Unexpected token / in JSON at position 1027 │ │ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭───────────────────────────────────────────────────────────────╮ +│ │ +│ Upgrading Storybook from version 0.0.0 to version 8.1.8.. │ +│ │ +╰───────────────────────────────────────────────────────────────╯ +info Checking for upgrade blockers... +No blockers found. + +info Updating dependencies in package.json.. +Installing dependencies... + +npm WARN EBADENGINE Unsupported engine { +npm WARN EBADENGINE package: '@es-joy/jsdoccomment@0.36.1', +npm WARN EBADENGINE required: { node: '^14 || ^16 || ^17 || ^18 || ^19' }, +npm WARN EBADENGINE current: { node: 'v20.14.0', npm: '10.5.0' } +npm WARN EBADENGINE } +npm WARN EBADENGINE Unsupported engine { +npm WARN EBADENGINE package: 'eslint-plugin-jsdoc@39.6.4', +npm WARN EBADENGINE required: { node: '^14 || ^16 || ^17 || ^18 || ^19' }, +npm WARN EBADENGINE current: { node: 'v20.14.0', npm: '10.5.0' } +npm WARN EBADENGINE } + +removed 6 packages, changed 2 packages, and audited 2081 packages in 49s + +377 packages are looking for funding + run `npm fund` for details + +9 vulnerabilities (3 moderate, 5 high, 1 critical) + +To address issues that do not require attention, run: + npm audit fix + +Some issues need review, and may require choosing +a different dependency. + +Run `npm audit` for details. +🔎 checking possible migrations.. + +🔎 found a 'remove-argtypes-regex' migration: +╭ Manual migration detected ───────────────────────────────────────────────────────────────────╮ +│ │ +│ Attention: We've detected that you're using argTypesRegex: │ +│ │ +│ .storybook\preview.js │ +│ 5 | │ +│ 6 | export const parameters = { │ +│ > 7 | actions: { argTypesRegex: '^on[A-Z].*' }, │ +│ | ^^^^^^^^^^^^^ │ +│ 8 | controls: { │ +│ 9 | matchers: { │ +│ 10 | color: /(background|color)$/i, │ +│ │ +│ Storybook's play functions let you render your stories interactively. │ +│ │ +│ In the past, play functions mocked action args implicitly by analyzing the argTypesRegex │ +│ in your preview.js|ts file. │ +│ │ +│ However, Storybook 8 changes this behavior, and we now recommend using the │ +│ (fn) function to mock your component's methods instead. │ +│ │ +│ Use the following command to check for implied mocked actions in your play functions: │ +│ npx storybook migrate find-implicit-spies --glob="**/*.stories.@(js|jsx|ts|tsx)" │ +│ │ +│ Then, refer to our docs to migrate your play functions to Storybook 8: │ +│ https://storybook.js.org/docs/8.0/essentials/actions#via-storybooktest-fn-spy-function │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────╯ + +√ Select continue once you have made the required changes, or quit to exit the migration process ... quit / continue + +🔎 found a 'mdx-to-csf' migration: +╭ Automigration detected ──────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ We've detected your project has one or more globs in your 'stories' config that matches .stories.mdx files: │ +│ "../ui/src/stories/**/*.stories.mdx" │ +│ "../ui/src/stories/**/*.stories.@(js|jsx|ts|tsx)" │ +│ │ +│ In Storybook 7, we have deprecated defining stories in MDX files, and consequently have changed the suffix to │ +│ simply .mdx. Since Storybook 8, we have removed the support of story definition in MDX files entirely. Therefore │ +│ '.stories.mdx' files aren't supported anymore. │ +│ │ +│ Now, since Storybook 8.0, we have removed support for .stories.mdx files. │ +│ │ +│ We can automatically migrate your 'stories' config to include any .mdx file instead of just .stories.mdx. │ +│ That would result in the following 'stories' config: │ +│ "../ui/src/stories/**/*.mdx" │ +│ "../ui/src/stories/**/*.stories.@(js|jsx|ts|tsx)" │ +│ │ +│ Additionally, we will run the 'mdx-to-csf' codemod for you, which tries to transform '*.stories.mdx' files to │ +│ '*.stories.js' and '*.mdx' files. │ +│ │ +│ To learn more about this change, see: https://storybook.js.org/docs/migration-guide#storiesmdx-to-mdxcsf │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +√ Do you want to run the 'mdx-to-csf' migration on your project? ... yes +✅ Setting 'stories' config: +[ + "../ui/src/stories/**/*.mdx", + "../ui/src/stories/**/*.stories.@(js|jsx|ts|tsx)" +] +√ Please enter the glob for your MDX stories ... ./src/**/*.stories.mdx +=> Applying mdx-to-csf: 0 files +=> No matching files for glob: ./src/**/*.stories.mdx +The migration successfully updated your 'stories' config to include any .mdx file instead of just .stories.mdx. + +It also ran the 'mdx-to-csf' codemod to convert your MDX stories to CSF format. +This codemod is not perfect however, so you may need to manually fix any issues it couldn't handle. +✅ ran mdx-to-csf migration + +🔎 found a 'remove-react-dependency' migration: +╭ Manual migration detected ───────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ We detected that your project has a dependency for "react" that it might not need. │ +│ Nothing breaks by having it, you can safely ignore this message, if you wish. │ +│ │ +│ Storybook asked you to add "react" as a direct dependency in the past when upgrading from Storybook 6 to 7. │ +│ However, since version 8.0, Storybook no longer requires you to provide "react" as a dependency. │ +│ Some community addons might still wrongfully list "react" and "react-dom" as required peer dependencies, but │ +│ since Storybook 7.6 it should not be needed in the majority of cases. │ +│ │ +│ If you know you are not using React outside of Storybook, it should be safe to remove the "react" and │ +│ "react-dom" dependencies from your project's package.json. │ +│ Storybook cannot do this automatically as removing it might break your project, so it should be done manually │ +│ with care. │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ + +√ Select continue once you have made the required changes, or quit to exit the migration process ... quit / continue + +🔎 found a 'mdx1to3' migration: +╭ Automigration detected ──────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ We've found 18 '.stories.mdx' files in your project. │ +│ │ +│ Storybook has upgraded to MDX3 (https://mdxjs.com/blog/v3/). MDX3 itself doesn't contain disruptive breaking │ +│ changes, whereas the transition from MDX1 to MDX2 was a significant change. │ +│ We can try to automatically upgrade your MDX files to MDX3 format using some common patterns. │ +│ │ +│ After this install completes, and before you start Storybook, we strongly recommend reading the MDX2 section │ +│ of the 7.0 migration guide. It contains useful tools for detecting and fixing any remaining issues. │ +│ │ +│ https://storybook.js.org/migration-guides/7.0 │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +√ Do you want to run the 'mdx1to3' migration on your project? ... yes +🆗 Unmodified checkbox.stories.mdx +🆗 Unmodified button.stories.mdx +🆗 Unmodified dialog.stories.mdx +🆗 Unmodified form-field.stories.mdx +🆗 Unmodified panel.stories.mdx +🆗 Unmodified autocomplete.stories.mdx +🆗 Unmodified menu.stories.mdx +🆗 Unmodified progress-bar.stories.mdx +🆗 Unmodified select.stories.mdx +🆗 Unmodified icon.stories.mdx +🆗 Unmodified radio.stories.mdx +🆗 Unmodified slide-toggle.stories.mdx +🆗 Unmodified progress-spinner.stories.mdx +🆗 Unmodified table.stories.mdx +🆗 Unmodified scrollbar.stories.mdx +🆗 Unmodified tabs.stories.mdx +🆗 Unmodified tooltip.stories.mdx +🆗 Unmodified textarea.stories.mdx +✅ ran mdx1to3 migration + +🔎 found a 'upgradeStorybookRelatedDependencies' migration: +╭ Automigration detected ──────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ You're upgrading to the latest version of Storybook. We recommend upgrading the following packages: │ +│ - eslint-plugin-storybook: 0.6.13 => 0.8.0 │ +│ │ +│ After upgrading, we will run the dedupe command, which could possibly have effects on dependencies that are not │ +│ Storybook related. │ +│ see: https://docs.npmjs.com/cli/commands/npm-dedupe │ +│ │ +│ Do you want to proceed (upgrade the detected packages)? │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +√ Do you want to run the 'upgradeStorybookRelatedDependencies' migration on your project? ... no + +🔎 found a 'visual-tests-addon' migration: +╭ Automigration detected ──────────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ New to Storybook 8: Storybook's Visual Tests addon helps you catch unintentional changes/bugs in your stories. │ +│ The addon is powered by Chromatic, a cloud-based testing tool developed by Storybook's core team. │ +│ │ +│ Learn more: https://storybook.js.org/docs/writing-tests/visual-testing │ +│ │ +│ Install Visual Tests addon in your project? │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +√ Do you want to run the 'visual-tests-addon' migration on your project? ... no + +🔎 found a 'autodocs-tags' migration: +╭ Automigration detected ───────────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ The docs.autodocs setting in .storybook\main.js is deprecated. │ +│ │ +│ Learn more: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#mainjs-docsautodocs-is-deprecated │ +│ │ +│ Remove docs.autodocs and update .storybook\preview.js? │ +│ │ +╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +√ Do you want to run the 'autodocs-tags' migration on your project? ... yes +✅ Adding "autodocs" tag to .storybook\preview.js +✅ Removing "docs.autodocs" from .storybook\main.js +✅ ran autodocs-tags migration + +╭ Migration check ran successfully ────────────────────────────────────────────────────────────────────────────────────╮ +│ │ +│ Successful migrations: │ +│ │ +│ mdx-to-csf, mdx1to3, autodocs-tags │ +│ │ +│ Manual migrations: │ +│ │ +│ remove-argtypes-regex, remove-react-dependency │ +│ │ +│ Skipped migrations: │ +│ │ +│ upgradeStorybookRelatedDependencies, visual-tests-addon │ +│ │ +│ ───────────────────────────────────────────────── │ +│ │ +│ If you'd like to run the migrations again, you can do so by running 'npx storybook automigrate' │ +│ │ +│ The automigrations try to migrate common patterns in your project, but might not contain everything needed to │ +│ migrate to the latest version of Storybook. │ +│ │ +│ Please check the changelog and migration guide for manual migrations and more information: │ +│ https://storybook.js.org/docs/8.0/migration-guide │ +│ And reach out on Discord if you need help: https://discord.gg/storybook │ +│ │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/package-lock.json b/package-lock.json index 1e12f146f..d0dd6bf9c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,59 +1,60 @@ { "name": "oncehub-ui", - "version": "8.0.30", + "version": "8.0.33", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "oncehub-ui", - "version": "8.0.30", - "dependencies": { - "@angular-devkit/architect": "0.1601.6", - "@angular-devkit/core": "16.1.6", - "@angular/animations": "16.1.7", - "@angular/cdk": "15.2.9", - "@angular/common": "16.1.7", - "@angular/compiler": "16.1.7", - "@angular/core": "16.1.7", - "@angular/forms": "16.1.7", - "@angular/platform-browser": "16.1.7", - "@angular/platform-browser-dynamic": "16.1.7", - "@angular/router": "16.1.7", + "version": "8.0.33", + "dependencies": { + "@angular-devkit/architect": "0.1801.0", + "@angular-devkit/core": "18.2.0", + "@angular/animations": "18.2.0", + "@angular/cdk": "18.2.0", + "@angular/common": "18.2.0", + "@angular/compiler": "18.2.0", + "@angular/core": "18.2.0", + "@angular/forms": "18.2.0", + "@angular/platform-browser": "18.2.0", + "@angular/platform-browser-dynamic": "18.2.0", + "@angular/router": "18.2.0", "core-js": "3.26.1", "rxjs": "7.5.7", "tslib": "2.4.1", - "zone.js": "^0.13.1" + "zone.js": "^0.14.7" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.15", - "@angular-eslint/builder": "15.1.0", - "@angular-eslint/eslint-plugin": "15.1.0", - "@angular-eslint/eslint-plugin-template": "15.1.0", - "@angular-eslint/template-parser": "15.1.0", - "@angular/cli": "16.1.6", - "@angular/compiler-cli": "16.1.7", - "@angular/elements": "16.1.7", - "@angular/language-service": "16.1.7", + "@angular-devkit/build-angular": "18.2.5", + "@angular-eslint/builder": "18.2.0", + "@angular-eslint/eslint-plugin": "18.2.0", + "@angular-eslint/eslint-plugin-template": "18.2.0", + "@angular-eslint/template-parser": "18.2.0", + "@angular/cli": "18.2.1", + "@angular/compiler-cli": "18.2.0", + "@angular/elements": "18.2.0", + "@angular/language-service": "18.2.0", "@babel/core": "7.20.5", "@compodoc/compodoc": "^1.1.25", - "@storybook/addon-actions": "7.1.0", - "@storybook/addon-controls": "7.1.0", - "@storybook/addon-essentials": "7.1.0", - "@storybook/addon-links": "7.1.0", - "@storybook/addon-mdx-gfm": "^7.1.0", - "@storybook/angular": "^7.6.7", + "@storybook/addon-actions": "^8.3.1", + "@storybook/addon-controls": "^8.3.1", + "@storybook/addon-essentials": "^8.3.1", + "@storybook/addon-links": "^8.3.1", + "@storybook/addon-mdx-gfm": "^8.3.1", + "@storybook/angular": "^8.3.1", + "@storybook/blocks": "^8.3.1", "@storybook/storybook-deployer": "2.8.16", "@types/jasmine": "4.3.0", "@types/node": "18.11.9", - "@typescript-eslint/eslint-plugin": "5.45.0", - "@typescript-eslint/parser": "5.45.0", + "@typescript-eslint/eslint-plugin": "^8.5.0", + "@typescript-eslint/parser": "^8.5.0", "@webcomponents/custom-elements": "1.5.1", "babel-loader": "9.1.0", - "eslint": "8.28.0", - "eslint-plugin-import": "2.26.0", - "eslint-plugin-jsdoc": "39.6.4", + "eslint": "8.57.0", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-jsdoc": "50.2.2", "eslint-plugin-prefer-arrow": "1.2.3", - "eslint-plugin-storybook": "^0.6.13", + "eslint-plugin-storybook": "^0.8.0", "gulp": "5.0.0", "jasmine-core": "4.1.0", "jasmine-spec-reporter": "7.0.0", @@ -63,7 +64,7 @@ "karma-jasmine": "4.0.1", "karma-jasmine-html-reporter": "1.7.0", "karma-junit-reporter": "2.0.1", - "ng-packagr": "16.1.0", + "ng-packagr": "18.1.0", "prettier": "2.8.0", "puppeteer": "22.11.1", "react": "^18.2.0", @@ -71,148 +72,190 @@ "rimraf": "3.0.2", "sass": "1.50.1", "scss-bundle": "3.1.2", - "storybook": "^7.1.0", + "storybook": "^8.3.1", "ts-node": "10.7.0", - "typescript": "5.1.6" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "typescript": "5.4.5" } }, "node_modules/@aduh95/viz.js": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@aduh95/viz.js/-/viz.js-3.4.0.tgz", "integrity": "sha512-KI2nVf9JdwWCXqK6RVf+9/096G7VWN4Z84mnynlyZKao2xQENW8WNEjLmvdlxS5X8PNWXFC1zqwm7tveOXw/4A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@angular-devkit/architect": { - "version": "0.1601.6", + "version": "0.1801.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1801.0.tgz", + "integrity": "sha512-iZa3J3CrZT6MKiHPw8ijgVwMyCMewCsP4xc75SetUwF/yuqRUHygALs5jJVZQFQjSFUrkg9gqXa1cCjFDwpT8A==", "license": "MIT", "dependencies": { - "@angular-devkit/core": "16.1.6", + "@angular-devkit/core": "18.1.0", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.1.0.tgz", + "integrity": "sha512-6eXQDzHZCbpSMLv9Ohl+1QyLVDmGEXpuuHz3y64LfUTP0aEiBaxk96FjLXIxzJ4f2pbbW2XHzc+yuboGToRA0w==", + "license": "MIT", + "dependencies": { + "ajv": "8.16.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/architect/node_modules/ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/@angular-devkit/architect/node_modules/rxjs": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.15.tgz", - "integrity": "sha512-gw9wQENYVNUCB2bnzk0yKd6YGlemDwuwKnrPnSm4myyMuScZpW+e+zliGW+JXRuVWZqiTJNcdd58e4CrrreILg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.15", - "@angular-devkit/build-webpack": "0.1602.15", - "@angular-devkit/core": "16.2.15", - "@babel/core": "7.22.9", - "@babel/generator": "7.22.9", - "@babel/helper-annotate-as-pure": "7.22.5", - "@babel/helper-split-export-declaration": "7.22.6", - "@babel/plugin-proposal-async-generator-functions": "7.20.7", - "@babel/plugin-transform-async-to-generator": "7.22.5", - "@babel/plugin-transform-runtime": "7.22.9", - "@babel/preset-env": "7.22.9", - "@babel/runtime": "7.22.6", - "@babel/template": "7.22.5", - "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.15", - "@vitejs/plugin-basic-ssl": "1.0.1", + "version": "18.2.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.2.5.tgz", + "integrity": "sha512-dIvb0AHoRIMM6tLuG4t6lDDslSAYP77wqytodsN317UzFOuuCPernXbO8NJs+QHxj09nPsem1T5vnvpO2E/PVQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1802.5", + "@angular-devkit/build-webpack": "0.1802.5", + "@angular-devkit/core": "18.2.5", + "@angular/build": "18.2.5", + "@babel/core": "7.25.2", + "@babel/generator": "7.25.0", + "@babel/helper-annotate-as-pure": "7.24.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-transform-async-generator-functions": "7.25.0", + "@babel/plugin-transform-async-to-generator": "7.24.7", + "@babel/plugin-transform-runtime": "7.24.7", + "@babel/preset-env": "7.25.3", + "@babel/runtime": "7.25.0", + "@discoveryjs/json-ext": "0.6.1", + "@ngtools/webpack": "18.2.5", + "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.14", + "autoprefixer": "10.4.20", "babel-loader": "9.1.3", - "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.21.5", - "chokidar": "3.5.3", - "copy-webpack-plugin": "11.0.0", - "critters": "0.0.20", - "css-loader": "6.8.1", - "esbuild-wasm": "0.18.17", - "fast-glob": "3.3.1", - "guess-parser": "0.4.22", - "https-proxy-agent": "5.0.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.2.0", + "copy-webpack-plugin": "12.0.2", + "critters": "0.0.24", + "css-loader": "7.1.2", + "esbuild-wasm": "0.23.0", + "fast-glob": "3.3.2", + "http-proxy-middleware": "3.0.0", + "https-proxy-agent": "7.0.5", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", "karma-source-map-support": "1.4.0", - "less": "4.1.3", - "less-loader": "11.1.0", + "less": "4.2.0", + "less-loader": "12.2.0", "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.1", - "magic-string": "0.30.1", - "mini-css-extract-plugin": "2.7.6", - "mrmime": "1.0.1", - "open": "8.4.2", + "loader-utils": "3.3.1", + "magic-string": "0.30.11", + "mini-css-extract-plugin": "2.9.0", + "mrmime": "2.0.0", + "open": "10.1.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", - "picomatch": "2.3.1", - "piscina": "4.0.0", - "postcss": "8.4.31", - "postcss-loader": "7.3.3", + "picomatch": "4.0.2", + "piscina": "4.6.1", + "postcss": "8.4.41", + "postcss-loader": "8.1.1", "resolve-url-loader": "5.0.0", "rxjs": "7.8.1", - "sass": "1.64.1", - "sass-loader": "13.3.2", - "semver": "7.5.4", - "source-map-loader": "4.0.1", + "sass": "1.77.6", + "sass-loader": "16.0.0", + "semver": "7.6.3", + "source-map-loader": "5.0.0", "source-map-support": "0.5.21", - "terser": "5.19.2", - "text-table": "0.2.0", + "terser": "5.31.6", "tree-kill": "1.2.2", - "tslib": "2.6.1", - "vite": "4.5.3", + "tslib": "2.6.3", + "vite": "5.4.6", + "watchpack": "2.4.1", "webpack": "5.94.0", - "webpack-dev-middleware": "6.1.2", - "webpack-dev-server": "4.15.1", - "webpack-merge": "5.9.0", + "webpack-dev-middleware": "7.4.2", + "webpack-dev-server": "5.0.4", + "webpack-merge": "6.0.1", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.18.17" + "esbuild": "0.23.0" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "@angular/localize": "^16.0.0", - "@angular/platform-server": "^16.0.0", - "@angular/service-worker": "^16.0.0", + "@angular/compiler-cli": "^18.0.0", + "@angular/localize": "^18.0.0", + "@angular/platform-server": "^18.0.0", + "@angular/service-worker": "^18.0.0", + "@web/test-runner": "^0.18.0", + "browser-sync": "^3.0.2", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^16.0.0", + "ng-packagr": "^18.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.9.3 <5.2" + "typescript": ">=5.4 <5.6" }, "peerDependenciesMeta": { "@angular/localize": { @@ -224,6 +267,12 @@ "@angular/service-worker": { "optional": true }, + "@web/test-runner": { + "optional": true + }, + "browser-sync": { + "optional": true + }, "jest": { "optional": true }, @@ -245,35 +294,35 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1602.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", - "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", + "version": "0.1802.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.5.tgz", + "integrity": "sha512-c7sVoW85Yqj7IYvNKxtNSGS5I7gWpORorg/xxLZX3OkHWXDrwYbb5LN/2p5/Aytxyb0aXl4o5fFOu6CUwcaLUw==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.2.15", + "@angular-devkit/core": "18.2.5", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", - "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "version": "18.2.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.5.tgz", + "integrity": "sha512-r9TumPlJ8PvA2+yz4sp+bUHgtznaVKzhvXTN5qL1k4YP8LJ7iZWMR2FOP+HjukHZOTsenzmV9pszbogabqwoZQ==", "dev": true, "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -286,26 +335,95 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular/build": { + "version": "18.2.5", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.2.5.tgz", + "integrity": "sha512-XWkmjzgeUga0SJ0lYSYcTuYOWTyqcln2mNfBp7Ae/GZ+/7+APbedsIZEiZGZwveOIyOpTM5wguNSoe9khDl5Ig==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.1802.5", + "@babel/core": "7.25.2", + "@babel/helper-annotate-as-pure": "7.24.7", + "@babel/helper-split-export-declaration": "7.24.7", + "@babel/plugin-syntax-import-attributes": "7.24.7", + "@inquirer/confirm": "3.1.22", + "@vitejs/plugin-basic-ssl": "1.1.0", + "browserslist": "^4.23.0", + "critters": "0.0.24", + "esbuild": "0.23.0", + "fast-glob": "3.3.2", + "https-proxy-agent": "7.0.5", + "listr2": "8.2.4", + "lmdb": "3.0.13", + "magic-string": "0.30.11", + "mrmime": "2.0.0", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "4.0.2", + "piscina": "4.6.1", + "rollup": "4.20.0", + "sass": "1.77.6", + "semver": "7.6.3", + "vite": "5.4.6", + "watchpack": "2.4.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^18.0.0", + "@angular/localize": "^18.0.0", + "@angular/platform-server": "^18.0.0", + "@angular/service-worker": "^18.0.0", + "less": "^4.2.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=5.4 <5.6" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", + "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { @@ -321,221 +439,317 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@esbuild/win32-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", - "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/@angular-devkit/build-angular/node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@babel/helper-plugin-utils": "^7.24.7" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "ajv": "^8.8.2" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "node_modules/@angular-devkit/build-angular/node_modules/@inquirer/confirm": { + "version": "3.1.22", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.1.22.tgz", + "integrity": "sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg==", "dev": true, "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" + "@inquirer/core": "^9.0.10", + "@inquirer/type": "^1.5.2" }, "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" + "node": ">=18" } }, - "node_modules/@angular-devkit/build-angular/node_modules/esbuild": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", - "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz", + "integrity": "sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==", + "cpu": [ + "arm" + ], "dev": true, - "hasInstallScript": true, "optional": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.17", - "@esbuild/android-arm64": "0.18.17", - "@esbuild/android-x64": "0.18.17", - "@esbuild/darwin-arm64": "0.18.17", - "@esbuild/darwin-x64": "0.18.17", - "@esbuild/freebsd-arm64": "0.18.17", - "@esbuild/freebsd-x64": "0.18.17", - "@esbuild/linux-arm": "0.18.17", - "@esbuild/linux-arm64": "0.18.17", - "@esbuild/linux-ia32": "0.18.17", - "@esbuild/linux-loong64": "0.18.17", - "@esbuild/linux-mips64el": "0.18.17", - "@esbuild/linux-ppc64": "0.18.17", - "@esbuild/linux-riscv64": "0.18.17", - "@esbuild/linux-s390x": "0.18.17", - "@esbuild/linux-x64": "0.18.17", - "@esbuild/netbsd-x64": "0.18.17", - "@esbuild/openbsd-x64": "0.18.17", - "@esbuild/sunos-x64": "0.18.17", - "@esbuild/win32-arm64": "0.18.17", - "@esbuild/win32-ia32": "0.18.17", - "@esbuild/win32-x64": "0.18.17" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/esbuild-wasm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", - "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", - "dev": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - } + "os": [ + "android" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-android-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.20.0.tgz", + "integrity": "sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.20.0.tgz", + "integrity": "sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/https-proxy-agent": { - "version": "5.0.1", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-darwin-x64": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.20.0.tgz", + "integrity": "sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/@angular-devkit/build-angular/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@angular-devkit/build-angular/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.20.0.tgz", + "integrity": "sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "p-locate": "^6.0.0" + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.20.0.tgz", + "integrity": "sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.20.0.tgz", + "integrity": "sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.20.0.tgz", + "integrity": "sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.20.0.tgz", + "integrity": "sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.20.0.tgz", + "integrity": "sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.20.0.tgz", + "integrity": "sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.20.0.tgz", + "integrity": "sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.20.0.tgz", + "integrity": "sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.20.0.tgz", + "integrity": "sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.20.0.tgz", + "integrity": "sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.20.0.tgz", + "integrity": "sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@angular-devkit/build-angular/node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-devkit/build-angular/node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "node_modules/@angular-devkit/build-angular/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/open": { - "version": "8.4.2", + "node_modules/@angular-devkit/build-angular/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -546,6 +760,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -561,6 +776,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -576,29 +792,17 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/piscina": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", - "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", - "dev": true, - "dependencies": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" - }, - "optionalDependencies": { - "nice-napi": "^1.0.2" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/pkg-dir": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^6.3.0" }, @@ -609,6 +813,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@angular-devkit/build-angular/node_modules/rollup": { + "version": "4.20.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.20.0.tgz", + "integrity": "sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.20.0", + "@rollup/rollup-android-arm64": "4.20.0", + "@rollup/rollup-darwin-arm64": "4.20.0", + "@rollup/rollup-darwin-x64": "4.20.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.20.0", + "@rollup/rollup-linux-arm-musleabihf": "4.20.0", + "@rollup/rollup-linux-arm64-gnu": "4.20.0", + "@rollup/rollup-linux-arm64-musl": "4.20.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.20.0", + "@rollup/rollup-linux-riscv64-gnu": "4.20.0", + "@rollup/rollup-linux-s390x-gnu": "4.20.0", + "@rollup/rollup-linux-x64-gnu": "4.20.0", + "@rollup/rollup-linux-x64-musl": "4.20.0", + "@rollup/rollup-win32-arm64-msvc": "4.20.0", + "@rollup/rollup-win32-ia32-msvc": "4.20.0", + "@rollup/rollup-win32-x64-msvc": "4.20.0", + "fsevents": "~2.3.2" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -619,9 +858,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/sass": { - "version": "1.64.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", - "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", + "version": "1.77.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -635,79 +874,18 @@ "node": ">=14.0.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true }, - "node_modules/@angular-devkit/build-angular/node_modules/webpack-dev-middleware": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", - "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", - "dev": true, - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.12", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, "node_modules/@angular-devkit/build-angular/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -716,54 +894,54 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1602.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.15.tgz", - "integrity": "sha512-ms1+vCDdV0KX8BplJ7JoKH3wKjWHxxZTOX+mSPIjt4wS1uAk5DnezXHIjpBiJ3HY9XVHFI9C0HT4n7o6kFIOEQ==", + "version": "0.1802.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1802.5.tgz", + "integrity": "sha512-6qkcrWBdkxojCVHGWcdJaz4G+7QTjFvmc+3g8xvLc9sYvJq1I059gfXhDnC0FxiA0MT4cY/26ECYWUHTD5CJLQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1602.15", + "@angular-devkit/architect": "0.1802.5", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { "webpack": "^5.30.0", - "webpack-dev-server": "^4.0.0" + "webpack-dev-server": "^5.0.2" } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1602.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", - "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", + "version": "0.1802.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.5.tgz", + "integrity": "sha512-c7sVoW85Yqj7IYvNKxtNSGS5I7gWpORorg/xxLZX3OkHWXDrwYbb5LN/2p5/Aytxyb0aXl4o5fFOu6CUwcaLUw==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.2.15", + "@angular-devkit/core": "18.2.5", "rxjs": "7.8.1" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", - "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "version": "18.2.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.5.tgz", + "integrity": "sha512-r9TumPlJ8PvA2+yz4sp+bUHgtznaVKzhvXTN5qL1k4YP8LJ7iZWMR2FOP+HjukHZOTsenzmV9pszbogabqwoZQ==", "dev": true, "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", - "picomatch": "2.3.1", + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -776,34 +954,6 @@ } } }, - "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@angular-devkit/build-webpack/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/@angular-devkit/build-webpack/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -814,17 +964,20 @@ } }, "node_modules/@angular-devkit/core": { - "version": "16.1.6", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.0.tgz", + "integrity": "sha512-8SOopyUKUMqAq2rj32XkTIfr79Y274k4uglxxRtzHYoWwHlLdG0KrA+wCcsh/FU9PyR4dA+5dcDAApn358ZF+Q==", "license": "MIT", "dependencies": { - "ajv": "8.12.0", - "ajv-formats": "2.1.1", - "jsonc-parser": "3.2.0", + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -837,44 +990,25 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/@angular-devkit/core/node_modules/jsonc-parser": { - "version": "3.2.0", - "license": "MIT" - }, "node_modules/@angular-devkit/core/node_modules/rxjs": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@angular-devkit/schematics": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.1.tgz", - "integrity": "sha512-AKcEGa3fIgyXT6XTQZWEJZzgmcqlB89fcF7JFOuz4rgQfRmnE2xFw37lKE6ZclCOSiEoffAvgrL8acjdPI1ouw==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.1.tgz", + "integrity": "sha512-2t/q0Jcv7yqhAzEdNgsxoGSCmPgD4qfnVOJ7EJw3LNIA+kX1CmtN4FESUS0i49kN4AyNJFAI5O2pV8iJiliKaw==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": "18.0.1", - "jsonc-parser": "3.2.1", - "magic-string": "0.30.10", + "@angular-devkit/core": "18.2.1", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.11", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -885,14 +1019,15 @@ } }, "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.1.tgz", - "integrity": "sha512-91eKZoObs+wRgwssw81Y/94Nvixj0WqJkNusBAg+gAfZTCEeJoGGZJkRK8wrONbM79C3Bx8lN/TfSIPRbjnfOQ==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.1.tgz", + "integrity": "sha512-fSuGj6CxiTFR+yjuVcaWqaVb5Wts39CSBYRO1BlsOlbuWFZ2NKC/BAb5bdxpB31heCBJi7e3XbPvcMMJIcnKlA==", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "8.13.0", + "ajv": "8.17.1", "ajv-formats": "3.0.1", - "jsonc-parser": "3.2.1", + "jsonc-parser": "3.3.1", "picomatch": "4.0.2", "rxjs": "7.8.1", "source-map": "0.7.4" @@ -911,602 +1046,251 @@ } } }, - "node_modules/@angular-devkit/schematics/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@angular-devkit/schematics/node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/@angular-devkit/schematics/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/@angular-devkit/schematics/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@angular-eslint/builder": { - "version": "15.1.0", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.2.0.tgz", + "integrity": "sha512-2NsrYqvVVha2XUUXm1T0XshW0d1TzYU6rXNCTut1t8qS/uinbxNiszKzJN1TuUsXFwpZfITRnEY3cjaqJDlsdA==", "dev": true, "license": "MIT", + "dependencies": { + "@nx/devkit": "^19.0.6", + "nx": "^19.0.6" + }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "15.1.0", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.2.0.tgz", + "integrity": "sha512-p/YvlvDJscSAbNOOAbT/BRdscEfWpQunUK+KuWM6/PXL07tTVae5dmp8B8A5am7Cxvp+ZVLVLZG4LFYB1TX1cw==", "dev": true, "license": "MIT" }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "15.1.0", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.2.0.tgz", + "integrity": "sha512-vJ7pstQPqCqkvMrEsjjocvHdPBl/frs0+fqkckog2Sq0QisBEjUPkbImvId6dw7JzxSDSvttdAklakF97CE4VA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/utils": "15.1.0", - "@typescript-eslint/utils": "5.44.0" + "@angular-eslint/bundled-angular-compiler": "18.2.0", + "@angular-eslint/utils": "18.2.0" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "15.1.0", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.2.0.tgz", + "integrity": "sha512-YHh+AUY9ubLAdmIRXH8vSpv+8EQkGjdX3B9xdj/grnrVzgzu+5W86F/spGp2tEny9l85R3JZNqjaMpW/vwibfw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "15.1.0", - "@angular-eslint/utils": "15.1.0", - "@typescript-eslint/type-utils": "5.44.0", - "@typescript-eslint/utils": "5.44.0", - "aria-query": "5.1.3", - "axobject-query": "3.1.1" + "@angular-eslint/bundled-angular-compiler": "18.2.0", + "@angular-eslint/utils": "18.2.0", + "aria-query": "5.3.0", + "axobject-query": "4.1.0" }, "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/scope-manager": { - "version": "5.44.0", + "node_modules/@angular-eslint/template-parser": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.2.0.tgz", + "integrity": "sha512-1jKH2fL8ir1ajcgu/N0xIWVtlpJQmbJBRRe1+WbBoomykcu1KnLwCSue/LuUDQOf3CTmMHxQE0f+58VpafYoyA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/visitor-keys": "5.44.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@angular-eslint/bundled-angular-compiler": "18.2.0", + "eslint-scope": "^8.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/type-utils": { - "version": "5.44.0", + "node_modules/@angular-eslint/utils": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.2.0.tgz", + "integrity": "sha512-g+b0L4RCZaKYPz4bGRRifo7g5guVJi2kUWymlDYmCkq3NhZng1HQQbNpVF1n5o034zT5lnaC5HENwaKIZ1Y37Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.44.0", - "@typescript-eslint/utils": "5.44.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@angular-eslint/bundled-angular-compiler": "18.2.0" }, "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/types": { - "version": "5.44.0", - "dev": true, + "node_modules/@angular/animations": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.2.0.tgz", + "integrity": "sha512-BFAfqDDjsa0Q91F4s33pFcBG+ydFDurEmwYGG1gmO7UXZJI6ZbRVdULaZHz75M+Bf3hJkzVB05pesvfbK+Fg/g==", "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.44.0", - "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/visitor-keys": "5.44.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "tslib": "^2.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "@angular/core": "18.2.0" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/utils": { - "version": "5.44.0", - "dev": true, + "node_modules/@angular/cdk": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.2.0.tgz", + "integrity": "sha512-hjuUWNhxU48WB2i1j4NLwnPTaCnucRElfp7DBX5Io0rY5Lwl3HXafvyi7/A1D0Ah+YsJpktKOWPDGv8r7vxymg==", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.44.0", - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/typescript-estree": "5.44.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "tslib": "^2.3.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "optionalDependencies": { + "parse5": "^7.1.2" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@angular/common": "^18.0.0 || ^19.0.0", + "@angular/core": "^18.0.0 || ^19.0.0", + "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.44.0", + "node_modules/@angular/cli": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.2.1.tgz", + "integrity": "sha512-SomUFDHanY4o7k3XBGf1eFt4z1h05IGJHfcbl2vxoc0lY59VN13m/pZsD2AtpqtJTzLQT02XQOUP4rmBbGoQ+Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.44.0", - "eslint-visitor-keys": "^3.3.0" + "@angular-devkit/architect": "0.1802.1", + "@angular-devkit/core": "18.2.1", + "@angular-devkit/schematics": "18.2.1", + "@inquirer/prompts": "5.3.8", + "@listr2/prompt-adapter-inquirer": "2.0.15", + "@schematics/angular": "18.2.1", + "@yarnpkg/lockfile": "1.1.0", + "ini": "4.1.3", + "jsonc-parser": "3.3.1", + "listr2": "8.2.4", + "npm-package-arg": "11.0.3", + "npm-pick-manifest": "9.1.0", + "pacote": "18.0.6", + "resolve": "1.22.8", + "semver": "7.6.3", + "symbol-observable": "4.0.0", + "yargs": "17.7.2" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "bin": { + "ng": "bin/ng.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.44.0", + "node_modules/@angular/cli/node_modules/@angular-devkit/architect": { + "version": "0.1802.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.1.tgz", + "integrity": "sha512-XTnJfCBMDQl3xF4w/eNrq821gbj2Ig1cqbzpRflhz4pqrANTAfHfPoIC7piWEZ60FNlHapzb6fvh6tJUGXG9og==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/visitor-keys": "5.44.0" + "@angular-devkit/core": "18.2.1", + "rxjs": "7.8.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.44.0", + "node_modules/@angular/cli/node_modules/@angular-devkit/core": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.1.tgz", + "integrity": "sha512-fSuGj6CxiTFR+yjuVcaWqaVb5Wts39CSBYRO1BlsOlbuWFZ2NKC/BAb5bdxpB31heCBJi7e3XbPvcMMJIcnKlA==", "dev": true, "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.44.0", - "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/visitor-keys": "5.44.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "chokidar": "^3.5.2" }, "peerDependenciesMeta": { - "typescript": { + "chokidar": { "optional": true } } }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "5.44.0", + "node_modules/@angular/cli/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.44.0", - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/typescript-estree": "5.44.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.44.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.44.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/template-parser": { - "version": "15.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "15.1.0", - "eslint-scope": "^7.0.0" - }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { - "version": "7.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@angular-eslint/utils": { - "version": "15.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "15.1.0", - "@typescript-eslint/utils": "5.44.0" - }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.44.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/visitor-keys": "5.44.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.44.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.44.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/visitor-keys": "5.44.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/utils": { - "version": "5.44.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.44.0", - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/typescript-estree": "5.44.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@angular-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.44.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.44.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular/animations": { - "version": "16.1.7", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0" - }, - "peerDependencies": { - "@angular/core": "16.1.7" - } - }, - "node_modules/@angular/cdk": { - "version": "15.2.9", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "optionalDependencies": { - "parse5": "^7.1.2" - }, - "peerDependencies": { - "@angular/common": "^15.0.0 || ^16.0.0", - "@angular/core": "^15.0.0 || ^16.0.0", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, - "node_modules/@angular/cli": { - "version": "16.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/architect": "0.1601.6", - "@angular-devkit/core": "16.1.6", - "@angular-devkit/schematics": "16.1.6", - "@schematics/angular": "16.1.6", - "@yarnpkg/lockfile": "1.1.0", - "ansi-colors": "4.1.3", - "ini": "4.1.1", - "inquirer": "8.2.4", - "jsonc-parser": "3.2.0", - "npm-package-arg": "10.1.0", - "npm-pick-manifest": "8.0.1", - "open": "8.4.2", - "ora": "5.4.1", - "pacote": "15.2.0", - "resolve": "1.22.2", - "semver": "7.5.3", - "symbol-observable": "4.0.0", - "yargs": "17.7.2" - }, - "bin": { - "ng": "bin/ng.js" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/@angular-devkit/schematics": { - "version": "16.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "16.1.6", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.0", - "ora": "5.4.1", - "rxjs": "7.8.1" - }, - "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" - } - }, - "node_modules/@angular/cli/node_modules/jsonc-parser": { - "version": "3.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@angular/cli/node_modules/magic-string": { - "version": "0.30.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@angular/cli/node_modules/open": { - "version": "8.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@angular/cli/node_modules/rxjs": { - "version": "7.8.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@angular/common": { - "version": "16.1.7", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular/common": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.0.tgz", + "integrity": "sha512-DELx/QYNqqjmiM+kE5PoVmyG4gPw5WB1bDDeg3hEuBCK3eS2KosgQH0/MQo3OSBZHOcAMFjfHMGqKgxndmYixQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "16.1.7", + "@angular/core": "18.2.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "16.1.7", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.0.tgz", + "integrity": "sha512-RmGwQ7jRzotUKKMk0CwxTcIXFr5mRxSbJf9o5S3ujuIOo1lYop8SQZvjq67a5BuoYyD+1pX6iMmxZqlbKoihBQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "16.1.7" + "@angular/core": "18.2.0" }, "peerDependenciesMeta": { "@angular/core": { @@ -1515,15 +1299,17 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "16.1.7", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.0.tgz", + "integrity": "sha512-pPBFjMqNTNettrleLtEc6a/ysOZjG3F0Z5lyKYePcyNQmn2rpa9XmD2y6PhmzTmIhxeXrogWA84Xgg/vK5wBNw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "7.22.5", + "@babel/core": "7.25.2", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "reflect-metadata": "^0.1.2", + "reflect-metadata": "^0.2.0", "semver": "^7.0.0", "tslib": "^2.3.0", "yargs": "^17.2.1" @@ -1534,33 +1320,35 @@ "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "16.1.7", - "typescript": ">=4.9.3 <5.2" + "@angular/compiler": "18.2.0", + "typescript": ">=5.4 <5.6" } }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.22.5", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1570,8 +1358,17 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -1579,71 +1376,81 @@ } }, "node_modules/@angular/core": { - "version": "16.1.7", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.0.tgz", + "integrity": "sha512-7+4wXfeAk1TnG3MGho2gpBI5XHxeSRWzLK2rC5qyyRbmMV+GrIgf1HqFjQ4S02rydkQvGpjqQHtO1PYJnyn4bg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.13.0" + "zone.js": "~0.14.10" } }, "node_modules/@angular/elements": { - "version": "16.1.7", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-18.2.0.tgz", + "integrity": "sha512-eTs1U0tfK9ClfvHILTnQjAtLSo3f7YMdqyz3wO+hMkZyoJVASHmzhEls/xoGfCUVskyufVwfR5TqkdPJx0yr+A==", "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "16.1.7", + "@angular/core": "18.2.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/forms": { - "version": "16.1.7", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.2.0.tgz", + "integrity": "sha512-G+4BjNCUo4cRwg9NwisGLbtG/1AbIJNOO3RUejPJJbCcAkYMSzmDWSQ+LQEGW4vC/1xaDKO8AT71DI/I09bOxA==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "16.1.7", - "@angular/core": "16.1.7", - "@angular/platform-browser": "16.1.7", + "@angular/common": "18.2.0", + "@angular/core": "18.2.0", + "@angular/platform-browser": "18.2.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "16.1.7", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-18.2.0.tgz", + "integrity": "sha512-brl5061YqfNnT7yZNMWmsgv6ve6p9+kfhX6mZWOGICcY2SYVtCNVHdqzwWTTwY7MvTVfycHxiAf9PEmc5lD4/g==", "dev": true, "license": "MIT", "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" } }, "node_modules/@angular/platform-browser": { - "version": "16.1.7", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.0.tgz", + "integrity": "sha512-yhj281TuPz5a8CehwucwIVl29Oqte9KS4X/VQkMV++GpYQE2KKKcoff4FXSdF5RUcUYkK2li4IvawIqPmUSagg==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "16.1.7", - "@angular/common": "16.1.7", - "@angular/core": "16.1.7" + "@angular/animations": "18.2.0", + "@angular/common": "18.2.0", + "@angular/core": "18.2.0" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1652,59 +1459,47 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "16.1.7", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.0.tgz", + "integrity": "sha512-izfaXKNC/kqOEzJG8eTnFu39VLI3vv3dTKoYOdEKRB7MTI0t0x66oZmABnHcihtkTSvXs/is+7lA5HmH2ZuIEQ==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "16.1.7", - "@angular/compiler": "16.1.7", - "@angular/core": "16.1.7", - "@angular/platform-browser": "16.1.7" + "@angular/common": "18.2.0", + "@angular/compiler": "18.2.0", + "@angular/core": "18.2.0", + "@angular/platform-browser": "18.2.0" } }, "node_modules/@angular/router": { - "version": "16.1.7", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.2.0.tgz", + "integrity": "sha512-6/462hvC3HSwbps8VItECHpkdkiFqRmTKdn1Trik+FjnvdupYrKB6kBsveM3eP+gZD4zyMBMKzBWB9N/xA1clw==", "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "16.1.7", - "@angular/core": "16.1.7", - "@angular/platform-browser": "16.1.7", + "@angular/common": "18.2.0", + "@angular/core": "18.2.0", + "@angular/platform-browser": "18.2.0", "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@assemblyscript/loader": { - "version": "0.10.1", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@aw-web-design/x-default-browser": { - "version": "1.4.126", - "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz", - "integrity": "sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==", - "dev": true, - "dependencies": { - "default-browser-id": "3.0.0" - }, - "bin": { - "x-default-browser": "bin/x-default-browser.js" - } - }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.24.7", "picocolors": "^1.0.0" @@ -1714,16 +1509,19 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", - "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz", + "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1753,6 +1551,8 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -1760,14 +1560,15 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.25.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -1775,11 +1576,13 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1790,6 +1593,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -1803,6 +1607,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.25.2", "@babel/helper-validator-option": "^7.24.8", @@ -1814,39 +1619,29 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", - "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-member-expression-to-functions": "^7.24.8", "@babel/helper-optimise-call-expression": "^7.24.7", "@babel/helper-replace-supers": "^7.25.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/traverse": "^7.25.0", + "@babel/traverse": "^7.25.4", "semver": "^6.3.1" }, "engines": { @@ -1856,20 +1651,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -1881,6 +1666,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", @@ -1893,20 +1679,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -1914,10 +1690,11 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -1929,23 +1706,12 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.8", "@babel/types": "^7.24.8" @@ -1959,6 +1725,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -1972,6 +1739,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", @@ -1990,6 +1758,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.24.7" }, @@ -2002,6 +1771,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -2011,6 +1781,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-wrap-function": "^7.25.0", @@ -2023,23 +1794,12 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-replace-supers": { "version": "7.25.0", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.24.8", "@babel/helper-optimise-call-expression": "^7.24.7", @@ -2057,6 +1817,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -2070,6 +1831,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.24.7", "@babel/types": "^7.24.7" @@ -2079,11 +1841,12 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2094,6 +1857,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -2103,6 +1867,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -2112,6 +1877,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -2121,6 +1887,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.25.0", "@babel/traverse": "^7.25.0", @@ -2130,42 +1897,15 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/types": "^7.25.6" }, "engines": { "node": ">=6.9.0" @@ -2176,6 +1916,7 @@ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", @@ -2187,12 +1928,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.2" + "@babel/types": "^7.25.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -2206,6 +1948,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8", "@babel/traverse": "^7.25.3" @@ -2222,6 +1965,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8" }, @@ -2237,6 +1981,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8" }, @@ -2252,6 +1997,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", @@ -2269,6 +2015,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8", "@babel/traverse": "^7.25.0" @@ -2280,25 +2027,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, "license": "MIT", "engines": { @@ -2308,23 +2040,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "license": "MIT", "dependencies": { @@ -2336,6 +2055,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", "dependencies": { @@ -2347,6 +2068,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "license": "MIT", "dependencies": { @@ -2361,6 +2084,8 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2372,6 +2097,8 @@ }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2381,28 +2108,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz", - "integrity": "sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2412,12 +2125,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2428,6 +2142,8 @@ }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", "dependencies": { @@ -2439,6 +2155,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", "dependencies": { @@ -2448,23 +2166,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "license": "MIT", "dependencies": { @@ -2476,6 +2181,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2487,6 +2194,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "license": "MIT", "dependencies": { @@ -2498,6 +2207,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "license": "MIT", "dependencies": { @@ -2509,6 +2220,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2520,6 +2233,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", "dependencies": { @@ -2531,6 +2246,8 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "license": "MIT", "dependencies": { @@ -2545,6 +2262,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", "dependencies": { @@ -2557,23 +2276,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "license": "MIT", "dependencies": { @@ -2592,6 +2298,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -2607,6 +2314,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-remap-async-to-generator": "^7.25.0", @@ -2621,13 +2329,15 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2641,6 +2351,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -2656,6 +2367,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8" }, @@ -2667,13 +2379,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -2687,6 +2400,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", @@ -2700,16 +2414,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", - "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-compilation-targets": "^7.25.2", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-replace-supers": "^7.25.0", - "@babel/traverse": "^7.25.0", + "@babel/traverse": "^7.25.4", "globals": "^11.1.0" }, "engines": { @@ -2719,23 +2434,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/template": "^7.24.7" @@ -2747,25 +2451,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8" }, @@ -2781,6 +2472,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -2797,6 +2489,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -2812,6 +2505,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.25.0", "@babel/helper-plugin-utils": "^7.24.8" @@ -2828,6 +2522,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -2844,6 +2539,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -2860,6 +2556,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -2871,27 +2568,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", - "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-flow": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" @@ -2908,6 +2590,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.24.8", "@babel/helper-plugin-utils": "^7.24.8", @@ -2925,6 +2608,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -2941,6 +2625,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8" }, @@ -2956,6 +2641,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -2972,6 +2658,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -2987,6 +2674,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -3003,6 +2691,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.24.8", "@babel/helper-plugin-utils": "^7.24.8", @@ -3020,6 +2709,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.25.0", "@babel/helper-plugin-utils": "^7.24.8", @@ -3038,6 +2728,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -3054,6 +2745,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -3070,6 +2762,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3085,6 +2778,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -3101,6 +2795,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -3117,6 +2812,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7", @@ -3135,6 +2831,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-replace-supers": "^7.24.7" @@ -3151,6 +2848,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -3167,6 +2865,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", @@ -3184,6 +2883,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3195,13 +2895,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -3215,6 +2916,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", "@babel/helper-create-class-features-plugin": "^7.24.7", @@ -3228,23 +2930,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3260,6 +2951,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" @@ -3276,6 +2968,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3287,16 +2980,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", - "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", + "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -3311,6 +3005,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -3320,6 +3015,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3335,6 +3031,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" @@ -3351,6 +3048,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3366,6 +3064,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3381,6 +3080,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.8" }, @@ -3391,42 +3091,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", - "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.25.0", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/plugin-syntax-typescript": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.24.7" }, @@ -3442,6 +3112,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -3458,6 +3129,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.24.7", "@babel/helper-plugin-utils": "^7.24.7" @@ -3470,13 +3142,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -3486,25 +3159,29 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", - "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", + "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/compat-data": "^7.25.2", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -3516,60 +3193,60 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.7", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.5", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.6", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.5", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.6", - "@babel/plugin-transform-parameters": "^7.22.5", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.5", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.5", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", - "core-js-compat": "^3.31.0", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.0", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.0", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", "semver": "^6.3.1" }, "engines": { @@ -3581,262 +3258,118 @@ }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/preset-flow": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.24.7.tgz", - "integrity": "sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-transform-flow-strip-types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", - "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.0.tgz", + "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.24.7" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/register": { - "version": "7.24.6", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz", - "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==", + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, + "license": "MIT", "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/register/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "node_modules/@babel/traverse": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", "dev": true, + "license": "MIT", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/@babel/register/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^3.0.0" + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "node_modules/@babel/register/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/register/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/register/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", - "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.2", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" + "node": ">=6.9.0" } }, "node_modules/@colors/colors": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, "license": "MIT", "engines": { @@ -3849,6 +3382,7 @@ "integrity": "sha512-MsTEv6S0JGkdXc8pFp3yB/r8Lw49YenD0TCXyIVAmQhWNDtGWi4m2TGz02hdiKAlTJ1McQJFuyXWiItTQtje0A==", "dev": true, "hasInstallScript": true, + "license": "MIT", "dependencies": { "@angular-devkit/schematics": "18.0.1", "@babel/core": "^7.24.6", @@ -3899,22 +3433,70 @@ "node": ">= 16.0.0" } }, + "node_modules/@compodoc/compodoc/node_modules/@angular-devkit/core": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.1.tgz", + "integrity": "sha512-91eKZoObs+wRgwssw81Y/94Nvixj0WqJkNusBAg+gAfZTCEeJoGGZJkRK8wrONbM79C3Bx8lN/TfSIPRbjnfOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.13.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@compodoc/compodoc/node_modules/@angular-devkit/schematics": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.1.tgz", + "integrity": "sha512-AKcEGa3fIgyXT6XTQZWEJZzgmcqlB89fcF7JFOuz4rgQfRmnE2xFw37lKE6ZclCOSiEoffAvgrL8acjdPI1ouw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "18.0.1", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.10", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, "node_modules/@compodoc/compodoc/node_modules/@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -3934,922 +3516,709 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@compodoc/compodoc/node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "node_modules/@compodoc/compodoc/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" }, - "engines": { - "node": ">=6.9.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@compodoc/compodoc/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "node_modules/@compodoc/compodoc/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "color-convert": "^2.0.1" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@compodoc/compodoc/node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "node_modules/@compodoc/compodoc/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@compodoc/compodoc/node_modules/@babel/preset-env": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", - "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", + "node_modules/@compodoc/compodoc/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.7", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.7", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.7", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, + "license": "MIT" + }, + "node_modules/@compodoc/compodoc/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=8" } }, - "node_modules/@compodoc/compodoc/node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@compodoc/compodoc/node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "license": "MIT" }, - "node_modules/@compodoc/compodoc/node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "node_modules/@compodoc/compodoc/node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "@jridgewell/sourcemap-codec": "^1.4.15" } }, - "node_modules/@compodoc/compodoc/node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "node_modules/@compodoc/compodoc/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" + "tslib": "^2.1.0" } }, - "node_modules/@compodoc/compodoc/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/@compodoc/compodoc/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@compodoc/compodoc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@compodoc/compodoc/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "node_modules/@compodoc/live-server": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@compodoc/live-server/-/live-server-1.2.3.tgz", + "integrity": "sha512-hDmntVCyjjaxuJzPzBx68orNZ7TW4BtHWMnXlIVn5dqhK7vuFF/11hspO1cMmc+2QTYgqde1TBcb3127S7Zrow==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "chokidar": "^3.5.2", + "colors": "1.4.0", + "connect": "^3.7.0", + "cors": "latest", + "event-stream": "4.0.1", + "faye-websocket": "0.11.x", + "http-auth": "4.1.9", + "http-auth-connect": "^1.0.5", + "morgan": "^1.10.0", + "object-assign": "latest", + "open": "8.4.0", + "proxy-middleware": "latest", + "send": "latest", + "serve-index": "^1.9.1" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@compodoc/compodoc/node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" + "bin": { + "live-server": "live-server.js" }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@compodoc/compodoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@compodoc/live-server/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/@compodoc/compodoc/node_modules/chalk": { - "version": "4.1.2", + "node_modules/@compodoc/live-server/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@compodoc/compodoc/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/@compodoc/live-server/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "is-docker": "^2.0.0" }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=8" } }, - "node_modules/@compodoc/compodoc/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@compodoc/compodoc/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "node_modules/@compodoc/live-server/node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dev": true, + "license": "MIT", "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=14" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@compodoc/compodoc/node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "node_modules/@compodoc/ngd-core": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-core/-/ngd-core-2.1.1.tgz", + "integrity": "sha512-Z+wE6wWZYVnudRYg6qunDlyh3Orw39Ib66Gvrz5kX5u7So+iu3tr6sQJdqH6yGS3hAjig5avlfhWLlgsb6/x1Q==", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "ansi-colors": "^4.1.3", + "fancy-log": "^2.0.0", + "typescript": "^5.0.4" }, "engines": { - "node": ">=8.6.0" + "node": ">= 10.0.0" } }, - "node_modules/@compodoc/compodoc/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/@compodoc/ngd-transformer": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-transformer/-/ngd-transformer-2.1.3.tgz", + "integrity": "sha512-oWxJza7CpWR8/FeWYfE6j+jgncnGBsTWnZLt5rD2GUpsGSQTuGrsFPnmbbaVLgRS5QIVWBJYke7QFBr/7qVMWg==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@aduh95/viz.js": "3.4.0", + "@compodoc/ngd-core": "~2.1.1", + "dot": "^2.0.0-beta.1", + "fs-extra": "^11.1.1" }, "engines": { - "node": ">=14.14" + "node": ">= 10.0.0" } }, - "node_modules/@compodoc/compodoc/node_modules/glob": { - "version": "10.4.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", - "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", + "node_modules/@cspotcode/source-map-consumer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", + "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==", "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 12" } }, - "node_modules/@compodoc/compodoc/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/@cspotcode/source-map-support": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz", + "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@compodoc/compodoc/node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@compodoc/compodoc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@compodoc/compodoc/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@compodoc/compodoc/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@compodoc/compodoc/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "@cspotcode/source-map-consumer": "0.8.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/@compodoc/compodoc/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.1.tgz", + "integrity": "sha512-boghen8F0Q8D+0/Q1/1r6DUEieUJ8w2a1gIknExMSHBsJFOr2+0KUfHiVYBvucPwl3+RU5PFBK833FjFCh3BhA==", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" - } - }, - "node_modules/@compodoc/compodoc/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" + "node": ">=14.17.0" } }, - "node_modules/@compodoc/live-server": { - "version": "1.2.3", + "node_modules/@emnapi/core": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.2.0.tgz", + "integrity": "sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^3.5.2", - "colors": "1.4.0", - "connect": "^3.7.0", - "cors": "latest", - "event-stream": "4.0.1", - "faye-websocket": "0.11.x", - "http-auth": "4.1.9", - "http-auth-connect": "^1.0.5", - "morgan": "^1.10.0", - "object-assign": "latest", - "open": "8.4.0", - "proxy-middleware": "latest", - "send": "latest", - "serve-index": "^1.9.1" - }, - "bin": { - "live-server": "live-server.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@compodoc/ngd-core": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@compodoc/ngd-core/-/ngd-core-2.1.1.tgz", - "integrity": "sha512-Z+wE6wWZYVnudRYg6qunDlyh3Orw39Ib66Gvrz5kX5u7So+iu3tr6sQJdqH6yGS3hAjig5avlfhWLlgsb6/x1Q==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.3", - "fancy-log": "^2.0.0", - "typescript": "^5.0.4" - }, - "engines": { - "node": ">= 10.0.0" + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" } }, - "node_modules/@compodoc/ngd-transformer": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@compodoc/ngd-transformer/-/ngd-transformer-2.1.3.tgz", - "integrity": "sha512-oWxJza7CpWR8/FeWYfE6j+jgncnGBsTWnZLt5rD2GUpsGSQTuGrsFPnmbbaVLgRS5QIVWBJYke7QFBr/7qVMWg==", + "node_modules/@emnapi/runtime": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", + "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", "dev": true, + "license": "MIT", "dependencies": { - "@aduh95/viz.js": "3.4.0", - "@compodoc/ngd-core": "~2.1.1", - "dot": "^2.0.0-beta.1", - "fs-extra": "^11.1.1" - }, - "engines": { - "node": ">= 10.0.0" + "tslib": "^2.4.0" } }, - "node_modules/@compodoc/ngd-transformer/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@cspotcode/source-map-consumer": { - "version": "0.8.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" + "tslib": "^2.4.0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.7.0", + "node_modules/@es-joy/jsdoccomment": { + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.48.0.tgz", + "integrity": "sha512-G6QUWIcC+KvSwXNsJyDTHvqUdNoAVJPPgkc3+Uk4WBKqZvoXhlvazOgm9aL0HwihJLQf0l+tOE2UFzXBqCqgDw==", "dev": true, "license": "MIT", "dependencies": { - "@cspotcode/source-map-consumer": "0.8.0" + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" }, "engines": { - "node": ">=12" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" + "node": ">=16" } }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.36.1", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "comment-parser": "1.3.1", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "~3.1.0" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": "^14 || ^16 || ^17 || ^18 || ^19" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", - "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", - "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", - "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", - "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", - "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", - "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", - "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", - "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", - "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", - "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", - "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", - "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", "cpu": [ "mips64el" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", - "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", - "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", - "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", - "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", - "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", - "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", - "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", - "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", - "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", "cpu": [ "x64" ], @@ -4859,20 +4228,47 @@ "os": [ "win32" ], - "peer": true, "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", + "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.3", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -4886,13 +4282,38 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "Python-2.0" + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.18.0", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4905,19 +4326,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -4927,17 +4346,35 @@ "node": "*" } }, - "node_modules/@fal-works/esbuild-plugin-global-externals": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", - "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", - "dev": true + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } }, "node_modules/@foliojs-fork/fontkit": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.2.tgz", "integrity": "sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==", "dev": true, + "license": "MIT", "dependencies": { "@foliojs-fork/restructure": "^2.0.2", "brotli": "^1.2.0", @@ -4954,6 +4391,7 @@ "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.2.tgz", "integrity": "sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==", "dev": true, + "license": "MIT", "dependencies": { "base64-js": "1.3.1", "unicode-trie": "^2.0.0" @@ -4963,13 +4401,15 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@foliojs-fork/pdfkit": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.14.0.tgz", "integrity": "sha512-nMOiQAv6id89MT3tVTCgc7HxD5ZMANwio2o5yvs5sexQkC0KI3BLaLakpsrHmFfeGFAhqPmZATZGbJGXTUebpg==", "dev": true, + "license": "MIT", "dependencies": { "@foliojs-fork/fontkit": "^1.9.1", "@foliojs-fork/linebreak": "^1.1.1", @@ -4981,13 +4421,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@gulpjs/messages": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz", "integrity": "sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -4997,6 +4439,7 @@ "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz", "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==", "dev": true, + "license": "MIT", "dependencies": { "is-negated-glob": "^1.0.0" }, @@ -5005,20 +4448,49 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.7", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5030,321 +4502,381 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", "dev": true, "license": "BSD-3-Clause" }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", + "node_modules/@inquirer/checkbox": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-2.5.0.tgz", + "integrity": "sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@inquirer/core": "^9.1.0", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.3", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", + "node_modules/@inquirer/confirm": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-3.2.0.tgz", + "integrity": "sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", + "node_modules/@inquirer/core": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz", + "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@inquirer/figures": "^1.0.6", + "@inquirer/type": "^2.0.0", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.5.5", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^1.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", + "node_modules/@inquirer/core/node_modules/@inquirer/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz", + "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==", "dev": true, "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "mute-stream": "^1.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", + "node_modules/@inquirer/core/node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "undici-types": "~6.19.2" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", + "node_modules/@inquirer/editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-2.2.0.tgz", + "integrity": "sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "external-editor": "^3.1.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", + "node_modules/@inquirer/expand": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-2.3.0.tgz", + "integrity": "sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", + "node_modules/@inquirer/figures": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.6.tgz", + "integrity": "sha512-yfZzps3Cso2UbM7WlxKwZQh2Hs6plrbjs1QnzQDZhK2DgyCo6D8AaHps9olkNcUFlcYERMqU3uJSp1gmy3s/qQ==", "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/@inquirer/input": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-2.3.0.tgz", + "integrity": "sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/@inquirer/number": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-1.1.0.tgz", + "integrity": "sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/@inquirer/password": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-2.2.0.tgz", + "integrity": "sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "ansi-escapes": "^4.3.2" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", + "node_modules/@inquirer/prompts": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-5.3.8.tgz", + "integrity": "sha512-b2BudQY/Si4Y2a0PdZZL6BeJtl8llgeZa7U2j47aaJSCeAl1e4UI7y8a9bSkO3o/ZbZrgT5muy/34JbsjfIWxA==", "dev": true, "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^2.4.7", + "@inquirer/confirm": "^3.1.22", + "@inquirer/editor": "^2.1.22", + "@inquirer/expand": "^2.1.22", + "@inquirer/input": "^2.2.9", + "@inquirer/number": "^1.0.10", + "@inquirer/password": "^2.1.22", + "@inquirer/rawlist": "^2.2.4", + "@inquirer/search": "^1.0.7", + "@inquirer/select": "^2.4.7" + }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@jest/schemas": { - "version": "29.6.0", + "node_modules/@inquirer/rawlist": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-2.3.0.tgz", + "integrity": "sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "@inquirer/core": "^9.1.0", + "@inquirer/type": "^1.5.3", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@jest/transform": { - "version": "29.6.1", + "node_modules/@inquirer/search": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-1.1.0.tgz", + "integrity": "sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.1", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" + "@inquirer/core": "^9.1.0", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.3", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/@inquirer/select": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-2.5.0.tgz", + "integrity": "sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@inquirer/core": "^9.1.0", + "@inquirer/figures": "^1.0.5", + "@inquirer/type": "^1.5.3", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", + "node_modules/@inquirer/type": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz", + "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "mute-stream": "^1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18" } }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "2.0.0", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@jest/types": { - "version": "29.6.1", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { @@ -5352,6 +4884,7 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -5362,7 +4895,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { @@ -5374,21 +4909,26 @@ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, @@ -5397,7723 +4937,2227 @@ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@juggle/resize-observer": { - "version": "3.4.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true - }, - "node_modules/@mdx-js/react": { - "version": "2.3.0", + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdx": "^2.0.0", - "@types/react": ">=16" + "engines": { + "node": ">=10.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "react": ">=16" + "tslib": "2" } }, - "node_modules/@ndelangen/get-tarball": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz", - "integrity": "sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.0.tgz", + "integrity": "sha512-zlQONA+msXPPwHWZMKFVS78ewFczIll5lXiVPwFPCZUsrOKdxc2AvxU1HoNBmMRhqDZUR9HkC3UOm+6pME6Xsg==", "dev": true, "dependencies": { - "gunzip-maybe": "^1.4.2", - "pump": "^3.0.0", - "tar-fs": "^2.1.1" + "@jsonjoy.com/base64": "^1.1.1", + "@jsonjoy.com/util": "^1.1.2", + "hyperdyperid": "^1.2.0", + "thingies": "^1.20.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@ngtools/webpack": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.15.tgz", - "integrity": "sha512-rD4IHt3nS6PdIKvmoqwIadMIGKsemBSz412kD8Deetl0TiCVhD/Tn1M00dxXzMSHSFCQcOKxdZAeD53yRwTOOA==", + "node_modules/@jsonjoy.com/util": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.3.0.tgz", + "integrity": "sha512-Cebt4Vk7k1xHy87kHY7KSPLT77A7Ev7IfOblyLZhtYEhrdQ6fX4EoLq3xOQ3O/DRMEh2ok5nyC180E+ABS8Wmw==", "dev": true, "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0", - "typescript": ">=4.9.3 <5.2", - "webpack": "^5.54.0" + "tslib": "2" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "dev": true + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.15.tgz", + "integrity": "sha512-MZrGem/Ujjd4cPTLYDfCZK2iKKeiO/8OX13S6jqxldLs0Prf2aGqVlJ77nMBqMv7fzqgXEgjrNHLXcKR8l9lOg==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@inquirer/type": "^1.5.1" }, "engines": { - "node": ">= 8" + "node": ">=18.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 6" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.0.13.tgz", + "integrity": "sha512-uiKPB0Fv6WEEOZjruu9a6wnW/8jrjzlZbxXscMB8kuCJ1k6kHpcBnuvaAWcqhbI7rqX5GKziwWEdD+wi2gNLfA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.0.13.tgz", + "integrity": "sha512-bEVIIfK5mSQoG1R19qA+fJOvCB+0wVGGnXHT3smchBVahYBdlPn2OsZZKzlHWfb1E+PhLBmYfqB5zQXFP7hJig==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.0.13.tgz", + "integrity": "sha512-Yml1KlMzOnXj/tnW7yX8U78iAzTk39aILYvCPbqeewAq1kSzl+w59k/fiVkTBfvDi/oW/5YRxL+Fq+Y1Fr1r2Q==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@npmcli/git": { - "version": "4.1.0", + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.0.13.tgz", + "integrity": "sha512-afbVrsMgZ9dUTNUchFpj5VkmJRxvht/u335jUJ7o23YTbNbnpmXif3VKQGCtnjSh+CZaqm6N3CPG8KO3zwyZ1Q==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.0.13.tgz", + "integrity": "sha512-vOtxu0xC0SLdQ2WRXg8Qgd8T32ak4SPqk5zjItRszrJk2BdeXqfGxBJbP7o4aOvSPSmSSv46Lr1EP4HXU8v7Kg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@npmcli/git/node_modules/which": { + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.0.13.tgz", + "integrity": "sha512-UCrMJQY/gJnOl3XgbWRZZUvGGBuKy6i0YNSptgMzHBjs+QYDYR1Mt/RLTOPy4fzzves65O1EDmlL//OzEqoLlA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@mdx-js/react": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", + "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" + "@types/mdx": "^2.0.0" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" } }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "dev": true, + "license": "MIT", "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@ngtools/webpack": { + "version": "18.2.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.2.5.tgz", + "integrity": "sha512-L0n4eHObeqEOYRfSP+e4SeF/dmwxOIFy9xYvYCOUwOLrW4b3+a1+kkT30pqyfL72LFtpf0cmUwaWEFIcWl5PCg==", + "dev": true, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" }, - "bin": { - "installed-package-contents": "lib/index.js" + "peerDependencies": { + "@angular/compiler-cli": "^18.0.0", + "typescript": ">=5.4 <5.6", + "webpack": "^5.54.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 8" } }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 8" } }, - "node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "which": "^3.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 8" } }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "3.0.1", + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/run-script": { - "version": "6.0.2", + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" + "semver": "^7.3.5" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/run-script/node_modules/which": { - "version": "3.0.1", + "node_modules/@npmcli/git": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "license": "MIT", - "optional": true, + "license": "ISC", "engines": { - "node": ">=14" + "node": ">=16" } }, - "node_modules/@puppeteer/browsers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.3.tgz", - "integrity": "sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==", + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.4.0", - "semver": "7.6.0", - "tar-fs": "3.0.5", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" + "isexe": "^3.1.1" }, "bin": { - "browsers": "lib/cjs/main-cli.js" + "node-which": "bin/which.js" }, "engines": { - "node": ">=18" + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/@puppeteer/browsers/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, + "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "bin": { - "semver": "bin/semver.js" + "installed-package-contents": "bin/index.js" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@puppeteer/browsers/node_modules/tar-fs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", - "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true, - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@puppeteer/browsers/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "node_modules/@npmcli/package-json": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz", + "integrity": "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==", "dev": true, + "license": "ISC", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@rollup/plugin-json": { - "version": "6.0.0", + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@rollup/pluginutils": "^5.0.1" + "which": "^4.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.1.0", + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, + "license": "ISC", "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "node": ">=16" } }, - "node_modules/@rollup/pluginutils": { - "version": "5.0.2", + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" + "isexe": "^3.1.1" }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "bin": { + "node-which": "bin/which.js" }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/@schematics/angular": { - "version": "16.1.6", + "node_modules/@npmcli/redact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", + "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", "dev": true, - "license": "MIT", - "dependencies": { - "@angular-devkit/core": "16.1.6", - "@angular-devkit/schematics": "16.1.6", - "jsonc-parser": "3.2.0" - }, + "license": "ISC", "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": { - "version": "16.1.6", + "node_modules/@npmcli/run-script": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", + "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@angular-devkit/core": "16.1.6", - "jsonc-parser": "3.2.0", - "magic-string": "0.30.0", - "ora": "5.4.1", - "rxjs": "7.8.1" + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" }, "engines": { - "node": "^16.14.0 || >=18.10.0", - "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", - "yarn": ">= 1.13.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@schematics/angular/node_modules/jsonc-parser": { - "version": "3.2.0", + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": ">=16" + } }, - "node_modules/@schematics/angular/node_modules/magic-string": { - "version": "0.30.0", + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" }, "engines": { - "node": ">=12" + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/@schematics/angular/node_modules/rxjs": { - "version": "7.8.1", + "node_modules/@nrwl/devkit": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-19.7.3.tgz", + "integrity": "sha512-g9vANTuxgHan6uAkI6M6tkfLjHECLmbZ4A80UqpxJNQJsCJFEHkzIC9oxhf8bWV3PjgCH6Xm4VyQ2GHwb3sgWw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "tslib": "^2.1.0" + "@nx/devkit": "19.7.3" } }, - "node_modules/@sigstore/bundle": { - "version": "1.0.0", + "node_modules/@nrwl/tao": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-19.7.3.tgz", + "integrity": "sha512-cIGhnSFPZdVTp4bI0fqwFoE9i7ToPg5jXz+hNMl/MTwcOQfKQ1JJY/ZPLM3aBUPORFIZ/GECQEycUb6+xCB56g==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" + "nx": "19.7.3", + "tslib": "^2.3.0" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "bin": { + "tao": "index.js" } }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.2.0", + "node_modules/@nx/devkit": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-19.7.3.tgz", + "integrity": "sha512-dIavuzfcMLCTa5uhd4R7HsxcFO0w9fHwG4wDg76wyBAbPGJlrR+9zg359hZ/SkXdguO6bMVmmQg/EXIvo6g69A==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "license": "MIT", + "dependencies": { + "@nrwl/devkit": "19.7.3", + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 17 <= 20" } }, - "node_modules/@sigstore/tuf": { - "version": "1.0.3", + "node_modules/@nx/nx-darwin-arm64": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.7.3.tgz", + "integrity": "sha512-0dDK0UkMR0vBv4AP/48Q9A+OC2dvpivdt8su/4W/CPADy69M9B5O3jPiK+jTRsLshQG/soC9JG0Rll1BNWymPg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 10" } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", + "node_modules/@nx/nx-darwin-x64": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-19.7.3.tgz", + "integrity": "sha512-hTdv5YY2GQTdT7GwVO7ST27ZzvCmAQvmkEapfnCdy74QsL4gapaXJFvtWLHVfG6qHNRHWXbpdegvR3VswRHZVQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } }, - "node_modules/@storybook/addon-actions": { - "version": "7.1.0", + "node_modules/@nx/nx-freebsd-x64": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.7.3.tgz", + "integrity": "sha512-dwuB/3eoV2RbD0b0LHnagQOXa9PKAjLi7g5vNxzw6LuNT1tdaLaUZZGv2tfG0hHjsV0cOaAX41rEyOIwJyE7zg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@storybook/client-logger": "7.1.0", - "@storybook/components": "7.1.0", - "@storybook/core-events": "7.1.0", - "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.1.0", - "@storybook/preview-api": "7.1.0", - "@storybook/theming": "7.1.0", - "@storybook/types": "7.1.0", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "polished": "^4.2.2", - "prop-types": "^15.7.2", - "react-inspector": "^6.0.0", - "telejson": "^7.0.3", - "ts-dedent": "^2.0.0", - "uuid": "^9.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@storybook/addon-actions/node_modules/uuid": { - "version": "9.0.0", + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.7.3.tgz", + "integrity": "sha512-X/eG3IqvIxlCfIOiCQKv7RKwra54I+SN9zj2TeSOtd/uK0paa3mYSlGUJqoP3wpzasW1+EPIGkTQqV283IA15w==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@storybook/addon-backgrounds": { - "version": "7.1.0", + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.7.3.tgz", + "integrity": "sha512-LNaX8DVcPlFVJhMf1AAAR6j1DZF9BlVhWlilRM44tIfnmvPfKIahKJIJbuikHE7q+lkvMrQUUDXKiQJlmm/qDw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@storybook/client-logger": "7.1.0", - "@storybook/components": "7.1.0", - "@storybook/core-events": "7.1.0", - "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.1.0", - "@storybook/preview-api": "7.1.0", - "@storybook/theming": "7.1.0", - "@storybook/types": "7.1.0", - "memoizerific": "^1.11.3", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@storybook/addon-controls": { - "version": "7.1.0", + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.7.3.tgz", + "integrity": "sha512-TJ9PqSebhrn8NfrW+wqMXB9N65U0L0Kjt8FfahWffNKtSAEUvhurbNhqna2Rt5WJe2qaVf6zN2pOHKhF/5pL0w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@storybook/blocks": "7.1.0", - "@storybook/client-logger": "7.1.0", - "@storybook/components": "7.1.0", - "@storybook/core-common": "7.1.0", - "@storybook/manager-api": "7.1.0", - "@storybook/node-logger": "7.1.0", - "@storybook/preview-api": "7.1.0", - "@storybook/theming": "7.1.0", - "@storybook/types": "7.1.0", - "lodash": "^4.17.21", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@storybook/addon-docs": { - "version": "7.1.0", + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.7.3.tgz", + "integrity": "sha512-YMb4WGGovwgxsP6VvAEnyWvLoUwsDrdE5CxFQ2yoThD2BixmSHUKLtx6dtPDHz25nOE3v1ZzM0xTwYXBhPaeRQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jest/transform": "^29.3.1", - "@mdx-js/react": "^2.1.5", - "@storybook/blocks": "7.1.0", - "@storybook/client-logger": "7.1.0", - "@storybook/components": "7.1.0", - "@storybook/csf-plugin": "7.1.0", - "@storybook/csf-tools": "7.1.0", - "@storybook/global": "^5.0.0", - "@storybook/mdx2-csf": "^1.0.0", - "@storybook/node-logger": "7.1.0", - "@storybook/postinstall": "7.1.0", - "@storybook/preview-api": "7.1.0", - "@storybook/react-dom-shim": "7.1.0", - "@storybook/theming": "7.1.0", - "@storybook/types": "7.1.0", - "fs-extra": "^11.1.0", - "remark-external-links": "^8.0.0", - "remark-slug": "^6.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@storybook/addon-docs/node_modules/fs-extra": { - "version": "11.1.1", + "node_modules/@nx/nx-linux-x64-musl": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.7.3.tgz", + "integrity": "sha512-zkjgDSvw2eDN+KuJBPPAPhU/lOdiMvJU0UMthJFw85dhQIYfAO8+UgiFg/qBsKo0kQ0MkhntnIPBPF8bH40qWg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.14" + "node": ">= 10" } }, - "node_modules/@storybook/addon-essentials": { - "version": "7.1.0", + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.7.3.tgz", + "integrity": "sha512-qCTFG6VxNvEe5JfoAELGZsjWDL4G+2NVSoSS3tByJYwVX256qgALcVoUHMjpxBn9FeOvUW9w5PL4Am4PKDdXLw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@storybook/addon-actions": "7.1.0", - "@storybook/addon-backgrounds": "7.1.0", - "@storybook/addon-controls": "7.1.0", - "@storybook/addon-docs": "7.1.0", - "@storybook/addon-highlight": "7.1.0", - "@storybook/addon-measure": "7.1.0", - "@storybook/addon-outline": "7.1.0", - "@storybook/addon-toolbars": "7.1.0", - "@storybook/addon-viewport": "7.1.0", - "@storybook/core-common": "7.1.0", - "@storybook/manager-api": "7.1.0", - "@storybook/node-logger": "7.1.0", - "@storybook/preview-api": "7.1.0", - "ts-dedent": "^2.0.0" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.7.3.tgz", + "integrity": "sha512-ULNf73gLgB5cU/O4dlQe6tetbRIROTmaUNYTUUCCAC0BqVwZwPDxn4u9C5LgiErVyfPwwAhlserCGei5taLASQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "url": "https://opencollective.com/unts" } }, - "node_modules/@storybook/addon-highlight": { - "version": "7.1.0", + "node_modules/@puppeteer/browsers": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.3.tgz", + "integrity": "sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@storybook/core-events": "7.1.0", - "@storybook/global": "^5.0.0", - "@storybook/preview-api": "7.1.0" + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "semver": "7.6.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" } }, - "node_modules/@storybook/addon-links": { - "version": "7.1.0", + "node_modules/@puppeteer/browsers/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/client-logger": "7.1.0", - "@storybook/core-events": "7.1.0", - "@storybook/csf": "^0.1.0", - "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.1.0", - "@storybook/preview-api": "7.1.0", - "@storybook/router": "7.1.0", - "@storybook/types": "7.1.0", - "prop-types": "^15.7.2", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "ms": "2.1.2" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "engines": { + "node": ">=6.0" }, "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { + "supports-color": { "optional": true } } }, - "node_modules/@storybook/addon-mdx-gfm": { - "version": "7.1.0", + "node_modules/@puppeteer/browsers/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@storybook/node-logger": "7.1.0", - "remark-gfm": "^3.0.1", - "ts-dedent": "^2.0.0" + "yallist": "^4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "engines": { + "node": ">=10" } }, - "node_modules/@storybook/addon-measure": { - "version": "7.1.0", + "node_modules/@puppeteer/browsers/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "license": "ISC", "dependencies": { - "@storybook/client-logger": "7.1.0", - "@storybook/components": "7.1.0", - "@storybook/core-events": "7.1.0", - "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.1.0", - "@storybook/preview-api": "7.1.0", - "@storybook/types": "7.1.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "lru-cache": "^6.0.0" }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "bin": { + "semver": "bin/semver.js" }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/@storybook/addon-outline": { - "version": "7.1.0", + "node_modules/@puppeteer/browsers/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/client-logger": "7.1.0", - "@storybook/components": "7.1.0", - "@storybook/core-events": "7.1.0", - "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.1.0", - "@storybook/preview-api": "7.1.0", - "@storybook/types": "7.1.0", - "ts-dedent": "^2.0.0" + "@rollup/pluginutils": "^5.1.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { + "rollup": { "optional": true } } }, - "node_modules/@storybook/addon-toolbars": { - "version": "7.1.0", + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/client-logger": "7.1.0", - "@storybook/components": "7.1.0", - "@storybook/manager-api": "7.1.0", - "@storybook/preview-api": "7.1.0", - "@storybook/theming": "7.1.0" + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { + "rollup": { "optional": true } } }, - "node_modules/@storybook/addon-viewport": { - "version": "7.1.0", + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/client-logger": "7.1.0", - "@storybook/components": "7.1.0", - "@storybook/core-events": "7.1.0", - "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.1.0", - "@storybook/preview-api": "7.1.0", - "@storybook/theming": "7.1.0", - "memoizerific": "^1.11.3", - "prop-types": "^15.7.2" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { + "rollup": { "optional": true } } }, - "node_modules/@storybook/angular": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-7.6.20.tgz", - "integrity": "sha512-0oOcM1AgOWmN7PGU/gCX56dTkAOo0G4CR2eejDHhzt2u0xSNxIJIdXXUgyO33kR1F2D/7W6oMMjApM302nD6sg==", - "dev": true, - "dependencies": { - "@storybook/builder-webpack5": "7.6.20", - "@storybook/cli": "7.6.20", - "@storybook/client-logger": "7.6.20", - "@storybook/core-common": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/core-server": "7.6.20", - "@storybook/core-webpack": "7.6.20", - "@storybook/docs-tools": "7.6.20", - "@storybook/global": "^5.0.0", - "@storybook/node-logger": "7.6.20", - "@storybook/preview-api": "7.6.20", - "@storybook/telemetry": "7.6.20", - "@storybook/types": "7.6.20", - "@types/node": "^18.0.0", - "@types/react": "^16.14.34", - "@types/react-dom": "^16.9.14", - "@types/semver": "^7.3.4", - "@types/webpack-env": "^1.18.0", - "find-up": "^5.0.0", - "read-pkg-up": "^7.0.1", - "semver": "^7.3.7", - "telejson": "^7.2.0", - "ts-dedent": "^2.0.0", - "tsconfig-paths-webpack-plugin": "^4.0.1", - "util-deprecate": "^1.0.2", - "webpack": "5" - }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=16.0.0" + "node": ">=8.6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@angular-devkit/architect": ">=0.1400.0 < 0.1900.0", - "@angular-devkit/build-angular": ">=14.1.0 < 19.0.0", - "@angular-devkit/core": ">=14.1.0 < 19.0.0", - "@angular/cli": ">=14.1.0 < 19.0.0", - "@angular/common": ">=14.1.0 < 19.0.0", - "@angular/compiler": ">=14.1.0 < 19.0.0", - "@angular/compiler-cli": ">=14.1.0 < 19.0.0", - "@angular/core": ">=14.1.0 < 19.0.0", - "@angular/forms": ">=14.1.0 < 19.0.0", - "@angular/platform-browser": ">=14.1.0 < 19.0.0", - "@angular/platform-browser-dynamic": ">=14.1.0 < 19.0.0", - "@babel/core": "*", - "rxjs": "^6.0.0 || ^7.4.0", - "typescript": "^4.0.0 || ^5.0.0", - "zone.js": ">= 0.11.1 < 1.0.0" - }, - "peerDependenciesMeta": { - "@angular/cli": { - "optional": true - } + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@storybook/angular/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.3.tgz", + "integrity": "sha512-MmKSfaB9GX+zXl6E8z4koOr/xU63AMVleLEa64v7R0QF/ZloMs5vcD1sHgM64GXXS1csaJutG+ddtzcueI/BLg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.3.tgz", + "integrity": "sha512-zrt8ecH07PE3sB4jPOggweBjJMzI1JG5xI2DIsUbkA+7K+Gkjys6eV7i9pOenNSDJH3eOr/jLb/PzqtmdwDq5g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/angular/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.3.tgz", + "integrity": "sha512-P0UxIOrKNBFTQaXTxOH4RxuEBVCgEA5UTNV6Yz7z9QHnUJ7eLX9reOd/NYMO3+XZO2cco19mXTxDMXxit4R/eQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.3.tgz", + "integrity": "sha512-L1M0vKGO5ASKntqtsFEjTq/fD91vAqnzeaF6sfNAy55aD+Hi2pBI5DKwCO+UNDQHWsDViJLqshxOahXyLSh3EA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/angular/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/angular/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.3.tgz", + "integrity": "sha512-btVgIsCjuYFKUjopPoWiDqmoUXQDiW2A4C3Mtmp5vACm7/GnyuprqIDPNczeyR5W8rTXEbkmrJux7cJmD99D2g==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/angular/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.3.tgz", + "integrity": "sha512-zmjbSphplZlau6ZTkxd3+NMtE4UKVy7U4aVFMmHcgO5CUbw17ZP6QCgyxhzGaU/wFFdTfiojjbLG3/0p9HhAqA==", "cpu": [ - "ia32" + "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.3.tgz", + "integrity": "sha512-nSZfcZtAnQPRZmUkUQwZq2OjQciR6tEoJaZVFvLHsj0MF6QhNMg0fQ6mUOsiCUpTqxTx0/O6gX0V/nYc7LrgPw==", "cpu": [ - "loong64" + "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.3.tgz", + "integrity": "sha512-MnvSPGO8KJXIMGlQDYfvYS3IosFN2rKsvxRpPO2l2cum+Z3exiExLwVU+GExL96pn8IP+GdH8Tz70EpBhO0sIQ==", "cpu": [ - "mips64el" + "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.3.tgz", + "integrity": "sha512-+W+p/9QNDr2vE2AXU0qIy0qQE75E8RTwTwgqS2G5CRQ11vzq0tbnfBd6brWhS9bCRjAjepJe2fvvkvS3dno+iw==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.3.tgz", + "integrity": "sha512-yXH6K6KfqGXaxHrtr+Uoy+JpNlUlI46BKVyonGiaD74ravdnF9BUNC+vV+SIuB96hUMGShhKV693rF9QDfO6nQ==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.3.tgz", + "integrity": "sha512-R8cwY9wcnApN/KDYWTH4gV/ypvy9yZUHlbJvfaiXSB48JO3KpwSpjOGqO4jnGkLDSk1hgjYkTbTt6Q7uvPf8eg==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.3.tgz", + "integrity": "sha512-kZPbX/NOPh0vhS5sI+dR8L1bU2cSO9FgxwM8r7wHzGydzfSjLRCFAT87GR5U9scj2rhzN3JPYVC7NoBbl4FZ0g==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/angular/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/angular/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.3.tgz", + "integrity": "sha512-S0Yq+xA1VEH66uiMNhijsWAafffydd2X5b77eLHfRmfLsRSpbiAWiRHV6DEpz6aOToPsgid7TI9rGd6zB1rhbg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } + "linux" + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.3.tgz", + "integrity": "sha512-9isNzeL34yquCPyerog+IMCNxKR8XYmGd0tHSV+OVx0TmE0aJOo9uw4fZfUuk2qxobP5sug6vNdZR6u7Mw7Q+Q==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.3.tgz", + "integrity": "sha512-nMIdKnfZfzn1Vsk+RuOvl43ONTZXoAPUUxgcU0tXooqg4YrAqzfKzVenqqk2g5efWh46/D28cKFrOzDSW28gTA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.3.tgz", + "integrity": "sha512-fOvu7PCQjAj4eWDEuD8Xz5gpzFqXzGlxHZozHP4b9Jxv9APtdxL6STqztDzMLuRXEc4UpXGGhx029Xgm91QBeA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" - ], - "engines": { - "node": ">=12" - } + ] }, - "node_modules/@storybook/angular/node_modules/@storybook/channels": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.20.tgz", - "integrity": "sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==", + "node_modules/@rollup/wasm-node": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/@rollup/wasm-node/-/wasm-node-4.21.3.tgz", + "integrity": "sha512-uZFl4GXMgyllfuKjY/zlXxTxDs+G/LB7snVENskpJt7IIXw6cD1yqi3eBeGM8NxE9kuxrNB0Qr1QLNtDYTlqeQ==", "dev": true, + "license": "MIT", "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" + "@types/estree": "1.0.5" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/@storybook/angular/node_modules/@storybook/client-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.20.tgz", - "integrity": "sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==", + "node_modules/@schematics/angular": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.2.1.tgz", + "integrity": "sha512-bBV7I+MCbdQmBPUFF4ECg37VReM0+AdQsxgwkjBBSYExmkErkDoDgKquwL/tH7stDCc5IfTd0g9BMeosRgDMug==", "dev": true, + "license": "MIT", "dependencies": { - "@storybook/global": "^5.0.0" + "@angular-devkit/core": "18.2.1", + "@angular-devkit/schematics": "18.2.1", + "jsonc-parser": "3.3.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@storybook/angular/node_modules/@storybook/core-common": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.20.tgz", - "integrity": "sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==", + "node_modules/@schematics/angular/node_modules/@angular-devkit/core": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.1.tgz", + "integrity": "sha512-fSuGj6CxiTFR+yjuVcaWqaVb5Wts39CSBYRO1BlsOlbuWFZ2NKC/BAb5bdxpB31heCBJi7e3XbPvcMMJIcnKlA==", "dev": true, + "license": "MIT", "dependencies": { - "@storybook/core-events": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/types": "7.6.20", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "esbuild": "^0.18.0", - "esbuild-register": "^3.5.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@storybook/angular/node_modules/@storybook/core-events": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.20.tgz", - "integrity": "sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==", + "node_modules/@schematics/angular/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "tslib": "^2.1.0" } }, - "node_modules/@storybook/angular/node_modules/@storybook/docs-tools": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.20.tgz", - "integrity": "sha512-Bw2CcCKQ5xGLQgtexQsI1EGT6y5epoFzOINi0FSTGJ9Wm738nRp5LH3dLk1GZLlywIXcYwOEThb2pM+pZeRQxQ==", + "node_modules/@sigstore/bundle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", + "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@storybook/core-common": "7.6.20", - "@storybook/preview-api": "7.6.20", - "@storybook/types": "7.6.20", - "@types/doctrine": "^0.0.3", - "assert": "^2.1.0", - "doctrine": "^3.0.0", - "lodash": "^4.17.21" + "@sigstore/protobuf-specs": "^0.3.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@storybook/angular/node_modules/@storybook/node-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.20.tgz", - "integrity": "sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==", + "node_modules/@sigstore/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@storybook/angular/node_modules/@storybook/preview-api": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.20.tgz", - "integrity": "sha512-3ic2m9LDZEPwZk02wIhNc3n3rNvbi7VDKn52hDXfAxnL5EYm7yDICAkaWcVaTfblru2zn0EDJt7ROpthscTW5w==", + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", + "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", "dev": true, - "dependencies": { - "@storybook/channels": "7.6.20", - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.20", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@storybook/angular/node_modules/@storybook/types": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.20.tgz", - "integrity": "sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==", + "node_modules/@sigstore/sign": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", + "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@storybook/channels": "7.6.20", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@storybook/angular/node_modules/@types/react": { - "version": "16.14.34", + "node_modules/@sigstore/tuf": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", + "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@storybook/angular/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@sigstore/verify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", + "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "color-convert": "^2.0.1" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@storybook/angular/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } + "license": "MIT" }, - "node_modules/@storybook/angular/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/angular/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@storybook/angular/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT" + }, + "node_modules/@storybook/addon-actions": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.3.1.tgz", + "integrity": "sha512-f00NxBNBcsMHqtwsOpRbZKrNMLdUjnSg1G6zYdVxAG7NwxzgpqPZm37I36ebFmgz/WO2XQ3ihxzfV2IKFuiZ6g==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" }, - "engines": { - "node": ">=14.14" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/angular/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/@storybook/addon-backgrounds": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.3.1.tgz", + "integrity": "sha512-HPQElHIi5SMWJTOimYt27QaiPrrwTprVShVfq3gQKpUcDJhT4qMpI3Bn3JCtthPlXlUA+miZcNdNRTIc2XzhSA==", "dev": true, + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/angular/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/angular/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/@storybook/addon-controls": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.3.1.tgz", + "integrity": "sha512-zqVNRGQ2GS1ReDZ6YTAl+pLmnrOWwE3OUsByRfzHCYlmO55TxYi92HBTSbAXyWRKyqVUKH69PmbKGukc83aX2Q==", "dev": true, + "license": "MIT", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "@storybook/global": "^5.0.0", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/angular/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@storybook/addon-docs": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.3.1.tgz", + "integrity": "sha512-8ES7ThajpKDoMheAthnDDg/lXUsIxzV+EdHuE4WnRoiw+25XfYr9WIEuEpytRz/drouJhunOgOJV0kCPxZ3XgQ==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "@mdx-js/react": "^3.0.0", + "@storybook/blocks": "8.3.1", + "@storybook/csf-plugin": "8.3.1", + "@storybook/global": "^5.0.0", + "@storybook/react-dom-shim": "8.3.1", + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "fs-extra": "^11.1.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "rehype-external-links": "^3.0.0", + "rehype-slug": "^6.0.0", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/angular/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/@storybook/addon-essentials": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.3.1.tgz", + "integrity": "sha512-5dNlKKJveBYqe1OT4dSE7V7ZjhULWnL238oeHz6wabjfL/l7W9MgLke5mxir4xSaAKf5sOg+QFK+RSmYYih4pg==", "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" + "license": "MIT", + "dependencies": { + "@storybook/addon-actions": "8.3.1", + "@storybook/addon-backgrounds": "8.3.1", + "@storybook/addon-controls": "8.3.1", + "@storybook/addon-docs": "8.3.1", + "@storybook/addon-highlight": "8.3.1", + "@storybook/addon-measure": "8.3.1", + "@storybook/addon-outline": "8.3.1", + "@storybook/addon-toolbars": "8.3.1", + "@storybook/addon-viewport": "8.3.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/angular/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/@storybook/addon-highlight": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.3.1.tgz", + "integrity": "sha512-hEB4O1a76SGEJypjPwjvBT8e9+pWptAD6VY995gtsOrMLaV0213DJV8aEGJRXhELEk2sr8WUaoYhzxxtgD97KA==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "@storybook/global": "^5.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/blocks": { - "version": "7.1.0", + "node_modules/@storybook/addon-links": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.3.1.tgz", + "integrity": "sha512-xhd1cXpHKn9mr87ImcEOV+YexDZcITzxFQoW2m5ocGkMyVFotK6NjOk/f9xsZAGIp4T7axsdEmwFNSovHgw91A==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/channels": "7.1.0", - "@storybook/client-logger": "7.1.0", - "@storybook/components": "7.1.0", - "@storybook/core-events": "7.1.0", - "@storybook/csf": "^0.1.0", - "@storybook/docs-tools": "7.1.0", + "@storybook/csf": "^0.1.11", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "7.1.0", - "@storybook/preview-api": "7.1.0", - "@storybook/theming": "7.1.0", - "@storybook/types": "7.1.0", - "@types/lodash": "^4.14.167", - "color-convert": "^2.0.1", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "markdown-to-jsx": "^7.1.8", - "memoizerific": "^1.11.3", - "polished": "^4.2.2", - "react-colorful": "^5.1.2", - "telejson": "^7.0.3", - "tocbot": "^4.20.1", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" + "ts-dedent": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.1" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } } }, - "node_modules/@storybook/builder-manager": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.20.tgz", - "integrity": "sha512-e2GzpjLaw6CM/XSmc4qJRzBF8GOoOyotyu3JrSPTYOt4RD8kjUsK4QlismQM1DQRu8i39aIexxmRbiJyD74xzQ==", + "node_modules/@storybook/addon-mdx-gfm": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-mdx-gfm/-/addon-mdx-gfm-8.3.1.tgz", + "integrity": "sha512-Kth9noYkHrK3s3XjQCG51Li42ecK4BVd0xS77xRrsmFBBR9fdBCPbMhR2g9WYmFJz5Vq2vEta9vBTXZUnxzNEg==", "dev": true, + "license": "MIT", "dependencies": { - "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "7.6.20", - "@storybook/manager": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@types/ejs": "^3.1.1", - "@types/find-cache-dir": "^3.2.1", - "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", - "browser-assert": "^1.2.1", - "ejs": "^3.1.8", - "esbuild": "^0.18.0", - "esbuild-plugin-alias": "^0.2.1", - "express": "^4.17.3", - "find-cache-dir": "^3.0.0", - "fs-extra": "^11.1.0", - "process": "^0.11.10", - "util": "^0.12.4" + "remark-gfm": "^4.0.0", + "ts-dedent": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], + "node_modules/@storybook/addon-measure": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.3.1.tgz", + "integrity": "sha512-XL7Rph0K0vggVcY7mxGws9SNzLJlCvzrPJdz1xZBKBLLd0fdpbR5Y+1oP1w/7qhZ9Xrg44VRVs4yUzCYUeK2OQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], + "node_modules/@storybook/addon-outline": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.3.1.tgz", + "integrity": "sha512-bpxiffkMjWbrVAmbonzkGaTQp3zCECOP5B4Uw0oRfH7YVZgUsj1brRjVsMvBB1bwDP/ijj46X12OcZjqVEJP5Q==", "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], + "node_modules/@storybook/addon-toolbars": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.3.1.tgz", + "integrity": "sha512-bjlQP9a56O4OCI4g9tDNm51frBcHaFpHma3MJ1vg302oj/XOQrec/am2sA0E6L1l4Hih2PkRYTamo3+GmQRJug==", "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], + "node_modules/@storybook/addon-viewport": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.3.1.tgz", + "integrity": "sha512-Z0Ls3ThjOx56KE4I5ampOtfK7G4/AAa0bOoaFq7+bLOomXMtZsC3yyXyrm5YQ6ZHmeP2XaXmOe52HDsvq+ko2Q==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], + "node_modules/@storybook/angular": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/angular/-/angular-8.3.1.tgz", + "integrity": "sha512-kMxTFN+KP+NNJ8e88nTS01sTOiGR2P7N7U7dPe6an8aZvjKnM6PKAo8FU0vLtdszhevmKB321IhnTSDjPnOGsg==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@storybook/channels": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.20.tgz", - "integrity": "sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@storybook/client-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.20.tgz", - "integrity": "sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@storybook/core-common": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.20.tgz", - "integrity": "sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==", - "dev": true, - "dependencies": { - "@storybook/core-events": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/types": "7.6.20", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "esbuild": "^0.18.0", - "esbuild-register": "^3.5.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@storybook/core-events": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.20.tgz", - "integrity": "sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==", - "dev": true, - "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@storybook/node-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.20.tgz", - "integrity": "sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-manager/node_modules/@storybook/types": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.20.tgz", - "integrity": "sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==", - "dev": true, - "dependencies": { - "@storybook/channels": "7.6.20", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-manager/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/builder-manager/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@storybook/builder-manager/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@storybook/builder-manager/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@storybook/builder-manager/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/builder-manager/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/builder-manager/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/builder-manager/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@storybook/builder-manager/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/builder-manager/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@storybook/builder-manager/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/builder-webpack5": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.6.20.tgz", - "integrity": "sha512-kUcMZHVo/jybwsje03MFN1ZucdjyH6QB+jlw9dzHrAhM6N1IItwHzhlixvxmseA5OB7jk1b0WcCN8tfD2qByFA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.2", - "@storybook/channels": "7.6.20", - "@storybook/client-logger": "7.6.20", - "@storybook/core-common": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/core-webpack": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/preview": "7.6.20", - "@storybook/preview-api": "7.6.20", - "@swc/core": "^1.3.82", - "@types/node": "^18.0.0", - "@types/semver": "^7.3.4", - "babel-loader": "^9.0.0", - "browser-assert": "^1.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "cjs-module-lexer": "^1.2.3", - "constants-browserify": "^1.0.0", - "css-loader": "^6.7.1", - "es-module-lexer": "^1.4.1", - "express": "^4.17.3", - "fork-ts-checker-webpack-plugin": "^8.0.0", - "fs-extra": "^11.1.0", - "html-webpack-plugin": "^5.5.0", - "magic-string": "^0.30.5", - "path-browserify": "^1.0.1", - "process": "^0.11.10", - "semver": "^7.3.7", - "style-loader": "^3.3.1", - "swc-loader": "^0.2.3", - "terser-webpack-plugin": "^5.3.1", - "ts-dedent": "^2.0.0", - "url": "^0.11.0", - "util": "^0.12.4", - "util-deprecate": "^1.0.2", - "webpack": "5", - "webpack-dev-middleware": "^6.1.1", - "webpack-hot-middleware": "^2.25.1", - "webpack-virtual-modules": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@storybook/channels": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.20.tgz", - "integrity": "sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@storybook/client-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.20.tgz", - "integrity": "sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@storybook/core-common": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.20.tgz", - "integrity": "sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==", - "dev": true, - "dependencies": { - "@storybook/core-events": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/types": "7.6.20", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "esbuild": "^0.18.0", - "esbuild-register": "^3.5.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@storybook/core-events": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.20.tgz", - "integrity": "sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==", - "dev": true, - "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@storybook/node-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.20.tgz", - "integrity": "sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@storybook/preview-api": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.20.tgz", - "integrity": "sha512-3ic2m9LDZEPwZk02wIhNc3n3rNvbi7VDKn52hDXfAxnL5EYm7yDICAkaWcVaTfblru2zn0EDJt7ROpthscTW5w==", - "dev": true, - "dependencies": { - "@storybook/channels": "7.6.20", - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.20", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/@storybook/types": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.20.tgz", - "integrity": "sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==", - "dev": true, - "dependencies": { - "@storybook/channels": "7.6.20", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@storybook/builder-webpack5/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@storybook/builder-webpack5/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/channel-postmessage": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "7.1.0", - "@storybook/client-logger": "7.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/channels": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "7.1.0", - "@storybook/client-logger": "7.1.0", - "@storybook/core-events": "7.1.0", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.0.3", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.20.tgz", - "integrity": "sha512-ZlP+BJyqg7HlnXf7ypjG2CKMI/KVOn03jFIiClItE/jQfgR6kRFgtjRU7uajh427HHfjv9DRiur8nBzuO7vapA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/types": "^7.23.0", - "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "7.6.20", - "@storybook/core-common": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/core-server": "7.6.20", - "@storybook/csf-tools": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/telemetry": "7.6.20", - "@storybook/types": "7.6.20", - "@types/semver": "^7.3.4", - "@yarnpkg/fslib": "2.10.3", - "@yarnpkg/libzip": "2.3.0", - "chalk": "^4.1.0", - "commander": "^6.2.1", - "cross-spawn": "^7.0.3", - "detect-indent": "^6.1.0", - "envinfo": "^7.7.3", - "execa": "^5.0.0", - "express": "^4.17.3", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "get-npm-tarball-url": "^2.0.3", - "get-port": "^5.1.1", - "giget": "^1.0.0", - "globby": "^11.0.2", - "jscodeshift": "^0.15.1", - "leven": "^3.1.0", - "ora": "^5.4.1", - "prettier": "^2.8.0", - "prompts": "^2.4.0", - "puppeteer-core": "^2.1.1", - "read-pkg-up": "^7.0.1", - "semver": "^7.3.7", - "strip-json-comments": "^3.0.1", - "tempy": "^1.0.1", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "bin": { - "getstorybook": "bin/index.js", - "sb": "bin/index.js" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli/node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@storybook/cli/node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@storybook/cli/node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/cli/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@storybook/cli/node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@storybook/cli/node_modules/@babel/preset-env": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", - "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.0", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.0", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@storybook/cli/node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@storybook/cli/node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@storybook/cli/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/cli/node_modules/@storybook/channels": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.20.tgz", - "integrity": "sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli/node_modules/@storybook/client-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.20.tgz", - "integrity": "sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli/node_modules/@storybook/core-common": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.20.tgz", - "integrity": "sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==", - "dev": true, - "dependencies": { - "@storybook/core-events": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/types": "7.6.20", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "esbuild": "^0.18.0", - "esbuild-register": "^3.5.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli/node_modules/@storybook/core-events": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.20.tgz", - "integrity": "sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==", - "dev": true, - "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli/node_modules/@storybook/csf-tools": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.20.tgz", - "integrity": "sha512-rwcwzCsAYh/m/WYcxBiEtLpIW5OH1ingxNdF/rK9mtGWhJxXRDV8acPkFrF8rtFWIVKoOCXu5USJYmc3f2gdYQ==", - "dev": true, - "dependencies": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "@storybook/csf": "^0.1.2", - "@storybook/types": "7.6.20", - "fs-extra": "^11.1.0", - "recast": "^0.23.1", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli/node_modules/@storybook/node-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.20.tgz", - "integrity": "sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli/node_modules/@storybook/types": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.20.tgz", - "integrity": "sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==", - "dev": true, - "dependencies": { - "@storybook/channels": "7.6.20", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/cli/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@storybook/cli/node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@storybook/cli/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@storybook/cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@storybook/cli/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/cli/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@storybook/cli/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@storybook/cli/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/cli/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/cli/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@storybook/cli/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/cli/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@storybook/cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/client-logger": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/codemod": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.20.tgz", - "integrity": "sha512-8vmSsksO4XukNw0TmqylPmk7PxnfNfE21YsxFa7mnEBmEKQcZCQsNil4ZgWfG0IzdhTfhglAN4r++Ew0WE+PYA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.2", - "@babel/preset-env": "^7.23.2", - "@babel/types": "^7.23.0", - "@storybook/csf": "^0.1.2", - "@storybook/csf-tools": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/types": "7.6.20", - "@types/cross-spawn": "^6.0.2", - "cross-spawn": "^7.0.3", - "globby": "^11.0.2", - "jscodeshift": "^0.15.1", - "lodash": "^4.17.21", - "prettier": "^2.8.0", - "recast": "^0.23.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/codemod/node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@storybook/codemod/node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/codemod/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@storybook/codemod/node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", - "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@storybook/codemod/node_modules/@babel/preset-env": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", - "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.25.2", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.7", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.0", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.25.0", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-dotall-regex": "^7.24.7", - "@babel/plugin-transform-duplicate-keys": "^7.24.7", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", - "@babel/plugin-transform-dynamic-import": "^7.24.7", - "@babel/plugin-transform-exponentiation-operator": "^7.24.7", - "@babel/plugin-transform-export-namespace-from": "^7.24.7", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-member-expression-literals": "^7.24.7", - "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-modules-systemjs": "^7.25.0", - "@babel/plugin-transform-modules-umd": "^7.24.7", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-new-target": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-object-super": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-property-literals": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-reserved-words": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.8", - "@babel/plugin-transform-unicode-escapes": "^7.24.7", - "@babel/plugin-transform-unicode-property-regex": "^7.24.7", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.37.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@storybook/codemod/node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@storybook/codemod/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/codemod/node_modules/@storybook/channels": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.20.tgz", - "integrity": "sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/codemod/node_modules/@storybook/client-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.20.tgz", - "integrity": "sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/codemod/node_modules/@storybook/core-events": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.20.tgz", - "integrity": "sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==", - "dev": true, - "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/codemod/node_modules/@storybook/csf-tools": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.20.tgz", - "integrity": "sha512-rwcwzCsAYh/m/WYcxBiEtLpIW5OH1ingxNdF/rK9mtGWhJxXRDV8acPkFrF8rtFWIVKoOCXu5USJYmc3f2gdYQ==", - "dev": true, - "dependencies": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "@storybook/csf": "^0.1.2", - "@storybook/types": "7.6.20", - "fs-extra": "^11.1.0", - "recast": "^0.23.1", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/codemod/node_modules/@storybook/node-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.20.tgz", - "integrity": "sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/codemod/node_modules/@storybook/types": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.20.tgz", - "integrity": "sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==", - "dev": true, - "dependencies": { - "@storybook/channels": "7.6.20", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/codemod/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@storybook/codemod/node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@storybook/codemod/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@storybook/codemod/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/codemod/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@storybook/components": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "7.1.0", - "@storybook/csf": "^0.1.0", - "@storybook/global": "^5.0.0", - "@storybook/theming": "7.1.0", - "@storybook/types": "7.1.0", - "memoizerific": "^1.11.3", - "use-resize-observer": "^9.1.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/core-common": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/node-logger": "7.1.0", - "@storybook/types": "7.1.0", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^16.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "esbuild": "^0.18.0", - "esbuild-register": "^3.4.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/android-arm": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.14.tgz", - "integrity": "sha512-blODaaL+lngG5bdK/t4qZcQvq2BBqrABmYwqPPcS5VRxrCSGHb9R/rA3fqxh7R18I7WU4KKv+NYkt22FDfalcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/android-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.14.tgz", - "integrity": "sha512-rZ2v+Luba5/3D6l8kofWgTnqE+qsC/L5MleKIKFyllHTKHrNBMqeRCnZI1BtRx8B24xMYxeU32iIddRQqMsOsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/android-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.14.tgz", - "integrity": "sha512-qSwh8y38QKl+1Iqg+YhvCVYlSk3dVLk9N88VO71U4FUjtiSFylMWK3Ugr8GC6eTkkP4Tc83dVppt2n8vIdlSGg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.14.tgz", - "integrity": "sha512-9Hl2D2PBeDYZiNbnRKRWuxwHa9v5ssWBBjisXFkVcSP5cZqzZRFBUWEQuqBHO4+PKx4q4wgHoWtfQ1S7rUqJ2Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/darwin-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.14.tgz", - "integrity": "sha512-ZnI3Dg4ElQ6tlv82qLc/UNHtFsgZSKZ7KjsUNAo1BF1SoYDjkGKHJyCrYyWjFecmXpvvG/KJ9A/oe0H12odPLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.14.tgz", - "integrity": "sha512-h3OqR80Da4oQCIa37zl8tU5MwHQ7qgPV0oVScPfKJK21fSRZEhLE4IIVpmcOxfAVmqjU6NDxcxhYaM8aDIGRLw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.14.tgz", - "integrity": "sha512-ha4BX+S6CZG4BoH9tOZTrFIYC1DH13UTCRHzFc3GWX74nz3h/N6MPF3tuR3XlsNjMFUazGgm35MPW5tHkn2lzQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-arm": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.14.tgz", - "integrity": "sha512-5+7vehI1iqru5WRtJyU2XvTOvTGURw3OZxe3YTdE9muNNIdmKAVmSHpB3Vw2LazJk2ifEdIMt/wTWnVe5V98Kg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.14.tgz", - "integrity": "sha512-IXORRe22In7U65NZCzjwAUc03nn8SDIzWCnfzJ6t/8AvGx5zBkcLfknI+0P+hhuftufJBmIXxdSTbzWc8X/V4w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-ia32": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.14.tgz", - "integrity": "sha512-BfHlMa0nibwpjG+VXbOoqJDmFde4UK2gnW351SQ2Zd4t1N3zNdmUEqRkw/srC1Sa1DRBE88Dbwg4JgWCbNz/FQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-loong64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.14.tgz", - "integrity": "sha512-j2/Ex++DRUWIAaUDprXd3JevzGtZ4/d7VKz+AYDoHZ3HjJzCyYBub9CU1wwIXN+viOP0b4VR3RhGClsvyt/xSw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.14.tgz", - "integrity": "sha512-qn2+nc+ZCrJmiicoAnJXJJkZWt8Nwswgu1crY7N+PBR8ChBHh89XRxj38UU6Dkthl2yCVO9jWuafZ24muzDC/A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.14.tgz", - "integrity": "sha512-aGzXzd+djqeEC5IRkDKt3kWzvXoXC6K6GyYKxd+wsFJ2VQYnOWE954qV2tvy5/aaNrmgPTb52cSCHFE+Z7Z0yg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.14.tgz", - "integrity": "sha512-8C6vWbfr0ygbAiMFLS6OPz0BHvApkT2gCboOGV76YrYw+sD/MQJzyITNsjZWDXJwPu9tjrFQOVG7zijRzBCnLw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-s390x": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.14.tgz", - "integrity": "sha512-G/Lf9iu8sRMM60OVGOh94ZW2nIStksEcITkXdkD09/T6QFD/o+g0+9WVyR/jajIb3A0LvBJ670tBnGe1GgXMgw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/linux-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.14.tgz", - "integrity": "sha512-TBgStYBQaa3EGhgqIDM+ECnkreb0wkcKqL7H6m+XPcGUoU4dO7dqewfbm0mWEQYH3kzFHrzjOFNpSAVzDZRSJw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.14.tgz", - "integrity": "sha512-stvCcjyCQR2lMTroqNhAbvROqRjxPEq0oQ380YdXxA81TaRJEucH/PzJ/qsEtsHgXlWFW6Ryr/X15vxQiyRXVg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.14.tgz", - "integrity": "sha512-apAOJF14CIsN5ht1PA57PboEMsNV70j3FUdxLmA2liZ20gEQnfTG5QU0FhENo5nwbTqCB2O3WDsXAihfODjHYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/sunos-x64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.14.tgz", - "integrity": "sha512-fYRaaS8mDgZcGybPn2MQbn1ZNZx+UXFSUoS5Hd2oEnlsyUcr/l3c6RnXf1bLDRKKdLRSabTmyCy7VLQ7VhGdOQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/win32-arm64": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.14.tgz", - "integrity": "sha512-1c44RcxKEJPrVj62XdmYhxXaU/V7auELCmnD+Ri+UCt+AGxTvzxl9uauQhrFso8gj6ZV1DaORV0sT9XSHOAk8Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/win32-ia32": { - "version": "0.18.14", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.14.tgz", - "integrity": "sha512-EXAFttrdAxZkFQmpvcAQ2bywlWUsONp/9c2lcfvPUhu8vXBBenCXpoq9YkUvVP639ld3YGiYx0YUQ6/VQz3Maw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@esbuild/win32-x64": { - "version": "0.18.14", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-common/node_modules/@types/node": { - "version": "16.18.38", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/core-common/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/core-common/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@storybook/core-common/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@storybook/core-common/node_modules/esbuild": { - "version": "0.18.14", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.14", - "@esbuild/android-arm64": "0.18.14", - "@esbuild/android-x64": "0.18.14", - "@esbuild/darwin-arm64": "0.18.14", - "@esbuild/darwin-x64": "0.18.14", - "@esbuild/freebsd-arm64": "0.18.14", - "@esbuild/freebsd-x64": "0.18.14", - "@esbuild/linux-arm": "0.18.14", - "@esbuild/linux-arm64": "0.18.14", - "@esbuild/linux-ia32": "0.18.14", - "@esbuild/linux-loong64": "0.18.14", - "@esbuild/linux-mips64el": "0.18.14", - "@esbuild/linux-ppc64": "0.18.14", - "@esbuild/linux-riscv64": "0.18.14", - "@esbuild/linux-s390x": "0.18.14", - "@esbuild/linux-x64": "0.18.14", - "@esbuild/netbsd-x64": "0.18.14", - "@esbuild/openbsd-x64": "0.18.14", - "@esbuild/sunos-x64": "0.18.14", - "@esbuild/win32-arm64": "0.18.14", - "@esbuild/win32-ia32": "0.18.14", - "@esbuild/win32-x64": "0.18.14" - } - }, - "node_modules/@storybook/core-common/node_modules/fs-extra": { - "version": "11.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/core-common/node_modules/glob": { - "version": "10.3.3", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/core-common/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-common/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/core-common/node_modules/minipass": { - "version": "7.0.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@storybook/core-common/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-events": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.20.tgz", - "integrity": "sha512-qC5BdbqqwMLTdCwMKZ1Hbc3+3AaxHYWLiJaXL9e8s8nJw89xV8c8l30QpbJOGvcDmsgY6UTtXYaJ96OsTr7MrA==", - "dev": true, - "dependencies": { - "@aw-web-design/x-default-browser": "1.4.126", - "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "7.6.20", - "@storybook/channels": "7.6.20", - "@storybook/core-common": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/csf": "^0.1.2", - "@storybook/csf-tools": "7.6.20", - "@storybook/docs-mdx": "^0.1.0", - "@storybook/global": "^5.0.0", - "@storybook/manager": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/preview-api": "7.6.20", - "@storybook/telemetry": "7.6.20", - "@storybook/types": "7.6.20", - "@types/detect-port": "^1.3.0", - "@types/node": "^18.0.0", - "@types/pretty-hrtime": "^1.0.0", - "@types/semver": "^7.3.4", - "better-opn": "^3.0.2", - "chalk": "^4.1.0", - "cli-table3": "^0.6.1", - "compression": "^1.7.4", - "detect-port": "^1.3.0", - "express": "^4.17.3", - "fs-extra": "^11.1.0", - "globby": "^11.0.2", - "lodash": "^4.17.21", - "open": "^8.4.0", - "pretty-hrtime": "^1.0.3", - "prompts": "^2.4.0", - "read-pkg-up": "^7.0.1", - "semver": "^7.3.7", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0", - "util": "^0.12.4", - "util-deprecate": "^1.0.2", - "watchpack": "^2.2.0", - "ws": "^8.2.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server/node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-server/node_modules/@storybook/channels": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.20.tgz", - "integrity": "sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server/node_modules/@storybook/client-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.20.tgz", - "integrity": "sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server/node_modules/@storybook/core-common": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.20.tgz", - "integrity": "sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==", - "dev": true, - "dependencies": { - "@storybook/core-events": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/types": "7.6.20", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "esbuild": "^0.18.0", - "esbuild-register": "^3.5.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server/node_modules/@storybook/core-events": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.20.tgz", - "integrity": "sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==", - "dev": true, - "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server/node_modules/@storybook/csf-tools": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.20.tgz", - "integrity": "sha512-rwcwzCsAYh/m/WYcxBiEtLpIW5OH1ingxNdF/rK9mtGWhJxXRDV8acPkFrF8rtFWIVKoOCXu5USJYmc3f2gdYQ==", - "dev": true, - "dependencies": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "@storybook/csf": "^0.1.2", - "@storybook/types": "7.6.20", - "fs-extra": "^11.1.0", - "recast": "^0.23.1", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server/node_modules/@storybook/node-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.20.tgz", - "integrity": "sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server/node_modules/@storybook/preview-api": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.20.tgz", - "integrity": "sha512-3ic2m9LDZEPwZk02wIhNc3n3rNvbi7VDKn52hDXfAxnL5EYm7yDICAkaWcVaTfblru2zn0EDJt7ROpthscTW5w==", - "dev": true, - "dependencies": { - "@storybook/channels": "7.6.20", - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/csf": "^0.1.2", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.6.20", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server/node_modules/@storybook/types": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.20.tgz", - "integrity": "sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==", - "dev": true, - "dependencies": { - "@storybook/channels": "7.6.20", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/core-server/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@storybook/core-server/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@storybook/core-server/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@storybook/core-server/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/core-server/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/core-server/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-server/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@storybook/core-server/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/core-server/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@storybook/core-server/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-webpack": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.6.20.tgz", - "integrity": "sha512-pGYhKQhMYQ76HPL336L5n7eiJGk1sjWFkA+xRRRmQ9q6VUlqtEPuRHjKBQwrrTb1nA33BQX58Be06OtlbsFkjg==", - "dev": true, - "dependencies": { - "@storybook/core-common": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/types": "7.6.20", - "@types/node": "^18.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@storybook/channels": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.20.tgz", - "integrity": "sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", - "@storybook/global": "^5.0.0", - "qs": "^6.10.0", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@storybook/client-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.20.tgz", - "integrity": "sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==", - "dev": true, - "dependencies": { - "@storybook/global": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@storybook/core-common": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.20.tgz", - "integrity": "sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==", - "dev": true, - "dependencies": { - "@storybook/core-events": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/types": "7.6.20", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "esbuild": "^0.18.0", - "esbuild-register": "^3.5.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@storybook/core-events": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.20.tgz", - "integrity": "sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==", - "dev": true, - "dependencies": { - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@storybook/node-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.20.tgz", - "integrity": "sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-webpack/node_modules/@storybook/types": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.20.tgz", - "integrity": "sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==", - "dev": true, - "dependencies": { - "@storybook/channels": "7.6.20", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-webpack/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/core-webpack/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@storybook/core-webpack/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@storybook/core-webpack/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@storybook/core-webpack/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/core-webpack/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/core-webpack/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-webpack/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@storybook/core-webpack/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/core-webpack/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@storybook/core-webpack/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/csf": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.2.tgz", - "integrity": "sha512-ePrvE/pS1vsKR9Xr+o+YwdqNgHUyXvg+1Xjx0h9LrVx7Zq4zNe06pd63F5EvzTbCbJsHj7GHr9tkiaqm7U8WRA==", - "dev": true, - "dependencies": { - "type-fest": "^2.19.0" - } - }, - "node_modules/@storybook/csf-plugin": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/csf-tools": "7.1.0", - "unplugin": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/csf-tools": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.22.0", - "@babel/parser": "^7.22.0", - "@babel/traverse": "^7.22.0", - "@babel/types": "^7.22.0", - "@storybook/csf": "^0.1.0", - "@storybook/types": "7.1.0", - "fs-extra": "^11.1.0", - "recast": "^0.23.1", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/csf-tools/node_modules/fs-extra": { - "version": "11.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/csf/node_modules/type-fest": { - "version": "2.19.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/docs-mdx": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz", - "integrity": "sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==", - "dev": true - }, - "node_modules/@storybook/docs-tools": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/core-common": "7.1.0", - "@storybook/preview-api": "7.1.0", - "@storybook/types": "7.1.0", - "@types/doctrine": "^0.0.3", - "doctrine": "^3.0.0", - "lodash": "^4.17.21" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/global": { - "version": "5.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/manager": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.20.tgz", - "integrity": "sha512-0Cf6WN0t7yEG2DR29tN5j+i7H/TH5EfPppg9h9/KiQSoFHk+6KLoy2p5do94acFU+Ro4+zzxvdCGbcYGKuArpg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/manager-api": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channels": "7.1.0", - "@storybook/client-logger": "7.1.0", - "@storybook/core-events": "7.1.0", - "@storybook/csf": "^0.1.0", - "@storybook/global": "^5.0.0", - "@storybook/router": "7.1.0", - "@storybook/theming": "7.1.0", - "@storybook/types": "7.1.0", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "semver": "^7.3.7", - "store2": "^2.14.2", - "telejson": "^7.0.3", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/mdx2-csf": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/node-logger": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/postinstall": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/preview": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.20.tgz", - "integrity": "sha512-cxYlZ5uKbCYMHoFpgleZqqGWEnqHrk5m5fT8bYSsDsdQ+X5wPcwI/V+v8dxYAdQcMphZVIlTjo6Dno9WG8qmVA==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/preview-api": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/channel-postmessage": "7.1.0", - "@storybook/channels": "7.1.0", - "@storybook/client-logger": "7.1.0", - "@storybook/core-events": "7.1.0", - "@storybook/csf": "^0.1.0", - "@storybook/global": "^5.0.0", - "@storybook/types": "7.1.0", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "synchronous-promise": "^2.0.15", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/react-dom-shim": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/router": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/client-logger": "7.1.0", - "memoizerific": "^1.11.3", - "qs": "^6.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@storybook/storybook-deployer": { - "version": "2.8.16", - "dev": true, - "license": "MIT", - "dependencies": { - "git-url-parse": "^12.0.0", - "glob": "^7.1.3", - "parse-repo": "^1.0.4", - "shelljs": "^0.8.1", - "yargs": "^15.0.0" - }, - "bin": { - "storybook-to-aws-s3": "bin/storybook_to_aws_s3", - "storybook-to-ghpages": "bin/storybook_to_ghpages" - } - }, - "node_modules/@storybook/storybook-deployer/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@storybook/storybook-deployer/node_modules/cliui": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/@storybook/storybook-deployer/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/storybook-deployer/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/storybook-deployer/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/storybook-deployer/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/storybook-deployer/node_modules/wrap-ansi": { - "version": "6.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/storybook-deployer/node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC" - }, - "node_modules/@storybook/storybook-deployer/node_modules/yargs": { - "version": "15.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/storybook-deployer/node_modules/yargs-parser": { - "version": "18.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/telemetry": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.20.tgz", - "integrity": "sha512-dmAOCWmOscYN6aMbhCMmszQjoycg7tUPRVy2kTaWg6qX10wtMrvEtBV29W4eMvqdsoRj5kcvoNbzRdYcWBUOHQ==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/core-common": "7.6.20", - "@storybook/csf-tools": "7.6.20", - "chalk": "^4.1.0", - "detect-package-manager": "^2.0.1", - "fetch-retry": "^5.0.2", - "fs-extra": "^11.1.0", - "read-pkg-up": "^7.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/telemetry/node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "@storybook/builder-webpack5": "8.3.1", + "@storybook/components": "^8.3.1", + "@storybook/core-webpack": "8.3.1", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "^8.3.1", + "@storybook/preview-api": "^8.3.1", + "@storybook/theming": "^8.3.1", + "@types/node": "^22.0.0", + "@types/react": "^18.0.37", + "@types/react-dom": "^18.0.11", + "@types/semver": "^7.3.4", + "@types/webpack-env": "^1.18.0", + "fd-package-json": "^1.2.0", + "find-up": "^5.0.0", + "semver": "^7.3.7", + "telejson": "^7.2.0", + "ts-dedent": "^2.0.0", + "tsconfig-paths-webpack-plugin": "^4.0.1", + "util-deprecate": "^1.0.2", + "webpack": "5" + }, "engines": { - "node": ">=12" + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@angular-devkit/architect": ">=0.1500.0 < 0.1900.0", + "@angular-devkit/build-angular": ">=15.0.0 < 19.0.0", + "@angular-devkit/core": ">=15.0.0 < 19.0.0", + "@angular/cli": ">=15.0.0 < 19.0.0", + "@angular/common": ">=15.0.0 < 19.0.0", + "@angular/compiler": ">=15.0.0 < 19.0.0", + "@angular/compiler-cli": ">=15.0.0 < 19.0.0", + "@angular/core": ">=15.0.0 < 19.0.0", + "@angular/forms": ">=15.0.0 < 19.0.0", + "@angular/platform-browser": ">=15.0.0 < 19.0.0", + "@angular/platform-browser-dynamic": ">=15.0.0 < 19.0.0", + "rxjs": "^6.0.0 || ^7.4.0", + "storybook": "^8.3.1", + "typescript": "^4.0.0 || ^5.0.0", + "zone.js": ">= 0.11.1 < 1.0.0" + }, + "peerDependenciesMeta": { + "@angular/cli": { + "optional": true + } } }, - "node_modules/@storybook/telemetry/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], + "node_modules/@storybook/angular/node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" } }, - "node_modules/@storybook/telemetry/node_modules/@storybook/channels": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.20.tgz", - "integrity": "sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==", + "node_modules/@storybook/blocks": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.3.1.tgz", + "integrity": "sha512-/wNLRVWR/edzHQAFvSW68VxHYmBcfXpL/XdO46I5Z1X/tXUd0rtgGZmliQ2jZ242FqxcT8guqqFGehbeYUns5w==", "dev": true, + "license": "MIT", "dependencies": { - "@storybook/client-logger": "7.6.20", - "@storybook/core-events": "7.6.20", + "@storybook/csf": "^0.1.11", "@storybook/global": "^5.0.0", - "qs": "^6.10.0", + "@storybook/icons": "^1.2.10", + "@types/lodash": "^4.14.167", + "color-convert": "^2.0.1", + "dequal": "^2.0.2", + "lodash": "^4.17.21", + "markdown-to-jsx": "^7.4.5", + "memoizerific": "^1.11.3", + "polished": "^4.2.2", + "react-colorful": "^5.1.2", "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1" + "ts-dedent": "^2.0.0", + "util-deprecate": "^1.0.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.1" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } } }, - "node_modules/@storybook/telemetry/node_modules/@storybook/client-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.20.tgz", - "integrity": "sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==", + "node_modules/@storybook/builder-webpack5": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.3.1.tgz", + "integrity": "sha512-H0KvdNCtsOuezcrqKmvjgNkwgIsT9TU+VWJkeRRXEARr+urN0A6cTYvka2ZXPVqdGfPa4XiCkjr3MX27Z8drZg==", "dev": true, + "license": "MIT", "dependencies": { - "@storybook/global": "^5.0.0" + "@storybook/core-webpack": "8.3.1", + "@types/node": "^22.0.0", + "@types/semver": "^7.3.4", + "browser-assert": "^1.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "cjs-module-lexer": "^1.2.3", + "constants-browserify": "^1.0.0", + "css-loader": "^6.7.1", + "es-module-lexer": "^1.5.0", + "express": "^4.19.2", + "fork-ts-checker-webpack-plugin": "^8.0.0", + "fs-extra": "^11.1.0", + "html-webpack-plugin": "^5.5.0", + "magic-string": "^0.30.5", + "path-browserify": "^1.0.1", + "process": "^0.11.10", + "semver": "^7.3.7", + "style-loader": "^3.3.1", + "terser-webpack-plugin": "^5.3.1", + "ts-dedent": "^2.0.0", + "url": "^0.11.0", + "util": "^0.12.4", + "util-deprecate": "^1.0.2", + "webpack": "5", + "webpack-dev-middleware": "^6.1.2", + "webpack-hot-middleware": "^2.25.1", + "webpack-virtual-modules": "^0.6.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@storybook/builder-webpack5/node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/@storybook/telemetry/node_modules/@storybook/core-common": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.20.tgz", - "integrity": "sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==", + "node_modules/@storybook/builder-webpack5/node_modules/webpack-dev-middleware": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz", + "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==", "dev": true, + "license": "MIT", "dependencies": { - "@storybook/core-events": "7.6.20", - "@storybook/node-logger": "7.6.20", - "@storybook/types": "7.6.20", - "@types/find-cache-dir": "^3.2.1", - "@types/node": "^18.0.0", - "@types/node-fetch": "^2.6.4", - "@types/pretty-hrtime": "^1.0.0", - "chalk": "^4.1.0", - "esbuild": "^0.18.0", - "esbuild-register": "^3.5.0", - "file-system-cache": "2.3.0", - "find-cache-dir": "^3.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "glob": "^10.0.0", - "handlebars": "^4.7.7", - "lazy-universal-dotenv": "^4.0.0", - "node-fetch": "^2.0.0", - "picomatch": "^2.3.0", - "pkg-dir": "^5.0.0", - "pretty-hrtime": "^1.0.3", - "resolve-from": "^5.0.0", - "ts-dedent": "^2.0.0" + "colorette": "^2.0.10", + "memfs": "^3.4.12", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/storybook" + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, - "node_modules/@storybook/telemetry/node_modules/@storybook/core-events": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.20.tgz", - "integrity": "sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==", + "node_modules/@storybook/components": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.3.1.tgz", + "integrity": "sha512-/CMqX40CpNOKow58oLyO/OvMhHiHCIvOGf/65lXHk/D9qECMvchFfA2/MH8H7HiJUIqoSPit194miBENK5kqdw==", "dev": true, - "dependencies": { - "ts-dedent": "^2.0.0" - }, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/telemetry/node_modules/@storybook/csf-tools": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.20.tgz", - "integrity": "sha512-rwcwzCsAYh/m/WYcxBiEtLpIW5OH1ingxNdF/rK9mtGWhJxXRDV8acPkFrF8rtFWIVKoOCXu5USJYmc3f2gdYQ==", + "node_modules/@storybook/core": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.3.1.tgz", + "integrity": "sha512-L8YTtUipcBvl4F8jFNnXU3NM1hnLwZ3Ge2l+SRVKUGoAZzdf/I8O/0eOeZ+3LM3PvDn8bC9x+qjhNyDgtT+ieQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/generator": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "@storybook/csf": "^0.1.2", - "@storybook/types": "7.6.20", - "fs-extra": "^11.1.0", - "recast": "^0.23.1", - "ts-dedent": "^2.0.0" + "@storybook/csf": "^0.1.11", + "@types/express": "^4.17.21", + "better-opn": "^3.0.2", + "browser-assert": "^1.2.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0", + "esbuild-register": "^3.5.0", + "express": "^4.19.2", + "jsdoc-type-pratt-parser": "^4.0.0", + "process": "^0.11.10", + "recast": "^0.23.5", + "semver": "^7.6.2", + "util": "^0.12.5", + "ws": "^8.2.3" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/telemetry/node_modules/@storybook/node-logger": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.20.tgz", - "integrity": "sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/telemetry/node_modules/@storybook/types": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.20.tgz", - "integrity": "sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==", + "node_modules/@storybook/core-webpack": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.3.1.tgz", + "integrity": "sha512-SrHycFCejWopqtxN/Smj9kI0aTkDo6vmtJWW0Rvgp+V8/83ikSJapN+TzRbq+zhSHhAfpvr5NmaFUwYzbwO/rw==", "dev": true, + "license": "MIT", "dependencies": { - "@storybook/channels": "7.6.20", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" + "@types/node": "^22.0.0", + "ts-dedent": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/telemetry/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@storybook/core-webpack/node_modules/@types/node": { + "version": "22.5.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.5.tgz", + "integrity": "sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "undici-types": "~6.19.2" } }, - "node_modules/@storybook/telemetry/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@storybook/csf": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", + "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "type-fest": "^2.19.0" } }, - "node_modules/@storybook/telemetry/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@storybook/csf-plugin": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.3.1.tgz", + "integrity": "sha512-K3JWJf79+BkJAbOnAns5KGQ9h0NCqWht/1B05frj9LuAD/U+0sikpByiC2QvJ+qtX4fODhqjRYvrv2jgP8o3mA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "unplugin": "^1.3.1" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@storybook/telemetry/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/@storybook/telemetry/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "engines": { - "node": ">=14.14" + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/telemetry/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/@storybook/global": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "MIT" }, - "node_modules/@storybook/telemetry/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/@storybook/icons": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.10.tgz", + "integrity": "sha512-310apKdDcjbbX2VSLWPwhEwAgjxTzVagrwucVZIdGPErwiAppX8KvBuWZgPo+rQLVrtH8S+pw1dbUwjcE6d7og==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@storybook/telemetry/node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/@storybook/manager-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.3.1.tgz", + "integrity": "sha512-GHJr1/nNAfkzNs4P8z31zBN8ZBucMfl+aSH6ciCy12jN3dOmEfb67mx3aes2PmBJjY3K8HG2lgsO9tNKIyDJXQ==", "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/telemetry/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@storybook/preview-api": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.3.1.tgz", + "integrity": "sha512-mpeeQi0DiK6lGiFEa/iAXNQykZB/wv9UiI5MYwxfgVTCCIh7skeBQsu/7Ye+C+KyXgrNmH5YAP3CjYfkFVimhQ==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/telemetry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@storybook/telemetry/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "type": "opencollective", + "url": "https://opencollective.com/storybook" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "storybook": "^8.3.1" } }, - "node_modules/@storybook/theming": { - "version": "7.1.0", + "node_modules/@storybook/react-dom-shim": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.3.1.tgz", + "integrity": "sha512-nHMhXkt3FAm8c08QTTU70vpYhsAu65RpCv/uhYZ89H5OWvmLFHn36iJQPzlpWFtJHJ5+bAV/bfgNODR3BV1gRg==", "dev": true, "license": "MIT", - "dependencies": { - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@storybook/client-logger": "7.1.0", - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.1" } }, - "node_modules/@storybook/types": { - "version": "7.1.0", + "node_modules/@storybook/storybook-deployer": { + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/@storybook/storybook-deployer/-/storybook-deployer-2.8.16.tgz", + "integrity": "sha512-DRQrjyLKaRLXMYo7SNUznyGabtOLJ0b9yfBKNVMu6PsUHJifGPabXuNXmRPZ6qvyhHUSKLQgeLaX8L3Og6uFUg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/channels": "7.1.0", - "@types/babel__core": "^7.0.0", - "@types/express": "^4.7.0", - "file-system-cache": "2.3.0" + "git-url-parse": "^12.0.0", + "glob": "^7.1.3", + "parse-repo": "^1.0.4", + "shelljs": "^0.8.1", + "yargs": "^15.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "bin": { + "storybook-to-aws-s3": "bin/storybook_to_aws_s3", + "storybook-to-ghpages": "bin/storybook_to_ghpages" } }, - "node_modules/@swc/core": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.102.tgz", - "integrity": "sha512-OAjNLY/f6QWKSDzaM3bk31A+OYHu6cPa9P/rFIx8X5d24tHXUpRiiq6/PYI6SQRjUPlB72GjsjoEU8F+ALadHg==", + "node_modules/@storybook/storybook-deployer/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "hasInstallScript": true, + "license": "MIT", "dependencies": { - "@swc/counter": "^0.1.1", - "@swc/types": "^0.1.5" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.102", - "@swc/core-darwin-x64": "1.3.102", - "@swc/core-linux-arm-gnueabihf": "1.3.102", - "@swc/core-linux-arm64-gnu": "1.3.102", - "@swc/core-linux-arm64-musl": "1.3.102", - "@swc/core-linux-x64-gnu": "1.3.102", - "@swc/core-linux-x64-musl": "1.3.102", - "@swc/core-win32-arm64-msvc": "1.3.102", - "@swc/core-win32-ia32-msvc": "1.3.102", - "@swc/core-win32-x64-msvc": "1.3.102" - }, - "peerDependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.102.tgz", - "integrity": "sha512-CJDxA5Wd2cUMULj3bjx4GEoiYyyiyL8oIOu4Nhrs9X+tlg8DnkCm4nI57RJGP8Mf6BaXPIJkHX8yjcefK2RlDA==", - "cpu": [ - "arm64" - ], + "node_modules/@storybook/storybook-deployer/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.102.tgz", - "integrity": "sha512-X5akDkHwk6oAer49oER0qZMjNMkLH3IOZaV1m98uXIasAGyjo5WH1MKPeMLY1sY6V6TrufzwiSwD4ds571ytcg==", - "cpu": [ - "x64" - ], + "node_modules/@storybook/storybook-deployer/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.102.tgz", - "integrity": "sha512-kJH3XtZP9YQdjq/wYVBeFuiVQl4HaC4WwRrIxAHwe2OyvrwUI43dpW3LpxSggBnxXcVCXYWf36sTnv8S75o2Gw==", - "cpu": [ - "arm" - ], + "node_modules/@storybook/storybook-deployer/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=10" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.102.tgz", - "integrity": "sha512-flQP2WDyCgO24WmKA1wjjTx+xfCmavUete2Kp6yrM+631IHLGnr17eu7rYJ/d4EnDBId/ytMyrnWbTVkaVrpbQ==", - "cpu": [ - "arm64" - ], + "node_modules/@storybook/storybook-deployer/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.102.tgz", - "integrity": "sha512-bQEQSnC44DyoIGLw1+fNXKVGoCHi7eJOHr8BdH0y1ooy9ArskMjwobBFae3GX4T1AfnrTaejyr0FvLYIb0Zkog==", - "cpu": [ - "arm64" - ], + "node_modules/@storybook/storybook-deployer/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=10" + "node": "*" } }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.102.tgz", - "integrity": "sha512-dFvnhpI478svQSxqISMt00MKTDS0e4YtIr+ioZDG/uJ/q+RpcNy3QI2KMm05Fsc8Y0d4krVtvCKWgfUMsJZXAg==", - "cpu": [ - "x64" - ], + "node_modules/@storybook/storybook-deployer/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.102.tgz", - "integrity": "sha512-+a0M3CvjeIRNA/jTCzWEDh2V+mhKGvLreHOL7J97oULZy5yg4gf7h8lQX9J8t9QLbf6fsk+0F8bVH1Ie/PbXjA==", - "cpu": [ - "x64" - ], + "node_modules/@storybook/storybook-deployer/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.102.tgz", - "integrity": "sha512-w76JWLjkZNOfkB25nqdWUNCbt0zJ41CnWrJPZ+LxEai3zAnb2YtgB/cCIrwxDebRuMgE9EJXRj7gDDaTEAMOOQ==", - "cpu": [ - "arm64" - ], + "node_modules/@storybook/storybook-deployer/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } + "license": "ISC" }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.102.tgz", - "integrity": "sha512-vlDb09HiGqKwz+2cxDS9T5/461ipUQBplvuhW+cCbzzGuPq8lll2xeyZU0N1E4Sz3MVdSPx1tJREuRvlQjrwNg==", - "cpu": [ - "ia32" - ], + "node_modules/@storybook/storybook-deployer/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.102", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.102.tgz", - "integrity": "sha512-E/jfSD7sShllxBwwgDPeXp1UxvIqehj/ShSUqq1pjR/IDRXngcRSXKJK92mJkNFY7suH6BcCWwzrxZgkO7sWmw==", - "cpu": [ - "x64" - ], + "node_modules/@storybook/storybook-deployer/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true - }, - "node_modules/@swc/types": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", - "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", - "dev": true + "node_modules/@storybook/theming": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.3.1.tgz", + "integrity": "sha512-R6YZnIdN9P9gTauVkZfVmob0/i6/yaAQxnwfMgRLCaFD0TFQ+UQ2pCz40zPAUp3BcNPwMD168GVxmheBb8cGag==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.1" + } }, "node_modules/@thednp/event-listener": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@thednp/event-listener/-/event-listener-2.0.4.tgz", - "integrity": "sha512-sc4B7AzYAIvnGnivirq0XyR7LfzEDhGiiB70Q0qdNn8wSJ2pL1buVAsEZxrlc47qRJiBV4YIP+BFkyMm2r3NLg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@thednp/event-listener/-/event-listener-2.0.6.tgz", + "integrity": "sha512-6u55ydv4+2VHwHU8EJaJXa40QzZ7XOXVo74MMPnGCSzbl0q3yqHfQh8r0Sw/50rutHxecLVQBM/C9Fr0c+m+ew==", "dev": true, + "license": "MIT", "engines": { "node": ">=16", "pnpm": ">=8.6.0" } }, "node_modules/@thednp/shorty": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@thednp/shorty/-/shorty-2.0.0.tgz", - "integrity": "sha512-kwtLivCxYIoFfGIVU4NlZtfdA/zxZ6X8UcWaJrb7XqU3WQ4Q1p5IaZlLBfOVAO06WH5oWE87QUdK/dS56Wnfjg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@thednp/shorty/-/shorty-2.0.3.tgz", + "integrity": "sha512-ngKP9/wQxM6JPDFjO6ak8lSz38ZA6cIFQy3gZbZM3xgUqArBr+VG9aoSoLHHEuaObyd9q9Jq/T0Wez7qrck0Gw==", "dev": true, + "license": "MIT", "engines": { "node": ">=16", "pnpm": ">=8.6.0" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@ts-morph/common": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.23.0.tgz", "integrity": "sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==", "dev": true, + "license": "MIT", "dependencies": { "fast-glob": "^3.3.2", "minimatch": "^9.0.3", @@ -13121,51 +7165,12 @@ "path-browserify": "^1.0.1" } }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@ts-morph/common/node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@ts-morph/common/node_modules/mkdirp": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -13177,55 +7182,61 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.8", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { - "version": "1.0.9", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { - "version": "1.0.1", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { - "version": "1.0.2", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true, "license": "MIT" }, "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@tufjs/models": { - "version": "1.0.4", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", + "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", "dev": true, "license": "MIT", "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.4" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.3", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -13238,50 +7249,27 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@types/archy": { - "version": "0.0.31", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "tslib": "^2.4.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.1", + "node_modules/@types/archy": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@types/archy/-/archy-0.0.31.tgz", + "integrity": "sha512-v+dxizsFVyXgD3EpFuqT9YjdEjbJmPxNf1QIX9ohZOhxh1ZF2yhqv3vYaeum9lg3VghhxS5S0a6yldN9J9lPEQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } + "license": "MIT" }, "node_modules/@types/body-parser": { - "version": "1.19.2", + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "license": "MIT", "dependencies": { @@ -13299,7 +7287,9 @@ } }, "node_modules/@types/connect": { - "version": "3.4.35", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { @@ -13320,65 +7310,40 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/cors": { "version": "2.8.17", "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==", - "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/debug": { - "version": "4.1.7", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "license": "MIT", "dependencies": { "@types/ms": "*" } }, - "node_modules/@types/detect-port": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.5.tgz", - "integrity": "sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==", - "dev": true - }, - "node_modules/@types/doctrine": { - "version": "0.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ejs": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", - "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==", - "dev": true - }, - "node_modules/@types/emscripten": { - "version": "1.39.13", - "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz", - "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==", - "dev": true - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.17", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13389,7 +7354,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "license": "MIT", "dependencies": { @@ -13399,13 +7366,10 @@ "@types/send": "*" } }, - "node_modules/@types/find-cache-dir": { - "version": "3.2.1", - "dev": true, - "license": "MIT" - }, "node_modules/@types/fs-extra": { - "version": "8.1.2", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13414,6 +7378,8 @@ }, "node_modules/@types/glob": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, "license": "MIT", "dependencies": { @@ -13421,21 +7387,27 @@ "@types/node": "*" } }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "@types/unist": "*" } }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true, "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.1", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true, "license": "MIT" }, @@ -13444,53 +7416,43 @@ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "dev": true, "license": "MIT", "dependencies": { - "@types/istanbul-lib-report": "*" + "@types/node": "*" } }, "node_modules/@types/jasmine": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.0.tgz", + "integrity": "sha512-u1jWakf8CWvLfSEZyxmzkgBzOEvXH/szpT0e6G8BTkx5Eu0BhDn7sbc5dz0JBN/6Wwm9rBe+JAsk9tJRyH9ZkA==", "dev": true, "license": "MIT" }, "node_modules/@types/json-schema": { - "version": "7.0.11", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.14.182", + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", "dev": true, "license": "MIT" }, "node_modules/@types/lodash.debounce": { - "version": "4.0.7", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz", + "integrity": "sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13498,53 +7460,59 @@ } }, "node_modules/@types/mdast": { - "version": "3.0.12", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^2" + "@types/unist": "*" } }, "node_modules/@types/mdx": { - "version": "2.0.5", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", "dev": true, "license": "MIT" }, "node_modules/@types/mime": { - "version": "1.3.2", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true, "license": "MIT" }, - "node_modules/@types/mime-types": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz", - "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==", - "dev": true - }, "node_modules/@types/minimatch": { - "version": "3.0.5", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true, "license": "MIT" }, "node_modules/@types/ms": { - "version": "0.7.31", + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", "dev": true, "license": "MIT" }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "18.11.9", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", - "dev": true - }, - "node_modules/@types/node-fetch": { - "version": "2.6.4", "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } + "license": "MIT" }, "node_modules/@types/node-forge": { "version": "1.3.11", @@ -13555,96 +7523,90 @@ "@types/node": "*" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "dev": true, - "license": "MIT" - }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true - }, - "node_modules/@types/pretty-hrtime": { - "version": "1.0.1", "dev": true, "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.5", + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", "dev": true, "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.7", + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { - "version": "1.2.4", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true, "license": "MIT" }, "node_modules/@types/react": { - "version": "18.2.15", + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.7.tgz", + "integrity": "sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==", "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "16.9.18", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "^16" - } - }, - "node_modules/@types/react-dom/node_modules/@types/react": { - "version": "16.14.35", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "@types/react": "*" } }, "node_modules/@types/resolve": { "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", "dev": true, "license": "MIT" }, "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "dev": true }, "node_modules/@types/sass": { - "version": "1.43.1", + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.45.0.tgz", + "integrity": "sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA==", + "deprecated": "This is a stub types definition. sass provides its own type definitions, so you do not need this installed.", "dev": true, "license": "MIT", "dependencies": { - "@types/node": "*" + "sass": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "dev": true, - "license": "MIT" - }, "node_modules/@types/semver": { - "version": "7.3.13", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true, "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.1", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", "dev": true, "license": "MIT", "dependencies": { @@ -13662,13 +7624,15 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.2", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/sockjs": { @@ -13681,12 +7645,30 @@ } }, "node_modules/@types/unist": { - "version": "2.0.7", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true, "license": "MIT" }, "node_modules/@types/webpack-env": { - "version": "1.18.1", + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.5.tgz", + "integrity": "sha512-wz7kjjRRj8/Lty4B+Kr0LN6Ypc/3SymeCCGSbaXp2leH0ZVg/PriNiOwNj4bD4uphI7A8NXS4b6Gl373sfO5mA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", "dev": true, "license": "MIT" }, @@ -13699,54 +7681,44 @@ "@types/node": "*" } }, - "node_modules/@types/yargs": { - "version": "17.0.24", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.45.0", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.6.0.tgz", + "integrity": "sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/type-utils": "5.45.0", - "@typescript-eslint/utils": "5.45.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/type-utils": "8.6.0", + "@typescript-eslint/utils": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -13755,24 +7727,27 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.45.0", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.6.0.tgz", + "integrity": "sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/typescript-estree": "5.45.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -13781,15 +7756,17 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.45.0", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.6.0.tgz", + "integrity": "sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/visitor-keys": "5.45.0" + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -13797,25 +7774,24 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.45.0", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.6.0.tgz", + "integrity": "sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.45.0", - "@typescript-eslint/utils": "5.45.0", + "@typescript-eslint/typescript-estree": "8.6.0", + "@typescript-eslint/utils": "8.6.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "*" - }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -13823,11 +7799,13 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.45.0", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.6.0.tgz", + "integrity": "sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -13835,20 +7813,23 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.45.0", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.6.0.tgz", + "integrity": "sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/visitor-keys": "5.45.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/visitor-keys": "8.6.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -13860,56 +7841,80 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { - "version": "5.45.0", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.6.0.tgz", + "integrity": "sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.45.0", - "@typescript-eslint/types": "5.45.0", - "@typescript-eslint/typescript-estree": "5.45.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.6.0", + "@typescript-eslint/types": "8.6.0", + "@typescript-eslint/typescript-estree": "8.6.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.45.0", + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.6.0.tgz", + "integrity": "sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.45.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "8.6.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@vitejs/plugin-basic-ssl": { - "version": "1.0.1", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", + "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.6.0" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, "node_modules/@webassemblyjs/ast": { @@ -13917,6 +7922,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -13926,25 +7932,29 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -13955,13 +7965,15 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -13974,6 +7986,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -13983,6 +7996,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } @@ -13991,13 +8005,15 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -14014,6 +8030,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -14027,6 +8044,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-buffer": "1.12.1", @@ -14039,6 +8057,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", @@ -14051,175 +8070,114 @@ "node_modules/@webassemblyjs/wast-printer": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webcomponents/custom-elements": { - "version": "1.5.1", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@wessberg/ts-evaluator": { - "version": "0.0.27", - "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", - "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", - "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "jsdom": "^16.4.0", - "object-path": "^0.11.5", - "tslib": "^2.0.3" - }, - "engines": { - "node": ">=10.1.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" - }, - "peerDependencies": { - "typescript": ">=3.2.x || >= 4.x" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" } }, + "node_modules/@webcomponents/custom-elements": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@webcomponents/custom-elements/-/custom-elements-1.5.1.tgz", + "integrity": "sha512-6T/XT3S1UHDlRWFSxRXdeSoYWczEl78sygNPS7jDyHVrfZcF/pUtWGYgxF4uviH59iPVw1eOWbhubm8CqO0MpA==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" }, - "node_modules/@yarnpkg/esbuild-plugin-pnp": { - "version": "3.0.0-rc.15", - "resolved": "https://registry.npmjs.org/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz", - "integrity": "sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==", + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { + "js-yaml": "^3.10.0", "tslib": "^2.4.0" }, "engines": { "node": ">=14.15.0" - }, - "peerDependencies": { - "esbuild": ">=0.10.0" } }, - "node_modules/@yarnpkg/fslib": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.3.tgz", - "integrity": "sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==", + "node_modules/@yarnpkg/parsers/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { - "@yarnpkg/libzip": "^2.3.0", - "tslib": "^1.13.0" - }, - "engines": { - "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/@yarnpkg/fslib/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@yarnpkg/libzip": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.3.0.tgz", - "integrity": "sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==", + "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { - "@types/emscripten": "^1.39.6", - "tslib": "^1.13.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@yarnpkg/libzip/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", + "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-3-Clause" }, - "node_modules/abab": { - "version": "2.0.6", + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, "node_modules/abbrev": { - "version": "1.1.1", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/accepts": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", "dependencies": { @@ -14235,28 +8193,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -14269,12 +8206,15 @@ "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^8" } }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -14282,24 +8222,22 @@ } }, "node_modules/acorn-walk": { - "version": "7.2.0", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, "license": "MIT", "dependencies": { @@ -14312,6 +8250,8 @@ }, "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "license": "MIT", "dependencies": { @@ -14324,39 +8264,22 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.3.0", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" + "debug": "^4.3.4" }, "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/agentkeepalive/node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" + "node": ">= 14" } }, "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "license": "MIT", "dependencies": { @@ -14368,14 +8291,15 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "dev": true, + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -14383,7 +8307,9 @@ } }, "node_modules/ajv-formats": { - "version": "2.1.1", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -14397,34 +8323,23 @@ } } }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, "node_modules/ajv-keywords": { - "version": "3.5.2", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.8.2" } }, "node_modules/ansi-colors": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, "license": "MIT", "engines": { @@ -14433,6 +8348,8 @@ }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { @@ -14447,6 +8364,8 @@ }, "node_modules/ansi-escapes/node_modules/type-fest": { "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -14458,6 +8377,8 @@ }, "node_modules/ansi-html-community": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, "engines": [ "node >= 0.8.0" @@ -14469,6 +8390,8 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "engines": { @@ -14480,6 +8403,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -14492,6 +8416,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -14500,13 +8425,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "devOptional": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -14515,8 +8442,23 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/apache-crypt": { - "version": "1.2.5", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.6.tgz", + "integrity": "sha512-072WetlM4blL8PREJVeY+WHiUh1R5VNt2HfceGS8aKqttPHcmqE5pkKuXPz/ULmJOFkc8Hw3kfKl6vy7Qka6DA==", "dev": true, "license": "MIT", "dependencies": { @@ -14527,84 +8469,54 @@ } }, "node_modules/apache-md5": { - "version": "1.1.7", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.8.tgz", + "integrity": "sha512-FCAJojipPn0bXjuEpjOOOMN8FZDkxfWWp4JGN9mifU2IhxvKyXZYqpzPHdnTSUpmPDy+tsslB6Z1g+Vg6nVbYA==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/app-root-dir": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/archy": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true, "license": "MIT" }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=14" } }, "node_modules/arg": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "node_modules/argparse": { - "version": "1.0.10", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "license": "Python-2.0" }, "node_modules/aria-query": { - "version": "5.1.3", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/aria-query/node_modules/deep-equal": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dequal": "^2.0.3" } }, "node_modules/array-buffer-byte-length": { @@ -14612,6 +8524,7 @@ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" @@ -14628,24 +8541,30 @@ "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/array-flatten": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true, "license": "MIT" }, "node_modules/array-includes": { - "version": "3.1.4", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -14660,26 +8579,71 @@ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.0", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -14694,6 +8658,7 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", @@ -14711,30 +8676,32 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" } }, "node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" }, "node_modules/async-done": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz", "integrity": "sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==", "dev": true, + "license": "MIT", "dependencies": { "end-of-stream": "^1.4.4", "once": "^1.4.0", @@ -14744,17 +8711,12 @@ "node": ">= 10.13.0" } }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "node_modules/async-settle": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-2.0.0.tgz", "integrity": "sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==", "dev": true, + "license": "MIT", "dependencies": { "async-done": "^2.0.0" }, @@ -14764,11 +8726,15 @@ }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, "license": "MIT" }, "node_modules/autoprefixer": { - "version": "10.4.14", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -14778,15 +8744,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -14804,6 +8774,7 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -14814,56 +8785,39 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/axobject-query": { - "version": "3.1.1", + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "deep-equal": "^2.0.5" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/axobject-query/node_modules/deep-equal": { - "version": "2.1.0", + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/b4a": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", - "dev": true - }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", "dev": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "Apache-2.0" }, "node_modules/babel-loader": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.0.tgz", + "integrity": "sha512-Antt61KJPinUMwHwIIz9T5zfMgevnfZkEVWYDWlG888fgdvRRGD0JTuf/fFozQnfT+uq64sk1bmdHDy/mOEWnA==", "dev": true, "license": "MIT", "dependencies": { @@ -14878,75 +8832,12 @@ "webpack": ">=5" } }, - "node_modules/babel-loader/node_modules/ajv": { - "version": "8.11.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/babel-loader/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/babel-loader/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.6.2", @@ -14956,24 +8847,10 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { @@ -14981,25 +8858,27 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", - "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -15010,6 +8889,7 @@ "resolved": "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz", "integrity": "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==", "dev": true, + "license": "MIT", "dependencies": { "async-done": "^2.0.0", "async-settle": "^2.0.0", @@ -15021,6 +8901,8 @@ }, "node_modules/bail": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "dev": true, "license": "MIT", "funding": { @@ -15030,21 +8912,25 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, "license": "MIT" }, "node_modules/bare-events": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz", - "integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", "dev": true, + "license": "Apache-2.0", "optional": true }, "node_modules/bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "bare-events": "^2.0.0", @@ -15053,10 +8939,11 @@ } }, "node_modules/bare-os": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", - "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", "dev": true, + "license": "Apache-2.0", "optional": true }, "node_modules/bare-path": { @@ -15064,23 +8951,28 @@ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { "bare-os": "^2.1.0" } }, "node_modules/bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", + "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", "dev": true, + "license": "Apache-2.0", "optional": true, "dependencies": { - "streamx": "^2.18.0" + "b4a": "^1.6.6", + "streamx": "^2.20.0" } }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, "funding": [ { @@ -15103,12 +8995,15 @@ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, + "license": "MIT", "engines": { "node": "^4.5.0 || >= 5.9" } }, "node_modules/basic-auth": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "dev": true, "license": "MIT", "dependencies": { @@ -15118,22 +9013,34 @@ "node": ">= 0.8" } }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, "node_modules/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/batch": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true, "license": "MIT" }, "node_modules/bcryptjs": { "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==", "dev": true, "license": "MIT" }, @@ -15142,6 +9049,7 @@ "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, + "license": "MIT", "dependencies": { "open": "^8.0.4" }, @@ -15149,17 +9057,67 @@ "node": ">=12.0.0" } }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "node_modules/better-opn/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.6" + "node": ">=8" + } + }, + "node_modules/better-opn/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/better-opn/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/better-opn/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/big.js": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true, "license": "MIT", "engines": { @@ -15167,15 +9125,22 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "devOptional": true, "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "license": "MIT", "dependencies": { @@ -15185,10 +9150,11 @@ } }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -15198,7 +9164,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -15208,63 +9174,36 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" + "safer-buffer": ">= 2.1.2 < 3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, "node_modules/bonjour-service": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", @@ -15277,14 +9216,17 @@ }, "node_modules/boolbase": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true, "license": "ISC" }, "node_modules/bootstrap.native": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/bootstrap.native/-/bootstrap.native-5.0.12.tgz", - "integrity": "sha512-qTiFBK7//IgdF9u67w3W91U8C2Fc3TGQh61xa0pbtHmD1YRncncFNNs+6ewG2tW7fBGGMXg57gj5d9Qamr0S+w==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/bootstrap.native/-/bootstrap.native-5.0.13.tgz", + "integrity": "sha512-SiiTxaK3LjuOjPaXEnDBQNY3w0t28Qdx6I8drortuFg6Ch3q6cWoOxlFHThcGOPewziVarQAA4WPE00GFQmbWQ==", "dev": true, + "license": "MIT", "dependencies": { "@thednp/event-listener": "^2.0.4", "@thednp/shorty": "^2.0.0" @@ -15294,25 +9236,14 @@ "pnpm": ">=8.6.0" } }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, "node_modules/brace-expansion": { - "version": "1.1.11", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -15320,6 +9251,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "devOptional": true, + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -15332,6 +9264,7 @@ "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", "dev": true, + "license": "MIT", "dependencies": { "base64-js": "^1.1.2" } @@ -15342,27 +9275,6 @@ "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", "dev": true }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", - "dev": true, - "dependencies": { - "pako": "~0.2.0" - } - }, - "node_modules/browserify-zlib/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true - }, "node_modules/browserslist": { "version": "4.23.3", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", @@ -15382,6 +9294,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001646", "electron-to-chromium": "^1.5.4", @@ -15395,16 +9308,10 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/bser": { - "version": "2.1.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, "node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -15428,6 +9335,8 @@ }, "node_modules/buffer-crc32": { "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true, "license": "MIT", "engines": { @@ -15436,11 +9345,15 @@ }, "node_modules/buffer-from": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true, "license": "MIT" }, "node_modules/builtin-modules": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, "license": "MIT", "engines": { @@ -15450,16 +9363,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/builtins": { - "version": "5.0.1", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, - "license": "MIT", "dependencies": { - "semver": "^7.0.0" + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bytes": { - "version": "3.0.0", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", "engines": { @@ -15467,16 +9389,18 @@ } }, "node_modules/cacache": { - "version": "17.1.3", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dev": true, "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-collect": "^1.0.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", @@ -15485,84 +9409,22 @@ "unique-filename": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/fs-minipass": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.3.3", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/minipass": { - "version": "5.0.0", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } + "license": "ISC" }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -15588,6 +9450,8 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", "engines": { @@ -15596,6 +9460,8 @@ }, "node_modules/camel-case": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "license": "MIT", "dependencies": { @@ -15605,6 +9471,8 @@ }, "node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "license": "MIT", "engines": { @@ -15612,9 +9480,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001650", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001650.tgz", - "integrity": "sha512-fgEc7hP/LB7iicdXHUI9VsBsMZmUmlVJeQP2qqQW+3lkqVhbmjEU8zp+h5stWeilX+G7uXuIUIIlWlDw9jdt8g==", + "version": "1.0.30001660", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001660.tgz", + "integrity": "sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==", "dev": true, "funding": [ { @@ -15629,19 +9497,23 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/ccount": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true, "license": "MIT", "funding": { @@ -15654,6 +9526,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -15665,6 +9538,8 @@ }, "node_modules/character-entities": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "dev": true, "license": "MIT", "funding": { @@ -15672,203 +9547,62 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chardet": { - "version": "0.7.0", - "dev": true, - "license": "MIT" - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dev": true, - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cheerio": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz", + "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==", "dev": true, + "license": "MIT", "dependencies": { + "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^9.1.0", + "parse5": "^7.1.2", + "parse5-htmlparser2-tree-adapter": "^7.0.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^6.19.5", + "whatwg-mimetype": "^4.0.0" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, "engines": { - "node": ">=0.12" + "node": ">=18.17" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" } }, - "node_modules/cheerio/node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], + "license": "BSD-2-Clause", "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" } }, "node_modules/chokidar": { - "version": "3.5.3", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -15882,12 +9616,17 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, "license": "ISC", "engines": { @@ -15895,7 +9634,9 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", "engines": { @@ -15907,6 +9648,7 @@ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.23.tgz", "integrity": "sha512-1o/gLU9wDqbN5nL2MtfjykjOuighGXc3/hnWueO1haiEoFgX8h5vbvcA4tgdQfjw1mkZ1OEF4x/+HVeqEX6NoA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "mitt": "3.0.1", "urlpattern-polyfill": "10.0.0", @@ -15916,37 +9658,17 @@ "devtools-protocol": "*" } }, - "node_modules/ci-info": { - "version": "3.8.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", - "dev": true, - "dependencies": { - "consola": "^3.2.3" - } - }, "node_modules/cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", - "dev": true + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "dev": true, + "license": "MIT" }, "node_modules/clean-css": { - "version": "5.3.0", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, "license": "MIT", "dependencies": { @@ -15958,6 +9680,8 @@ }, "node_modules/clean-css/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -15966,6 +9690,8 @@ }, "node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, "license": "MIT", "engines": { @@ -15973,18 +9699,25 @@ } }, "node_modules/cli-cursor": { - "version": "3.1.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "restore-cursor": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-spinners": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true, "license": "MIT", "engines": { @@ -15994,41 +9727,140 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0" + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" }, "engines": { - "node": "10.* || >= 12.*" + "node": ">=18" }, - "optionalDependencies": { - "@colors/colors": "1.5.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/cli-width": { - "version": "3.0.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, "license": "ISC", "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/cliui": { - "version": "7.0.4", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/clone": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "license": "MIT", "engines": { @@ -16037,6 +9869,8 @@ }, "node_modules/clone-deep": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16048,20 +9882,37 @@ "node": ">=6" } }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/code-block-writer": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.1.tgz", - "integrity": "sha512-c5or4P6erEA69TxaxTNcHUNcIn+oyxSRTOWV+pSYF+z4epXqNvwvJ70XPGjPNgue83oAFAPBRQYwpAJ/Hpe/Sg==", - "dev": true + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.2.tgz", + "integrity": "sha512-XfXzAGiStXSmCIwrkdfvc7FS5Dtj8yelCtyOf2p2skCAfvLd6zu0rGzuS9NSCO3bq1JKpFZ7tbKdKlcd5occQA==", + "dev": true, + "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16073,11 +9924,15 @@ }, "node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, "license": "MIT" }, "node_modules/color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, "license": "ISC", "bin": { @@ -16086,11 +9941,15 @@ }, "node_modules/colorette": { "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true, "license": "MIT" }, "node_modules/colors": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, "license": "MIT", "engines": { @@ -16099,6 +9958,8 @@ }, "node_modules/combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "license": "MIT", "dependencies": { @@ -16113,12 +9974,15 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" } }, "node_modules/comment-parser": { - "version": "1.3.1", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, "license": "MIT", "engines": { @@ -16129,17 +9993,21 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/commondir": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true, "license": "MIT" }, "node_modules/compressible": { "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, - "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -16149,8 +10017,9 @@ }, "node_modules/compression": { "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, - "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -16164,77 +10033,47 @@ "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "dependencies": { - "safe-buffer": "~5.1.0" + "ms": "2.0.0" } }, - "node_modules/confbox": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, "node_modules/connect": { "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16258,6 +10097,8 @@ }, "node_modules/connect/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -16266,31 +10107,22 @@ }, "node_modules/connect/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, - "node_modules/consola": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", - "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", - "dev": true, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/content-disposition": { "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "license": "MIT", "dependencies": { @@ -16300,58 +10132,44 @@ "node": ">= 0.6" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/content-type": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { - "version": "1.8.0", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.1" - } + "license": "MIT" }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true, "license": "MIT" }, "node_modules/copy-anything": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, "license": "MIT", "dependencies": { @@ -16366,6 +10184,7 @@ "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-4.0.0.tgz", "integrity": "sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==", "dev": true, + "license": "MIT", "dependencies": { "each-props": "^3.0.0", "is-plain-object": "^5.0.0" @@ -16374,29 +10193,22 @@ "node": ">= 10.13.0" } }, - "node_modules/copy-props/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/copy-webpack-plugin": { - "version": "11.0.0", + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz", + "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==", "dev": true, "license": "MIT", "dependencies": { - "fast-glob": "^3.2.11", + "fast-glob": "^3.3.2", "glob-parent": "^6.0.1", - "globby": "^13.1.1", + "globby": "^14.0.0", "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -16406,34 +10218,10 @@ "webpack": "^5.1.0" } }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.11.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -16443,60 +10231,10 @@ "node": ">=10.13.0" } }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/core-js": { "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.1.tgz", + "integrity": "sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==", "hasInstallScript": true, "license": "MIT", "funding": { @@ -16505,10 +10243,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz", - "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, + "license": "MIT", "dependencies": { "browserslist": "^4.23.3" }, @@ -16518,15 +10257,17 @@ } }, "node_modules/core-util-is": { - "version": "1.0.2", - "dev": true, - "license": "MIT" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dev": true, + "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -16536,30 +10277,43 @@ } }, "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/create-require": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, "license": "MIT" }, "node_modules/critters": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", - "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.24.tgz", + "integrity": "sha512-Oyqew0FGM0wYUSNqR0L6AteO5MpMoUU0rhKRieXeiKs+PmRTxiJMyaunYB2KF6fQ3dzChXKCpbFOEJx3OQ1v/Q==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -16568,7 +10322,7 @@ "domhandler": "^5.0.2", "htmlparser2": "^8.0.2", "postcss": "^8.4.23", - "pretty-bytes": "^5.3.0" + "postcss-media-query-parser": "^0.2.3" } }, "node_modules/critters/node_modules/ansi-styles": { @@ -16588,89 +10342,18 @@ }, "node_modules/critters/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/critters/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/critters/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/critters/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/critters/node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/critters/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": ">=0.12" + "node": ">=10" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/critters/node_modules/has-flag": { @@ -16715,6 +10398,8 @@ }, "node_modules/cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "license": "MIT", "dependencies": { @@ -16730,51 +10415,56 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "dev": true - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/css-loader": { - "version": "6.8.1", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", "dev": true, "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^5.0.0" + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-select": { - "version": "4.3.0", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -16783,6 +10473,8 @@ }, "node_modules/css-what": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -16794,6 +10486,8 @@ }, "node_modules/cssesc": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "license": "MIT", "bin": { @@ -16803,291 +10497,40 @@ "node": ">=4" } }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, "node_modules/csstype": { - "version": "3.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/cuint": { - "version": "0.2.2", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true, "license": "MIT" }, "node_modules/custom-event": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true, "license": "MIT" }, "node_modules/data-uri-to-buffer": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", - "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/data-urls/node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-format": { - "version": "4.0.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decache": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/decache/-/decache-4.6.2.tgz", - "integrity": "sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==", - "dev": true, - "dependencies": { - "callsite": "^1.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", - "dev": true - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "dev": true, - "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/defaults": { - "version": "1.0.3", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true, "license": "MIT", - "dependencies": { - "clone": "^1.0.2" + "engines": { + "node": ">= 14" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", + "call-bind": "^1.0.6", "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -17096,23 +10539,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -17121,1223 +10557,1089 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "dev": true - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dev": true, - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/degenerator/node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dev": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, + "license": "MIT", "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/depd": { - "version": "1.1.2", + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=4.0" } }, - "node_modules/dependency-graph": { - "version": "0.11.0", + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">= 0.6.0" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/dequal": { - "version": "2.0.3", + "node_modules/decache": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/decache/-/decache-4.6.2.tgz", + "integrity": "sha512-2LPqkLeu8XWHU8qNCS3kcF6sCcb5zIzvWaAHYSvPfwhdd7mHuah29NssMzrTYyHN4F5oFy2ko9OBYxegtU0FEw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "callsite": "^1.0.0" } }, - "node_modules/destroy": { + "node_modules/decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true - }, - "node_modules/detect-package-manager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", - "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", "dev": true, + "license": "MIT", "dependencies": { - "execa": "^5.1.1" + "character-entities": "^2.0.0" }, - "engines": { - "node": ">=12" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", "dev": true, + "license": "MIT", "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" }, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/devtools-protocol": { - "version": "0.0.1299070", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz", - "integrity": "sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg==", - "dev": true - }, - "node_modules/dfa": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", - "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", - "dev": true - }, - "node_modules/di": { - "version": "0.0.1", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, - "node_modules/diff": { - "version": "4.0.2", + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=0.3.1" + "node": ">=0.10.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, - "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/doctrine": { - "version": "3.0.0", + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "esutils": "^2.0.2" + "execa": "^5.0.0" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serialize": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "node": ">= 10" } }, - "node_modules/dom-serializer": { - "version": "1.4.1", + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "clone": "^1.0.2" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { - "webidl-conversions": "^5.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/domhandler": { - "version": "4.3.1", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "domelementtype": "^2.2.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">= 4" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/domutils": { - "version": "2.8.0", + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "engines": { + "node": ">= 14" } }, - "node_modules/dot": { - "version": "2.0.0-beta.1", - "resolved": "https://registry.npmjs.org/dot/-/dot-2.0.0-beta.1.tgz", - "integrity": "sha512-kxM7fSnNQTXOmaeGuBSXM8O3fEsBb7XSDBllkGbRwa0lJSJTxxDE/4eSNGLKZUmlFw0f1vJ5qSV2BljrgQtgIA==", - "dev": true - }, - "node_modules/dot-case": { - "version": "3.0.4", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/dotenv": { - "version": "16.3.1", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "node": ">= 0.8" } }, - "node_modules/dotenv-expand": { - "version": "10.0.0", + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=4" } }, - "node_modules/duplexer": { - "version": "0.1.2", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/duplexify/node_modules/isarray": { + "node_modules/detect-file": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": ">=8" } }, - "node_modules/each-props": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-3.0.0.tgz", - "integrity": "sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, + "license": "MIT", "dependencies": { - "is-plain-object": "^5.0.0", - "object.defaults": "^1.1.0" + "dequal": "^2.0.0" }, - "engines": { - "node": ">= 10.13.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/each-props/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/devtools-protocol": { + "version": "0.0.1299070", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz", + "integrity": "sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "BSD-3-Clause" }, - "node_modules/eastasianwidth": { - "version": "0.2.0", + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", "dev": true, "license": "MIT" }, - "node_modules/ee-first": { - "version": "1.1.1", + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", "dev": true, "license": "MIT" }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=0.3.1" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", - "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", - "dev": true - }, - "node_modules/emitter-component": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.2.tgz", - "integrity": "sha512-QdXO3nXOzZB4pAjM0n6ZE+R9/+kPpECA/XSELIcc54NeYVnBqIk+4DFiBgK+8QbV3mdvTG6nedl7dTYgO+5wDw==", + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, - "node_modules/emojis-list": { - "version": "3.0.0", + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/encodeurl": { - "version": "1.0.2", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, - "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, "engines": { - "node": ">= 0.8" + "node": ">=6" } }, - "node_modules/encoding": { - "version": "0.1.13", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "MIT", - "optional": true, + "license": "Apache-2.0", "dependencies": { - "iconv-lite": "^0.6.2" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "utila": "~0.4" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", "dev": true, "license": "MIT", "dependencies": { - "once": "^1.4.0" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, - "node_modules/engine.io": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", - "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, - "engines": { - "node": ">=10.2.0" + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/engine.io-parser": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", - "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, - "engines": { - "node": ">=10.0.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, - "engines": { - "node": ">=10.0.0" + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "engines": { + "node": ">= 4" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, - "engines": { - "node": ">=10.13.0" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/ent": { - "version": "2.2.0", + "node_modules/dot": { + "version": "2.0.0-beta.1", + "resolved": "https://registry.npmjs.org/dot/-/dot-2.0.0-beta.1.tgz", + "integrity": "sha512-kxM7fSnNQTXOmaeGuBSXM8O3fEsBb7XSDBllkGbRwa0lJSJTxxDE/4eSNGLKZUmlFw0f1vJ5qSV2BljrgQtgIA==", "dev": true, "license": "MIT" }, - "node_modules/entities": { - "version": "2.2.0", + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/env-paths": { - "version": "2.2.1", + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, - "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "node_modules/dotenv-expand": { + "version": "11.0.6", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", + "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", "dev": true, - "bin": { - "envinfo": "dist/cli.js" + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.4" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, - "node_modules/err-code": { - "version": "2.0.3", + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true, "license": "MIT" }, - "node_modules/errno": { - "version": "0.1.8", + "node_modules/each-props": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-3.0.0.tgz", + "integrity": "sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "prr": "~1.0.1" + "is-plain-object": "^5.0.0", + "object.defaults": "^1.1.0" }, - "bin": { - "errno": "cli.js" + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/error-ex": { - "version": "1.3.2", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } + "license": "MIT" }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "get-intrinsic": "^1.2.4" + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" } }, - "node_modules/es-get-iterator": { + "node_modules/electron-to-chromium": { + "version": "1.5.25", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.25.tgz", + "integrity": "sha512-kMb204zvK3PsSlgvvwzI3wBIcAw15tRkYk+NQdsjdDtcQWTp2RABbMQ9rUBy8KNEOM+/E6ep+XC3AykiWZld4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/emitter-component": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.2.tgz", + "integrity": "sha512-QdXO3nXOzZB4pAjM0n6ZE+R9/+kPpECA/XSELIcc54NeYVnBqIk+4DFiBgK+8QbV3mdvTG6nedl7dTYgO+5wDw==", "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.8" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "has": "^1.0.3" + "iconv-lite": "^0.6.2" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", + "node_modules/encoding-sniffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz", + "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, - "node_modules/es6-shim": { - "version": "0.35.8", - "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.8.tgz", - "integrity": "sha512-Twf7I2v4/1tLoIXMT8HlqaBSS5H2wQTs2wx3MNYCI8K1R1/clXyCazrcVCPm/FuO9cyV8+leEaZOWD5C253NDg==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.17.19", + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "node_modules/esbuild-plugin-alias": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz", - "integrity": "sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==", - "dev": true + "dependencies": { + "once": "^1.4.0" + } }, - "node_modules/esbuild-register": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", - "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==", + "node_modules/engine.io": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.3.4" + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" }, - "peerDependencies": { - "esbuild": ">=0.12 <1" + "engines": { + "node": ">=10.2.0" } }, - "node_modules/esbuild-wasm": { - "version": "0.17.19", + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, "engines": { - "node": ">=12" + "node": ">=10.0.0" } }, - "node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/esbuild/node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/esbuild/node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, "engines": { - "node": ">=12" + "node": ">=10.13.0" } }, - "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, "engines": { - "node": ">=12" + "node": ">=8.6" } }, - "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], + "node_modules/ent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=12" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, + "license": "MIT", "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild/node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" } }, - "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], + "node_modules/es6-shim": { + "version": "0.35.8", + "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.8.tgz", + "integrity": "sha512-Twf7I2v4/1tLoIXMT8HlqaBSS5H2wQTs2wx3MNYCI8K1R1/clXyCazrcVCPm/FuO9cyV8+leEaZOWD5C253NDg==", "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], + "node_modules/esbuild": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=12" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" } }, - "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.23.0.tgz", + "integrity": "sha512-6jP8UmWy6R6TUUV8bMuC3ZyZ6lZKI56x0tkxyCIqWwRRJ/DgeQKneh/Oid5EoGoPFLrGNkz47ZEtWAYuiY/u9g==", + "dev": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { @@ -18349,6 +11651,7 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -18370,54 +11673,56 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/eslint": { - "version": "8.28.0", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -18431,16 +11736,21 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", - "resolve": "^1.20.0" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18448,104 +11758,57 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.3", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.11.0.tgz", + "integrity": "sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, - "node_modules/eslint-module-utils/node_modules/find-up": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/locate-path": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-limit": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-locate": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/p-try": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-module-utils/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/eslint-plugin-import": { - "version": "2.26.0", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "license": "MIT", "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -18554,16 +11817,31 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -18575,6 +11853,8 @@ }, "node_modules/eslint-plugin-import/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -18584,33 +11864,46 @@ "node": "*" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/eslint-plugin-jsdoc": { - "version": "39.6.4", + "version": "50.2.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.2.2.tgz", + "integrity": "sha512-i0ZMWA199DG7sjxlzXn5AeYZxpRfMJjDPUl7lL9eJJX8TPRoIaxJU4ys/joP5faM5AXE1eqW/dslCj3uj4Nqpg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.36.1", - "comment-parser": "1.3.1", - "debug": "^4.3.4", + "@es-joy/jsdoccomment": "~0.48.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.6", "escape-string-regexp": "^4.0.0", - "esquery": "^1.4.0", - "semver": "^7.3.8", - "spdx-expression-parse": "^3.0.1" + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": "^14 || ^16 || ^17 || ^18 || ^19" + "node": ">=18" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -18620,8 +11913,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.12.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-plugin-prefer-arrow": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -18629,17 +11955,19 @@ } }, "node_modules/eslint-plugin-storybook": { - "version": "0.6.13", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.8.0.tgz", + "integrity": "sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==", "dev": true, "license": "MIT", "dependencies": { "@storybook/csf": "^0.0.1", - "@typescript-eslint/utils": "^5.45.0", - "requireindex": "^1.1.0", + "@typescript-eslint/utils": "^5.62.0", + "requireindex": "^1.2.0", "ts-dedent": "^2.2.0" }, "engines": { - "node": "12.x || 14.x || >= 16" + "node": ">= 18" }, "peerDependencies": { "eslint": ">=6" @@ -18647,14 +11975,123 @@ }, "node_modules/eslint-plugin-storybook/node_modules/@storybook/csf": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", + "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", "dev": true, "license": "MIT", "dependencies": { "lodash": "^4.17.15" } }, - "node_modules/eslint-scope": { + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-storybook/node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -18665,49 +12102,98 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-scope/node_modules/estraverse": { + "node_modules/eslint-plugin-storybook/node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", + "node_modules/eslint-plugin-storybook/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", + "node_modules/eslint-plugin-storybook/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/eslint-scope": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -18720,13 +12206,21 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "Python-2.0" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -18742,6 +12236,8 @@ }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { @@ -18752,7 +12248,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -18761,10 +12259,15 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -18775,7 +12278,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.18.0", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18790,25 +12295,25 @@ }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "4.1.0", + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "license": "MIT" }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { @@ -18818,24 +12323,10 @@ "node": "*" } }, - "node_modules/eslint/node_modules/optionator": { - "version": "0.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -18845,14 +12336,29 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/espree": { - "version": "9.4.1", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -18863,6 +12369,8 @@ }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "license": "BSD-2-Clause", "bin": { @@ -18874,7 +12382,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -18886,6 +12396,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -18897,6 +12409,8 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -18905,11 +12419,15 @@ }, "node_modules/estree-walker": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -18918,6 +12436,8 @@ }, "node_modules/etag": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "license": "MIT", "engines": { @@ -18926,6 +12446,8 @@ }, "node_modules/event-stream": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", "dev": true, "license": "MIT", "dependencies": { @@ -18938,18 +12460,17 @@ "through": "^2.3.8" } }, - "node_modules/eventemitter-asyncresource": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/eventemitter3": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true, "license": "MIT" }, "node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", "engines": { @@ -18958,8 +12479,9 @@ }, "node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -18980,8 +12502,9 @@ }, "node_modules/execa/node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -18989,11 +12512,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/execa/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, + "license": "MIT", "dependencies": { "homedir-polyfill": "^1.0.1" }, @@ -19003,41 +12548,44 @@ }, "node_modules/exponential-backoff": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", "dev": true, "license": "Apache-2.0" }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -19048,41 +12596,25 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/express/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -19097,70 +12629,20 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/express/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT" }, - "node_modules/express/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/extend": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, "license": "MIT" }, "node_modules/external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "license": "MIT", "dependencies": { @@ -19172,8 +12654,23 @@ "node": ">=4" } }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/external-editor/node_modules/tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "license": "MIT", "dependencies": { @@ -19188,6 +12685,7 @@ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", "get-stream": "^5.1.0", @@ -19205,6 +12703,8 @@ }, "node_modules/fancy-log": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-2.0.0.tgz", + "integrity": "sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==", "dev": true, "license": "MIT", "dependencies": { @@ -19216,19 +12716,23 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -19242,11 +12746,15 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, @@ -19254,19 +12762,22 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", - "dev": true + "license": "MIT" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.9.1" } }, "node_modules/fastq": { - "version": "1.13.0", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "license": "ISC", "dependencies": { @@ -19275,6 +12786,8 @@ }, "node_modules/faye-websocket": { "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -19284,30 +12797,30 @@ "node": ">=0.8.0" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", + "node_modules/fd-package-json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-1.2.0.tgz", + "integrity": "sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "bser": "2.1.1" + "walk-up-path": "^3.0.1" } }, "node_modules/fd-slicer": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "dev": true, "license": "MIT", "dependencies": { "pend": "~1.2.0" } }, - "node_modules/fetch-retry": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz", - "integrity": "sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==", - "dev": true - }, "node_modules/figures": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "license": "MIT", "dependencies": { @@ -19322,6 +12835,8 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { @@ -19331,199 +12846,133 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-system-cache": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fs-extra": "11.1.1", - "ramda": "0.29.0" - } - }, - "node_modules/file-system-cache/node_modules/fs-extra": { - "version": "11.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "devOptional": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "node": ">=10" } }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "4.1.0", - "dev": true, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "devOptional": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^6.0.0" - }, + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/find-cache-dir/node_modules/p-limit": { + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/finalhandler/node_modules/on-finished": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/finalhandler/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "4.2.0", + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "engines": { "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, "node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -19542,6 +12991,7 @@ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", "dev": true, + "license": "MIT", "dependencies": { "detect-file": "^1.0.0", "is-glob": "^4.0.3", @@ -19557,6 +13007,7 @@ "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.2", "is-plain-object": "^5.0.0", @@ -19568,30 +13019,35 @@ "node": ">= 10.13.0" } }, - "node_modules/fined/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/flagged-respawn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.13.0" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { - "version": "3.0.4", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -19599,23 +13055,16 @@ } }, "node_modules/flatted": { - "version": "3.2.5", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true, "license": "ISC" }, - "node_modules/flow-parser": { - "version": "0.242.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.242.1.tgz", - "integrity": "sha512-E3ml21Q1S5cMAyPbtYslkvI6yZO5oCS/S2EoteeFH8Kx9iKOv/YOJ+dGd/yMf+H3YKfhMKjnOpyNwrO7NdddWA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "dev": true, "funding": [ { @@ -19623,6 +13072,7 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -19634,6 +13084,8 @@ }, "node_modules/for-each": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "license": "MIT", "dependencies": { @@ -19645,6 +13097,7 @@ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -19654,6 +13107,7 @@ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", "dev": true, + "license": "MIT", "dependencies": { "for-in": "^1.0.1" }, @@ -19662,7 +13116,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, "license": "ISC", "dependencies": { @@ -19676,22 +13132,12 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.0.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", "integrity": "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", @@ -19715,11 +13161,39 @@ "webpack": "^5.11.0" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -19730,11 +13204,23 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -19746,20 +13232,103 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -19768,7 +13337,9 @@ } }, "node_modules/form-data": { - "version": "3.0.1", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dev": true, "license": "MIT", "dependencies": { @@ -19782,6 +13353,8 @@ }, "node_modules/forwarded": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, "license": "MIT", "engines": { @@ -19789,7 +13362,9 @@ } }, "node_modules/fraction.js": { - "version": "4.2.0", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "license": "MIT", "engines": { @@ -19797,11 +13372,13 @@ }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fresh": { "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "license": "MIT", "engines": { @@ -19810,17 +13387,63 @@ }, "node_modules/from": { "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==", "dev": true, "license": "MIT" }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/front-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/front-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/front-matter/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fs-extra": { - "version": "10.1.0", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "license": "MIT", "dependencies": { @@ -19829,18 +13452,20 @@ "universalify": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.14" } }, "node_modules/fs-minipass": { - "version": "2.1.0", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/fs-mkdirp-stream": { @@ -19848,6 +13473,7 @@ "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz", "integrity": "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.8", "streamx": "^2.12.0" @@ -19857,12 +13483,16 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.4", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true, "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, "license": "ISC" }, @@ -19872,6 +13502,7 @@ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -19885,6 +13516,7 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -19894,6 +13526,7 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -19909,32 +13542,18 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", "engines": { @@ -19943,17 +13562,33 @@ }, "node_modules/get-caller-file": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -19968,37 +13603,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-npm-tarball-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.1.0.tgz", - "integrity": "sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==", - "dev": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dev": true, "license": "MIT", "dependencies": { @@ -20016,6 +13624,7 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", @@ -20033,6 +13642,7 @@ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", "dev": true, + "license": "MIT", "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -20043,41 +13653,10 @@ "node": ">= 14" } }, - "node_modules/get-uri/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/giget": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz", - "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==", - "dev": true, - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.2.3", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.3", - "nypm": "^0.3.8", - "ohash": "^1.1.3", - "pathe": "^1.1.2", - "tar": "^6.2.0" - }, - "bin": { - "giget": "dist/cli.mjs" - } - }, "node_modules/git-up": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-6.0.0.tgz", + "integrity": "sha512-6RUFSNd1c/D0xtGnyWN2sxza2bZtZ/EmI9448n6rCZruFwV/ezeEn2fJP7XnUQGwf0RAtd/mmUCbtH6JPYA2SA==", "dev": true, "license": "MIT", "dependencies": { @@ -20087,6 +13666,8 @@ }, "node_modules/git-url-parse": { "version": "12.0.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-12.0.0.tgz", + "integrity": "sha512-I6LMWsxV87vysX1WfsoglXsXg6GjQRKq7+Dgiseo+h0skmp5Hp2rzmcEIRQot9CPA+uzU7x1x7jZdqvTFGnB+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -20094,24 +13675,28 @@ } }, "node_modules/github-slugger": { - "version": "1.5.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", "dev": true, "license": "ISC" }, "node_modules/glob": { - "version": "7.2.0", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -20119,6 +13704,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "devOptional": true, "license": "ISC", "dependencies": { @@ -20133,6 +13720,7 @@ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.2.tgz", "integrity": "sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw==", "dev": true, + "license": "MIT", "dependencies": { "@gulpjs/to-absolute-glob": "^4.0.0", "anymatch": "^3.1.3", @@ -20152,6 +13740,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -20161,6 +13750,8 @@ }, "node_modules/glob-to-regexp": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, "license": "BSD-2-Clause" }, @@ -20169,6 +13760,7 @@ "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz", "integrity": "sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==", "dev": true, + "license": "MIT", "dependencies": { "async-done": "^2.0.0", "chokidar": "^3.5.3" @@ -20177,11 +13769,28 @@ "node": ">= 10.13.0" } }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -20196,6 +13805,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -20211,13 +13821,15 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -20227,6 +13839,8 @@ }, "node_modules/globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "license": "MIT", "engines": { @@ -20234,11 +13848,14 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -20248,19 +13865,21 @@ } }, "node_modules/globby": { - "version": "11.1.0", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -20268,17 +13887,66 @@ }, "node_modules/globs": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globs/-/globs-0.1.4.tgz", + "integrity": "sha512-D23dWbOq48vlOraoSigbcQV4tWrnhwk+E/Um2cMuDS3/5dwGmdFeA7L/vAvDhLFlQOTDqHcXh35m/71g2A2WzQ==", "dev": true, "license": "MIT", "dependencies": { "glob": "^7.1.1" } }, + "node_modules/globs/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/globs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/glogg": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/glogg/-/glogg-2.2.0.tgz", "integrity": "sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==", "dev": true, + "license": "MIT", "dependencies": { "sparkles": "^2.1.0" }, @@ -20288,6 +13956,8 @@ }, "node_modules/gopd": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "license": "MIT", "dependencies": { @@ -20301,30 +13971,22 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/guess-parser": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", - "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, - "dependencies": { - "@wessberg/ts-evaluator": "0.0.27" - }, - "peerDependencies": { - "typescript": ">=3.7.5" - } + "license": "MIT" }, "node_modules/gulp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.0.tgz", "integrity": "sha512-S8Z8066SSileaYw1S2N1I64IUc/myI2bqe2ihOBzO6+nKpvNSg7ZcWJt/AwF8LC/NVN+/QZ560Cb/5OPsyhkhg==", "dev": true, + "license": "MIT", "dependencies": { "glob-watcher": "^6.0.0", "gulp-cli": "^3.0.0", @@ -20343,6 +14005,7 @@ "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.0.0.tgz", "integrity": "sha512-RtMIitkT8DEMZZygHK2vEuLPqLPAFB4sntSxg4NoDta7ciwGZ18l7JuhCTiS5deOJi2IoK0btE+hs6R4sfj7AA==", "dev": true, + "license": "MIT", "dependencies": { "@gulpjs/messages": "^1.1.0", "chalk": "^4.1.2", @@ -20369,6 +14032,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -20384,6 +14048,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -20395,11 +14060,24 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/gulp-cli/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, "node_modules/gulp-cli/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -20409,6 +14087,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -20416,11 +14095,30 @@ "node": ">=8" } }, + "node_modules/gulp-cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/gulp-cli/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -20439,6 +14137,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -20448,6 +14147,7 @@ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz", "integrity": "sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==", "dev": true, + "license": "MIT", "dependencies": { "glogg": "^2.2.0" }, @@ -20455,28 +14155,12 @@ "node": ">= 10.13.0" } }, - "node_modules/gunzip-maybe": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", - "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", - "dev": true, - "dependencies": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" - }, - "bin": { - "gunzip-maybe": "bin.js" - } - }, "node_modules/hammerjs": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -20492,6 +14176,7 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -20510,25 +14195,18 @@ }, "node_modules/handlebars/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/has": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "license": "MIT", "funding": { @@ -20540,6 +14218,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -20549,6 +14228,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -20561,6 +14241,7 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -20570,6 +14251,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "license": "MIT", "engines": { @@ -20584,26 +14267,23 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "license": "ISC" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -20611,23 +14291,52 @@ "node": ">= 0.4" } }, - "node_modules/hdr-histogram-js": { - "version": "2.0.3", + "node_modules/hast-util-heading-rank": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz", + "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==", "dev": true, - "license": "BSD", + "license": "MIT", "dependencies": { - "@assemblyscript/loader": "^0.10.1", - "base64-js": "^1.2.0", - "pako": "^1.0.3" + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/hdr-histogram-percentiles-obj": { + "node_modules/hast-util-is-element": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.0.tgz", + "integrity": "sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, "node_modules/he": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true, "license": "MIT", "bin": { @@ -20639,6 +14348,7 @@ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, + "license": "MIT", "dependencies": { "parse-passwd": "^1.0.0" }, @@ -20647,23 +14357,24 @@ } }, "node_modules/hosted-git-info": { - "version": "6.1.1", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^7.5.1" + "lru-cache": "^10.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } + "license": "ISC" }, "node_modules/hpack.js": { "version": "2.1.6", @@ -20698,6 +14409,12 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -20707,18 +14424,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/html-entities": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", @@ -20733,15 +14438,20 @@ "type": "patreon", "url": "https://patreon.com/mdevils" } - ] + ], + "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, "license": "MIT", "dependencies": { @@ -20762,6 +14472,8 @@ }, "node_modules/html-minifier-terser/node_modules/commander": { "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "license": "MIT", "engines": { @@ -20769,7 +14481,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.5.0", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", "dev": true, "license": "MIT", "dependencies": { @@ -20787,11 +14501,22 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/htmlparser2": { - "version": "6.1.0", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz", + "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -20802,14 +14527,16 @@ ], "license": "MIT", "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" } }, "node_modules/http-auth": { "version": "4.1.9", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-4.1.9.tgz", + "integrity": "sha512-kvPYxNGc9EKGTXvOMnTBQw2RZfuiSihK/mLw/a4pbtRueTE45S55Lw/3k5CktIf7Ak0veMKEIteDj4YkNmCzmQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20823,15 +14550,29 @@ } }, "node_modules/http-auth-connect": { - "version": "1.0.5", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/http-auth-connect/-/http-auth-connect-1.0.6.tgz", + "integrity": "sha512-yaO0QSCPqGCjPrl3qEEHjJP+lwZ6gMpXLuCBE06eWwcXomkI5TARtu0kxf9teFuBj6iaV3Ybr15jaWUvbzNzHw==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/http-auth/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/http-cache-semantics": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true, "license": "BSD-2-Clause" }, @@ -20846,6 +14587,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -20857,31 +14599,17 @@ "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/http-parser-js": { - "version": "0.5.6", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true, "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "license": "MIT", "dependencies": { @@ -20894,86 +14622,73 @@ } }, "node_modules/http-proxy-agent": { - "version": "5.0.0", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.0.tgz", + "integrity": "sha512-36AV1fIaI2cWRzHo+rbcxhe3M3jUDCNzc4D5zRl57sEWRAxdXYtw7FSQKYY6PDKssiAKjLYypbssHk+xs/kMXw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/http-proxy": "^1.17.8", + "@types/http-proxy": "^1.17.10", + "debug": "^4.3.4", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" + "micromatch": "^4.0.5" }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/https-proxy-agent": { - "version": "5.0.0", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" + "engines": { + "node": ">=10.18" } }, "node_modules/i18next": { - "version": "23.11.5", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.5.tgz", - "integrity": "sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==", + "version": "23.15.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.15.1.tgz", + "integrity": "sha512-wB4abZ3uK7EWodYisHl/asf8UYEhrI/vj/8aoSsrj/ZDxj4/UXPOa1KvFt1Fq5hkUHquNqwFlDprmjZ8iySgYA==", "dev": true, "funding": [ { @@ -20989,34 +14704,19 @@ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" } ], + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" } }, - "node_modules/i18next/node_modules/@babel/runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/i18next/node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, "node_modules/iconv-lite": { - "version": "0.4.24", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -21024,6 +14724,8 @@ }, "node_modules/icss-utils": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, "license": "ISC", "engines": { @@ -21035,6 +14737,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, "funding": [ { @@ -21053,7 +14757,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.2.0", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -21061,7 +14767,9 @@ } }, "node_modules/ignore-walk": { - "version": "6.0.3", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, "license": "ISC", "dependencies": { @@ -21071,30 +14779,10 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/image-size": { "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", "dev": true, "license": "MIT", "optional": true, @@ -21106,12 +14794,16 @@ } }, "node_modules/immutable": { - "version": "4.0.0", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", "dev": true, "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "license": "MIT", "dependencies": { @@ -21125,16 +14817,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -21143,6 +14829,8 @@ }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, "license": "MIT", "engines": { @@ -21151,6 +14839,9 @@ }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -21160,96 +14851,29 @@ }, "node_modules/inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, "license": "ISC" }, "node_modules/ini": { - "version": "4.1.1", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/injection-js": { - "version": "2.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - } - }, - "node_modules/inquirer": { - "version": "8.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/injection-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/injection-js/-/injection-js-2.4.0.tgz", + "integrity": "sha512-6jiJt0tCAo9zjHbcwLiPL+IuNe9SQ6a9g0PEzafThW3fOQi0mrmiJGBJvDD6tmhPh8cQHIQtCOrJuBfQME4kPA==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "tslib": "^2.0.0" } }, "node_modules/internal-slot": { @@ -21257,6 +14881,7 @@ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", @@ -21271,6 +14896,7 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -21280,6 +14906,7 @@ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, + "license": "MIT", "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -21288,14 +14915,10 @@ "node": ">= 12" } }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true - }, "node_modules/ipaddr.js": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, "license": "MIT", "engines": { @@ -21307,6 +14930,7 @@ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, + "license": "MIT", "dependencies": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" @@ -21316,15 +14940,22 @@ } }, "node_modules/is-absolute-url": { - "version": "3.0.3", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz", + "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-arguments": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dev": true, "license": "MIT", "dependencies": { @@ -21343,6 +14974,7 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" @@ -21356,11 +14988,15 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, "license": "MIT" }, "node_modules/is-bigint": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "license": "MIT", "dependencies": { @@ -21372,6 +15008,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -21383,6 +15021,8 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "license": "MIT", "dependencies": { @@ -21398,6 +15038,8 @@ }, "node_modules/is-builtin-module": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", "dev": true, "license": "MIT", "dependencies": { @@ -21412,6 +15054,8 @@ }, "node_modules/is-callable": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", "engines": { @@ -21422,11 +15066,16 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "license": "MIT", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -21437,6 +15086,7 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, + "license": "MIT", "dependencies": { "is-typed-array": "^1.1.13" }, @@ -21449,6 +15099,8 @@ }, "node_modules/is-date-object": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21461,21 +15113,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-deflate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", - "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", - "dev": true - }, "node_modules/is-docker": { - "version": "2.2.1", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, - "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -21483,6 +15130,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "devOptional": true, "license": "MIT", "engines": { @@ -21490,15 +15139,22 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-generator-function": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, "license": "MIT", "dependencies": { @@ -21513,6 +15169,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -21522,17 +15180,28 @@ "node": ">=0.10.0" } }, - "node_modules/is-gzip": { + "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-interactive": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, "license": "MIT", "engines": { @@ -21541,42 +15210,24 @@ }, "node_modules/is-lambda": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true, "license": "MIT" }, - "node_modules/is-map": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-module": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true, "license": "MIT" }, - "node_modules/is-nan": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -21586,6 +15237,7 @@ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -21593,17 +15245,32 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-network-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz", + "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21616,54 +15283,43 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { - "version": "4.1.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-plain-object": { - "version": "2.0.4", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, "node_modules/is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "license": "MIT", "dependencies": { @@ -21682,6 +15338,7 @@ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, + "license": "MIT", "dependencies": { "is-unc-path": "^1.0.0" }, @@ -21689,19 +15346,12 @@ "node": ">=0.10.0" } }, - "node_modules/is-set": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7" }, @@ -21714,6 +15364,8 @@ }, "node_modules/is-ssh": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21722,6 +15374,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { @@ -21733,6 +15387,8 @@ }, "node_modules/is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "license": "MIT", "dependencies": { @@ -21747,6 +15403,8 @@ }, "node_modules/is-symbol": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "license": "MIT", "dependencies": { @@ -21764,6 +15422,7 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, @@ -21779,6 +15438,7 @@ "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, + "license": "MIT", "dependencies": { "unc-path-regex": "^0.1.2" }, @@ -21788,6 +15448,8 @@ }, "node_modules/is-unicode-supported": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true, "license": "MIT", "engines": { @@ -21802,20 +15464,15 @@ "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -21825,20 +15482,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-what": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", "dev": true, "license": "MIT" }, @@ -21847,28 +15494,37 @@ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-wsl": { - "version": "2.2.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, - "license": "MIT", "dependencies": { - "is-docker": "^2.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isarray": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, "node_modules/isbinaryfile": { "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", "dev": true, "license": "MIT", "engines": { @@ -21880,11 +15536,15 @@ }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, "license": "MIT", "engines": { @@ -21892,7 +15552,9 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -21900,43 +15562,89 @@ } }, "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" + "semver": "^7.5.4" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { + "node_modules/istanbul-lib-instrument/node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, + "node_modules/istanbul-lib-instrument/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -21944,29 +15652,25 @@ } }, "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "3.1.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -21978,6 +15682,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -21991,16 +15697,81 @@ "node": ">=6" } }, + "node_modules/istanbul-lib-source-maps/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=6" + "node": "*" } }, "node_modules/istanbul-lib-source-maps/node_modules/rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -22010,8 +15781,20 @@ "rimraf": "bin.js" } }, + "node_modules/istanbul-lib-source-maps/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -22019,7 +15802,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -22031,16 +15816,14 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -22053,6 +15836,7 @@ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", @@ -22071,6 +15855,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -22081,11 +15866,23 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/jake/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -22102,6 +15899,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -22111,6 +15909,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -22123,6 +15922,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -22132,293 +15932,43 @@ }, "node_modules/jasmine-core": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.1.0.tgz", + "integrity": "sha512-8E8BiffCL8sBwK1zU9cbavLe8xpJAgOduSJ6N8PJVv8VosQ/nxVTuXj2kUeHxTlZBVvh24G19ga7xdiaxlceKg==", "dev": true, "license": "MIT" }, "node_modules/jasmine-spec-reporter": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", + "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", "dev": true, "license": "Apache-2.0", "dependencies": { "colors": "1.4.0" } }, - "node_modules/jest-haste-map": { - "version": "29.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^29.6.1", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.1", - "jest-worker": "^29.6.1", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-regex-util": { - "version": "29.4.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.6.1", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "^29.6.1", - "@types/node": "*", "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "29.6.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.6.1", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-sdsl": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true - }, - "node_modules/jscodeshift": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", - "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.0", - "@babel/parser": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/preset-flow": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@babel/register": "^7.22.15", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.23.3", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - }, - "peerDependenciesMeta": { - "@babel/preset-env": { - "optional": true - } - } - }, - "node_modules/jscodeshift/node_modules/@babel/core": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.0", - "@babel/helper-compilation-targets": "^7.25.2", - "@babel/helper-module-transforms": "^7.25.2", - "@babel/helpers": "^7.25.0", - "@babel/parser": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.2", - "@babel/types": "^7.25.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/jscodeshift/node_modules/@babel/generator": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", - "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.25.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jscodeshift/node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jscodeshift/node_modules/ansi-styles": { + "node_modules/jest-diff/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -22429,11 +15979,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/jscodeshift/node_modules/chalk": { + "node_modules/jest-diff/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -22441,39 +15992,26 @@ "engines": { "node": ">=10" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jscodeshift/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } }, - "node_modules/jscodeshift/node_modules/has-flag": { + "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/jscodeshift/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/jscodeshift/node_modules/supports-color": { + "node_modules/jest-diff/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -22481,182 +16019,108 @@ "node": ">=8" } }, - "node_modules/jscodeshift/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "3.1.0", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jsdom/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">= 6" + "node": ">= 10.13.0" } }, - "node_modules/jsdom/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/jsdom/node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { - "punycode": "^2.1.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jsdom/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "dev": true, - "engines": { - "node": ">= 4.0.0" + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" } }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, - "engines": { - "node": ">=10.4" - } + "license": "MIT" }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=10" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdom/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=12.0.0" } }, "node_modules/jsesc": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, "license": "MIT", "bin": { @@ -22666,23 +16130,40 @@ "node": ">=4" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", + "node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", "bin": { @@ -22693,13 +16174,15 @@ } }, "node_modules/jsonc-parser": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", - "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" }, "node_modules/jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22711,6 +16194,8 @@ }, "node_modules/jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" @@ -22719,6 +16204,8 @@ }, "node_modules/karma": { "version": "6.3.19", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.19.tgz", + "integrity": "sha512-NDhWckzES/Y9xMiddyU1RzaKL76/scCsu8Mp0vR0Z3lQRvC3p72+Ab4ppoxs36S9tyPNX5V48yvaV++RNEBPZw==", "dev": true, "license": "MIT", "dependencies": { @@ -22756,6 +16243,8 @@ }, "node_modules/karma-chrome-launcher": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -22764,6 +16253,8 @@ }, "node_modules/karma-chrome-launcher/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "license": "ISC", "dependencies": { @@ -22775,6 +16266,8 @@ }, "node_modules/karma-coverage-istanbul-reporter": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", + "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", "dev": true, "license": "MIT", "dependencies": { @@ -22788,8 +16281,34 @@ "url": "https://github.com/sponsors/mattlewis92" } }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma-coverage-istanbul-reporter/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/karma-jasmine": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", + "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", "dev": true, "license": "MIT", "dependencies": { @@ -22804,6 +16323,8 @@ }, "node_modules/karma-jasmine-html-reporter": { "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -22814,11 +16335,15 @@ }, "node_modules/karma-jasmine/node_modules/jasmine-core": { "version": "3.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.1.tgz", + "integrity": "sha512-Hu1dmuoGcZ7AfyynN3LsfruwMbxMALMka+YtZeGoLuDEySVmVAPaonkNoBRIw/ectu8b9tVQCJNgp4a4knp+tg==", "dev": true, "license": "MIT" }, "node_modules/karma-junit-reporter": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-2.0.1.tgz", + "integrity": "sha512-VtcGfE0JE4OE1wn0LK8xxDKaTP7slN8DO3I+4xg6gAi1IoAHAXOJ1V9G/y45Xg6sxdxPOR3THCFtDlAfBo9Afw==", "dev": true, "license": "MIT", "dependencies": { @@ -22834,33 +16359,120 @@ }, "node_modules/karma-source-map-support": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", "dev": true, "license": "MIT", "dependencies": { "source-map-support": "^0.5.5" } }, - "node_modules/karma/node_modules/mkdirp": { - "version": "0.5.6", + "node_modules/karma/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.6" + "color-convert": "^2.0.1" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/karma/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/karma/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/karma/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/karma/node_modules/yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "license": "MIT", "dependencies": { @@ -22878,6 +16490,8 @@ }, "node_modules/karma/node_modules/yargs-parser": { "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "license": "ISC", "engines": { @@ -22890,29 +16504,24 @@ "integrity": "sha512-i/XBRTiLqRConPKioy2oq45vbv04e8x59b0mnsIRQM+7Ec/8BC7UcL5pnC4FMeGb8KwG7q4wOMw7CtNZf5tiIg==", "dev": true }, - "node_modules/kind-of": { - "version": "6.0.3", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "json-buffer": "3.0.1" } }, - "node_modules/klona": { - "version": "2.0.6", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=0.10.0" } }, "node_modules/last-run": { @@ -22920,44 +16529,35 @@ "resolved": "https://registry.npmjs.org/last-run/-/last-run-2.0.0.tgz", "integrity": "sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.13.0" } }, "node_modules/launch-editor": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.1.tgz", - "integrity": "sha512-elBx2l/tp9z99X5H/qev8uyDywVh0VXAwEbjk8kJhnc5grOFkGh7aW6q55me9xnYbss261XtnUrysZ+XvGbhQA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", "dev": true, "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" } }, - "node_modules/lazy-universal-dotenv": { - "version": "4.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "app-root-dir": "^1.0.2", - "dotenv": "^16.0.0", - "dotenv-expand": "^10.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/lead": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz", "integrity": "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/less": { - "version": "4.1.3", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -22982,26 +16582,51 @@ } }, "node_modules/less-loader": { - "version": "11.1.0", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz", + "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==", "dev": true, "license": "MIT", - "dependencies": { - "klona": "^2.0.4" - }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "less": "^3.5.0 || ^4.0.0", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/less/node_modules/mime": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "license": "MIT", "optional": true, @@ -23012,8 +16637,21 @@ "node": ">=4" } }, + "node_modules/less/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/less/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "optional": true, @@ -23021,17 +16659,10 @@ "node": ">=0.10.0" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -23044,6 +16675,8 @@ }, "node_modules/license-webpack-plugin": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, "license": "ISC", "dependencies": { @@ -23063,6 +16696,7 @@ "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.0.tgz", "integrity": "sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg==", "dev": true, + "license": "MIT", "dependencies": { "extend": "^3.0.2", "findup-sync": "^5.0.0", @@ -23076,34 +16710,161 @@ "node": ">=10.13.0" } }, - "node_modules/liftoff/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/lines-and-columns": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/liftoff/node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "node_modules/listr2": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", "dev": true, + "license": "MIT", "dependencies": { - "resolve": "^1.20.0" + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">=18.0.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, "license": "MIT" }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.0.13.tgz", + "integrity": "sha512-UGe+BbaSUQtAMZobTb4nHvFMrmvuAQKSeaqAX2meTEQjfsbpl5sxdHD8T72OnwD4GU9uwNhYXIVe4QGs8N9Zyw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "msgpackr": "^1.10.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.4.1", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.0.13", + "@lmdb/lmdb-darwin-x64": "3.0.13", + "@lmdb/lmdb-linux-arm": "3.0.13", + "@lmdb/lmdb-linux-arm64": "3.0.13", + "@lmdb/lmdb-linux-x64": "3.0.13", + "@lmdb/lmdb-win32-x64": "3.0.13" + } + }, + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true + }, "node_modules/loader-runner": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "license": "MIT", "engines": { @@ -23111,7 +16872,9 @@ } }, "node_modules/loader-utils": { - "version": "3.2.1", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "dev": true, "license": "MIT", "engines": { @@ -23120,6 +16883,8 @@ }, "node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -23134,21 +16899,29 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "license": "MIT", "dependencies": { @@ -23164,6 +16937,8 @@ }, "node_modules/log-symbols/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -23178,58 +16953,221 @@ }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/log4js": { - "version": "6.4.5", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "date-format": "^4.0.7", + "date-format": "^4.0.14", "debug": "^4.3.4", - "flatted": "^3.2.5", + "flatted": "^3.2.7", "rfdc": "^1.3.0", - "streamroller": "^3.0.7" + "streamroller": "^3.1.5" }, "engines": { "node": ">=8.0" } }, "node_modules/loglevel": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", - "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", + "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" }, @@ -23240,11 +17178,15 @@ }, "node_modules/loglevel-plugin-prefix": { "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", "dev": true, "license": "MIT" }, "node_modules/longest-streak": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "dev": true, "license": "MIT", "funding": { @@ -23254,6 +17196,8 @@ }, "node_modules/loose-envify": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -23265,6 +17209,8 @@ }, "node_modules/lower-case": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, "license": "MIT", "dependencies": { @@ -23272,23 +17218,26 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/lunr": { "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true, "license": "MIT" }, "node_modules/macos-release": { - "version": "2.5.0", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", + "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", "dev": true, "license": "MIT", "engines": { @@ -23299,92 +17248,70 @@ } }, "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, "node_modules/make-dir": { - "version": "2.1.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "license": "ISC", "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" } }, "node_modules/make-error": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, "license": "ISC" }, "node_modules/make-fetch-happen": { - "version": "11.1.1", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", "dev": true, "license": "ISC", "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", + "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", + "proc-log": "^4.2.0", "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", "ssri": "^10.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/map-cache": { @@ -23392,22 +17319,29 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/map-or-similar": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", "dev": true, "license": "MIT" }, "node_modules/map-stream": { "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==", "dev": true, "license": "MIT" }, "node_modules/markdown-table": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", "dev": true, "license": "MIT", "funding": { @@ -23416,7 +17350,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "7.2.1", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.5.0.tgz", + "integrity": "sha512-RrBNcMHiFPcz/iqIj0n3wclzHXjwS7mzjBNWecKKVhNTIxQepIix6Il/wZCn2Cg5Y1ow2Qi84+eJrryFRWBEWw==", "dev": true, "license": "MIT", "engines": { @@ -23431,6 +17367,7 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-7.0.3.tgz", "integrity": "sha512-ev2uM40p0zQ/GbvqotfKcSWEa59fJwluGZj5dcaUOwDRrB1F3dncdXy8NWUApk4fi8atU3kTBOwjyjZ0ud0dxw==", "dev": true, + "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -23438,27 +17375,17 @@ "node": ">= 16" } }, - "node_modules/mdast-util-definitions": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "unist-util-visit": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-find-and-replace": { - "version": "2.2.2", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", + "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.0.0" + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, "funding": { "type": "opencollective", @@ -23467,6 +17394,8 @@ }, "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", "engines": { @@ -23476,60 +17405,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mdast-util-find-and-replace/node_modules/unist-util-is": { - "version": "5.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-from-markdown": { - "version": "1.3.1", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-from-markdown/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0" + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -23537,17 +17431,19 @@ } }, "node_modules/mdast-util-gfm": { - "version": "2.0.2", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", "dev": true, "license": "MIT", "dependencies": { - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-gfm-autolink-literal": "^1.0.0", - "mdast-util-gfm-footnote": "^1.0.0", - "mdast-util-gfm-strikethrough": "^1.0.0", - "mdast-util-gfm-table": "^1.0.0", - "mdast-util-gfm-task-list-item": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23555,14 +17451,17 @@ } }, "node_modules/mdast-util-gfm-autolink-literal": { - "version": "1.0.3", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", + "@types/mdast": "^4.0.0", "ccount": "^2.0.0", - "mdast-util-find-and-replace": "^2.0.0", - "micromark-util-character": "^1.0.0" + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23570,13 +17469,17 @@ } }, "node_modules/mdast-util-gfm-footnote": { - "version": "1.0.2", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0", - "micromark-util-normalize-identifier": "^1.0.0" + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23584,12 +17487,15 @@ } }, "node_modules/mdast-util-gfm-strikethrough": { - "version": "1.0.3", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23597,14 +17503,17 @@ } }, "node_modules/mdast-util-gfm-table": { - "version": "1.0.7", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.3.0" + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23612,12 +17521,16 @@ } }, "node_modules/mdast-util-gfm-task-list-item": { - "version": "1.0.2", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.3.0" + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23625,24 +17538,14 @@ } }, "node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing/node_modules/unist-util-is": { - "version": "5.2.1", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0" + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", @@ -23650,17 +17553,19 @@ } }, "node_modules/mdast-util-to-markdown": { - "version": "1.5.0", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" }, "funding": { @@ -23668,68 +17573,24 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-markdown/node_modules/mdast-util-to-string": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown/node_modules/unist-util-is": { - "version": "5.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { - "version": "5.1.3", + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" + "@types/mdast": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-string": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/media-typer": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, "license": "MIT", "engines": { @@ -23738,6 +17599,8 @@ }, "node_modules/memfs": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "license": "Unlicense", "dependencies": { @@ -23749,6 +17612,8 @@ }, "node_modules/memoizerific": { "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", "dev": true, "license": "MIT", "dependencies": { @@ -23756,17 +17621,26 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -23775,6 +17649,8 @@ }, "node_modules/methods": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "license": "MIT", "engines": { @@ -23782,7 +17658,9 @@ } }, "node_modules/micromark": { - "version": "3.2.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", "dev": true, "funding": [ { @@ -23799,24 +17677,26 @@ "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-core-commonmark": { - "version": "1.1.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", "dev": true, "funding": [ { @@ -23831,36 +17711,38 @@ "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-gfm": { - "version": "2.0.3", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", "dev": true, "license": "MIT", "dependencies": { - "micromark-extension-gfm-autolink-literal": "^1.0.0", - "micromark-extension-gfm-footnote": "^1.0.0", - "micromark-extension-gfm-strikethrough": "^1.0.0", - "micromark-extension-gfm-table": "^1.0.0", - "micromark-extension-gfm-tagfilter": "^1.0.0", - "micromark-extension-gfm-task-list-item": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23868,14 +17750,16 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.5", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "dev": true, "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23883,18 +17767,20 @@ } }, "node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.2", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "dev": true, "license": "MIT", "dependencies": { - "micromark-core-commonmark": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23902,16 +17788,18 @@ } }, "node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.7", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "dev": true, "license": "MIT", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23919,15 +17807,17 @@ } }, "node_modules/micromark-extension-gfm-table": { - "version": "1.0.7", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", "dev": true, "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23935,11 +17825,13 @@ } }, "node_modules/micromark-extension-gfm-tagfilter": { - "version": "1.0.2", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", "dev": true, "license": "MIT", "dependencies": { - "micromark-util-types": "^1.0.0" + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23947,15 +17839,17 @@ } }, "node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.5", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "dev": true, "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", @@ -23963,7 +17857,9 @@ } }, "node_modules/micromark-factory-destination": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", "dev": true, "funding": [ { @@ -23977,13 +17873,15 @@ ], "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-label": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", "dev": true, "funding": [ { @@ -23997,14 +17895,16 @@ ], "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-space": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "dev": true, "funding": [ { @@ -24018,12 +17918,14 @@ ], "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-title": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", "dev": true, "funding": [ { @@ -24037,14 +17939,16 @@ ], "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-whitespace": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", "dev": true, "funding": [ { @@ -24058,14 +17962,16 @@ ], "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-character": { - "version": "1.2.0", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "dev": true, "funding": [ { @@ -24079,12 +17985,14 @@ ], "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-chunked": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", "dev": true, "funding": [ { @@ -24098,11 +18006,13 @@ ], "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-classify-character": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", "dev": true, "funding": [ { @@ -24116,13 +18026,15 @@ ], "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-combine-extensions": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", "dev": true, "funding": [ { @@ -24136,12 +18048,14 @@ ], "license": "MIT", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.1.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", "dev": true, "funding": [ { @@ -24155,11 +18069,13 @@ ], "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-decode-string": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", "dev": true, "funding": [ { @@ -24174,13 +18090,15 @@ "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-encode": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", "dev": true, "funding": [ { @@ -24195,7 +18113,9 @@ "license": "MIT" }, "node_modules/micromark-util-html-tag-name": { - "version": "1.2.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", "dev": true, "funding": [ { @@ -24210,7 +18130,9 @@ "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", "dev": true, "funding": [ { @@ -24224,11 +18146,13 @@ ], "license": "MIT", "dependencies": { - "micromark-util-symbol": "^1.0.0" + "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-resolve-all": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", "dev": true, "funding": [ { @@ -24242,11 +18166,13 @@ ], "license": "MIT", "dependencies": { - "micromark-util-types": "^1.0.0" + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-sanitize-uri": { - "version": "1.2.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", "dev": true, "funding": [ { @@ -24260,13 +18186,15 @@ ], "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-subtokenize": { - "version": "1.1.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", "dev": true, "funding": [ { @@ -24280,14 +18208,16 @@ ], "license": "MIT", "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-symbol": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "dev": true, "funding": [ { @@ -24302,7 +18232,9 @@ "license": "MIT" }, "node_modules/micromark-util-types": { - "version": "1.1.0", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", "dev": true, "funding": [ { @@ -24317,19 +18249,36 @@ "license": "MIT" }, "node_modules/micromatch": { - "version": "4.0.5", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "license": "MIT", "bin": { @@ -24341,6 +18290,8 @@ }, "node_modules/mime-db": { "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", "engines": { @@ -24349,6 +18300,8 @@ }, "node_modules/mime-types": { "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "dependencies": { @@ -24360,70 +18313,36 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "dev": true, "license": "MIT", - "dependencies": { - "schema-utils": "^4.0.0" - }, "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "node": ">=18" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", + "node_modules/mini-css-extract-plugin": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz", + "integrity": "sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA==", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -24431,6 +18350,9 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" } }, "node_modules/minimalistic-assert": { @@ -24440,14 +18362,19 @@ "dev": true }, "node_modules/minimatch": { - "version": "3.0.5", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -24455,38 +18382,42 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { - "version": "3.1.6", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-collect": { - "version": "1.0.2", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, "license": "ISC", "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minipass-fetch": { - "version": "3.0.3", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "license": "MIT", "dependencies": { - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, @@ -24497,16 +18428,10 @@ "encoding": "^0.1.13" } }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, "node_modules/minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, "license": "ISC", "dependencies": { @@ -24516,17 +18441,30 @@ "node": ">= 8" } }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "license": "ISC", "dependencies": { @@ -24536,8 +18474,30 @@ "node": ">=8" } }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/minipass-sized": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "license": "ISC", "dependencies": { @@ -24547,8 +18507,30 @@ "node": ">=8" } }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "license": "MIT", "dependencies": { @@ -24559,39 +18541,44 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mkdirp": { - "version": "1.0.4", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, "bin": { "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/mlly": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", - "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", - "dev": true, - "dependencies": { - "acorn": "^8.11.3", - "pathe": "^1.1.2", - "pkg-types": "^1.1.1", - "ufo": "^1.5.3" } }, "node_modules/moment": { @@ -24599,12 +18586,15 @@ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/morgan": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -24620,46 +18610,81 @@ }, "node_modules/morgan/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, - "node_modules/morgan/node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/morgan/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, - "node_modules/mri": { - "version": "1.2.0", + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, "node_modules/mrmime": { - "version": "1.0.1", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/ms": { - "version": "2.1.2", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, + "node_modules/msgpackr": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.0.tgz", + "integrity": "sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==", + "dev": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", @@ -24678,17 +18703,25 @@ "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-2.0.0.tgz", "integrity": "sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.13.0" } }, "node_modules/mute-stream": { - "version": "0.0.8", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/nanoid": { - "version": "3.3.6", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -24704,56 +18737,35 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/needle": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" }, - "node_modules/needle/node_modules/iconv-lite": { - "version": "0.6.3", + "node_modules/needle": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" }, "engines": { - "node": ">=0.10.0" + "node": ">= 4.4.x" } }, "node_modules/negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "license": "MIT", "engines": { @@ -24762,6 +18774,8 @@ }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT" }, @@ -24770,54 +18784,55 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/ng-packagr": { - "version": "16.1.0", + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/ng-packagr/-/ng-packagr-18.1.0.tgz", + "integrity": "sha512-QfqiCIuRX7VhdHqE1goZIuaFh0aMmFTF6r+gP+iq7YyIookXlZWswEZYcnpyRw52Q1RHFdUJRm7foBRFyEXTLA==", "dev": true, "license": "MIT", "dependencies": { - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.0", - "ajv": "^8.11.0", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/wasm-node": "^4.18.0", + "ajv": "^8.12.0", "ansi-colors": "^4.1.3", - "autoprefixer": "^10.4.12", - "browserslist": "^4.21.4", - "cacache": "^17.0.0", + "browserslist": "^4.22.1", + "cacache": "^18.0.0", "chokidar": "^3.5.3", - "commander": "^10.0.0", + "commander": "^12.0.0", "convert-source-map": "^2.0.0", - "dependency-graph": "^0.11.0", - "esbuild-wasm": "^0.17.0", - "fast-glob": "^3.2.12", + "dependency-graph": "^1.0.0", + "esbuild": "^0.23.0", + "fast-glob": "^3.3.1", "find-cache-dir": "^3.3.2", "injection-js": "^2.4.0", "jsonc-parser": "^3.2.0", - "less": "^4.1.3", + "less": "^4.2.0", "ora": "^5.1.0", - "piscina": "^3.2.0", - "postcss": "^8.4.16", - "postcss-url": "^10.1.3", - "rollup": "^3.0.0", - "rxjs": "^7.5.6", - "sass": "^1.55.0" + "piscina": "^4.4.0", + "postcss": "^8.4.31", + "rxjs": "^7.8.1", + "sass": "^1.69.5" }, "bin": { "ng-packagr": "cli/main.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0" + "node": "^18.19.1 || >=20.11.1" }, "optionalDependencies": { - "esbuild": "^0.17.0" + "rollup": "^4.18.0" }, "peerDependencies": { - "@angular/compiler-cli": "^16.0.0 || ^16.1.0-next.0", + "@angular/compiler-cli": "^18.0.0 || ^18.2.0-next.0", "tailwindcss": "^2.0.0 || ^3.0.0", "tslib": "^2.3.0", - "typescript": ">=4.9.3 <5.2" + "typescript": ">=5.4 <5.6" }, "peerDependenciesMeta": { "tailwindcss": { @@ -24825,45 +18840,45 @@ } } }, - "node_modules/ng-packagr/node_modules/ajv": { - "version": "8.12.0", + "node_modules/ng-packagr/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } + "license": "MIT" }, - "node_modules/ng-packagr/node_modules/commander": { - "version": "10.0.1", + "node_modules/ng-packagr/node_modules/readdirp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.1.tgz", + "integrity": "sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==", "dev": true, "license": "MIT", "engines": { - "node": ">=14" + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/ng-packagr/node_modules/convert-source-map": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/ng-packagr/node_modules/json-schema-traverse": { - "version": "1.0.0", + "node_modules/ng-packagr/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } }, "node_modules/ng-packagr/node_modules/sass": { - "version": "1.64.1", + "version": "1.79.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.1.tgz", + "integrity": "sha512-+mA7svoNKeL0DiJqZGeR/ZGUu8he4I8o3jyUcOFyo4eBJrwNgIMmAEwCMo/N2Y3wdjOBcRzoNxZIOtrtMX8EXg==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", + "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" }, @@ -24874,12 +18889,29 @@ "node": ">=14.0.0" } }, + "node_modules/ng-packagr/node_modules/sass/node_modules/chokidar": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.0.tgz", + "integrity": "sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/nice-napi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "!win32" @@ -24891,6 +18923,8 @@ }, "node_modules/no-case": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "license": "MIT", "dependencies": { @@ -24902,51 +18936,16 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "dev": true, - "optional": true - }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "dev": true, "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", - "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", - "dev": true + "optional": true }, "node_modules/node-forge": { "version": "1.3.1", @@ -24958,34 +18957,36 @@ } }, "node_modules/node-gyp": { - "version": "9.4.0", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", + "glob": "^10.3.10", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" + "tar": "^6.2.1", + "which": "^4.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.13 || ^14.13 || >=16" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", "dev": true, + "license": "MIT", "optional": true, "bin": { "node-gyp-build": "bin.js", @@ -24993,8 +18994,50 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-int64": { - "version": "0.4.0", + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", "dev": true, "license": "MIT" }, @@ -25002,48 +19045,44 @@ "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nopt": { - "version": "6.0.0", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dev": true, "license": "ISC", "dependencies": { - "abbrev": "^1.0.0" + "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/normalize-package-data": { - "version": "2.5.0", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "devOptional": true, "license": "MIT", "engines": { @@ -25052,6 +19091,8 @@ }, "node_modules/normalize-range": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true, "license": "MIT", "engines": { @@ -25060,6 +19101,8 @@ }, "node_modules/normalize-url": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "dev": true, "license": "MIT", "engines": { @@ -25074,6 +19117,7 @@ "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz", "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" }, @@ -25082,7 +19126,9 @@ } }, "node_modules/npm-bundled": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dev": true, "license": "ISC", "dependencies": { @@ -25093,7 +19139,9 @@ } }, "node_modules/npm-install-checks": { - "version": "6.1.1", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -25105,6 +19153,8 @@ }, "node_modules/npm-normalize-package-bin": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, "license": "ISC", "engines": { @@ -25112,71 +19162,74 @@ } }, "node_modules/npm-package-arg": { - "version": "10.1.0", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", "dev": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm-packlist": { - "version": "7.0.4", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", "dev": true, "license": "ISC", "dependencies": { - "ignore-walk": "^6.0.0" + "ignore-walk": "^6.0.4" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-pick-manifest": { - "version": "8.0.1", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", + "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", "dev": true, "license": "ISC", "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", + "npm-package-arg": "^11.0.0", "semver": "^7.3.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm-registry-fetch": { - "version": "14.0.5", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", "dev": true, "license": "ISC", "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { @@ -25186,22 +19239,10 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/nth-check": { - "version": "2.0.1", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -25211,93 +19252,208 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", - "dev": true - }, - "node_modules/nypm": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.9.tgz", - "integrity": "sha512-BI2SdqqTHg2d4wJh8P9A1W+bslg33vOE9IZDY6eR2QC+Pu1iNBVZUqczrd43rJb+fMzHU7ltAYKsEFY/kHMFcw==", + "node_modules/nx": { + "version": "19.7.3", + "resolved": "https://registry.npmjs.org/nx/-/nx-19.7.3.tgz", + "integrity": "sha512-8F4CzKavSuOFv+uKVwXHc00Px0q40CWAYCW6NC5IgU3AMaJVumyHzgB8Sn+yfkaVgfVnZVqznOsyrbZUWuj/VA==", "dev": true, + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "citty": "^0.1.6", - "consola": "^3.2.3", - "execa": "^8.0.1", - "pathe": "^1.1.2", - "pkg-types": "^1.1.1", - "ufo": "^1.5.3" + "@napi-rs/wasm-runtime": "0.2.4", + "@nrwl/tao": "19.7.3", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.7.4", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "fs-extra": "^11.1.0", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" }, "bin": { - "nypm": "dist/cli.mjs" + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "19.7.3", + "@nx/nx-darwin-x64": "19.7.3", + "@nx/nx-freebsd-x64": "19.7.3", + "@nx/nx-linux-arm-gnueabihf": "19.7.3", + "@nx/nx-linux-arm64-gnu": "19.7.3", + "@nx/nx-linux-arm64-musl": "19.7.3", + "@nx/nx-linux-x64-gnu": "19.7.3", + "@nx/nx-linux-x64-musl": "19.7.3", + "@nx/nx-win32-arm64-msvc": "19.7.3", + "@nx/nx-win32-x64-msvc": "19.7.3" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": "^14.16.0 || >=16.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/nypm/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=16.17" + "node": ">=10" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/nypm/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/nx/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, "engines": { - "node": ">=16" + "node": ">=8" + } + }, + "node_modules/nx/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nypm/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "node_modules/nx/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, "engines": { - "node": ">=16.17.0" + "node": ">=8" } }, - "node_modules/nypm/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/nx/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/nx/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nypm/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/nx/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, "engines": { "node": ">=12" }, @@ -25305,70 +19461,76 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nypm/node_modules/npm-run-path": { + "node_modules/nx/node_modules/ora": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nypm/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/nx/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, + "license": "MIT", "dependencies": { - "mimic-fn": "^4.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/nypm/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/nx/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "ISC" }, - "node_modules/nypm/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/nx/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "engines": { - "node": ">=14" + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=8" } }, - "node_modules/nypm/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "node_modules/nx/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, "node_modules/object-assign": { @@ -25376,26 +19538,33 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-is": { - "version": "1.1.5", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -25406,26 +19575,20 @@ }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/object-path": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", - "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", - "dev": true, - "engines": { - "node": ">= 10.12.0" - } - }, "node_modules/object.assign": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -25444,6 +19607,7 @@ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", "dev": true, + "license": "MIT", "dependencies": { "array-each": "^1.0.1", "array-slice": "^1.0.0", @@ -25454,11 +19618,46 @@ "node": ">=0.10.0" } }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -25467,13 +19666,15 @@ } }, "node_modules/object.values": { - "version": "1.1.5", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -25488,14 +19689,10 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "node_modules/ohash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", - "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==", - "dev": true - }, "node_modules/on-finished": { - "version": "2.3.0", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "license": "MIT", "dependencies": { @@ -25507,6 +19704,8 @@ }, "node_modules/on-headers": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true, "license": "MIT", "engines": { @@ -25515,6 +19714,8 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "license": "ISC", "dependencies": { @@ -25522,30 +19723,34 @@ } }, "node_modules/onetime": { - "version": "5.1.2", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-function": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open": { - "version": "8.4.0", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, - "license": "MIT", "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -25553,14 +19758,36 @@ }, "node_modules/opencollective-postinstall": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", "dev": true, "license": "MIT", "bin": { "opencollective-postinstall": "index.js" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ora": { "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -25583,6 +19810,8 @@ }, "node_modules/ora/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -25597,6 +19826,8 @@ }, "node_modules/ora/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -25610,16 +19841,70 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ora/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, "engines": { "node": ">=8" } }, + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -25629,8 +19914,16 @@ "node": ">=8" } }, + "node_modules/ordered-binary": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.1.tgz", + "integrity": "sha512-5VyHfHY3cd0iza71JepYG50My+YUbrFtGoUz2ooEydPyPM7Aai/JW098juLr+RG6+rDJuzNNTsEQu2DZa1A41A==", + "dev": true + }, "node_modules/os-name": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", "dev": true, "license": "MIT", "dependencies": { @@ -25646,6 +19939,8 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, "license": "MIT", "engines": { @@ -25654,6 +19949,8 @@ }, "node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -25668,6 +19965,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -25682,6 +19981,8 @@ }, "node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "license": "MIT", "dependencies": { @@ -25691,105 +19992,60 @@ "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", - "dev": true, - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/p-retry": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.0.tgz", + "integrity": "sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==", "dev": true, "dependencies": { - "debug": "^4.3.4" + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" }, "engines": { - "node": ">= 14" + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, "engines": { - "node": ">= 14" + "node": ">= 4" } }, - "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, + "license": "MIT", "engines": { - "node": ">= 14" + "node": ">=6" } }, - "node_modules/pac-proxy-agent/node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "node_modules/pac-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", + "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.1.1", + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", "debug": "^4.3.4", - "socks": "^2.7.1" + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.5", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.4" }, "engines": { "node": ">= 14" @@ -25800,6 +20056,7 @@ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", "dev": true, + "license": "MIT", "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -25816,62 +20073,48 @@ "license": "BlueOak-1.0.0" }, "node_modules/pacote": { - "version": "15.2.0", + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", + "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/git": "^4.0.0", + "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", + "sigstore": "^2.2.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/fs-minipass": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^5.0.0" + "pacote": "bin/index.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/pako": { - "version": "1.0.11", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", "dev": true, - "license": "(MIT AND Zlib)" + "license": "MIT" }, "node_modules/param-case": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "license": "MIT", "dependencies": { @@ -25881,6 +20124,8 @@ }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { @@ -25895,6 +20140,7 @@ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dev": true, + "license": "MIT", "dependencies": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", @@ -25904,8 +20150,24 @@ "node": ">=0.8" } }, + "node_modules/parse-imports": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.1.1.tgz", + "integrity": "sha512-TDT4HqzUiTMO1wJRwg/t/hYk8Wdp3iF/ToMIlAoVQfL1Xs/sTxq1dKWSMjMbQmIarfWKymOyly40+zmPHXMqCA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { @@ -25921,8 +20183,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/parse-node-version": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true, "license": "MIT", "engines": { @@ -25934,12 +20212,15 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/parse-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-5.0.0.tgz", + "integrity": "sha512-qOpH55/+ZJ4jUu/oLO+ifUKjFPNZGfnPJtzvGzKN/4oLMil5m9OH4VpOj6++9/ytJcfks4kzH2hhi87GL/OU9A==", "dev": true, "license": "MIT", "dependencies": { @@ -25948,11 +20229,15 @@ }, "node_modules/parse-repo": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/parse-repo/-/parse-repo-1.0.4.tgz", + "integrity": "sha512-RdwYLh7cmxByP/BfeZX0QfIVfeNrH2fWgK1aLsGK+G6nCO4WTlCks4J7aW0O3Ap9BCPDF/e8rGTT50giQr10zg==", "dev": true, "license": "MIT" }, "node_modules/parse-url": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-7.0.2.tgz", + "integrity": "sha512-PqO4Z0eCiQ08Wj6QQmrmp5YTTxpYfONdOEamrtvK63AmzXpcavIVQubGHxOEwiIoDZFb8uDOoQFS0NCcjqIYQg==", "dev": true, "license": "MIT", "dependencies": { @@ -25964,6 +20249,8 @@ }, "node_modules/parse5": { "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -25975,8 +20262,9 @@ }, "node_modules/parse5-html-rewriting-stream": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "dev": true, - "license": "MIT", "dependencies": { "entities": "^4.3.0", "parse5": "^7.0.0", @@ -25986,22 +20274,12 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-html-rewriting-stream/node_modules/entities": { - "version": "4.5.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "dev": true, + "license": "MIT", "dependencies": { "domhandler": "^5.0.2", "parse5": "^7.0.0" @@ -26010,25 +20288,24 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "dev": true, + "license": "MIT", "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" + "parse5": "^7.0.0" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-sax-parser": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dev": true, - "license": "MIT", "dependencies": { "parse5": "^7.0.0" }, @@ -26036,19 +20313,10 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5/node_modules/entities": { - "version": "4.5.0", - "devOptional": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parseurl": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, "license": "MIT", "engines": { @@ -26057,6 +20325,8 @@ }, "node_modules/pascal-case": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, "license": "MIT", "dependencies": { @@ -26066,11 +20336,15 @@ }, "node_modules/path-browserify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", "dev": true, "license": "MIT" }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", "engines": { @@ -26079,6 +20353,8 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { @@ -26087,6 +20363,8 @@ }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { @@ -26095,6 +20373,8 @@ }, "node_modules/path-parse": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, "license": "MIT" }, @@ -26103,6 +20383,7 @@ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "dev": true, + "license": "MIT", "dependencies": { "path-root-regex": "^0.1.0" }, @@ -26115,6 +20396,7 @@ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -26124,6 +20406,7 @@ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -26136,43 +20419,36 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.2", + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } + "license": "ISC" }, "node_modules/path-to-regexp": { - "version": "0.1.7", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "dev": true, "license": "MIT" }, "node_modules/path-type": { - "version": "4.0.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, "node_modules/pause-stream": { "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", "dev": true, "license": [ "MIT", @@ -26183,10 +20459,11 @@ } }, "node_modules/pdfmake": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.10.tgz", - "integrity": "sha512-doipFnmE1UHSk+Z3wfQuVweVQqx2pE/Ns2G5gCqZmWwqjDj+mZHnZYH/ryXWoIfD+iVdZUAutgI/VHkTCN+Xrw==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.12.tgz", + "integrity": "sha512-TFsqaG6KVtk+TWermmJNNwom3wmB/xiz07prM74KBhdM+7pz3Uwq2b0uoqhhQRn6cYUTpL8lXZY6xF011o1YcQ==", "dev": true, + "license": "MIT", "dependencies": { "@foliojs-fork/linebreak": "^1.1.1", "@foliojs-fork/pdfkit": "^0.14.0", @@ -26197,46 +20474,27 @@ "node": ">=12" } }, - "node_modules/pdfmake/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/peek-stream": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", - "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "duplexify": "^3.5.0", - "through2": "^2.0.3" - } - }, "node_modules/pend": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true, "license": "MIT" }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "devOptional": true, + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -26244,53 +20502,91 @@ }, "node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/pirates": { - "version": "4.0.6", + "node_modules/piscina": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.6.1.tgz", + "integrity": "sha512-z30AwWGtQE+Apr+2WBZensP2lIvwoaMcOPkQlIEmSGMJNUvaYACylPYrQM6wSdUNJlnDVMSpLv7xTMJqlVshOA==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/piscina": { - "version": "3.2.0", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { - "eventemitter-asyncresource": "^1.0.0", - "hdr-histogram-js": "^2.0.1", - "hdr-histogram-percentiles-obj": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, - "optionalDependencies": { - "nice-napi": "^1.0.2" + "engines": { + "node": ">=8" } }, - "node_modules/pkg-dir": { + "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { - "find-up": "^5.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/pkg-types": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", - "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { - "confbox": "^0.1.7", - "mlly": "^1.7.1", - "pathe": "^1.1.2" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/png-js": { @@ -26300,7 +20596,9 @@ "dev": true }, "node_modules/polished": { - "version": "4.2.2", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/polished/-/polished-4.3.1.tgz", + "integrity": "sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==", "dev": true, "license": "MIT", "dependencies": { @@ -26315,14 +20613,15 @@ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "dev": true, "funding": [ { @@ -26338,83 +20637,58 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-loader": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz", + "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==", "dev": true, + "license": "MIT", "dependencies": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" + "cosmiconfig": "^9.0.0", + "jiti": "^1.20.0", + "semver": "^7.5.4" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" - } - }, - "node_modules/postcss-loader/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" }, "peerDependenciesMeta": { - "typescript": { + "@rspack/core": { + "optional": true + }, + "webpack": { "optional": true } } }, - "node_modules/postcss-loader/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "license": "ISC", "engines": { @@ -26425,7 +20699,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "license": "MIT", "dependencies": { @@ -26441,7 +20717,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "license": "ISC", "dependencies": { @@ -26456,6 +20734,8 @@ }, "node_modules/postcss-modules-values": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "license": "ISC", "dependencies": { @@ -26469,7 +20749,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.10", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "license": "MIT", "dependencies": { @@ -26480,63 +20762,17 @@ "node": ">=4" } }, - "node_modules/postcss-url": { - "version": "10.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "make-dir": "~3.1.0", - "mime": "~2.5.2", - "minimatch": "~3.0.4", - "xxhashjs": "~0.2.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-url/node_modules/make-dir": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/postcss-url/node_modules/mime": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/postcss-url/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/postcss-value-parser": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true, "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -26545,6 +20781,8 @@ }, "node_modules/prettier": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.0.tgz", + "integrity": "sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==", "dev": true, "license": "MIT", "bin": { @@ -26559,6 +20797,8 @@ }, "node_modules/pretty-bytes": { "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, "license": "MIT", "engines": { @@ -26570,6 +20810,8 @@ }, "node_modules/pretty-error": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, "license": "MIT", "dependencies": { @@ -26577,12 +20819,32 @@ "renderkid": "^3.0.0" } }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/prismjs": { @@ -26590,12 +20852,15 @@ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/proc-log": { - "version": "3.0.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, "license": "ISC", "engines": { @@ -26607,17 +20872,21 @@ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/process-nextick-args": { "version": "2.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "node_modules/progress": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "license": "MIT", "engines": { @@ -26626,11 +20895,15 @@ }, "node_modules/promise-inflight": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true, "license": "ISC" }, "node_modules/promise-retry": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "license": "MIT", "dependencies": { @@ -26641,50 +20914,27 @@ "node": ">=10" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "dev": true, - "license": "MIT" - }, "node_modules/propagating-hammerjs": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/propagating-hammerjs/-/propagating-hammerjs-1.5.0.tgz", "integrity": "sha512-3PUXWmomwutoZfydC+lJwK1bKCh6sK6jZGB31RUX6+4EXzsbkDZrK4/sVR7gBrvJaEIwpTVyxQUAd29FKkmVdw==", "dev": true, + "license": "MIT", "dependencies": { "hammerjs": "^2.0.8" } }, "node_modules/protocols": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true, "license": "MIT" }, "node_modules/proxy-addr": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "license": "MIT", "dependencies": { @@ -26700,6 +20950,7 @@ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -26714,69 +20965,20 @@ "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/proxy-agent/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/proxy-agent/node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", - "dev": true, - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/proxy-from-env": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true, "license": "MIT" }, @@ -26785,23 +20987,23 @@ "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", "integrity": "sha512-EGCG8SeoIRVMhsqHQUdDigB2i7qU7fCsWASwn54+nPutYO8n4q6EiwMzyfWlC+dzRFExP+kvcnDFdBDHoZBU7Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/prr": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, "license": "MIT", "optional": true }, - "node_modules/psl": { - "version": "1.8.0", - "dev": true, - "license": "MIT" - }, "node_modules/pump": { - "version": "3.0.0", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", "dev": true, "license": "MIT", "dependencies": { @@ -26809,33 +21011,12 @@ "once": "^1.3.1" } }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" }, "node_modules/puppeteer": { "version": "22.11.1", @@ -26843,6 +21024,7 @@ "integrity": "sha512-NhpLQC2NMXcNvCquRCeFWxu12ywfBeZ8wK9TyupOnSyaX2czeuqZdBVOQ33mBzmG8qTnM7DsStY8Z+TOgshMdA==", "dev": true, "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.2.3", "cosmiconfig": "9.0.0", @@ -26857,149 +21039,28 @@ } }, "node_modules/puppeteer-core": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-2.1.1.tgz", - "integrity": "sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==", - "dev": true, - "dependencies": { - "@types/mime-types": "^2.1.0", - "debug": "^4.1.0", - "extract-zip": "^1.6.6", - "https-proxy-agent": "^4.0.0", - "mime": "^2.0.3", - "mime-types": "^2.1.25", - "progress": "^2.0.1", - "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" - }, - "engines": { - "node": ">=8.16.0" - } - }, - "node_modules/puppeteer-core/node_modules/agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/puppeteer-core/node_modules/extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", - "dev": true, - "dependencies": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - } - }, - "node_modules/puppeteer-core/node_modules/extract-zip/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/puppeteer-core/node_modules/https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "dependencies": { - "agent-base": "5", - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/puppeteer-core/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/puppeteer-core/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/puppeteer-core/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "dev": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/puppeteer/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/puppeteer/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "22.11.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.11.1.tgz", + "integrity": "sha512-lIMQrpbMlQ5GqXzD7fo/j74PhceRma+DrVFX+vAx3cwURsfDKyYx7fksTo1nUfLmKyXRyCDSa2peASa/DQ0R9Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "@puppeteer/browsers": "2.2.3", + "chromium-bidi": "0.5.23", + "debug": "4.3.5", + "devtools-protocol": "0.0.1299070", + "ws": "8.17.0" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=18" } }, - "node_modules/puppeteer/node_modules/debug": { + "node_modules/puppeteer-core/node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -27012,36 +21073,17 @@ } } }, - "node_modules/puppeteer/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/puppeteer/node_modules/puppeteer-core": { - "version": "22.11.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.11.1.tgz", - "integrity": "sha512-lIMQrpbMlQ5GqXzD7fo/j74PhceRma+DrVFX+vAx3cwURsfDKyYx7fksTo1nUfLmKyXRyCDSa2peASa/DQ0R9Q==", + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, - "dependencies": { - "@puppeteer/browsers": "2.2.3", - "chromium-bidi": "0.5.23", - "debug": "4.3.5", - "devtools-protocol": "0.0.1299070", - "ws": "8.17.0" - }, - "engines": { - "node": ">=18" - } + "license": "MIT" }, "node_modules/qjobs": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true, "license": "MIT", "engines": { @@ -27053,6 +21095,7 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -27063,14 +21106,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -27092,19 +21131,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true - }, - "node_modules/ramda": { - "version": "0.29.0", "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ramda" - } + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", "dependencies": { @@ -27113,6 +21146,8 @@ }, "node_modules/range-parser": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, "license": "MIT", "engines": { @@ -27124,6 +21159,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -27134,17 +21170,23 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { - "node": ">= 0.8" + "node": ">=0.10.0" } }, "node_modules/react": { - "version": "18.2.0", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dev": true, "license": "MIT", "dependencies": { @@ -27156,6 +21198,8 @@ }, "node_modules/react-colorful": { "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -27164,228 +21208,30 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-inspector": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/read-package-json": { - "version": "6.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "10.3.3", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/minipass": { - "version": "7.0.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/read-package-json/node_modules/normalize-package-data": { - "version": "5.0.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" + "react": "^18.3.1" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/readable-stream": { - "version": "3.6.0", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", "dependencies": { @@ -27399,24 +21245,41 @@ }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "devOptional": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, "engines": { - "node": ">=8.10.0" + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/recast": { - "version": "0.23.3", + "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", "dev": true, "license": "MIT", "dependencies": { - "assert": "^2.0.0", "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" }, "engines": { @@ -27425,6 +21288,8 @@ }, "node_modules/recast/node_modules/ast-types": { "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -27436,6 +21301,8 @@ }, "node_modules/recast/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -27443,27 +21310,36 @@ } }, "node_modules/rechoir": { - "version": "0.6.2", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, + "license": "MIT", "dependencies": { - "resolve": "^1.1.6" + "resolve": "^1.20.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/reflect-metadata": { - "version": "0.1.13", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "dev": true, "license": "Apache-2.0" }, "node_modules/regenerate": { "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true, "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dev": true, "license": "MIT", "dependencies": { @@ -27474,7 +21350,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true, "license": "MIT" }, @@ -27483,12 +21361,15 @@ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regex-parser": { - "version": "2.2.11", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", "dev": true, "license": "MIT" }, @@ -27497,6 +21378,7 @@ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "define-properties": "^1.2.1", @@ -27510,19 +21392,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/regexpu-core": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -27539,6 +21412,8 @@ }, "node_modules/regjsparser": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -27550,58 +21425,106 @@ }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" } }, + "node_modules/rehype-external-links": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz", + "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-is-element": "^3.0.0", + "is-absolute-url": "^4.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-slug": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz", + "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "github-slugger": "^2.0.0", + "hast-util-heading-rank": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/relateurl": { "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.10" } }, - "node_modules/remark-external-links": { - "version": "8.0.0", + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", "dev": true, "license": "MIT", "dependencies": { - "extend": "^3.0.0", - "is-absolute-url": "^3.0.0", - "mdast-util-definitions": "^4.0.0", - "space-separated-tokens": "^1.0.0", - "unist-util-visit": "^2.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-gfm": { - "version": "3.0.1", + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-gfm": "^2.0.0", - "micromark-extension-gfm": "^2.0.0", - "unified": "^10.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/remark-slug": { - "version": "6.1.0", + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", "dev": true, "license": "MIT", "dependencies": { - "github-slugger": "^1.0.0", - "mdast-util-to-string": "^1.0.0", - "unist-util-visit": "^2.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", @@ -27612,10 +21535,13 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/renderkid": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "license": "MIT", "dependencies": { @@ -27626,11 +21552,105 @@ "strip-ansi": "^6.0.1" } }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, "node_modules/replace-ext": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } @@ -27640,12 +21660,15 @@ "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-2.0.0.tgz", "integrity": "sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.13.0" } }, "node_modules/require-directory": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "license": "MIT", "engines": { @@ -27654,6 +21677,8 @@ }, "node_modules/require-from-string": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -27661,11 +21686,15 @@ }, "node_modules/require-main-filename": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true, "license": "ISC" }, "node_modules/requireindex": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true, "license": "MIT", "engines": { @@ -27674,15 +21703,19 @@ }, "node_modules/requires-port": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true, "license": "MIT" }, "node_modules/resolve": { - "version": "1.22.2", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -27698,6 +21731,7 @@ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" @@ -27707,11 +21741,13 @@ } }, "node_modules/resolve-from": { - "version": "5.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/resolve-options": { @@ -27719,6 +21755,7 @@ "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz", "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==", "dev": true, + "license": "MIT", "dependencies": { "value-or-function": "^4.0.0" }, @@ -27728,6 +21765,8 @@ }, "node_modules/resolve-url-loader": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, "license": "MIT", "dependencies": { @@ -27743,6 +21782,8 @@ }, "node_modules/resolve-url-loader/node_modules/loader-utils": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "license": "MIT", "dependencies": { @@ -27756,6 +21797,8 @@ }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -27763,19 +21806,26 @@ } }, "node_modules/restore-cursor": { - "version": "3.1.0", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, "license": "MIT", "engines": { @@ -27784,6 +21834,8 @@ }, "node_modules/reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "license": "MIT", "engines": { @@ -27792,12 +21844,17 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, "license": "MIT" }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -27810,32 +21867,104 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.3.tgz", + "integrity": "sha512-7sqRtBNnEbcBtMeRVc6VRsJMmpI+JU1z9VTvW8D4gXIYQFz0aLcsE6rRkyghZkLfEgUZgVvOG7A5CVz/VW5GIA==", "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.21.3", + "@rollup/rollup-android-arm64": "4.21.3", + "@rollup/rollup-darwin-arm64": "4.21.3", + "@rollup/rollup-darwin-x64": "4.21.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.3", + "@rollup/rollup-linux-arm-musleabihf": "4.21.3", + "@rollup/rollup-linux-arm64-gnu": "4.21.3", + "@rollup/rollup-linux-arm64-musl": "4.21.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.3", + "@rollup/rollup-linux-riscv64-gnu": "4.21.3", + "@rollup/rollup-linux-s390x-gnu": "4.21.3", + "@rollup/rollup-linux-x64-gnu": "4.21.3", + "@rollup/rollup-linux-x64-musl": "4.21.3", + "@rollup/rollup-win32-arm64-msvc": "4.21.3", + "@rollup/rollup-win32-ia32-msvc": "4.21.3", + "@rollup/rollup-win32-x64-msvc": "4.21.3", "fsevents": "~2.3.2" } }, - "node_modules/run-async": { - "version": "2.4.1", + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", "dev": true, - "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -27858,27 +21987,19 @@ }, "node_modules/rxjs": { "version": "7.5.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.7.tgz", + "integrity": "sha512-z9MzKh/UcOqB3i20H6rtrlaE/CgjLOvheWK/9ILrbhROGTweAi1BaFsTT9FbwZi5Trr1qNRs+MXkhmR06awzQA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, - "node_modules/sade": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "get-intrinsic": "^1.2.4", @@ -27893,8 +22014,24 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, "node_modules/safe-regex-test": { @@ -27902,6 +22039,7 @@ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", @@ -27916,11 +22054,15 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "license": "MIT" }, "node_modules/sass": { "version": "1.50.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.50.1.tgz", + "integrity": "sha512-noTnY41KnlW2A9P8sdwESpDmo+KBNkukI1i8+hOK3footBUcohNHtdOJbckp46XO95nuvcHDDZ+4tmOnpK3hjw==", "dev": true, "license": "MIT", "dependencies": { @@ -27936,29 +22078,30 @@ } }, "node_modules/sass-loader": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", - "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.0.tgz", + "integrity": "sha512-n13Z+3rU9A177dk4888czcVFiC8CL9dii4qpXWUg3YIIgZEvi9TCFKjOQcbK0kJM7DJu9VucrZFddvNfYCPwtw==", "dev": true, + "license": "MIT", "dependencies": { "neo-async": "^2.6.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", + "@rspack/core": "0.x || 1.x", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "fibers": { + "@rspack/core": { "optional": true }, "node-sass": { @@ -27969,28 +22112,23 @@ }, "sass-embedded": { "optional": true + }, + "webpack": { + "optional": true } } }, "node_modules/sax": { - "version": "1.2.4", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "dev": true, "license": "ISC" }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/scheduler": { - "version": "0.23.0", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -27998,24 +22136,47 @@ } }, "node_modules/schema-utils": { - "version": "3.3.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, "node_modules/scss-bundle": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/scss-bundle/-/scss-bundle-3.1.2.tgz", + "integrity": "sha512-lvxTwCKDLgzmRWhGwJ834ggtnEhs0G9FxSJRWte+NwlshVvBcQ/kOHHkpAGDpCxIMNGz/Utl0yd/MWyQAOBhqg==", "dev": true, "license": "MIT", "dependencies": { @@ -28044,6 +22205,8 @@ }, "node_modules/scss-bundle/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -28058,6 +22221,8 @@ }, "node_modules/scss-bundle/node_modules/chalk": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "license": "MIT", "dependencies": { @@ -28070,6 +22235,8 @@ }, "node_modules/scss-bundle/node_modules/commander": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "license": "MIT", "engines": { @@ -28078,6 +22245,8 @@ }, "node_modules/scss-bundle/node_modules/fs-extra": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "license": "MIT", "dependencies": { @@ -28091,6 +22260,8 @@ }, "node_modules/scss-bundle/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -28099,6 +22270,8 @@ }, "node_modules/scss-bundle/node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, "license": "MIT", "optionalDependencies": { @@ -28107,6 +22280,8 @@ }, "node_modules/scss-bundle/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -28118,11 +22293,15 @@ }, "node_modules/scss-bundle/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/scss-bundle/node_modules/universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, "license": "MIT", "engines": { @@ -28149,12 +22328,11 @@ } }, "node_modules/semver": { - "version": "7.5.3", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -28167,6 +22345,7 @@ "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-2.0.0.tgz", "integrity": "sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==", "dev": true, + "license": "MIT", "dependencies": { "sver": "^1.8.3" }, @@ -28175,10 +22354,11 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -28200,6 +22380,8 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { @@ -28208,11 +22390,15 @@ }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, - "node_modules/send/node_modules/depd": { - "version": "2.0.0", + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "license": "MIT", "engines": { @@ -28221,6 +22407,8 @@ }, "node_modules/send/node_modules/mime": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "license": "MIT", "bin": { @@ -28230,32 +22418,10 @@ "node": ">=4" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/serialize-javascript": { - "version": "6.0.1", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -28264,6 +22430,8 @@ }, "node_modules/serve-index": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "license": "MIT", "dependencies": { @@ -28281,14 +22449,28 @@ }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "license": "MIT", "dependencies": { @@ -28303,29 +22485,46 @@ }, "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true, "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true, "license": "ISC" }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -28333,6 +22532,8 @@ }, "node_modules/set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true, "license": "ISC" }, @@ -28341,6 +22542,7 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -28354,14 +22556,16 @@ } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -28369,11 +22573,15 @@ }, "node_modules/setprototypeof": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true, "license": "ISC" }, "node_modules/shallow-clone": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "license": "MIT", "dependencies": { @@ -28385,6 +22593,8 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", "dependencies": { @@ -28396,6 +22606,8 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { @@ -28413,6 +22625,8 @@ }, "node_modules/shelljs": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -28427,19 +22641,80 @@ "node": ">=4" } }, + "node_modules/shelljs/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/shelljs/node_modules/interpret": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.10" } }, + "node_modules/shelljs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/shelljs/node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/side-channel": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -28454,43 +22729,90 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "ISC" + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sigstore": { - "version": "1.8.0", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", + "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@sigstore/bundle": "^1.0.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, "node_modules/slash": { - "version": "3.0.0", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", + "dev": true, + "license": "ISC" + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "license": "MIT", "engines": { @@ -28503,6 +22825,7 @@ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", @@ -28521,6 +22844,7 @@ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "~4.3.4", "ws": "~8.17.1" @@ -28531,6 +22855,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -28552,6 +22877,7 @@ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, + "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" @@ -28571,11 +22897,21 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/socks": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, + "license": "MIT", "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -28586,28 +22922,33 @@ } }, "node_modules/socks-proxy-agent": { - "version": "7.0.0", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" }, "engines": { - "node": ">= 10" + "node": ">= 14" } }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/source-map-js": { - "version": "1.0.2", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -28615,16 +22956,17 @@ } }, "node_modules/source-map-loader": { - "version": "4.0.1", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz", + "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==", "dev": true, "license": "MIT", "dependencies": { - "abab": "^2.0.6", "iconv-lite": "^0.6.3", "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -28634,19 +22976,10 @@ "webpack": "^5.72.1" } }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", "dependencies": { @@ -28656,6 +22989,8 @@ }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -28663,7 +22998,9 @@ } }, "node_modules/space-separated-tokens": { - "version": "1.1.5", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true, "license": "MIT", "funding": { @@ -28676,12 +23013,15 @@ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz", "integrity": "sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.13.0" } }, "node_modules/spdx-correct": { - "version": "3.1.1", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -28689,13 +23029,28 @@ "spdx-license-ids": "^3.0.0" } }, + "node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/spdx-exceptions": { - "version": "2.3.0", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", "dev": true, "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { - "version": "3.0.1", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -28704,7 +23059,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.11", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true, "license": "CC0-1.0" }, @@ -28740,6 +23097,8 @@ }, "node_modules/split": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, "license": "MIT", "dependencies": { @@ -28750,53 +23109,48 @@ } }, "node_modules/sprintf-js": { - "version": "1.0.3", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/ssri": { - "version": "10.0.4", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "license": "ISC", "dependencies": { - "minipass": "^5.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ssri/node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, "node_modules/statuses": { - "version": "1.5.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/store2": { - "version": "2.14.2", - "dev": true, - "license": "(MIT OR GPL-3.0)" - }, "node_modules/storybook": { - "version": "7.6.20", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.6.20.tgz", - "integrity": "sha512-Wt04pPTO71pwmRmsgkyZhNo4Bvdb/1pBAMsIFb9nQLykEdzzpXjvingxFFvdOG4nIowzwgxD+CLlyRqVJqnATw==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.3.1.tgz", + "integrity": "sha512-CYqt5KOpaTgb8OczNo2+EtMi8YNDPi4vNVebVlLDOroWxyulb8I7MIOH9gALczcIOb+TZUArPztjoa8rkXTaDQ==", "dev": true, + "license": "MIT", "dependencies": { - "@storybook/cli": "7.6.20" + "@storybook/core": "8.3.1" }, "bin": { - "sb": "index.js", - "storybook": "index.js" + "getstorybook": "bin/index.cjs", + "sb": "bin/index.cjs", + "storybook": "bin/index.cjs" }, "funding": { "type": "opencollective", @@ -28805,6 +23159,8 @@ }, "node_modules/stream-combiner": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -28817,6 +23173,7 @@ "resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz", "integrity": "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==", "dev": true, + "license": "MIT", "dependencies": { "streamx": "^2.13.2" } @@ -28825,32 +23182,65 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/streamroller": { - "version": "3.0.7", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", "dev": true, "license": "MIT", "dependencies": { - "date-format": "^4.0.7", + "date-format": "^4.0.14", "debug": "^4.3.4", - "fs-extra": "^10.0.1" + "fs-extra": "^8.1.0" }, "engines": { "node": ">=8.0" } }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/streamroller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", + "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", "dev": true, + "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", "queue-tick": "^1.0.1", @@ -28862,33 +23252,18 @@ }, "node_modules/string_decoder": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -28903,6 +23278,8 @@ "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { @@ -28914,11 +23291,32 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -28937,6 +23335,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -28951,6 +23350,7 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -28965,6 +23365,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -28977,6 +23379,8 @@ "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { @@ -28988,6 +23392,8 @@ }, "node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -28996,6 +23402,8 @@ }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", "engines": { @@ -29004,6 +23412,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { @@ -29013,11 +23423,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/style-loader": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 12.13.0" }, @@ -29034,6 +23463,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -29043,6 +23473,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { @@ -29057,6 +23489,7 @@ "resolved": "https://registry.npmjs.org/sver/-/sver-1.8.4.tgz", "integrity": "sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==", "dev": true, + "license": "MIT", "optionalDependencies": { "semver": "^6.3.0" } @@ -29066,6 +23499,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "optional": true, "bin": { "semver": "bin/semver.js" @@ -29075,48 +23509,54 @@ "version": "3.6.1", "resolved": "https://registry.npmjs.org/svg-pan-zoom/-/svg-pan-zoom-3.6.1.tgz", "integrity": "sha512-JaKkGHHfGvRrcMPdJWkssLBeWqM+Isg/a09H7kgNNajT1cX5AztDTNs+C8UzpCxjCTRrG34WbquwaovZbmSk9g==", - "dev": true - }, - "node_modules/swc-loader": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz", - "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==", "dev": true, - "dependencies": { - "@swc/counter": "^0.1.3" - }, - "peerDependencies": { - "@swc/core": "^1.2.147", - "webpack": ">=2" - } + "license": "BSD-2-Clause" }, "node_modules/symbol-observable": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true + "node_modules/synckit": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz", + "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } }, - "node_modules/synchronous-promise": { - "version": "2.0.17", + "node_modules/synckit/node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "dev": true, - "license": "BSD-3-Clause" + "license": "0BSD" }, "node_modules/tablesort": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/tablesort/-/tablesort-5.3.0.tgz", "integrity": "sha512-WkfcZBHsp47gVH9CBHG0ZXopriG01IA87arGrchvIe868d4RiXVvoYPS1zMq9IdW05kBs5iGsqxTABqLyWonbg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tapable": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, "license": "MIT", "engines": { @@ -29128,6 +23568,7 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, + "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -29141,28 +23582,38 @@ } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", + "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", "dev": true, + "license": "MIT", "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" } }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "node_modules/tar-fs/node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -29174,102 +23625,88 @@ "node": ">=6" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/teex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", - "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", - "dev": true, - "dependencies": { - "streamx": "^2.12.5" - } - }, - "node_modules/telejson": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", - "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", - "dev": true, "dependencies": { - "memoizerific": "^1.11.3" + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/temp": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { - "rimraf": "~2.6.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=8" } }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, + "license": "MIT", "bin": { - "rimraf": "bin.js" + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/tempy": { + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/teex": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", "dev": true, + "license": "MIT", "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "streamx": "^2.12.5" } }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "node_modules/telejson": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz", + "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "dependencies": { + "memoizerific": "^1.11.3" } }, "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -29288,6 +23725,7 @@ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -29317,141 +23755,101 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.31.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", - "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, - "node_modules/test-exclude": { - "version": "6.0.0", + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=8" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, "node_modules/text-decoder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", - "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.0.tgz", + "integrity": "sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" } }, "node_modules/text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "license": "MIT" }, - "node_modules/through": { - "version": "2.3.8", - "dev": true, - "license": "MIT" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/thingies": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", + "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "engines": { + "node": ">=10.18" + }, + "peerDependencies": { + "tslib": "^2" } }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/through2/node_modules/readable-stream": { + "node_modules/through": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } + "license": "MIT" }, "node_modules/thunky": { "version": "1.1.0", @@ -29463,31 +23861,30 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tiny-invariant": { - "version": "1.3.1", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "dev": true, "license": "MIT" }, "node_modules/tmp": { - "version": "0.2.1", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, "license": "MIT", - "dependencies": { - "rimraf": "^3.0.0" - }, "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/to-fast-properties": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, "license": "MIT", "engines": { @@ -29499,6 +23896,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "devOptional": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -29511,6 +23909,7 @@ "resolved": "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz", "integrity": "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==", "dev": true, + "license": "MIT", "dependencies": { "streamx": "^2.12.5" }, @@ -29518,29 +23917,22 @@ "node": ">=10.13.0" } }, - "node_modules/tocbot": { - "version": "4.21.0", - "dev": true, - "license": "MIT" - }, "node_modules/toidentifier": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "dev": true, - "license": "MIT" - }, "node_modules/traverse": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.9.tgz", - "integrity": "sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==", + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.10.tgz", + "integrity": "sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==", "dev": true, + "license": "MIT", "dependencies": { "gopd": "^1.0.1", "typedarray.prototype.slice": "^1.0.3", @@ -29553,8 +23945,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tree-dump": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", + "dev": true, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/tree-kill": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, "license": "MIT", "bin": { @@ -29562,7 +23972,9 @@ } }, "node_modules/trough": { - "version": "2.1.0", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "dev": true, "license": "MIT", "funding": { @@ -29570,8 +23982,23 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-dedent": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", "dev": true, "license": "MIT", "engines": { @@ -29583,6 +24010,7 @@ "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-22.0.0.tgz", "integrity": "sha512-M9MqFGZREyeb5fTl6gNHKZLqBQA0TjA1lea+CR48R8EBTDuWrNqW6ccC5QvjNR4s6wDumD3LTCjOFSp9iwlzaw==", "dev": true, + "license": "MIT", "dependencies": { "@ts-morph/common": "~0.23.0", "code-block-writer": "^13.0.1" @@ -29590,6 +24018,8 @@ }, "node_modules/ts-node": { "version": "10.7.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz", + "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==", "dev": true, "license": "MIT", "dependencies": { @@ -29630,27 +24060,23 @@ } } }, - "node_modules/ts-node/node_modules/acorn-walk": { - "version": "8.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/tsconfig-paths": { - "version": "3.14.1", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tsconfig-paths-webpack-plugin": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.1.0.tgz", + "integrity": "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==", "dev": true, "license": "MIT", "dependencies": { @@ -29664,6 +24090,8 @@ }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -29678,6 +24106,8 @@ }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { @@ -29693,6 +24123,8 @@ }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", "engines": { @@ -29701,6 +24133,8 @@ }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { @@ -29712,6 +24146,8 @@ }, "node_modules/tsconfig-paths-webpack-plugin/node_modules/tsconfig-paths": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", "dependencies": { @@ -29725,6 +24161,8 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", "dependencies": { @@ -29736,10 +24174,14 @@ }, "node_modules/tslib": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", "dependencies": { @@ -29754,24 +24196,30 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/tuf-js": { - "version": "1.1.7", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", + "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", "dev": true, "license": "MIT", "dependencies": { - "@tufjs/models": "1.0.4", + "@tufjs/models": "2.0.1", "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" + "make-fetch-happen": "^13.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -29782,11 +24230,13 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -29794,6 +24244,8 @@ }, "node_modules/type-is": { "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "license": "MIT", "dependencies": { @@ -29809,6 +24261,7 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -29823,6 +24276,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -29842,6 +24296,7 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -29862,6 +24317,7 @@ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -29879,20 +24335,17 @@ }, "node_modules/typed-assert": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true, "license": "MIT" }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, "node_modules/typedarray.prototype.slice": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz", "integrity": "sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -29909,7 +24362,9 @@ } }, "node_modules/typescript": { - "version": "5.1.6", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -29921,7 +24376,9 @@ } }, "node_modules/ua-parser-js": { - "version": "0.7.33", + "version": "0.7.39", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.39.tgz", + "integrity": "sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==", "dev": true, "funding": [ { @@ -29931,21 +24388,24 @@ { "type": "paypal", "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" } ], "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, "engines": { "node": "*" } }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", - "dev": true - }, "node_modules/uglify-js": { - "version": "3.15.4", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, "license": "BSD-2-Clause", "optional": true, @@ -29958,6 +24418,8 @@ }, "node_modules/unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "license": "MIT", "dependencies": { @@ -29975,6 +24437,7 @@ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -29985,6 +24448,7 @@ "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -29994,6 +24458,7 @@ "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-2.0.0.tgz", "integrity": "sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==", "dev": true, + "license": "MIT", "dependencies": { "bach": "^2.0.1", "fast-levenshtein": "^3.0.0", @@ -30009,6 +24474,7 @@ "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-2.0.0.tgz", "integrity": "sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.13.0" } @@ -30018,12 +24484,32 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", "dev": true, + "license": "MIT", "dependencies": { "fastest-levenshtein": "^1.0.7" } }, + "node_modules/undici": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" + }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, "license": "MIT", "engines": { @@ -30032,6 +24518,8 @@ }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -30043,7 +24531,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "dev": true, "license": "MIT", "engines": { @@ -30055,6 +24545,7 @@ "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", "dev": true, + "license": "MIT", "dependencies": { "base64-js": "^1.3.0", "unicode-trie": "^2.0.0" @@ -30062,6 +24553,8 @@ }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true, "license": "MIT", "engines": { @@ -30073,59 +24566,62 @@ "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", "dev": true, + "license": "MIT", "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, - "node_modules/unicode-trie/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/unified": { - "version": "10.1.2", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", + "@types/unist": "^3.0.0", "bail": "^2.0.0", + "devlop": "^1.0.0", "extend": "^3.0.0", - "is-buffer": "^2.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", - "vfile": "^5.0.0" + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/unified/node_modules/is-buffer": { - "version": "2.0.5", + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/unique-filename": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, "license": "ISC", "dependencies": { @@ -30137,6 +24633,8 @@ }, "node_modules/unique-slug": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, "license": "ISC", "dependencies": { @@ -30146,33 +24644,28 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/unist-util-is": { - "version": "4.1.0", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dev": true, "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-stringify-position": { - "version": "3.0.3", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", @@ -30180,13 +24673,15 @@ } }, "node_modules/unist-util-visit": { - "version": "2.0.3", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0", - "unist-util-visit-parents": "^3.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, "funding": { "type": "opencollective", @@ -30194,12 +24689,14 @@ } }, "node_modules/unist-util-visit-parents": { - "version": "3.1.1", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^4.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", @@ -30207,7 +24704,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, "license": "MIT", "engines": { @@ -30216,11 +24715,15 @@ }, "node_modules/unix-crypt-td-js": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", + "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/unpipe": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "license": "MIT", "engines": { @@ -30228,23 +24731,25 @@ } }, "node_modules/unplugin": { - "version": "1.4.0", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.14.1.tgz", + "integrity": "sha512-lBlHbfSFPToDYp9pjXlUEFVxYLaue9f9T1HC+4OHlmj+HnMDdz9oZY+erXfoCe/5V/7gKUSY2jpXPb9S7f0f/w==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.9.0", - "chokidar": "^3.5.3", - "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.5.0" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, + "acorn": "^8.12.1", + "webpack-virtual-modules": "^0.6.2" + }, "engines": { - "node": ">=8" + "node": ">=14.0.0" + }, + "peerDependencies": { + "webpack-sources": "^3" + }, + "peerDependenciesMeta": { + "webpack-sources": { + "optional": true + } } }, "node_modules/update-browserslist-db": { @@ -30266,6 +24771,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" @@ -30279,16 +24785,28 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/url": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^1.4.1", "qs": "^6.12.3" @@ -30297,42 +24815,17 @@ "node": ">= 0.4" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, "node_modules/urlpattern-polyfill": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "dev": true - }, - "node_modules/use-resize-observer": { - "version": "9.1.0", "dev": true, - "license": "MIT", - "dependencies": { - "@juggle/resize-observer": "^3.3.1" - }, - "peerDependencies": { - "react": "16.8.0 - 18", - "react-dom": "16.8.0 - 18" - } + "license": "MIT" }, "node_modules/util": { "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, "license": "MIT", "dependencies": { @@ -30345,16 +24838,22 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true, "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, "license": "MIT", "engines": { @@ -30362,48 +24861,23 @@ } }, "node_modules/uuid": { - "version": "8.3.2", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/uvu": { - "version": "0.5.6", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/uvu/node_modules/diff": { - "version": "5.1.0", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/uvu/node_modules/kleur": { - "version": "4.1.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "license": "MIT" }, @@ -30412,12 +24886,15 @@ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.13.0" } }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -30425,13 +24902,23 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "node_modules/validate-npm-package-name": { - "version": "5.0.0", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -30441,12 +24928,15 @@ "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz", "integrity": "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10.13.0" } }, "node_modules/vary": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", "engines": { @@ -30454,14 +24944,14 @@ } }, "node_modules/vfile": { - "version": "5.3.7", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", @@ -30469,45 +24959,26 @@ } }, "node_modules/vfile-message": { - "version": "3.1.4", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dev": true, "license": "MIT", "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/vfile/node_modules/is-buffer": { - "version": "2.0.5", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/vinyl": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", "dev": true, + "license": "MIT", "dependencies": { "clone": "^2.1.2", "clone-stats": "^1.0.0", @@ -30524,6 +24995,7 @@ "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz", "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==", "dev": true, + "license": "MIT", "dependencies": { "bl": "^5.0.0", "vinyl": "^3.0.0" @@ -30537,6 +25009,7 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", "dev": true, + "license": "MIT", "dependencies": { "buffer": "^6.0.3", "inherits": "^2.0.4", @@ -30562,6 +25035,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -30572,6 +25046,7 @@ "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz", "integrity": "sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==", "dev": true, + "license": "MIT", "dependencies": { "fs-mkdirp-stream": "^2.0.1", "glob-stream": "^8.0.0", @@ -30592,23 +25067,12 @@ "node": ">=10.13.0" } }, - "node_modules/vinyl-fs/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/vinyl-sourcemap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz", "integrity": "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==", "dev": true, + "license": "MIT", "dependencies": { "convert-source-map": "^2.0.0", "graceful-fs": "^4.2.10", @@ -30625,13 +25089,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/vinyl/node_modules/clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } @@ -30642,6 +25108,7 @@ "integrity": "sha512-JVS1mywKg5S88XbkDJPfCb3n+vlg5fMA8Ae2hzs3KHAwD4ryM5qwlbFZ6ReDfY8te7I4NLCpuCoywJQEehvJlQ==", "deprecated": "Please consider using https://github.com/visjs", "dev": true, + "license": "(Apache-2.0 OR MIT)", "dependencies": { "emitter-component": "^1.1.1", "hammerjs": "^2.0.8", @@ -30651,32 +25118,33 @@ } }, "node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.6.tgz", + "integrity": "sha512-IeL5f8OO5nylsgzd9tq4qD2QqI0k2CQLGrWD0rCN0EQJZpBK5vJAx0I+GDkMOXxQX/OfFHMuLIx6ddAxGX/k+Q==", "dev": true, "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", + "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" @@ -30694,6 +25162,9 @@ "sass": { "optional": true }, + "sass-embedded": { + "optional": true + }, "stylus": { "optional": true }, @@ -30705,10 +25176,26 @@ } } }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -30722,9 +25209,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -30738,9 +25225,9 @@ } }, "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -30754,9 +25241,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -30770,9 +25257,9 @@ } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -30786,9 +25273,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -30802,9 +25289,9 @@ } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -30818,9 +25305,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -30834,9 +25321,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -30850,9 +25337,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -30866,9 +25353,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -30882,9 +25369,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -30898,9 +25385,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -30914,9 +25401,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -30930,9 +25417,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -30946,9 +25433,9 @@ } }, "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -30962,9 +25449,9 @@ } }, "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -30978,9 +25465,9 @@ } }, "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -30994,9 +25481,9 @@ } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -31010,9 +25497,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -31026,9 +25513,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -31042,9 +25529,9 @@ } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -31058,9 +25545,9 @@ } }, "node_modules/vite/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -31070,73 +25557,82 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, "node_modules/void-elements": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", + "node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } + "license": "ISC" }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -31156,22 +25652,26 @@ }, "node_modules/wcwidth": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "dev": true, - "license": "BSD-2-Clause" + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true }, "node_modules/webpack": { "version": "5.94.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -31214,19 +25714,20 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.3.tgz", - "integrity": "sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz", + "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==", "dev": true, "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.12", + "memfs": "^4.6.0", "mime-types": "^2.1.31", + "on-finished": "^2.4.1", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", @@ -31241,108 +25742,74 @@ } } }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "node_modules/webpack-dev-middleware/node_modules/memfs": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.12.0.tgz", + "integrity": "sha512-74wDsex5tQDSClVkeK1vtxqYCAgCoXxx+K4NSHzgU/muYVYByFqa+0RnrPO9NM6naWm1+G9JmZ0p6QHhXmeYfA==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "@jsonjoy.com/json-pack": "^1.0.3", + "@jsonjoy.com/util": "^1.3.0", + "tree-dump": "^1.0.1", + "tslib": "^2.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 4.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dev": true, - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.0.4.tgz", + "integrity": "sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.13", + "@types/connect-history-api-fallback": "^1.5.4", + "@types/express": "^4.17.21", + "@types/serve-index": "^1.9.4", + "@types/serve-static": "^1.15.5", + "@types/sockjs": "^0.3.36", + "@types/ws": "^8.5.10", "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", + "bonjour-service": "^1.2.1", + "chokidar": "^3.6.0", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", + "html-entities": "^2.4.0", "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", + "ipaddr.js": "^2.1.0", + "launch-editor": "^2.6.1", + "open": "^10.0.3", + "p-retry": "^6.2.0", + "rimraf": "^5.0.5", + "schema-utils": "^4.2.0", + "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" + "webpack-dev-middleware": "^7.1.0", + "ws": "^8.16.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "webpack": { @@ -31350,35 +25817,31 @@ }, "webpack-cli": { "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + } } }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.3" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" }, "peerDependencies": { - "ajv": "^8.8.2" + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { @@ -31390,52 +25853,19 @@ "node": ">= 10" } }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "dev": true, "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" + "glob": "^10.3.7" }, - "engines": { - "node": ">= 12.13.0" + "bin": { + "rimraf": "dist/esm/bin.mjs" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/webpack-hot-middleware": { @@ -31443,6 +25873,7 @@ "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.26.1.tgz", "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-html-community": "0.0.8", "html-entities": "^2.1.0", @@ -31450,19 +25881,24 @@ } }, "node_modules/webpack-merge": { - "version": "5.9.0", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dev": true, "license": "MIT", "dependencies": { "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" + "flat": "^5.0.2", + "wildcard": "^2.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } }, "node_modules/webpack-sources": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, "license": "MIT", "engines": { @@ -31471,6 +25907,8 @@ }, "node_modules/webpack-subresource-integrity": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, "license": "MIT", "dependencies": { @@ -31490,12 +25928,100 @@ } }, "node_modules/webpack-virtual-modules": { - "version": "0.5.0", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -31509,6 +26035,8 @@ }, "node_modules/websocket-extensions": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -31516,31 +26044,32 @@ } }, "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, + "license": "MIT", "dependencies": { - "iconv-lite": "0.4.24" + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" } }, "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "engines": { + "node": ">=18" } }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", "dependencies": { @@ -31555,6 +26084,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "license": "MIT", "dependencies": { @@ -31568,22 +26099,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-collection": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-module": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true, "license": "ISC" }, @@ -31592,6 +26111,7 @@ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -31606,21 +26126,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wildcard": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true, "license": "MIT" }, "node_modules/windows-release": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", "dev": true, "license": "MIT", "dependencies": { @@ -31635,6 +26151,8 @@ }, "node_modules/windows-release/node_modules/execa": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "license": "MIT", "dependencies": { @@ -31657,19 +26175,58 @@ }, "node_modules/windows-release/node_modules/human-signals": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=8.12.0" } }, + "node_modules/windows-release/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi": { - "version": "7.0.0", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", "dependencies": { @@ -31678,15 +26235,14 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { @@ -31703,6 +26259,8 @@ }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -31717,6 +26275,8 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { @@ -31731,26 +26291,17 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/ws": { "version": "8.17.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -31767,54 +26318,30 @@ } } }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, "node_modules/xmlbuilder": { "version": "12.0.0", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-12.0.0.tgz", + "integrity": "sha512-lMo8DJ8u6JRWp0/Y4XLa/atVDr75H9litKlb2E5j3V3MesoL50EBgZDWoLT3F/LztVnG67GjPXLZpqcky/UMnQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6.0" } }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, "node_modules/xmldoc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.3.0.tgz", "integrity": "sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng==", "dev": true, - "dependencies": { - "sax": "^1.2.4" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/xxhashjs": { - "version": "0.2.2", - "dev": true, "license": "MIT", "dependencies": { - "cuint": "^0.2.2" + "sax": "^1.2.4" } }, "node_modules/y18n": { "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { @@ -31822,7 +26349,9 @@ } }, "node_modules/yallist": { - "version": "4.0.0", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, @@ -31831,12 +26360,15 @@ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/yargs": { "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { @@ -31854,27 +26386,18 @@ }, "node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/yauzl": { "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "dev": true, "license": "MIT", "dependencies": { @@ -31884,6 +26407,8 @@ }, "node_modules/yn": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "license": "MIT", "engines": { @@ -31892,6 +26417,8 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", "engines": { @@ -31901,30 +26428,46 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zepto": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/zepto/-/zepto-1.2.0.tgz", "integrity": "sha512-C1x6lfvBICFTQIMgbt3JqMOno3VOtkWat/xEakLTOurskYIHPmzJrzd1e8BnmtdDVJlGuk5D+FxyCA8MPmkIyA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/zod": { "version": "3.23.8", "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zone.js": { - "version": "0.13.1", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - } + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", + "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==", + "license": "MIT" }, "node_modules/zwitch": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "dev": true, "license": "MIT", "funding": { diff --git a/package.json b/package.json index d4b4b6945..0059ec5e8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "oncehub-ui", - "version": "8.0.30", + "version": "8.0.33", "scripts": { "ng": "ng", "build": "ng build ui", @@ -25,52 +25,53 @@ }, "private": true, "dependencies": { - "@angular-devkit/architect": "0.1601.6", - "@angular-devkit/core": "16.1.6", - "@angular/animations": "16.1.7", - "@angular/cdk": "15.2.9", - "@angular/common": "16.1.7", - "@angular/compiler": "16.1.7", - "@angular/core": "16.1.7", - "@angular/forms": "16.1.7", - "@angular/platform-browser": "16.1.7", - "@angular/platform-browser-dynamic": "16.1.7", - "@angular/router": "16.1.7", + "@angular-devkit/architect": "0.1801.0", + "@angular-devkit/core": "18.2.0", + "@angular/animations": "18.2.0", + "@angular/cdk": "18.2.0", + "@angular/common": "18.2.0", + "@angular/compiler": "18.2.0", + "@angular/core": "18.2.0", + "@angular/forms": "18.2.0", + "@angular/platform-browser": "18.2.0", + "@angular/platform-browser-dynamic": "18.2.0", + "@angular/router": "18.2.0", "core-js": "3.26.1", "rxjs": "7.5.7", "tslib": "2.4.1", - "zone.js": "^0.13.1" + "zone.js": "^0.14.7" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.15", - "@angular-eslint/builder": "15.1.0", - "@angular-eslint/eslint-plugin": "15.1.0", - "@angular-eslint/eslint-plugin-template": "15.1.0", - "@angular-eslint/template-parser": "15.1.0", - "@angular/cli": "16.1.6", - "@angular/compiler-cli": "16.1.7", - "@angular/elements": "16.1.7", - "@angular/language-service": "16.1.7", + "@angular-devkit/build-angular": "18.2.5", + "@angular-eslint/builder": "18.2.0", + "@angular-eslint/eslint-plugin": "18.2.0", + "@angular-eslint/eslint-plugin-template": "18.2.0", + "@angular-eslint/template-parser": "18.2.0", + "@angular/cli": "18.2.1", + "@angular/compiler-cli": "18.2.0", + "@angular/elements": "18.2.0", + "@angular/language-service": "18.2.0", "@babel/core": "7.20.5", "@compodoc/compodoc": "^1.1.25", - "@storybook/addon-actions": "7.1.0", - "@storybook/addon-controls": "7.1.0", - "@storybook/addon-essentials": "7.1.0", - "@storybook/addon-links": "7.1.0", - "@storybook/addon-mdx-gfm": "^7.1.0", - "@storybook/angular": "^7.6.7", + "@storybook/addon-actions": "^8.3.1", + "@storybook/addon-controls": "^8.3.1", + "@storybook/addon-essentials": "^8.3.1", + "@storybook/addon-links": "^8.3.1", + "@storybook/addon-mdx-gfm": "^8.3.1", + "@storybook/angular": "^8.3.1", + "@storybook/blocks": "^8.3.1", "@storybook/storybook-deployer": "2.8.16", "@types/jasmine": "4.3.0", "@types/node": "18.11.9", - "@typescript-eslint/eslint-plugin": "5.45.0", - "@typescript-eslint/parser": "5.45.0", + "@typescript-eslint/eslint-plugin": "^8.5.0", + "@typescript-eslint/parser": "^8.5.0", "@webcomponents/custom-elements": "1.5.1", "babel-loader": "9.1.0", - "eslint": "8.28.0", - "eslint-plugin-import": "2.26.0", - "eslint-plugin-jsdoc": "39.6.4", + "eslint": "8.57.0", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-jsdoc": "50.2.2", "eslint-plugin-prefer-arrow": "1.2.3", - "eslint-plugin-storybook": "^0.6.13", + "eslint-plugin-storybook": "^0.8.0", "gulp": "5.0.0", "jasmine-core": "4.1.0", "jasmine-spec-reporter": "7.0.0", @@ -80,7 +81,7 @@ "karma-jasmine": "4.0.1", "karma-jasmine-html-reporter": "1.7.0", "karma-junit-reporter": "2.0.1", - "ng-packagr": "16.1.0", + "ng-packagr": "18.1.0", "prettier": "2.8.0", "puppeteer": "22.11.1", "react": "^18.2.0", @@ -88,8 +89,8 @@ "rimraf": "3.0.2", "sass": "1.50.1", "scss-bundle": "3.1.2", - "storybook": "^7.1.0", + "storybook": "^8.3.1", "ts-node": "10.7.0", - "typescript": "5.1.6" + "typescript": "5.4.5" } } diff --git a/ui/package-lock.json b/ui/package-lock.json index c30966a19..e41cc54cd 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -1,27 +1,21 @@ { "name": "@oncehub/ui", - "version": "8.0.30", - "lockfileVersion": 2, + "version": "8.0.33", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@oncehub/ui", - "version": "8.0.30", + "version": "8.0.33", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } - }, - "dependencies": { - "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" } } } diff --git a/ui/package.json b/ui/package.json index f5293f217..0d23c7ad6 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,6 +1,6 @@ { "name": "@oncehub/ui", - "version": "8.0.30", + "version": "8.0.33", "description": "Oncehub UI", "peerDependencies": {}, "repository": { diff --git a/ui/src/components/button/button.scss b/ui/src/components/button/button.scss index 7405783cc..c6d554106 100644 --- a/ui/src/components/button/button.scss +++ b/ui/src/components/button/button.scss @@ -66,19 +66,21 @@ $green-tick-icon: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0 } /*common properties in all buttons*/ @mixin oui-button-base { - font-size: $font-size; - border-radius: $border-radius; - letter-spacing: $letter-spacing; - padding: $padding; - line-height: $line-height; - min-height: $min-height; - min-width: $min-width; - font-weight: $font-semi-bold; - cursor: $cursor; - border: $border; - background: transparent; - text-decoration: $text-decoration; - text-align: $text-align-center; + & { + font-size: $font-size; + border-radius: $border-radius; + letter-spacing: $letter-spacing; + padding: $padding; + line-height: $line-height; + min-height: $min-height; + min-width: $min-width; + font-weight: $font-semi-bold; + cursor: $cursor; + border: $border; + background: transparent; + text-decoration: $text-decoration; + text-align: $text-align-center; + } &[disabled] { cursor: $disabled-cursor; } diff --git a/ui/src/components/checkbox/checkbox.ts b/ui/src/components/checkbox/checkbox.ts index bc6cc84ec..eb2df3bb8 100644 --- a/ui/src/components/checkbox/checkbox.ts +++ b/ui/src/components/checkbox/checkbox.ts @@ -104,7 +104,7 @@ export class Checkbox * Users can specify the `aria-labelledby` attribute which will be forwarded to the input element */ @Input('aria-labelledby') - ariaLabelledby: any | null = null; + ariaLabelledby: any = null; private _uniqueId: any = `oui-checkbox-${++nextUniqueId}`; diff --git a/ui/src/components/core/option/option.scss b/ui/src/components/core/option/option.scss index 280cee4a1..5c23f823d 100644 --- a/ui/src/components/core/option/option.scss +++ b/ui/src/components/core/option/option.scss @@ -11,7 +11,6 @@ } .oui-option { - @include oui-menu-item-base(); position: relative; cursor: pointer; outline: none; @@ -21,6 +20,7 @@ box-sizing: border-box; align-items: center; -webkit-tap-highlight-color: transparent; + @include oui-menu-item-base(); &[aria-disabled='true'] { @include user-select(none); diff --git a/ui/src/components/core/style/_menu-common.scss b/ui/src/components/core/style/_menu-common.scss index 84b53bca3..ae583cd51 100644 --- a/ui/src/components/core/style/_menu-common.scss +++ b/ui/src/components/core/style/_menu-common.scss @@ -23,7 +23,7 @@ $oui-menu-icon-margin: 16px !default; @include oui-truncate-line(); // Needs to be a block for the ellipsis to work. - display: block; + // display: block; line-height: $oui-menu-item-height; height: $oui-menu-item-height; padding: 0 $oui-menu-side-padding; diff --git a/ui/src/components/datepicker/datepicker.ts b/ui/src/components/datepicker/datepicker.ts index a73ddfaee..32d07ff7f 100644 --- a/ui/src/components/datepicker/datepicker.ts +++ b/ui/src/components/datepicker/datepicker.ts @@ -234,7 +234,11 @@ export class OuiDatepicker implements OnDestroy, CanColor { return this._opened; } set opened(value: boolean) { - value ? this.open() : this.close(); + if (value) { + this.open(); + } else { + this.close(); + } } private _opened = false; @@ -374,7 +378,11 @@ export class OuiDatepicker implements OnDestroy, CanColor { this._focusedElementBeforeOpen = this._document.activeElement; } - this.touchUi ? this._openAsDialog() : this._openAsPopup(); + if (this.touchUi) { + this._openAsDialog(); + } else { + this._openAsPopup(); + } this._opened = true; // add input focus here this._datepickerInput.focus(); diff --git a/ui/src/components/datepicker/native-date-adapter.ts b/ui/src/components/datepicker/native-date-adapter.ts index d8281ef65..3278cc5d9 100644 --- a/ui/src/components/datepicker/native-date-adapter.ts +++ b/ui/src/components/datepicker/native-date-adapter.ts @@ -195,7 +195,7 @@ export class NativeDateAdapter extends DateAdapter { return value ? new Date(Date.parse(value as string)) : null; } - format(date: Date, displayFormat: Object): string { + format(date: Date, displayFormat: object): string { if (!this.isValid(date)) { throw Error('NativeDateAdapter: Cannot format invalid date.'); } diff --git a/ui/src/components/dialog/dialog-ref.ts b/ui/src/components/dialog/dialog-ref.ts index f0dd7a624..a95ccab0b 100644 --- a/ui/src/components/dialog/dialog-ref.ts +++ b/ui/src/components/dialog/dialog-ref.ts @@ -134,17 +134,21 @@ export class OuiDialogRef { const strategy = this._getPositionStrategy(); if (position && (position.left || position.right)) { - position.left - ? strategy.left(position.left) - : strategy.right(position.right); + if (position.left) { + strategy.left(position.left); + } else { + strategy.right(position.right); + } } else { strategy.centerHorizontally(); } if (position && (position.top || position.bottom)) { - position.top - ? strategy.top(position.top) - : strategy.bottom(position.bottom); + if (position.top) { + strategy.top(position.top); + } else { + strategy.bottom(position.bottom); + } } else { strategy.centerVertically(); } diff --git a/ui/src/components/menu/menu-trigger.ts b/ui/src/components/menu/menu-trigger.ts index 73ec7d4de..2cddfcec5 100644 --- a/ui/src/components/menu/menu-trigger.ts +++ b/ui/src/components/menu/menu-trigger.ts @@ -316,7 +316,11 @@ export class OuiMenuTrigger implements AfterContentInit, OnDestroy { // set state rather than toggle to support triggers sharing a menu private _setIsMenuOpen(isOpen: boolean): void { this._menuOpen = isOpen; - this._menuOpen ? this.menuOpened.emit() : this.menuClosed.emit(); + if (this._menuOpen) { + this.menuOpened.emit(); + } else { + this.menuClosed.emit(); + } if (this.triggersSubmenu()) { this._menuItemInstance._highlighted = isOpen; diff --git a/ui/src/components/menu/menu.scss b/ui/src/components/menu/menu.scss index 33b9de834..f9d92a4a9 100644 --- a/ui/src/components/menu/menu.scss +++ b/ui/src/components/menu/menu.scss @@ -24,9 +24,11 @@ $oui-menu-line-height: 22px; /*reset the browser default properties*/ @mixin oui-button-reset { - border: 0 none; - background: none; - font-family: 'Open Sans', Helvetica, Arial, sans-serif; + & { + border: 0 none; + background: none; + font-family: 'Open Sans', Helvetica, Arial, sans-serif; + } &:focus { outline: 0 none; } @@ -65,19 +67,21 @@ $oui-menu-line-height: 22px; @mixin oui-menu-item-base() { //white-space: nowrap; - font-size: 13px; - font-family: 'Open Sans', Helvetica, Arial, sans-serif; - overflow: hidden; - text-overflow: ellipsis; - // Needs to be a block for the ellipsis to work. - display: block; - line-height: $oui-menu-line-height; - padding: 0 $oui-menu-side-padding; - text-align: left; - text-decoration: none; // necessary to reset anchor tags - // Required for Edge not to show scrollbars when setting the width manually. See #12112. - max-width: 100%; - width: 100%; + & { + font-size: 13px; + font-family: 'Open Sans', Helvetica, Arial, sans-serif; + overflow: hidden; + text-overflow: ellipsis; + // Needs to be a block for the ellipsis to work. + display: block; + line-height: $oui-menu-line-height; + padding: 0 $oui-menu-side-padding; + text-align: left; + text-decoration: none; // necessary to reset anchor tags + // Required for Edge not to show scrollbars when setting the width manually. See #12112. + max-width: 100%; + width: 100%; + } &[disabled] { cursor: default; @@ -100,15 +104,17 @@ $oui-menu-line-height: 22px; .oui-menu-item { @include oui-button-reset(); @include oui-menu-item-base(); - position: relative; - padding: 8px 8px; - display: block; - color: #333; - cursor: pointer; - position: relative; - min-width: $oui-menu-overlay-min-width; - max-width: $oui-menu-overlay-max-width; - width: 100%; + & { + position: relative; + padding: 8px 8px; + display: block; + color: #333; + cursor: pointer; + position: relative; + min-width: $oui-menu-overlay-min-width; + max-width: $oui-menu-overlay-max-width; + width: 100%; + } span { display: inline-block; diff --git a/ui/src/components/panel/panel-trigger.ts b/ui/src/components/panel/panel-trigger.ts index 6a9f3e01e..69a78def7 100644 --- a/ui/src/components/panel/panel-trigger.ts +++ b/ui/src/components/panel/panel-trigger.ts @@ -171,7 +171,11 @@ export class OuiPanelTrigger implements OnDestroy { // set state rather than toggle to support triggers sharing a panel private _setIsPanelOpen(isOpen: boolean): void { this._panelOpen = isOpen; - this._panelOpen ? this.panelOpened.emit() : this.panelClosed.emit(); + if (this._panelOpen) { + this.panelOpened.emit(); + } else { + this.panelClosed.emit(); + } } /** diff --git a/ui/src/components/select/select.component.ts b/ui/src/components/select/select.component.ts index 1daa1f6b5..8cf0bcbae 100644 --- a/ui/src/components/select/select.component.ts +++ b/ui/src/components/select/select.component.ts @@ -722,7 +722,11 @@ export class OuiSelect /** Toggles the overlay panel open or closed. */ toggle(): void { - this.panelOpen ? this.close() : this.open(); + if (this.panelOpen) { + this.close(); + } else { + this.open(); + } } /** Opens the overlay panel. */ @@ -848,9 +852,11 @@ export class OuiSelect /** Handles all keydown events on the select. */ _handleKeydown(event: KeyboardEvent): void { if (!this.disabled) { - this.panelOpen - ? this._handleOpenKeydown(event) - : this._handleClosedKeydown(event); + if (this.panelOpen) { + this._handleOpenKeydown(event); + } else { + this._handleClosedKeydown(event); + } } } @@ -874,9 +880,11 @@ export class OuiSelect this.open(); } else if (!this.multiple) { if (keyCode === HOME || keyCode === END) { - keyCode === HOME - ? manager.setFirstItemActive() - : manager.setLastItemActive(); + if (keyCode === HOME) { + manager.setFirstItemActive(); + } else { + manager.setLastItemActive(); + } event.preventDefault(); } else { manager.onKeydown(event); @@ -969,9 +977,11 @@ export class OuiSelect keyCode: number, manager: ActiveDescendantKeyManager ) { - keyCode === HOME - ? manager.setFirstItemActive() - : manager.setLastItemActive(); + if (keyCode === HOME) { + manager.setFirstItemActive(); + } else { + manager.setLastItemActive(); + } } /** Check if search input field is present in select box */ searchCheck() { @@ -1033,7 +1043,11 @@ export class OuiSelect this.options.forEach((option) => { if (!option.disabled) { - hasDeselectedOptions ? option.select() : option.deselect(); + if (hasDeselectedOptions) { + option.select(); + } else { + option.deselect(); + } } }); } @@ -1153,7 +1167,7 @@ export class OuiSelect * Sets the selected option based on a value. If no option can be * found with the designated value, the select trigger is cleared. */ - private _setSelectionByValue(value: any | any[]): void { + private _setSelectionByValue(value: any): void { if (this.multiple && value) { if (!Array.isArray(value)) { throw getOuiSelectNonArrayValueError(); @@ -1267,9 +1281,11 @@ export class OuiSelect this._selectionModel.clear(); this._propagateChanges(option.value); } else { - option.selected - ? this._selectionModel.select(option) - : this._selectionModel.deselect(option); + if (option.selected) { + this._selectionModel.select(option); + } else { + this._selectionModel.deselect(option); + } if (isUserInput) { this._keyManager.setActiveItem(option); diff --git a/ui/src/components/tabs/tab-body.ts b/ui/src/components/tabs/tab-body.ts index 6c0ac9c4f..9e8fde5b8 100644 --- a/ui/src/components/tabs/tab-body.ts +++ b/ui/src/components/tabs/tab-body.ts @@ -248,6 +248,7 @@ export class OuiTabBody implements OnInit, OnDestroy, OnChanges { } /** Whether the provided position state is considered center, regardless of origin. */ + // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents _isCenterPosition(position: OuiTabBodyPositionState | string): boolean { return ( position == 'center' || diff --git a/ui/src/components/tooltip/tooltip.ts b/ui/src/components/tooltip/tooltip.ts index a369a8b4e..979fca582 100644 --- a/ui/src/components/tooltip/tooltip.ts +++ b/ui/src/components/tooltip/tooltip.ts @@ -489,7 +489,11 @@ export class OuiTooltip implements OnDestroy, CanDisable { /** Shows/hides the tooltip */ toggle(): void { - this._isTooltipVisible() ? this.hide() : this.show(); + if (this._isTooltipVisible()) { + this.hide(); + } else { + this.show(); + } } /** Returns true if the tooltip is currently visible to the user */ diff --git a/ui/src/stories/autocomplete/autocomplete.component.ts b/ui/src/stories/autocomplete/autocomplete.component.ts index b257da379..bf10ecff8 100644 --- a/ui/src/stories/autocomplete/autocomplete.component.ts +++ b/ui/src/stories/autocomplete/autocomplete.component.ts @@ -46,6 +46,8 @@ export class OuiAutocompleteStorybook implements OnInit { filteredOptions: Observable; myControl = new UntypedFormControl(); @Input() options: any[]; + @Input() appearance: string; + @Input() autoActiveFirstOption: boolean; @Input() set disabled(value: boolean) { if (value) { @@ -107,6 +109,8 @@ export class OuiAutocompleteStorybook implements OnInit { }) export class OuiAutocompleteGroupStorybook implements OnInit { @Input() stateGroups: StateGroup[]; + @Input() appearance: string; + @Input() autoActiveFirstOption: boolean; @Input() set disabled(value: boolean) { if (value) { diff --git a/ui/src/stories/autocomplete/autocomplete.mdx b/ui/src/stories/autocomplete/autocomplete.mdx new file mode 100644 index 000000000..ed3ae622a --- /dev/null +++ b/ui/src/stories/autocomplete/autocomplete.mdx @@ -0,0 +1,36 @@ +import { Meta, Story, Canvas, Controls } from '@storybook/blocks'; +import { action } from '@storybook/addon-actions'; +import { STATEGROUPS, OPTIONS } from './const'; +import { APPEARANCE } from '../const'; +import { + OuiAutocompleteModule, + OuiFormFieldModule, + OuiInputModule, + OuiAutocomplete, +} from '../../components'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { + OuiAutocompleteStorybook, + OuiAutocompleteGroupStorybook, +} from './autocomplete.component'; +import * as AutocompleteStories from './autocomplete.stories'; + + + +# Autocomplete + +The autocomplete is a normal text input enhanced by a panel of suggested options. See: https://github.com/scheduleonce/once-ui/blob/master/ui/src/components/autocomplete/README.md + +Stackblitz demo link : https://stackblitz.com/edit/oui-autocomplete + +Regular Input field + + + + + +With Group + + + + diff --git a/ui/src/stories/autocomplete/autocomplete.stories.js b/ui/src/stories/autocomplete/autocomplete.stories.js new file mode 100644 index 000000000..2fded1623 --- /dev/null +++ b/ui/src/stories/autocomplete/autocomplete.stories.js @@ -0,0 +1,161 @@ +import { action } from '@storybook/addon-actions'; +import { STATEGROUPS, OPTIONS } from './const'; +import { APPEARANCE } from '../const'; +import { + OuiAutocompleteModule, + OuiFormFieldModule, + OuiInputModule, + OuiAutocomplete, +} from '../../components'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { + OuiAutocompleteStorybook, + OuiAutocompleteGroupStorybook, +} from './autocomplete.component'; + +export default { + title: 'FORM FIELD/Autocomplete', +}; + +export const Regular = { + render: (props) => ({ + moduleMetadata: { + imports: [ + OuiFormFieldModule, + OuiInputModule, + OuiAutocompleteModule, + FormsModule, + ReactiveFormsModule, + ], + schemas: [], + declarations: [OuiAutocompleteStorybook], + }, + + template: ` + `, + + component: OuiAutocompleteStorybook, + + props: { + ...props, + opened: action('opened'), + optionSelected: action('optionSelected'), + }, + }), + + name: 'Regular', + height: '200px', + + parameters: { + docs: { + source: { + code: ` + + + + + + {{ option }} + + `, + }, + }, + }, + + args: { + options: OPTIONS, + appearance: 'standard', + autoActiveFirstOption: false, + }, + + argTypes: { + options: { + control: { + type: 'object', + }, + }, + + appearance: { + options: ['standard', 'underline'], + + control: { + type: 'select', + }, + }, + }, +}; + +export const WithGroup = { + render: (props) => ({ + moduleMetadata: { + imports: [ + OuiFormFieldModule, + OuiInputModule, + OuiAutocompleteModule, + FormsModule, + ReactiveFormsModule, + ], + + schemas: [], + declarations: [OuiAutocompleteGroupStorybook], + }, + + template: ` + `, + + component: OuiAutocompleteGroupStorybook, + + props: { + ...props, + closed: action('closed'), + opened: action('opened'), + optionSelected: action('optionSelected'), + }, + }), + + name: 'With group', + height: '400px', + + parameters: { + docs: { + source: { + code: ` + + + + + + {{ option }} + + `, + }, + }, + + component: OuiAutocompleteGroupStorybook, + }, + + args: { + disabled: false, + appearance: 'standard', + stateGroups: STATEGROUPS, + autoActiveFirstOption: false, + }, + + argTypes: { + appearance: { + options: ['standard', 'underline'], + + control: { + type: 'select', + }, + }, + }, +}; diff --git a/ui/src/stories/autocomplete/autocomplete.stories.mdx b/ui/src/stories/autocomplete/autocomplete.stories.mdx deleted file mode 100644 index c7391b121..000000000 --- a/ui/src/stories/autocomplete/autocomplete.stories.mdx +++ /dev/null @@ -1,141 +0,0 @@ -import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'; -import { action } from '@storybook/addon-actions'; -import { STATEGROUPS, OPTIONS } from './const'; -import { APPEARANCE } from '../const'; -import { - OuiAutocompleteModule, - OuiFormFieldModule, - OuiInputModule, - OuiAutocomplete, -} from '../../components'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { - OuiAutocompleteStorybook, - OuiAutocompleteGroupStorybook, -} from './autocomplete.component'; - - - -# Autocomplete - -The autocomplete is a normal text input enhanced by a panel of suggested options. See: https://github.com/scheduleonce/once-ui/blob/master/ui/src/components/autocomplete/README.md - -Regular Input field - - - - - - - - {{ option }} - - `, - }, - }, - }} - args={{ - options: OPTIONS, - appearance: 'standard', - autoActiveFirstOption: false, - }} - argTypes={{ - options: { - control: { type: 'object' }, - }, - appearance: { - options: ['standard', 'underline'], - control: { type: 'select' }, - }, - }} - > - {(props) => ({ - moduleMetadata: { - imports: [ - OuiFormFieldModule, - OuiInputModule, - OuiAutocompleteModule, - FormsModule, - ReactiveFormsModule, - ], - schemas: [], - declarations: [OuiAutocompleteStorybook], - }, - component: OuiAutocompleteStorybook, - props: { - ...props, - opened: action('opened'), - optionSelected: action('optionSelected'), - }, - })} - - - -With Group - - - - - - - - {{ option }} - - `, - }, - }, - component: OuiAutocompleteGroupStorybook, - }} - args={{ - disabled: false, - appearance: 'standard', - stateGroups: STATEGROUPS, - autoActiveFirstOption: false, - }} - argTypes={{ - appearance: { - options: ['standard', 'underline'], - control: { type: 'select' }, - }, - }} - > - {props => ({ - moduleMetadata: { - imports: [ - OuiFormFieldModule, - OuiInputModule, - OuiAutocompleteModule, - FormsModule, - ReactiveFormsModule, - ], - schemas: [], - declarations: [OuiAutocompleteStorybook], - }, - component: OuiAutocompleteGroupStorybook, - props: { - ...props, - closed: action('closed'), - opened: action('opened'), - optionSelected: action('optionSelected'), - }, - })} - - - -Stackblitz demo link : https://stackblitz.com/edit/oui-autocomplete - - diff --git a/ui/src/stories/button/button.component.ts b/ui/src/stories/button/button.component.ts index 1ed851f5b..56fb84648 100644 --- a/ui/src/stories/button/button.component.ts +++ b/ui/src/stories/button/button.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, Input } from '@angular/core'; import { DomSanitizer } from '@angular/platform-browser'; import { OuiIconRegistry } from '../../components'; @Component({ @@ -15,6 +15,8 @@ import { OuiIconRegistry } from '../../components'; `, }) export class OuiIconButtonStorybook { + @Input() color: string; + @Input() disabled: boolean; constructor( private ouiIconRegistry: OuiIconRegistry, private domSanitizer: DomSanitizer diff --git a/ui/src/stories/button/button.mdx b/ui/src/stories/button/button.mdx new file mode 100644 index 000000000..2b7652815 --- /dev/null +++ b/ui/src/stories/button/button.mdx @@ -0,0 +1,48 @@ +import { Meta, Story, Canvas, Controls } from '@storybook/blocks'; +import { OuiButtonModule, OuiButton, OuiIconModule } from '../../components'; +import { action } from '@storybook/addon-actions'; +import { COLORS, THEME } from '../const'; +import { OuiIconButtonStorybook } from './button.component'; +import * as ButtonStories from './button.stories'; + + + +# Button + +The Once UI buttons are native ``, + + props: { + ...props, + clicked: action('click'), + }, + }), + + name: 'Regular', + + parameters: { + docs: { + source: { + code: ``, + }, + }, + }, + + args: { + theme: THEME[0], + color: COLORS[0], + disabled: false, + text: 'This is a button', + }, + + argTypes: { + theme: { + options: THEME, + + control: { + type: 'select', + }, + }, + + color: { + options: COLORS, + + control: { + type: 'select', + }, + }, + }, +}; + +export const Link = { + render: (props) => ({ + moduleMetadata: { + imports: [OuiButtonModule], + schemas: [], + declarations: [], + }, + + template: ``, + props, + }), + + name: 'Link', + + parameters: { + docs: { + source: { + code: ``, + }, + }, + }, + + args: { + disabled: false, + text: 'This is a button', + }, +}; + +export const Ghost = { + render: (props) => ({ + moduleMetadata: { + imports: [OuiButtonModule], + schemas: [], + declarations: [], + }, + + template: ``, + + props: { + ...props, + clicked: action('click'), + }, + }), + + name: 'Ghost', + + parameters: { + docs: { + source: { + code: ``, + }, + }, + }, + + args: { + theme: THEME[0], + color: COLORS[0], + disabled: false, + text: 'This is a button', + }, + + argTypes: { + theme: { + options: THEME, + + control: { + type: 'select', + }, + }, + + color: { + options: COLORS, + + control: { + type: 'select', + }, + }, + }, +}; + +export const Progress = { + render: (props) => ({ + moduleMetadata: { + imports: [OuiButtonModule], + schemas: [], + declarations: [], + }, + + template: ``, + + props: { + ...props, + clicked: action('click'), + + progressButtonClick: function (progressButton) { + progressButton.setToProgress(); + action('set to progress', progressButton); + + setTimeout(() => { + this.disabled = false; + progressButton.setToDone(); + }, 1000); + }, + }, + }), + + name: 'Progress', + + parameters: { + docs: { + source: { + code: ``, + }, + }, + }, + + args: { + theme: THEME[0], + color: COLORS[0], + disabled: false, + text: 'This is a button', + }, + + argTypes: { + theme: { + options: THEME, + + control: { + type: 'select', + }, + }, + + color: { + options: COLORS, + + control: { + type: 'select', + }, + }, + }, +}; + +export const Icon = { + render: (props) => ({ + moduleMetadata: { + imports: [OuiButtonModule, OuiIconModule], + schemas: [], + declarations: [OuiIconButtonStorybook], + }, + + template: ``, + + props: { + ...props, + clicked: action('click'), + }, + }), + + name: 'Icon', + + parameters: { + docs: { + source: { + code: ``, + }, + }, + }, + + args: { + color: COLORS[0], + icon: 'configuration', + disabled: false, + }, + + argTypes: { + color: { + options: COLORS, + + control: { + type: 'select', + }, + }, + }, +}; diff --git a/ui/src/stories/button/button.stories.mdx b/ui/src/stories/button/button.stories.mdx deleted file mode 100644 index ddde19d97..000000000 --- a/ui/src/stories/button/button.stories.mdx +++ /dev/null @@ -1,230 +0,0 @@ -import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'; -import { OuiButtonModule, OuiButton, OuiIconModule } from '../../components'; -import { action } from '@storybook/addon-actions'; -import { COLORS, THEME } from '../const'; -import { OuiIconButtonStorybook } from './button.component'; - - - -# Button - -The Once UI buttons are native `` }, - }, - }} - args={{ - theme: THEME[0], - color: COLORS[0], - disabled: false, - text: 'This is a button', - }} - argTypes={{ - theme: { - options: THEME, - control: { type: 'select' }, - }, - color: { - options: COLORS, - control: { type: 'select' }, - }, - }} - > - {(props) => ({ - moduleMetadata: { - imports: [OuiButtonModule], - schemas: [], - declarations: [], - }, - template: ``, - props: { ...props, clicked: action('click') }, - })} - - - -Link button: - - - Primary`, - }, - }, - }} - args={{ - disabled: false, - text: 'This is a button', - }} - > - {(props) => ({ - moduleMetadata: { - imports: [OuiButtonModule], - schemas: [], - declarations: [], - }, - template: ``, - props, - })} - - - -Ghost button: - - - Primary`, - }, - }, - }} - args={{ - theme: THEME[0], - color: COLORS[0], - disabled: false, - text: 'This is a button', - }} - argTypes={{ - theme: { - options: THEME, - control: { type: 'select' }, - }, - color: { - options: COLORS, - control: { type: 'select' }, - }, - }} - > - {(props) => ({ - moduleMetadata: { - imports: [OuiButtonModule], - schemas: [], - declarations: [], - }, - template: ``, - props: { - ...props, - clicked: action('click'), - }, - })} - - - -Progress button: - - - `, - }, - }, - }} - args={{ - theme: THEME[0], - color: COLORS[0], - disabled: false, - text: 'This is a button', - }} - argTypes={{ - theme: { - options: THEME, - control: { type: 'select' }, - }, - color: { - options: COLORS, - control: { type: 'select' }, - }, - }} - > - {(props) => ({ - moduleMetadata: { - imports: [OuiButtonModule], - schemas: [], - declarations: [], - }, - template: ``, - props: { - ...props, - clicked: action('click'), - progressButtonClick: function (progressButton) { - progressButton.setToProgress(); - action('set to progress', progressButton); - setTimeout(() => { - this.disabled = false; - progressButton.setToDone(); - }, 1000); - }, - }, - })} - - - -Icon button: - - - `, - }, - }, - }} - args={{ - color: COLORS[0], - icon: 'configuration', - }} - argTypes={{ - color: { - options: COLORS, - control: { type: 'select' }, - }, - }} - > - {props => ({ - moduleMetadata: { - imports: [OuiButtonModule, OuiIconModule], - schemas: [], - declarations: [OuiIconButtonStorybook], - }, - template: ``, - props: { - ...props, - clicked: action('click'), - }, - })} - - - -Stackblitz demo link : https://stackblitz.com/edit/oui-button - - diff --git a/ui/src/stories/checkbox/checkbox.mdx b/ui/src/stories/checkbox/checkbox.mdx new file mode 100644 index 000000000..9bd25cf21 --- /dev/null +++ b/ui/src/stories/checkbox/checkbox.mdx @@ -0,0 +1,17 @@ +import { Meta, Story, Canvas, Controls } from '@storybook/blocks'; +import { OuiCheckboxModule } from '../../components'; +import { action } from '@storybook/addon-actions'; +import { LABELPOSITION, COLORS } from '../const'; +import * as CheckboxStories from './checkbox.stories'; + + + +# Checkbox + +Supports all of the functionality of an HTML5 checkbox, and exposes a similar API. A MatCheckbox can be either checked, unchecked, or disabled. Note that all additional accessibility attributes are taken care of by the component, so there is no need to provide them yourself. However, if you want to omit a label and still have the checkbox be accessible, you may supply an \[aria-label] input. See: https://github.com/scheduleonce/once-ui/tree/master/ui/src/components/checkbox/README.md + +Stackblitz demo link : https://stackblitz.com/edit/oui-checkbox + + + + diff --git a/ui/src/stories/checkbox/checkbox.stories.js b/ui/src/stories/checkbox/checkbox.stories.js new file mode 100644 index 000000000..f639dd160 --- /dev/null +++ b/ui/src/stories/checkbox/checkbox.stories.js @@ -0,0 +1,66 @@ +import { OuiCheckboxModule } from '../../components'; +import { action } from '@storybook/addon-actions'; +import { LABELPOSITION, COLORS } from '../const'; + +export default { + title: 'Checkbox', +}; + +export const Regular = { + render: (props) => ({ + moduleMetadata: { + imports: [OuiCheckboxModule], + schemas: [], + declarations: [], + }, + + template: ` + I'm a checkbox + `, + + props: { + ...props, + changed: action('click'), + }, + }), + + name: 'regular', + + parameters: { + docs: { + source: { + code: `I'm a checkbox`, + }, + }, + }, + + args: { + color: COLORS[0], + labelPosition: LABELPOSITION[1], + disabled: false, + checked: false, + }, + + argTypes: { + color: { + options: COLORS, + + control: { + type: 'select', + }, + }, + + labelPosition: { + options: LABELPOSITION, + + control: { + type: 'select', + }, + }, + }, +}; diff --git a/ui/src/stories/checkbox/checkbox.stories.mdx b/ui/src/stories/checkbox/checkbox.stories.mdx deleted file mode 100644 index a1e0d9c53..000000000 --- a/ui/src/stories/checkbox/checkbox.stories.mdx +++ /dev/null @@ -1,64 +0,0 @@ -import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'; -import { OuiCheckboxModule } from '../../components'; -import { action } from '@storybook/addon-actions'; -import { LABELPOSITION, COLORS } from '../const'; - - - -# Checkbox - -Supports all of the functionality of an HTML5 checkbox, and exposes a similar API. A MatCheckbox can be either checked, unchecked, or disabled. Note that all additional accessibility attributes are taken care of by the component, so there is no need to provide them yourself. However, if you want to omit a label and still have the checkbox be accessible, you may supply an [aria-label] input. See: https://github.com/scheduleonce/once-ui/tree/master/ui/src/components/checkbox/README.md - - - I'm a checkbox`, - }, - }, - }} - args={{ - color: COLORS[0], - labelPosition: LABELPOSITION[1], - disabled: false, - checked: false, - }} - argTypes={{ - color: { - options: COLORS, - control: { type: 'select' }, - }, - labelPosition: { - options: LABELPOSITION, - control: { type: 'select' }, - }, - }} - > - {(props) => ({ - moduleMetadata: { - imports: [OuiCheckboxModule], - schemas: [], - declarations: [], - }, - template: ` - I'm a checkbox - `, - props: { - ...props, - changed: action('click'), - }, - })} - - - -Stackblitz demo link : https://stackblitz.com/edit/oui-checkbox - - diff --git a/ui/src/stories/datepicker/datepicker.mdx b/ui/src/stories/datepicker/datepicker.mdx new file mode 100644 index 000000000..89fadb273 --- /dev/null +++ b/ui/src/stories/datepicker/datepicker.mdx @@ -0,0 +1,39 @@ +import { Meta, Story, Canvas, Controls } from '@storybook/blocks'; +import { action } from '@storybook/addon-actions'; +import { COLORS, APPEARANCE } from '../const'; +import { OuiDatepickerModule } from '../../components/datepicker'; +import { OuiFormFieldModule, OuiInputModule } from '../../components'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { + OuiDaterangepickerStorybook, + OuiDatepickerStorybook, + OuiDatepickerCustomStorybook, +} from './datepicker.component'; +import * as datepickerStories from './index.stories.ts'; + + + +# Datepicker + +The datepicker allows users to enter a date either through text input, or by choosing a date from the calendar. It is made up of several components and directives that work together. +See: https://github.com/scheduleonce/once-ui/blob/master/ui/src/components/datepicker/README.md + +Stackblitz demo link: https://stackblitz.com/edit/oui-datepicker + +Regular Datepicker + + + + + +Custom Format + + + + + +Daterange Picker + + + + diff --git a/ui/src/stories/dialog/dialog.mdx b/ui/src/stories/dialog/dialog.mdx new file mode 100644 index 000000000..bb2d3f6b8 --- /dev/null +++ b/ui/src/stories/dialog/dialog.mdx @@ -0,0 +1,18 @@ +import { Meta, Story, Canvas, Controls } from '@storybook/blocks'; +import { OuiButtonModule, OuiDialog, OuiDialogModule } from '../../components'; +import { action } from '@storybook/addon-actions'; +import { THEME } from '../const'; +import { OuiDialogStorybook } from './dialog.component'; +import * as DialogStories from './dialog.stories'; + + + +# Dialog + +Service to open Once UI Design modal dialogs. See: https://github.com/scheduleonce/once-ui/blob/master/ui/src/components/dialog/README.md + +Stackblitz demo link : https://stackblitz.com/edit/oui-dialog + + + + diff --git a/ui/src/stories/dialog/dialog.stories.js b/ui/src/stories/dialog/dialog.stories.js new file mode 100644 index 000000000..b96eb24cb --- /dev/null +++ b/ui/src/stories/dialog/dialog.stories.js @@ -0,0 +1,52 @@ +import { OuiButtonModule, OuiDialog, OuiDialogModule } from '../../components'; +import { action } from '@storybook/addon-actions'; +import { THEME } from '../const'; +import { OuiDialogStorybook } from './dialog.component'; + +export default { + title: 'Dialog', +}; + +export const Regular = { + render: (props) => ({ + moduleMetadata: { + imports: [OuiButtonModule, OuiDialogModule], + schemas: [], + declarations: [OuiDialogStorybook], + }, + + template: ``, + + props: { + ...props, + close: action('closed'), + click: action('clicked'), + }, + }), + + name: 'regular', + height: '300px', + + parameters: { + docs: { + source: { + code: ``, + }, + }, + }, + + args: { + theme: THEME[0], + disabled: false, + }, + + argTypes: { + theme: { + options: THEME, + + control: { + type: 'select', + }, + }, + }, +}; diff --git a/ui/src/stories/dialog/dialog.stories.mdx b/ui/src/stories/dialog/dialog.stories.mdx deleted file mode 100644 index 1f5c46496..000000000 --- a/ui/src/stories/dialog/dialog.stories.mdx +++ /dev/null @@ -1,53 +0,0 @@ -import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'; -import { OuiButtonModule, OuiDialog, OuiDialogModule } from '../../components'; -import { action } from '@storybook/addon-actions'; -import { THEME } from '../const'; -import { OuiDialogStorybook } from './dialog.component'; - - - -# Dialog - -Service to open Once UI Design modal dialogs. See: https://github.com/scheduleonce/once-ui/blob/master/ui/src/components/dialog/README.md - - - Open`, - }, - }, - }} - args={{ - theme: THEME[0], - disabled: false, - }} - argTypes={{ - theme: { - options: THEME, - control: { type: 'select' }, - }, - }} - > - {props => ({ - moduleMetadata: { - imports: [OuiButtonModule, OuiDialogModule], - schemas: [], - declarations: [OuiDialogStorybook], - }, - template: ``, - props: { - ...props, - close: action('closed'), - click: action('clicked'), - }, - })} - - - -Stackblitz demo link : https://stackblitz.com/edit/oui-dialog - - diff --git a/ui/src/stories/form-field/form-field.mdx b/ui/src/stories/form-field/form-field.mdx new file mode 100644 index 000000000..ac58cafd8 --- /dev/null +++ b/ui/src/stories/form-field/form-field.mdx @@ -0,0 +1,20 @@ +import { Meta, Story, Canvas, Controls } from '@storybook/blocks'; +import { OuiFormFieldModule, FormFieldModule } from '../../components'; +import { OuiInputModule, OuiFormField } from '../../components'; +import { action } from '@storybook/addon-actions'; +import { APPEARANCE, THEME } from '../const'; +import * as FormFieldStories from './form-field.stories'; + + + +# Input + +`ouiInput` is a directive that allows native `` and ` `, + + props: { + ...props, + focused: action('focus'), + blured: action('blur'), + }, + }), + + name: 'Regular', + + parameters: { + docs: { + source: { + code: ` + +`, + }, + }, + }, + + args: { + rows: 2, + theme: THEME[0], + disabled: false, + placeholder: 'Type here', + }, + + argTypes: { + theme: { + options: THEME, + + control: { + type: 'select', + }, + }, + }, +}; diff --git a/ui/src/stories/textarea/textarea.stories.mdx b/ui/src/stories/textarea/textarea.stories.mdx deleted file mode 100644 index 98ca71c22..000000000 --- a/ui/src/stories/textarea/textarea.stories.mdx +++ /dev/null @@ -1,61 +0,0 @@ -import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'; -import { - OuiFormFieldModule, - OuiInputModule, - OuiFormField, -} from '../../components'; -import { action } from '@storybook/addon-actions'; -import { THEME } from '../const'; - - - -# Textarea - -`ouiInput` is a directive that allows native `` and ` `, - props: { - ...props, - focused: action('focus'), - blured: action('blur'), - }, - })} - - - -Stackblitz demo link : https://stackblitz.com/edit/oui-textarea - - diff --git a/ui/src/stories/tooltip/tooltip.component.ts b/ui/src/stories/tooltip/tooltip.component.ts index 2ce98fc1e..9c16e7377 100644 --- a/ui/src/stories/tooltip/tooltip.component.ts +++ b/ui/src/stories/tooltip/tooltip.component.ts @@ -31,7 +31,7 @@ export class OuiTooltipStorybook { this.ouiIconRegistry.addSvgIconSet( this.domSanitizer.bypassSecurityTrustResourceUrl( - 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?81ot1f' + 'https://cdn.icomoon.io/135790/oncehub-20/symbol-defs.svg?dfx71h' ) ); } diff --git a/ui/src/stories/tooltip/tooltip.mdx b/ui/src/stories/tooltip/tooltip.mdx new file mode 100644 index 000000000..d4d3f49b6 --- /dev/null +++ b/ui/src/stories/tooltip/tooltip.mdx @@ -0,0 +1,23 @@ +import { Meta, Story, Canvas, Controls } from '@storybook/blocks'; +import { + OuiTooltipModule, + OuiIconModule, + OuiFormField, +} from '../../components'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { action } from '@storybook/addon-actions'; +import { TOOLTIPPOSITION, THEME } from '../const'; +import { OuiTooltipStorybook } from './tooltip.component'; +import * as TooltipStories from './tooltip.stories.ts'; + + + +# Tooltip + +The `oui-tooltip` provides a text label that is displayed when the user hovers over an element. See: https://github.com/scheduleonce/once-ui/blob/master/ui/src/components/tooltip/README.md + +Stackblitz demo link : https://stackblitz.com/edit/oui-tooltip + + + + diff --git a/ui/src/stories/tooltip/tooltip.stories.mdx b/ui/src/stories/tooltip/tooltip.stories.mdx deleted file mode 100644 index 549a3cbe1..000000000 --- a/ui/src/stories/tooltip/tooltip.stories.mdx +++ /dev/null @@ -1,64 +0,0 @@ -import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs'; -import { - OuiTooltipModule, - OuiIconModule, - OuiFormField, -} from '../../components'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { action } from '@storybook/addon-actions'; -import { TOOLTIPPOSITION, THEME } from '../const'; -import { OuiTooltipStorybook } from './tooltip.component'; - - - -# Tooltip - -The `oui-tooltip` provides a text label that is displayed when the user hovers over an element. See: https://github.com/scheduleonce/once-ui/blob/master/ui/src/components/tooltip/README.md - - - `, - }, - }, - }} - args={{ - theme: THEME[0], - disabled: false, - ouiTooltip: 'This is a tooltip', - ouiTooltipPosition: TOOLTIPPOSITION[0], - }} - argTypes={{ - theme: { - options: THEME, - control: { type: 'select' }, - }, - ouiTooltipPosition: { - options: TOOLTIPPOSITION, - control: { type: 'select' }, - }, - }} - > - {props => ({ - moduleMetadata: { - imports: [OuiTooltipModule, OuiIconModule, BrowserAnimationsModule], - schemas: [], - declarations: [OuiTooltipStorybook], - }, - template: ``, - props: { - ...props, - changed: action('change'), - }, - })} - - - -Stackblitz demo link : https://stackblitz.com/edit/oui-tooltip - - diff --git a/ui/src/stories/tooltip/tooltip.stories.ts b/ui/src/stories/tooltip/tooltip.stories.ts new file mode 100644 index 000000000..5223e6dfb --- /dev/null +++ b/ui/src/stories/tooltip/tooltip.stories.ts @@ -0,0 +1,63 @@ +import { OuiTooltipModule, OuiIconModule } from '../../components'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { action } from '@storybook/addon-actions'; +import { TOOLTIPPOSITION, THEME } from '../const'; +import { OuiTooltipStorybook } from './tooltip.component'; + +export default { + title: 'Tooltip', +}; + +export const Regular = { + render: (props) => ({ + moduleMetadata: { + imports: [OuiTooltipModule, OuiIconModule, BrowserAnimationsModule], + schemas: [], + declarations: [OuiTooltipStorybook], + }, + + template: ``, + + props: { + ...props, + changed: action('change'), + }, + }), + + name: 'Regular', + + parameters: { + docs: { + source: { + code: ``, + }, + }, + }, + + args: { + theme: THEME[0], + disabled: false, + ouiTooltip: 'This is a tooltip', + ouiTooltipPosition: TOOLTIPPOSITION[0], + }, + + argTypes: { + theme: { + options: THEME, + + control: { + type: 'select', + }, + }, + + ouiTooltipPosition: { + options: TOOLTIPPOSITION, + + control: { + type: 'select', + }, + }, + }, +};