diff --git a/.changeset/pf-alert.md b/.changeset/pf-alert.md new file mode 100644 index 0000000000..72ae8cc2d1 --- /dev/null +++ b/.changeset/pf-alert.md @@ -0,0 +1,14 @@ + +--- +"@patternfly/elements": minor +--- + +:sparkles: Added `` + +An alert is a banner used to notify a user about a change in status or communicate other information. It can be created programmatically or declared in markup. + +```html + +

Success alert title

+
+``` \ No newline at end of file diff --git a/elements/package.json b/elements/package.json index 94dadf7fc8..c52fdefa33 100644 --- a/elements/package.json +++ b/elements/package.json @@ -15,6 +15,7 @@ "./pf-accordion/pf-accordion-header.js": "./pf-accordion/pf-accordion-header.js", "./pf-accordion/pf-accordion-panel.js": "./pf-accordion/pf-accordion-panel.js", "./pf-accordion/pf-accordion.js": "./pf-accordion/pf-accordion.js", + "./pf-alert/pf-alert.js": "./pf-alert/pf-alert.js", "./pf-avatar/pf-avatar.js": "./pf-avatar/pf-avatar.js", "./pf-back-to-top/pf-back-to-top.js": "./pf-back-to-top/pf-back-to-top.js", "./pf-background-image/pf-background-image.js": "./pf-background-image/pf-background-image.js", @@ -26,6 +27,7 @@ "./pf-chip/pf-chip-group.js": "./pf-chip/pf-chip-group.js", "./pf-clipboard-copy/pf-clipboard-copy.js": "./pf-clipboard-copy/pf-clipboard-copy.js", "./pf-code-block/pf-code-block.js": "./pf-code-block/pf-code-block.js", + "./pf-description-list/pf-description-list.js": "./pf-description-list/pf-description-list.js", "./pf-dropdown/context.js": "./pf-dropdown/context.js", "./pf-dropdown/pf-dropdown-group.js": "./pf-dropdown/pf-dropdown-group.js", "./pf-dropdown/pf-dropdown-item.js": "./pf-dropdown/pf-dropdown-item.js", diff --git a/elements/pf-alert/README.md b/elements/pf-alert/README.md new file mode 100644 index 0000000000..4598c317d0 --- /dev/null +++ b/elements/pf-alert/README.md @@ -0,0 +1,78 @@ +# pf-alert + +The `pf-alert` web component displays PatternFly-styled alerts. It can be used inline in pages or as a toast notification. Alerts support several visual states (for example: `info`, `success`, `warning`, `danger`), an optional header slot, body content, and an `actions` slot for interactive controls. + +## Installation + +Import the element in your page or application as an ES module: + +```html + +``` + +## Basic usage + +Inline alert example: + +```html + +

Success

+ The operation completed successfully. +
+ Details +
+
+``` + +Toast usage (static helper): + +```html + +``` + +## API + +### Attributes / Properties +- `state` (string) — Visual state of the alert. Common values: `neutral`, `info`, `success`, `warning`, `danger`, `custom`, `cogear`. Default: `neutral`. +- `variant` (string) — Visual variant: `inline`, `toast`, or `alternate`. +- `dismissable` (boolean) — When true, a close control is shown and the alert will emit a close event when dismissed. + +> See `elements/pf-alert/pf-alert.ts` for exact property types, defaults, and any additional options. + +### Slots +- `header` — Slot for the heading (typically an `

`). +- default (unnamed) — Main body/content of the alert. +- `actions` — Buttons or links for user actions (e.g. ``). + +### Events +- `close` (AlertCloseEvent) — Fired when the alert is closed (either via UI or programmatically). The event contains the action (e.g. `'close'`, `'dismiss'`, or `'confirm'`). Check the component source for exact payload. + +### Methods +- `static toast(options)` — Static helper to show a toast notification. Options typically include `message`, `heading`, `state`, `persistent`, and `actions`. + +## Styling + +The component exposes CSS parts and custom properties for styling. Typical part(s): `::part(container)` for the main container. See the component stylesheet (`pf-alert.css`) for a list of CSS custom properties (colors, spacing, durations) you can override. + +## Accessibility + +- Toasts use `role="status"` and `aria-live="polite"` to announce messages to assistive technologies. Inline alerts should be used in-context with appropriate semantic markup. + +## Notes & tips + +- Use the `actions` slot to add interactive elements and listen for their events on the page. +- For persistent toasts set the `persistent` option when calling `PfAlert.toast(...)`. +- If you need the exact event names/shape or CSS variables, I can extract and add them from the component source. + +--- +If you want, I can also: +- Add a short section listing every CSS custom property the component exposes. +- Add a copyable example showing how to listen for the alert `close` event. +- Add a brief section demonstrating integration in React or Angular. diff --git a/elements/pf-alert/demo/Custom-icon.html b/elements/pf-alert/demo/Custom-icon.html new file mode 100644 index 0000000000..1acd8635df --- /dev/null +++ b/elements/pf-alert/demo/Custom-icon.html @@ -0,0 +1,38 @@ +
+
+ +

Success alert title

+
+ +

Success alert title

+
+
+
+ + + \ No newline at end of file diff --git a/elements/pf-alert/demo/Expandable.html b/elements/pf-alert/demo/Expandable.html new file mode 100644 index 0000000000..e72830e183 --- /dev/null +++ b/elements/pf-alert/demo/Expandable.html @@ -0,0 +1,50 @@ +
+
+ +

Success alert title

+ View details + lgnore +
+ + +

Success alert title (expanded)

+

Success alert description. This should tell the user more information about the alert.

+ View details + lgnore +
+ + +

Success alert title

+ View details + lgnore +
+ + +

Success alert title (expanded)

+

Success alert description. This should tell the user more information about the alert.

+ View details + lgnore +
+
+
+ + + \ No newline at end of file diff --git a/elements/pf-alert/demo/Inline-Variations.html b/elements/pf-alert/demo/Inline-Variations.html new file mode 100644 index 0000000000..17feba8bdb --- /dev/null +++ b/elements/pf-alert/demo/Inline-Variations.html @@ -0,0 +1,51 @@ +
+
+ +

Success alert title

+

Success alert description. This should tell the user more information about the alert.

+ View details + lgnore +
+ + +

Success alert title

+

Success alert description. This should tell the user more information about the alert. + This is + a link. +

+
+ + +

Success alert title

+ View details + lgnore +
+ + +

Success alert title

+
+
+
+ + + + \ No newline at end of file diff --git a/elements/pf-alert/demo/Inline-plain.html b/elements/pf-alert/demo/Inline-plain.html new file mode 100644 index 0000000000..0750f81620 --- /dev/null +++ b/elements/pf-alert/demo/Inline-plain.html @@ -0,0 +1,30 @@ +
+
+ +

Success alert title

+
+
+
+ + + + + + diff --git a/elements/pf-alert/demo/Types.html b/elements/pf-alert/demo/Types.html new file mode 100644 index 0000000000..5f49983fdc --- /dev/null +++ b/elements/pf-alert/demo/Types.html @@ -0,0 +1,46 @@ +
+ +
+ +

Default alert title

+
+ + +

Info alert title

+
+ + +

Success alert title

+
+ + +

Warning alert title

+
+ + +

Danger alert title

+
+
+
+ + + + + + \ No newline at end of file diff --git a/elements/pf-alert/demo/Variations.html b/elements/pf-alert/demo/Variations.html new file mode 100644 index 0000000000..02cd66e7fc --- /dev/null +++ b/elements/pf-alert/demo/Variations.html @@ -0,0 +1,71 @@ +
+ +
+ +

Success alert title

+

Success alert description. This should tell the user more information about the alert.

+ View details + lgnore +
+ + +

Success alert title

+

Success alert description. This should tell the user more information about the alert. This is a link.

+
+ + +

Success alert title

+ View details + lgnore +
+ + +

Success alert title

+
+ + +

Success alert title

+
+ + + +

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur pellentesque neque cursus + enim + fringilla...

+

This example uses ".pf-m-truncate" to limit the title to a single line and truncate any overflow text with + ellipses.

+
+ + + +

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur pellentesque neque cursus + enim + fringilla tincidunt. Proin lobortis aliquam dictum. Nam vel ullamcorper nulla, nec blandit dolor. Vivamus + pellentesque...

+

This example uses ".pf-m-truncate" and sets "--pf-c-alert__title--max-lines: 2" to limit title to two lines and + truncate any overflow text with ellipses.

+
+
+
+ + + + + \ No newline at end of file diff --git a/elements/pf-alert/demo/index.html b/elements/pf-alert/demo/index.html new file mode 100644 index 0000000000..107fd4d007 --- /dev/null +++ b/elements/pf-alert/demo/index.html @@ -0,0 +1,5 @@ + + diff --git a/elements/pf-alert/demo/inline-types.html b/elements/pf-alert/demo/inline-types.html new file mode 100644 index 0000000000..21f9136ec1 --- /dev/null +++ b/elements/pf-alert/demo/inline-types.html @@ -0,0 +1,43 @@ + +
+
+ +

Custom inline alert title

+
+ + +

Info inline alert title

+
+ + +

Success inline alert title

+
+ + +

Warning inline alert title

+
+ + +

Danger inline alert title

+
+
+
+ + + + + \ No newline at end of file diff --git a/elements/pf-alert/docs/docs/docs/rh-element-name/test/pf-alert.md b/elements/pf-alert/docs/docs/docs/rh-element-name/test/pf-alert.md new file mode 100644 index 0000000000..61f5ec0add --- /dev/null +++ b/elements/pf-alert/docs/docs/docs/rh-element-name/test/pf-alert.md @@ -0,0 +1,17 @@ +{% renderOverview %} + +{% endrenderOverview %} + +{% band header="Usage" %}{% endband %} + +{% renderSlots %}{% endrenderSlots %} + +{% renderAttributes %}{% endrenderAttributes %} + +{% renderMethods %}{% endrenderMethods %} + +{% renderEvents %}{% endrenderEvents %} + +{% renderCssCustomProperties %}{% endrenderCssCustomProperties %} + +{% renderCssParts %}{% endrenderCssParts %} diff --git a/elements/pf-alert/pf-alert.css b/elements/pf-alert/pf-alert.css new file mode 100644 index 0000000000..b16e45b9fe --- /dev/null +++ b/elements/pf-alert/pf-alert.css @@ -0,0 +1,149 @@ + +header { + display: flex; + align-items: center; + justify-content: flex-start; +} + +#left-column pf-icon#icon { + margin-right: 0.5rem; +} + + + +#container { + align-items: flex-start; + background-color: var(--_background-color); + border-width: var(--pf-global--BorderWidth--md); + border-style: solid; + border-color: var(--_border-color, var(--pf-global--default-color--200)); + border-inline-start-color: transparent; + border-block-end-color: transparent; + border-inline-end-color: transparent; + margin-bottom: 1.5rem; + padding: var(--pf-global--spacer--md); + display: grid; + grid-template-columns: max-content 1fr max-content; + grid-template-areas: + "icon title action" + ". description description" + ". actiongroup actiongroup"; + gap: var(--pf-global--spacer--xs); + font-family: var(--pf-global--FontFamily--text, RedHatText, 'Red Hat Text', Helvetica, Arial, sans-serif); + font-size: var(--pf-global--FontSize--sm); + line-height: var(--pf-global--lineHeight--md); + max-width: var(--pf-c-alert--MaxWidth, initial); + box-shadow: var(--_box-shadow); + + & header ::slotted(*) { + font-family: var(--pf-global--FontFamily--text, RedHatText, 'Red Hat Text', Helvetica, Arial, sans-serif) !important; + font-size: var(--pf-global--FontSize--sm) !important; + line-height: var(--pf-global--lineHeight--md) !important; + margin: 0 !important; + } + +} + +#container.info { + --_border-color: var(--pf-global--palette--purple-500, + #2b9af3); + --_icon-color: var(--pf-global--palette--purple-500, + #2b9af3); + --title--Color: var(--pf-global--palette--purple-500, + #002952); + --_background-color: var(--pf-global--palette--purple-50, + #e7f1fa); +} + +#container.cogear { + --_border-color: var(--pf-global--success-color--100, + #3e8635); + --_icon-color: var(--pf-global--success-color--100, + #3e8635); + --title--Color: var(--pf-global--palette--purple-500, + #1e4f18); + --_background-color: var(--pf-global--palette--green-50, + #f3faf2); +} + +#container.success { + --_border-color: var(--pf-global--success-color--100, + #3e8635); + --_icon-color: var(--pf-global--success-color--100, + #3e8635); + --title--Color: var(--pf-global--palette--purple-500, + #1e4f18); + --_background-color: var(--pf-global--palette--green-50, + #f3faf2); +} + +#container.warning { + --_border-color: var(--pf-global--warning-color--100, + #f0ab00); + --_icon-color: var(--pf-global--warning-color--100, + #f0ab00); + --title--Color: var(--pf-global--palette--purple-500, + #795600); + --_background-color: var(--pf-global--palette--gold-50, + #fdf7e7); +} + +#container.custom { + --_background-color: var(--pf-global--BackgroundColor--100, + #f2f9f9); + --_border-color: var(--pf-global--BorderColor--100, + #009596); + --_icon-color: var(--pf-global--icon--Color--light, + #009596); + --title--Color: var(--pf-global--palette--gold-50, + #003737); + +} + +#container.danger { + --_border-color: var(--pf-global--danger-color--200, + #c9190b); + --_icon-color: var(--pf-global--danger-color--200, + #c9190b); + --title--Color: var(--pf-global--palette--purple-500, + #a30000); + --_background-color: var(--pf-global--palette--red-50, + #faeae8); +} +#container header ::slotted(h3) { + font-weight: bold; + color: var(--title--Color); +} + + + +#header { + flex: 1 1 auto; +} + +#icon { + --pf-icon--size: 18px; + display: flex; + align-items: center; + justify-content: center; + color: var(--_icon-color); +} + +#left-column pf-icon#arrow-icon, +#header-actions pf-icon#close-button { + --pf-icon--size: 16px; + --pf-c-icon--Color: #6a6e73; + color: #6a6e73; + cursor: pointer; + transition: color 0.2s ease, --pf-c-icon--Color 0.2s ease; +} + +#left-column pf-icon#arrow-icon:hover, +#left-column pf-icon#arrow-icon:active, +#left-column pf-icon#arrow-icon.active, +#header-actions pf-icon#close-button:hover, +#header-actions pf-icon#close-button:active, +#header-actions pf-icon#close-button.active { + --pf-c-icon--Color: #000000; + color: #000000; +} \ No newline at end of file diff --git a/elements/pf-alert/pf-alert.ts b/elements/pf-alert/pf-alert.ts new file mode 100644 index 0000000000..4f7623c0a2 --- /dev/null +++ b/elements/pf-alert/pf-alert.ts @@ -0,0 +1,324 @@ + +import { LitElement, type TemplateResult, html, isServer, render } from 'lit'; +import { customElement } from 'lit/decorators/custom-element.js'; +import { property } from 'lit/decorators/property.js'; +import { repeat } from 'lit/directives/repeat.js'; +import { classMap } from 'lit/directives/class-map.js'; +import { getRandomId } from '@patternfly/pfe-core/functions/random.js'; +import { SlotController } from '@patternfly/pfe-core/controllers/slot-controller.js'; +import styles from './pf-alert.css'; +import '@patternfly/elements/pf-icon/pf-icon.js'; +import '@patternfly/elements/pf-button/pf-button.js'; + + +interface AlertAction { + action: 'dismiss' | 'confirm' | string; + text: string; +} +interface ToastOptions { + id?: string; + message: string | TemplateResult; + heading?: string; + state?: PfAlert['state']; + persistent?: boolean; + actions?: AlertAction[]; +} +const ICONS = new Map(Object.entries({ + neutral: 'minus-circle', + info: 'info-circle', + success: 'check-circle', + custom: 'bell', + cogear: 'cog', + warning: 'exclamation-triangle', + danger: 'exclamation-circle', + close: 'times', + +})); + + +export class AlertCloseEvent extends Event { + constructor(public action: 'close' | 'confirm' | 'dismiss' | string) { + super('close', { bubbles: true, cancelable: true }); + } +} +let toaster: HTMLElement; +const toasts = new Set>(); + + +@customElement('pf-alert') +export class PfAlert extends LitElement { + static readonly styles: CSSStyleSheet[] = [styles]; + + public static async toast(options: Omit): Promise { + const { + message, + persistent = false, + heading = 'Success', + state = 'info', + actions = [], + } = options; + toaster ??= initToaster(); + const id = getRandomId(); + const toast = { actions, heading, message, state, id, persistent }; + toasts.add(toast); + const { matches: motionOK } = window.matchMedia('(prefers-reduced-motion: no-preference)'); + renderToasts(); + const alert = toaster.querySelector(`#${id}`); + if (toaster.children.length && motionOK) { + flip(toaster); + } + await Promise.all(toaster.getAnimations().map(x => x.finished)); + if (!persistent && alert) { + await Promise.all(alert?.getAnimations().map(x => x.finished) ?? []); + toasts.delete(toast); + } + renderToasts(); + } + + + @property({ reflect: true }) + state: + | 'warning' + | 'custom' + | 'neutral' + | 'info' + | 'success' + | 'danger' + | 'cogear' = 'neutral'; + + @property({ reflect: true }) variant?: 'alternate' | 'toast' | 'inline'; + + @property({ reflect: true, type: Boolean }) dismissable = false; + + #slots = new SlotController(this, 'header', null, 'actions'); + + get #icon() { + const state = this.state.toLowerCase() as this['state']; + switch (state) { + // @ts-expect-error: support for deprecated props + case 'note': return ICONS.get('info'); + // @ts-expect-error: support for deprecated props + case 'default': return ICONS.get('neutral'); + // @ts-expect-error: support for deprecated props + case 'error': return ICONS.get('danger'); + default: return ICONS.get(state); + } + } + + #aliasState(state: string) { + switch (state.toLowerCase()) { + // the first three are deprecated pre-DPO status names + case 'note': return 'info'; + case 'default': return 'neutral'; + case 'error': return 'danger'; + // the following are DPO-approved status names + case 'danger': + case 'warning': + case 'custom': + case 'neutral': + case 'info': + case 'success': + case 'cogear': + return state.toLowerCase() as this['state']; + default: + return 'neutral'; + } + } + + connectedCallback(): void { + super.connectedCallback(); + if (!isServer) { + this.requestUpdate(); + } + } + + render(): TemplateResult<1> { + const _isServer = isServer && !this.hasUpdated; + const hasActions = _isServer || this.#slots.hasSlotted('actions'); + const hasBody = + _isServer || this.#slots.hasSlotted(SlotController.default as unknown as string); + const { variant = 'inline' } = this; + const state = this.#aliasState(this.state); + const inDemo = this.closest('.demo-with-arrows') !== null; + const hasDescription = this.querySelector('p') !== null; + const showArrow = inDemo; + const arrowDirection = hasDescription ? 'angle-down' : 'angle-right'; + + + const footer = html`
+ +
`; + return html` + + `; + } + + + firstUpdated(): void { + const icons = this.renderRoot.querySelectorAll('#arrow-icon, #close-button'); + icons.forEach(icon => { + icon.addEventListener('click', () => { + // Remove active from all icons of all components + document.querySelectorAll('pf-alert').forEach(alert => { + const innerIcons = alert.renderRoot?.querySelectorAll('#arrow-icon, #close-button'); + innerIcons?.forEach(i => i.classList.remove('active')); + }); + // Add active to the current icon + icon.classList.add('active'); + }); + }); + + // Click anywhere else returns to normal mode + document.addEventListener('click', event => { + const path = event.composedPath(); + const clickedOnIcon = Array.from(icons).some(i => path.includes(i as EventTarget)); + if (!clickedOnIcon) { + icons.forEach(i => i.classList.remove('active')); + } + }); + } +} + + +function initToaster() { + const node = document.createElement('section'); + node.classList.add('pf-alert-toast-group'); + document.adoptedStyleSheets = [ + ...document.adoptedStyleSheets ?? [], + ]; + + document.body.append(node); + return node; +} + +function renderToasts() { + render(repeat(toasts, t => t.id, ({ + id, state, heading, message, actions, persistent }) => { + const [firstAction, secondAction] = actions ?? []; + return html` + +

${heading}

+ ${!message ? '' : typeof message !== 'string' ? message : html` +

${message}

`} + ${[firstAction, secondAction].filter(x => !!x).map(action => html` + ${action.text} + `) ?? []} + +
+ `; + }), toaster); +} + + +function manageAlertAnimation(event: Event) { + const alert = + event.target instanceof PfAlert ? event.target + : event.target instanceof Element ? event.target.closest('pf-alert') + : null; + if (!alert) { + return; + } + for (const animation of alert.getAnimations() ?? []) { + switch (event.type) { + case 'focusin': + case 'mouseenter': + animation.pause(); + break; + case 'focusout': + case 'mouseleave': + if (!alert.matches(':focus-within')) { + animation.play(); + } + break; + } + } +} +/** + * @see https://aerotwist.com/blog/flip-your-animations/ + * @param toaster container for toasted alerts + */ +function flip(toaster: HTMLElement) { + const first = toaster.offsetHeight; + const last = toaster.offsetHeight; + const invert = last - first; + const animation = toaster.animate([ + { transform: `translateY(${invert}px)` }, + { transform: 'translateY(0)' }, + ], { + duration: 150, + easing: 'ease-out', + }); + animation.startTime = document.timeline.currentTime; +} + + +declare global { + interface HTMLElementTagNameMap { + 'pf-alert': PfAlert; + } +} + + diff --git a/elements/pf-alert/test/MANUAL_TESTS.md b/elements/pf-alert/test/MANUAL_TESTS.md new file mode 100644 index 0000000000..bc066ff899 --- /dev/null +++ b/elements/pf-alert/test/MANUAL_TESTS.md @@ -0,0 +1,88 @@ +# pf-alert — Manual Tests + +This document outlines manual testing procedures for the `pf-alert` component. + +## Setup +1. Start the development server: +```bash +npm run start +``` +2. Open the demo page in your browser +3. Have a screen reader ready (e.g., NVDA, VoiceOver) + +## Visual Tests + +### Base Alert +- [ ] Renders with correct default styling +- [ ] Title text is clearly visible +- [ ] Content text is properly formatted +- [ ] Icon matches the alert state +- [ ] Close button (if dismissable) is properly positioned + +### States +Test each state and verify proper styling: +- [ ] Default +- [ ] Success (green) +- [ ] Warning (orange/yellow) +- [ ] Danger (red) +- [ ] Info (blue) + +### Variants +Test each variant: +- [ ] Inline +- [ ] Toast +- [ ] Default + +## Interaction Tests + +### Keyboard Navigation +- [ ] Tab key focuses interactive elements in correct order +- [ ] Enter/Space triggers action buttons +- [ ] Escape key dismisses alert (if dismissable) +- [ ] Focus is properly trapped in modal alerts (if applicable) + +### Mouse Interaction +- [ ] Click on close button dismisses alert +- [ ] Action buttons respond to clicks +- [ ] Toast alerts can be dismissed via close button + +### Screen Reader Tests +Using NVDA or VoiceOver: +- [ ] Alert role is announced +- [ ] Alert state (success/warning/etc) is announced +- [ ] Title and content are read in correct order +- [ ] Interactive elements are properly announced +- [ ] Dismissal is announced + +## Functional Tests + +### Toast API +- [ ] `PfAlert.toast()` creates visible toast +- [ ] Toast appears in correct position +- [ ] Auto-dismiss works with specified duration +- [ ] Multiple toasts stack correctly + +### State Changes +- [ ] Changing state updates styling immediately +- [ ] Changing variant updates layout immediately +- [ ] Adding/removing `dismissable` updates UI +- [ ] Slot content updates reflect immediately + +## Accessibility Tests +- [ ] Run aXe or similar tool +- [ ] Verify color contrast meets WCAG standards +- [ ] Verify all interactive elements are keyboard accessible +- [ ] Check aria attributes are present and correct +- [ ] Test with screen reader in different browsers + +## Browser Testing +Test in: +- [ ] Chrome +- [ ] Firefox +- [ ] Safari +- [ ] Edge + +## Notes +- Document any bugs or inconsistencies found +- Note any browser-specific issues +- Record accessibility concerns \ No newline at end of file diff --git a/elements/pf-alert/test/pf-alert.e2e.ts b/elements/pf-alert/test/pf-alert.e2e.ts new file mode 100644 index 0000000000..a768690de2 --- /dev/null +++ b/elements/pf-alert/test/pf-alert.e2e.ts @@ -0,0 +1,158 @@ +import { test, expect } from '@playwright/test'; +import { PfeDemoPage } from '@patternfly/pfe-tools/test/playwright/PfeDemoPage.js'; +import { SSRPage } from '@patternfly/pfe-tools/test/playwright/SSRPage.js'; + +const tagName = 'pf-alert'; + +test.describe(tagName, () => { + test.beforeEach(async ({ page }) => { + const componentPage = new PfeDemoPage(page, tagName); + await componentPage.navigate(); + }); + test('snapshot', async ({ page }) => { + const componentPage = new PfeDemoPage(page, tagName); + await componentPage.navigate(); + await componentPage.snapshot(); + }); + + test('ssr', async ({ browser }) => { + const fixture = new SSRPage({ + tagName, + browser, + demoDir: new URL('../demo/', import.meta.url), + importSpecifiers: [ + `@patternfly/elements/${tagName}/${tagName}.js`, + ], + }); + await fixture.snapshots(); + }); + + test('keyboard navigation works correctly', async ({ page }) => { + const componentPage = new PfeDemoPage(page, tagName); + await componentPage.navigate(); + + // Start with focus on body + await page.focus('body'); + + // Tab should move focus to first interactive element + await page.keyboard.press('Tab'); + const focusedElement = await page.evaluate(() => document.activeElement?.tagName); + expect(focusedElement).toBeTruthy(); + + // If alert has actions, they should be focusable + const hasActions = await page.$('pf-alert [slot="actions"]'); + if (hasActions) { + await page.keyboard.press('Tab'); + const actionFocused = await page.evaluate(() => + document.activeElement?.closest('[slot="actions"]') !== null + ); + expect(actionFocused).toBeTruthy(); + } + }); + + test('WAI-ARIA compliance', async ({ page }) => { + const componentPage = new PfeDemoPage(page, tagName); + await componentPage.navigate(); + + // Test inline alert role + const inlineAlert = await page.$('pf-alert[variant="inline"]'); + if (inlineAlert) { + const role = await inlineAlert.getAttribute('role'); + expect(role).toBe('alert'); + } + + // Test toast alert role + const toastAlert = await page.$('pf-alert[variant="toast"]'); + if (toastAlert) { + const role = await toastAlert.getAttribute('role'); + expect(role).toBe('status'); + } + + // Check dismissable alerts have proper close button + const dismissableAlert = await page.$('pf-alert[dismissable]'); + if (dismissableAlert) { + const closeButton = await dismissableAlert.$('#close-button'); + expect(await closeButton?.getAttribute('role')).toBe('button'); + expect(await closeButton?.getAttribute('tabindex')).toBe('0'); + expect(await closeButton?.getAttribute('aria-label')).toBe('Close'); + } + }); + + test('accessibility - roles and attributes', async ({ page }) => { + // Test inline alert role + const inlineAlert = await page.locator('pf-alert[variant="inline"]').first(); + if (await inlineAlert.count() > 0) { + expect(await inlineAlert.getAttribute('role')).toBe('alert'); + } + + // Test toast alert role + const toastAlert = await page.locator('pf-alert[variant="toast"]').first(); + if (await toastAlert.count() > 0) { + expect(await toastAlert.getAttribute('role')).toBe('status'); + } + + // Verify aria attributes + const alert = await page.locator('pf-alert').first(); + expect(await alert.getAttribute('aria-hidden')).not.toBe('true'); + }); + + test('screen reader content structure', async ({ page }) => { + // Test header content is properly structured + const alertWithHeader = await page.locator('pf-alert:has([slot="header"])').first(); + if (await alertWithHeader.count() > 0) { + const header = await alertWithHeader.locator('[slot="header"]'); + expect(await header.count()).toBe(1); + } + + // Test main content area + const alertWithContent = await page.locator('pf-alert:has(p)').first(); + if (await alertWithContent.count() > 0) { + const content = await alertWithContent.locator('p'); + expect(await content.count()).toBeGreaterThan(0); + } + }); + + test('toast functionality and stacking', async ({ page }) => { + // Create multiple toasts + await page.evaluate(async () => { + const { PfAlert } = await import('@patternfly/elements/pf-alert/pf-alert.js'); + for (const state of ['success', 'warning', 'info']) { + await PfAlert.toast({ + heading: `Test ${state}`, + message: `${state} message`, + state: state as any + }); + } + }); + + // Verify toasts exist with correct attributes + const toasts = await page.locator('pf-alert[variant="toast"]').all(); + expect(toasts.length).toBeGreaterThanOrEqual(1); + + // Check toast container structure + const toastContainer = await page.locator('.pf-alert-toast-group'); + expect(await toastContainer.count()).toBe(1); + }); + + test('visual states and variants', async ({ page }) => { + // Test each state renders + for (const state of ['success', 'warning', 'danger', 'info']) { + const alert = await page.locator(`pf-alert[state="${state}"]`).first(); + if (await alert.count() > 0) { + // Verify icon exists for state + const icon = await alert.locator('#icon'); + expect(await icon.count()).toBe(1); + } + } + + // Test variants render + for (const variant of ['inline', 'toast']) { + const alert = await page.locator(`pf-alert[variant="${variant}"]`).first(); + if (await alert.count() > 0) { + // Verify basic structure + const container = await alert.locator('#container'); + expect(await container.count()).toBe(1); + } + } + }); +}); diff --git a/elements/pf-alert/test/pf-alert.spec.ts b/elements/pf-alert/test/pf-alert.spec.ts new file mode 100644 index 0000000000..76edb8ecbb --- /dev/null +++ b/elements/pf-alert/test/pf-alert.spec.ts @@ -0,0 +1,91 @@ +import { expect, html } from '@open-wc/testing'; +import { createFixture } from '@patternfly/pfe-tools/test/create-fixture.js'; +import { PfAlert, AlertCloseEvent } from '@patternfly/elements/pf-alert/pf-alert.js'; +import { oneEvent } from '@open-wc/testing'; + +describe('', function() { + describe('simply instantiating', function() { + let element: PfAlert; + + it('imperatively instantiates', function() { + expect(document.createElement('pf-alert')).to.be.an.instanceof(PfAlert); + }); + + it('should upgrade', async function() { + element = await createFixture(html``); + const klass = customElements.get('pf-alert'); + expect(element) + .to.be.an.instanceOf(klass) + .and + .to.be.an.instanceOf(PfAlert); + }); + }); + + describe('attributes and properties', function() { + it('reflects state attribute', async function() { + const el = await createFixture(html``); + expect(el.getAttribute('state')).to.equal('success'); + expect(el.state).to.equal('success'); + }); + + it('reflects variant attribute', async function() { + const el = await createFixture(html``); + expect(el.getAttribute('variant')).to.equal('inline'); + expect(el.variant).to.equal('inline'); + }); + }); + + describe('slots and rendering', function() { + it('renders header slot content', async function() { + const el = await createFixture(html` + +

Alert Title

+

Alert content

+
+ `); + const header = el.querySelector('[slot="header"]'); + expect(header).to.exist; + expect(header?.textContent?.trim()).to.equal('Alert Title'); + }); + + it('renders action buttons with correct attributes', async function() { + const el = await createFixture(html` + +
+ Action +
+
+ `); + const actionButton = el.querySelector('[slot="actions"] pf-button'); + expect(actionButton).to.exist; + }); + }); + + describe('events and interactions', function() { + it('emits close event when close button clicked', async function() { + const el = await createFixture(html``); + const closeButton = el.shadowRoot?.querySelector('#close-button'); + setTimeout(() => closeButton?.dispatchEvent(new MouseEvent('click'))); + const event = await oneEvent(el, 'close') as AlertCloseEvent; + expect(event.action).to.equal('dismiss'); + }); + }); + + describe('toast functionality', function() { + it('creates toast alerts via static method', async function() { + const toastPromise = PfAlert.toast({ + heading: 'Test Toast', + message: 'Toast message', + state: 'info' + }); + + expect(toastPromise).to.be.instanceof(Promise); + await toastPromise; + + const toast = document.querySelector('pf-alert[variant="toast"]'); + expect(toast).to.exist; + expect(toast?.getAttribute('role')).to.equal('status'); + expect(toast?.getAttribute('state')).to.equal('info'); + }); + }); +}); diff --git a/elements/pf-description-list/README.md b/elements/pf-description-list/README.md new file mode 100644 index 0000000000..56560185df --- /dev/null +++ b/elements/pf-description-list/README.md @@ -0,0 +1,11 @@ +# Description List +Add a description of the component here. + +## Usage +Describe how best to use this web component along with best practices. + +```html + + + +``` diff --git a/elements/pf-description-list/demo/pf-description-list.html b/elements/pf-description-list/demo/pf-description-list.html new file mode 100644 index 0000000000..32b7417e54 --- /dev/null +++ b/elements/pf-description-list/demo/pf-description-list.html @@ -0,0 +1,60 @@ +
+
+
+ Name +
+
+
example
+
+
+
+
+ Namespace +
+
+
+ mary-test +
+
+
+
+
+ Labels +
+
+
example
+
+
+
+
+ Pod selector +
+
+
+ +
+
+
+
+
+ Annotation +
+
+
2 Annotations
+
+
+
+ + + + diff --git a/elements/pf-description-list/docs/pf-description-list.md b/elements/pf-description-list/docs/pf-description-list.md new file mode 100644 index 0000000000..16594d677a --- /dev/null +++ b/elements/pf-description-list/docs/pf-description-list.md @@ -0,0 +1,17 @@ +{% renderOverview %} + +{% endrenderOverview %} + +{% band header="Usage" %}{% endband %} + +{% renderSlots %}{% endrenderSlots %} + +{% renderAttributes %}{% endrenderAttributes %} + +{% renderMethods %}{% endrenderMethods %} + +{% renderEvents %}{% endrenderEvents %} + +{% renderCssCustomProperties %}{% endrenderCssCustomProperties %} + +{% renderCssParts %}{% endrenderCssParts %} diff --git a/elements/pf-description-list/pf-description-list.css b/elements/pf-description-list/pf-description-list.css new file mode 100644 index 0000000000..9c0228fdef --- /dev/null +++ b/elements/pf-description-list/pf-description-list.css @@ -0,0 +1,31 @@ +/* :host { + display: block; +} */ +:host { + display: block; + background: var(--pf-global--BackgroundColor--100, #fff); + padding: 1.5rem; + border-radius: 4px; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + } + + .pf-c-description-list { + display: flex; + flex-direction: column; + gap: 1rem; + } + + .pf-c-description-list__term { + font-weight: 600; + color: var(--pf-global--Color--100, #151515); + } + + .pf-c-description-list__text a { + color: var(--pf-global--link--Color, #06c); + text-decoration: none; + pointer-events: none; + } + + .pf-c-description-list__text button { + pointer-events: none; + } diff --git a/elements/pf-description-list/pf-description-list.ts b/elements/pf-description-list/pf-description-list.ts new file mode 100644 index 0000000000..3b2a87f770 --- /dev/null +++ b/elements/pf-description-list/pf-description-list.ts @@ -0,0 +1,25 @@ +import { LitElement, html, type TemplateResult } from 'lit'; +import { customElement } from 'lit/decorators/custom-element.js'; + +import styles from './pf-description-list.css'; + +/** + * Description List + * @slot - Place element content here + */ +@customElement('pf-description-list') +export class PfDescriptionList extends LitElement { + static readonly styles: CSSStyleSheet[] = [styles]; + + render(): TemplateResult<1> { + return html` + + `; + } +} + +declare global { + interface HTMLElementTagNameMap { + 'pf-description-list': PfDescriptionList; + } +} diff --git a/elements/pf-description-list/test/pf-description-list.e2e.ts b/elements/pf-description-list/test/pf-description-list.e2e.ts new file mode 100644 index 0000000000..069aea8025 --- /dev/null +++ b/elements/pf-description-list/test/pf-description-list.e2e.ts @@ -0,0 +1,25 @@ +import { test } from '@playwright/test'; +import { PfeDemoPage } from '@patternfly/pfe-tools/test/playwright/PfeDemoPage.js'; +import { SSRPage } from '@patternfly/pfe-tools/test/playwright/SSRPage.js'; + +const tagName = 'pf-description-list'; + +test.describe(tagName, () => { + test('snapshot', async ({ page }) => { + const componentPage = new PfeDemoPage(page, tagName); + await componentPage.navigate(); + await componentPage.snapshot(); + }); + + test('ssr', async ({ browser }) => { + const fixture = new SSRPage({ + tagName, + browser, + demoDir: new URL('../demo/', import.meta.url), + importSpecifiers: [ + `@patternfly/elements/${tagName}/${tagName}.js`, + ], + }); + await fixture.snapshots(); + }); +}); diff --git a/elements/pf-description-list/test/pf-description-list.spec.ts b/elements/pf-description-list/test/pf-description-list.spec.ts new file mode 100644 index 0000000000..98bde65dc2 --- /dev/null +++ b/elements/pf-description-list/test/pf-description-list.spec.ts @@ -0,0 +1,21 @@ +import { expect, html } from '@open-wc/testing'; +import { createFixture } from '@patternfly/pfe-tools/test/create-fixture.js'; +import { PfDescriptionList } from '@patternfly/elements/pf-description-list/pf-description-list.js'; + +describe('', function() { + describe('simply instantiating', function() { + let element: PfDescriptionList; + it('imperatively instantiates', function() { + expect(document.createElement('pf-description-list')).to.be.an.instanceof(PfDescriptionList); + }); + + it('should upgrade', async function() { + element = await createFixture(html``); + const klass = customElements.get('pf-description-list'); + expect(element) + .to.be.an.instanceOf(klass) + .and + .to.be.an.instanceOf(PfDescriptionList); + }); + }) +}); diff --git a/elements/pf-search-input/demo/index.html b/elements/pf-search-input/demo/index.html index 9a48121cba..9d167ed1ee 100644 --- a/elements/pf-search-input/demo/index.html +++ b/elements/pf-search-input/demo/index.html @@ -29,9 +29,9 @@ const searchInput = document.getElementById('search-input'); searchInput.addEventListener('change', (event) => { - /* eslint-disable no-console */ + console.log('Selected:', event.target.value); - /* eslint-disable no-console */ + }); diff --git a/elements/pf-search-input/demo/pf-search-input-with-submit.html b/elements/pf-search-input/demo/pf-search-input-with-submit.html index 4282ef9e0f..2973a0be6b 100644 --- a/elements/pf-search-input/demo/pf-search-input-with-submit.html +++ b/elements/pf-search-input/demo/pf-search-input-with-submit.html @@ -33,17 +33,17 @@ const searchInput = document.getElementById('search-input'); searchInput.addEventListener('change', (event) => { - /* eslint-disable no-console */ + console.log('Selected:', event.target.value); - /* eslint-disable no-console */ + }); const form = document.querySelector('form.container'); form.addEventListener('submit', (event) =>{ event.preventDefault(); - /* eslint-disable no-console */ + console.log("Value:", form.elements.search?.value); - /* eslint-disable no-console */ + }) diff --git a/elements/tsconfig.json b/elements/tsconfig.json index 9e228ec9b3..f312468c1a 100644 --- a/elements/tsconfig.json +++ b/elements/tsconfig.json @@ -4,7 +4,7 @@ "**/*.ts" ], "exclude": [ - "*/demo/*.js", + "**/demo/*.js", "pf-icon/test/rh-icon*.js", "custom-elements-manifest.config.js", "react" @@ -21,4 +21,4 @@ "path": "../tools/pfe-tools" } ] -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 670d312fce..a9e47840aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,9 @@ "./elements", "./tools/*" ], + "dependencies": { + "@patternfly/icons": "^1.0.3" + }, "devDependencies": { "@actions/core": "^1.10.1", "@actions/exec": "^1.1.1", @@ -21,7 +24,7 @@ "@lit/react": "^1.0.5", "@octokit/core": "^6.1.2", "@patternfly/patternfly": "^4.224.5", - "@pwrs/cem": "^0.3.0", + "@pwrs/cem": "^0.6.5", "@rhds/elements": "^1.4.5", "@types/koa__router": "^12.0.4", "@types/node": "^22.15.32", @@ -30,7 +33,7 @@ "@types/prompts": "^2.4.9", "chalk": "^5.3.0", "commitlint": "^19.4.0", - "eslint": "^9.9.0", + "eslint": "^9.38.0", "execa": "^9.3.1", "fuse.js": "^7.0.0", "husky": "^9.1.4", @@ -69,7 +72,7 @@ }, "elements": { "name": "@patternfly/elements", - "version": "4.1.0", + "version": "4.2.0", "license": "MIT", "dependencies": { "@lit/context": "^1.1.5", @@ -867,9 +870,9 @@ } }, "node_modules/@changesets/apply-release-plan": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.12.tgz", - "integrity": "sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.13.tgz", + "integrity": "sha512-BIW7bofD2yAWoE8H4V40FikC+1nNFEKBisMECccS16W1rt6qqhNTBDmIw5HaqmMgtLNz9e7oiALiEUuKrQ4oHg==", "license": "MIT", "peer": true, "dependencies": { @@ -914,13 +917,13 @@ } }, "node_modules/@changesets/cli": { - "version": "2.29.5", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.29.5.tgz", - "integrity": "sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==", + "version": "2.29.7", + "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.29.7.tgz", + "integrity": "sha512-R7RqWoaksyyKXbKXBTbT4REdy22yH81mcFK6sWtqSanxUCbUi9Uf+6aqxZtDQouIqPdem2W56CdxXgsxdq7FLQ==", "license": "MIT", "peer": true, "dependencies": { - "@changesets/apply-release-plan": "^7.0.12", + "@changesets/apply-release-plan": "^7.0.13", "@changesets/assemble-release-plan": "^6.0.9", "@changesets/changelog-git": "^0.2.1", "@changesets/config": "^3.1.1", @@ -934,11 +937,11 @@ "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@changesets/write": "^0.4.0", + "@inquirer/external-editor": "^1.0.0", "@manypkg/get-packages": "^1.1.3", "ansi-colors": "^4.1.3", "ci-info": "^3.7.0", "enquirer": "^2.4.1", - "external-editor": "^3.1.0", "fs-extra": "^7.0.1", "mri": "^1.2.0", "p-limit": "^2.2.0", @@ -1475,9 +1478,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -1488,13 +1491,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -1505,13 +1508,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -1522,13 +1525,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -1539,7 +1542,7 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { @@ -1559,9 +1562,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -1572,13 +1575,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -1589,13 +1592,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -1606,13 +1609,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -1623,13 +1626,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -1640,13 +1643,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -1657,13 +1660,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -1674,13 +1677,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -1691,13 +1694,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -1708,13 +1711,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -1725,13 +1728,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -1742,7 +1745,7 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { @@ -1762,9 +1765,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.6.tgz", - "integrity": "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], @@ -1779,9 +1782,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -1792,13 +1795,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.6.tgz", - "integrity": "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], @@ -1813,9 +1816,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -1826,13 +1829,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.6.tgz", - "integrity": "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", "cpu": [ "arm64" ], @@ -1847,9 +1850,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -1860,13 +1863,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -1877,13 +1880,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -1894,13 +1897,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -1911,13 +1914,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" @@ -1971,12 +1974,12 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -1985,18 +1988,33 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" @@ -2051,9 +2069,9 @@ "license": "MIT" }, "node_modules/@eslint/js": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", - "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", + "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2063,27 +2081,39 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz", - "integrity": "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.1", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@esm-bundle/chai": { "version": "4.3.4-fix.0", "resolved": "https://registry.npmjs.org/@esm-bundle/chai/-/chai-4.3.4-fix.0.tgz", @@ -2210,6 +2240,45 @@ "license": "MIT", "peer": true }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/@isaacs/balanced-match": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", @@ -2869,13 +2938,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz", - "integrity": "sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.1.tgz", + "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", "license": "Apache-2.0", "peer": true, "dependencies": { - "playwright": "1.54.1" + "playwright": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -2908,9 +2977,9 @@ } }, "node_modules/@pwrs/cem": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@pwrs/cem/-/cem-0.3.0.tgz", - "integrity": "sha512-g3A2TlI86vxuJuh/FGjOJGoMCk23/kt4Qgd3lrf+3ccTdUdu2OOw7efzPEcGI3CZdAlB6v8JQi+S5prAgAyv3g==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@pwrs/cem/-/cem-0.6.5.tgz", + "integrity": "sha512-ycf3gIY4VTxjgpCbXsCkTpyAzhQF54r0mfE+uaXlmDjcyKZ8Mm5ZUhzhw++spNq2+tMsn2NgioMMh6Umho+vUA==", "dev": true, "hasInstallScript": true, "bin": { @@ -2920,12 +2989,12 @@ "node": ">=22.0.0" }, "optionalDependencies": { - "@pwrs/cem-darwin-arm64": "0.3.0", - "@pwrs/cem-darwin-x64": "0.3.0", - "@pwrs/cem-linux-arm64": "0.3.0", - "@pwrs/cem-linux-x64": "0.3.0", - "@pwrs/cem-win32-arm64": "0.3.0", - "@pwrs/cem-win32-x64": "0.3.0" + "@pwrs/cem-darwin-arm64": "0.6.5", + "@pwrs/cem-darwin-x64": "0.6.5", + "@pwrs/cem-linux-arm64": "0.6.5", + "@pwrs/cem-linux-x64": "0.6.5", + "@pwrs/cem-win32-arm64": "0.6.5", + "@pwrs/cem-win32-x64": "0.6.5" } }, "node_modules/@pwrs/cem-darwin-arm64": { @@ -2993,9 +3062,9 @@ } }, "node_modules/@pwrs/cem-win32-arm64": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@pwrs/cem-win32-arm64/-/cem-win32-arm64-0.3.0.tgz", - "integrity": "sha512-hCY6FiaHM4kn9v+ab39+DUcmGRy9D3Lm0DxMU3JPY+fybJWxY9KDCy4H/Gm/YBmsmXFIDQeyjCG2ZUp/NT3APA==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@pwrs/cem-win32-arm64/-/cem-win32-arm64-0.6.5.tgz", + "integrity": "sha512-bsEVNKJXkHSPPPgJ1v5u32PWrA/s3HYi2AacRC0Z2MkMo3PoXS/I7Iehis+zryNKjxIcn9zXyQBNPTbyIfdxPA==", "cpu": [ "arm64" ], @@ -3010,9 +3079,9 @@ } }, "node_modules/@pwrs/cem-win32-x64": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@pwrs/cem-win32-x64/-/cem-win32-x64-0.3.0.tgz", - "integrity": "sha512-95aBtvCqfgb0VsJ5dX3DQsHruCAx4CF/YWQ8gp92DxwqmUh6byfRRmu/+A3dATTVkMTz/uV+qO/EzoBfQS0zBw==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@pwrs/cem-win32-x64/-/cem-win32-x64-0.6.5.tgz", + "integrity": "sha512-Tbff2k3AqHYVK0M7cUXz4SdmLc5R5OrdX2h2PTOt8ZFLOXv1yfrOYpnpqljdsdZgIOU5EaoxEwcYMjnZUeG8LQ==", "cpu": [ "x64" ], @@ -3026,6 +3095,74 @@ "node": ">=22.0.0" } }, + "node_modules/@pwrs/cem/node_modules/@pwrs/cem-darwin-arm64": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@pwrs/cem-darwin-arm64/-/cem-darwin-arm64-0.6.5.tgz", + "integrity": "sha512-ZIISRtiKvj6mzTk68M5S6DOh8Euzh093+fND0aZURs28rzEKrAGQuLh3ta2uioIobUshyCtL/lIhySnHrCmKzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@pwrs/cem/node_modules/@pwrs/cem-darwin-x64": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@pwrs/cem-darwin-x64/-/cem-darwin-x64-0.6.5.tgz", + "integrity": "sha512-b4FiyULEyvodKN2MVuZl5cukPjQG/RleeeLh4N9HyMXwP+rgplJhuhbBY62Ie1j17R/LXNT8GMypZlydlORb8A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@pwrs/cem/node_modules/@pwrs/cem-linux-arm64": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@pwrs/cem-linux-arm64/-/cem-linux-arm64-0.6.5.tgz", + "integrity": "sha512-6krAhgNvibEyS8RNMmxdoad9DvX4v9xc99jmQ1JSyxDPihhWv0GJi7ZWuNaq3kea/15wAzEIpFle6IbZWogTKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@pwrs/cem/node_modules/@pwrs/cem-linux-x64": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@pwrs/cem-linux-x64/-/cem-linux-x64-0.6.5.tgz", + "integrity": "sha512-nQWuZEHEUCjlROA3wci5Xkt4twOXM6gKn07EgZ8f5a4ljxuZDTsBpxvBevYh5HEnHzmwu/E0K1O45jXPaJZz1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=22.0.0" + } + }, "node_modules/@pwrs/lit-css": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@pwrs/lit-css/-/lit-css-3.0.1.tgz", @@ -4537,568 +4674,135 @@ "mime-types": "^2.1.27", "parse5": "^6.0.1", "picomatch": "^2.2.2", - "ws": "^7.5.10" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/dev-server-core/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "peer": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@web/dev-server-core/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==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@web/dev-server-core/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==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@web/dev-server-core/node_modules/lru-cache": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", - "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">=16.14" - } - }, - "node_modules/@web/dev-server-core/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "license": "MIT", - "peer": true - }, - "node_modules/@web/dev-server-core/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@web/dev-server-core/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@web/dev-server-core/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "peer": true, - "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_modules/@web/dev-server-esbuild": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-1.0.4.tgz", - "integrity": "sha512-ia1LxBwwRiQBYhJ7/RtLenHyPjzle3SvTw3jOZaeGv8UGXVPOkQV8fR05caOtW/DPPZaZovNAybzRKVnNiYIZg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@mdn/browser-compat-data": "^4.0.0", - "@web/dev-server-core": "^0.7.4", - "esbuild": "^0.25.0", - "parse5": "^6.0.1", - "ua-parser-js": "^1.0.33" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.6.tgz", - "integrity": "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/android-arm": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.6.tgz", - "integrity": "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/android-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.6.tgz", - "integrity": "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/android-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.6.tgz", - "integrity": "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.6.tgz", - "integrity": "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.6.tgz", - "integrity": "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.6.tgz", - "integrity": "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.6.tgz", - "integrity": "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-arm": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.6.tgz", - "integrity": "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.6.tgz", - "integrity": "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.6.tgz", - "integrity": "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.6.tgz", - "integrity": "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.6.tgz", - "integrity": "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.6.tgz", - "integrity": "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.6.tgz", - "integrity": "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.6.tgz", - "integrity": "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "ws": "^7.5.10" + }, "engines": { - "node": ">=18" + "node": ">=18.0.0" } }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/linux-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.6.tgz", - "integrity": "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==", - "cpu": [ - "x64" - ], + "node_modules/@web/dev-server-core/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, "engines": { - "node": ">=18" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.6.tgz", - "integrity": "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==", - "cpu": [ - "x64" - ], + "node_modules/@web/dev-server-core/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==", "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], "peer": true, "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.6.tgz", - "integrity": "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==", - "cpu": [ - "x64" - ], + "node_modules/@web/dev-server-core/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==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], "peer": true, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.6.tgz", - "integrity": "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "node_modules/@web/dev-server-core/node_modules/lru-cache": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", + "license": "ISC", "peer": true, "engines": { - "node": ">=18" + "node": ">=16.14" } }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.6.tgz", - "integrity": "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==", - "cpu": [ - "arm64" - ], + "node_modules/@web/dev-server-core/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT", + "peer": true + }, + "node_modules/@web/dev-server-core/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "peer": true, "engines": { - "node": ">=18" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.6.tgz", - "integrity": "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==", - "cpu": [ - "ia32" - ], + "node_modules/@web/dev-server-core/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "peer": true, "engines": { - "node": ">=18" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@web/dev-server-esbuild/node_modules/@esbuild/win32-x64": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.6.tgz", - "integrity": "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==", - "cpu": [ - "x64" - ], + "node_modules/@web/dev-server-core/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "peer": true, "engines": { - "node": ">=18" + "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_modules/@web/dev-server-esbuild/node_modules/esbuild": { - "version": "0.25.6", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.6.tgz", - "integrity": "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==", - "hasInstallScript": true, + "node_modules/@web/dev-server-esbuild": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-1.0.4.tgz", + "integrity": "sha512-ia1LxBwwRiQBYhJ7/RtLenHyPjzle3SvTw3jOZaeGv8UGXVPOkQV8fR05caOtW/DPPZaZovNAybzRKVnNiYIZg==", "license": "MIT", "peer": true, - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "@mdn/browser-compat-data": "^4.0.0", + "@web/dev-server-core": "^0.7.4", + "esbuild": "^0.25.0", + "parse5": "^6.0.1", + "ua-parser-js": "^1.0.33" }, "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.6", - "@esbuild/android-arm": "0.25.6", - "@esbuild/android-arm64": "0.25.6", - "@esbuild/android-x64": "0.25.6", - "@esbuild/darwin-arm64": "0.25.6", - "@esbuild/darwin-x64": "0.25.6", - "@esbuild/freebsd-arm64": "0.25.6", - "@esbuild/freebsd-x64": "0.25.6", - "@esbuild/linux-arm": "0.25.6", - "@esbuild/linux-arm64": "0.25.6", - "@esbuild/linux-ia32": "0.25.6", - "@esbuild/linux-loong64": "0.25.6", - "@esbuild/linux-mips64el": "0.25.6", - "@esbuild/linux-ppc64": "0.25.6", - "@esbuild/linux-riscv64": "0.25.6", - "@esbuild/linux-s390x": "0.25.6", - "@esbuild/linux-x64": "0.25.6", - "@esbuild/netbsd-arm64": "0.25.6", - "@esbuild/netbsd-x64": "0.25.6", - "@esbuild/openbsd-arm64": "0.25.6", - "@esbuild/openbsd-x64": "0.25.6", - "@esbuild/openharmony-arm64": "0.25.6", - "@esbuild/sunos-x64": "0.25.6", - "@esbuild/win32-arm64": "0.25.6", - "@esbuild/win32-ia32": "0.25.6", - "@esbuild/win32-x64": "0.25.6" + "node": ">=18.0.0" } }, "node_modules/@web/dev-server-esbuild/node_modules/parse5": { @@ -5948,16 +5652,6 @@ "tslib": "^2.4.0" } }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "license": "ISC", - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/axe-core": { "version": "4.10.3", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", @@ -6542,9 +6236,9 @@ } }, "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "license": "MIT", "peer": true }, @@ -7042,9 +6736,9 @@ } }, "node_modules/compression": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", - "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "license": "MIT", "peer": true, "dependencies": { @@ -7052,7 +6746,7 @@ "compressible": "~2.0.18", "debug": "2.6.9", "negotiator": "~0.6.4", - "on-headers": "~1.0.2", + "on-headers": "~1.1.0", "safe-buffer": "5.2.1", "vary": "~1.1.2" }, @@ -8165,9 +7859,9 @@ } }, "node_modules/esbuild": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "hasInstallScript": true, "license": "MIT", "peer": true, @@ -8175,65 +7869,78 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/esbuild-plugin-lit-css": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/esbuild-plugin-lit-css/-/esbuild-plugin-lit-css-3.0.2.tgz", - "integrity": "sha512-01IoTlpZzxcIP6uqdbh05xTYYPJ7rglJQBOvNzlBYt/GD/cwe03s6GkzhHWq7YMyqzLZapIBNORzDsbLPLoXRg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-lit-css/-/esbuild-plugin-lit-css-4.0.0.tgz", + "integrity": "sha512-3o2/KDiDM6vU3nxricFrqlbXUl0Z56ltHOYyKjdmn51FyzRB71QqyrBhwxH9eiKSimndTiHiDc5yw2ImU9usrg==", "license": "ISC", "peer": true, "dependencies": { - "@pwrs/lit-css": "^3.0.1" + "@pwrs/lit-css": "^4.0.0" }, "peerDependencies": { - "esbuild": ">=0.16.17 <0.24.0", + "esbuild": ">=0.16.17 || ^0.25.0", "lit": "^2.7.2 || ^3.0.0" } }, + "node_modules/esbuild-plugin-lit-css/node_modules/@pwrs/lit-css": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@pwrs/lit-css/-/lit-css-4.0.0.tgz", + "integrity": "sha512-yz8dGXCZJJBvg8/riSlf8XGrNbktLd639XlCtKyVsc8xFdq9Sa+ZFJi66GEk5D3YrYSj3JmFLFh1fETR77CSmw==", + "license": "ISC", + "peer": true, + "dependencies": { + "cssnano": "^7.0.7" + } + }, "node_modules/esbuild-plugin-minify-html-literals": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esbuild-plugin-minify-html-literals/-/esbuild-plugin-minify-html-literals-2.0.1.tgz", - "integrity": "sha512-yFMZuCxey/UT2GiWVbzWn0girH8bwVbibt9yJsdeHKDm7SkWNI2Ys/zHgB60M7G7MwlYB/BPIllOrGYMxdoW/w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/esbuild-plugin-minify-html-literals/-/esbuild-plugin-minify-html-literals-3.0.0.tgz", + "integrity": "sha512-tlNLoD03VF1u0XkZAdIHICiA9WQag6kw/2Z8zqS71nfVh4FkObRIPhLdRBSnOZHkH8jgpgM4iodx0iwaxk58JQ==", "license": "ISC", "peer": true, "dependencies": { "minify-html-literals": "^1.3.5" }, "peerDependencies": { - "esbuild": ">=0.16.17 <0.24.0" + "esbuild": ">=0.16.17 || ^0.25.0" } }, "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -8244,13 +7951,13 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/esbuild/node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -8261,7 +7968,7 @@ ], "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/escalade": { @@ -8326,24 +8033,23 @@ } }, "node_modules/eslint": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", - "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", + "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.1", + "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.31.0", - "@eslint/plugin-kit": "^0.3.1", + "@eslint/js": "9.38.0", + "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", @@ -9111,34 +8817,6 @@ "license": "MIT", "peer": true }, - "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==", - "license": "MIT", - "peer": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "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==", - "license": "MIT", - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -11171,9 +10849,9 @@ } }, "node_modules/koa": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", - "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.3.tgz", + "integrity": "sha512-zPPuIt+ku1iCpFBRwseMcPYQ1cJL8l60rSmKeOuGfOXyE6YnTBmf2aEFNL2HQGrD0cPcLO/t+v9RTgC+fwEh/g==", "license": "MIT", "peer": true, "dependencies": { @@ -12773,9 +12451,9 @@ } }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", "peer": true, "engines": { @@ -12848,16 +12526,6 @@ "node": ">= 0.8.0" } }, - "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==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/outdent": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", @@ -13273,9 +12941,9 @@ } }, "node_modules/patch-package": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", - "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", + "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", "license": "MIT", "peer": true, "dependencies": { @@ -13284,15 +12952,14 @@ "ci-info": "^3.7.0", "cross-spawn": "^7.0.3", "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", + "fs-extra": "^10.0.0", "json-stable-stringify": "^1.0.2", "klaw-sync": "^6.0.0", "minimist": "^1.2.6", "open": "^7.4.2", - "rimraf": "^2.6.3", "semver": "^7.5.3", "slash": "^2.0.0", - "tmp": "^0.0.33", + "tmp": "^0.2.4", "yaml": "^2.2.2" }, "bin": { @@ -13337,47 +13004,24 @@ } }, "node_modules/patch-package/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "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==", "license": "MIT", "peer": true, "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/patch-package/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", - "license": "ISC", - "peer": true, - "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": ">=12" } }, "node_modules/patch-package/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "peer": true, "dependencies": { @@ -13404,20 +13048,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/patch-package/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", - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/patch-package/node_modules/slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", @@ -13560,13 +13190,13 @@ } }, "node_modules/playwright": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz", - "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", "license": "Apache-2.0", "peer": true, "dependencies": { - "playwright-core": "1.54.1" + "playwright-core": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -13579,9 +13209,9 @@ } }, "node_modules/playwright-core": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz", - "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", "license": "Apache-2.0", "peer": true, "bin": { @@ -16016,9 +15646,9 @@ } }, "node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "license": "MIT", "peer": true, "dependencies": { @@ -16129,16 +15759,13 @@ } }, "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", "license": "MIT", "peer": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, "engines": { - "node": ">=0.6.0" + "node": ">=14.14" } }, "node_modules/to-regex-range": { @@ -17398,7 +17025,7 @@ }, "tools/pfe-tools": { "name": "@patternfly/pfe-tools", - "version": "5.0.3", + "version": "5.0.4", "license": "MIT", "devDependencies": { "@types/dedent": "^0.7.2", @@ -17444,9 +17071,9 @@ "element-internals-polyfill": "^1.3.10", "eleventy-plugin-toc": "^1.1.5", "es-module-shims": "^1.9.0", - "esbuild": "^0.20.2", - "esbuild-plugin-lit-css": "^3.0.0", - "esbuild-plugin-minify-html-literals": "^2.0.0", + "esbuild": "^0.25.12", + "esbuild-plugin-lit-css": "^4.0.0", + "esbuild-plugin-minify-html-literals": "^3.0.0", "eslint": "^9.0.0", "execa": "^9.3.0", "glob": "^10.3.12", diff --git a/package.json b/package.json index f231efe893..14a59f7dc5 100644 --- a/package.json +++ b/package.json @@ -290,7 +290,7 @@ "@lit/react": "^1.0.5", "@octokit/core": "^6.1.2", "@patternfly/patternfly": "^4.224.5", - "@pwrs/cem": "^0.3.0", + "@pwrs/cem": "^0.6.5", "@rhds/elements": "^1.4.5", "@types/koa__router": "^12.0.4", "@types/node": "^22.15.32", @@ -299,7 +299,7 @@ "@types/prompts": "^2.4.9", "chalk": "^5.3.0", "commitlint": "^19.4.0", - "eslint": "^9.9.0", + "eslint": "^9.38.0", "execa": "^9.3.1", "fuse.js": "^7.0.0", "husky": "^9.1.4", @@ -326,5 +326,8 @@ "./core/*", "./elements", "./tools/*" - ] + ], + "dependencies": { + "@patternfly/icons": "^1.0.3" + } } diff --git a/tools/pfe-tools/package.json b/tools/pfe-tools/package.json index 5b81d9ff6e..ec6fea5f02 100644 --- a/tools/pfe-tools/package.json +++ b/tools/pfe-tools/package.json @@ -91,9 +91,9 @@ "element-internals-polyfill": "^1.3.10", "eleventy-plugin-toc": "^1.1.5", "es-module-shims": "^1.9.0", - "esbuild": "^0.20.2", - "esbuild-plugin-lit-css": "^3.0.0", - "esbuild-plugin-minify-html-literals": "^2.0.0", + "esbuild": "^0.25.12", + "esbuild-plugin-lit-css": "^4.0.0", + "esbuild-plugin-minify-html-literals": "^3.0.0", "eslint": "^9.0.0", "execa": "^9.3.0", "glob": "^10.3.12",