@redvars/peacock 3.9.0 → 3.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/code-highlighter.js +1 -4
  2. package/dist/code-highlighter.js.map +1 -1
  3. package/dist/custom-elements-jsdocs.json +39 -223
  4. package/dist/custom-elements.json +391 -2205
  5. package/dist/elevation.js +55 -2
  6. package/dist/elevation.js.map +1 -1
  7. package/dist/flow.js +762 -0
  8. package/dist/flow.js.map +1 -0
  9. package/dist/index.js +1 -3
  10. package/dist/index.js.map +1 -1
  11. package/dist/loader.js +2 -9
  12. package/dist/loader.js.map +1 -1
  13. package/dist/menu-item.js +144 -63
  14. package/dist/menu-item.js.map +1 -1
  15. package/dist/menu.js +161 -73
  16. package/dist/menu.js.map +1 -1
  17. package/dist/src/flow/flow.d.ts +102 -0
  18. package/dist/src/flow/index.d.ts +2 -0
  19. package/dist/src/index.d.ts +2 -4
  20. package/dist/src/menu/menu/menu.d.ts +10 -9
  21. package/dist/src/menu/menu-item/menu-item.d.ts +1 -3
  22. package/dist/src/timeline/timeline.d.ts +0 -1
  23. package/dist/sub-menu.js +28 -1
  24. package/dist/sub-menu.js.map +1 -1
  25. package/dist/timeline-item.js +22 -34
  26. package/dist/timeline-item.js.map +1 -1
  27. package/dist/timeline.js +1 -18
  28. package/dist/timeline.js.map +1 -1
  29. package/dist/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +3 -2
  31. package/readme.md +2 -2
  32. package/src/code-highlighter/code-highlighter.scss +1 -7
  33. package/src/elevation/demo/index.html +52 -0
  34. package/src/elevation/elevation.scss +52 -5
  35. package/src/elevation/elevation.ts +8 -1
  36. package/src/flow/flow.scss +195 -0
  37. package/src/flow/flow.ts +683 -0
  38. package/src/flow/index.ts +2 -0
  39. package/src/index.ts +2 -16
  40. package/src/loader.ts +2 -9
  41. package/src/menu/menu/copy-component-files.mjs +47 -0
  42. package/src/menu/menu/menu.scss +55 -17
  43. package/src/menu/menu/menu.ts +155 -84
  44. package/src/menu/menu-item/menu-item-colors.scss +3 -3
  45. package/src/menu/menu-item/menu-item.scss +118 -24
  46. package/src/menu/menu-item/menu-item.ts +61 -55
  47. package/src/menu/sub-menu/sub-menu.scss +30 -1
  48. package/src/timeline/timeline-item.scss +21 -31
  49. package/src/timeline/timeline-item.ts +2 -1
  50. package/src/timeline/timeline.scss +0 -10
  51. package/src/timeline/timeline.ts +0 -2
  52. package/dist/canvas.js +0 -385
  53. package/dist/canvas.js.map +0 -1
  54. package/dist/flow-designer-node-CGSm6cUH.js +0 -553
  55. package/dist/flow-designer-node-CGSm6cUH.js.map +0 -1
  56. package/dist/flow-designer-node.js +0 -4
  57. package/dist/flow-designer-node.js.map +0 -1
  58. package/dist/flow-designer.js +0 -1417
  59. package/dist/flow-designer.js.map +0 -1
  60. package/dist/src/canvas/canvas.d.ts +0 -92
  61. package/dist/src/canvas/index.d.ts +0 -2
  62. package/dist/src/flow-designer/commands.d.ts +0 -66
  63. package/dist/src/flow-designer/flow-designer-node.d.ts +0 -46
  64. package/dist/src/flow-designer/flow-designer.d.ts +0 -133
  65. package/dist/src/flow-designer/index.d.ts +0 -7
  66. package/dist/src/flow-designer/layout.d.ts +0 -30
  67. package/dist/src/flow-designer/types.d.ts +0 -142
  68. package/dist/src/flow-designer/validation.d.ts +0 -43
  69. package/dist/src/flow-designer/workflow-utils.d.ts +0 -40
  70. package/src/canvas/canvas.scss +0 -72
  71. package/src/canvas/canvas.ts +0 -413
  72. package/src/canvas/index.ts +0 -2
  73. package/src/flow-designer/DEMO.md +0 -239
  74. package/src/flow-designer/commands.ts +0 -278
  75. package/src/flow-designer/flow-designer-node.ts +0 -172
  76. package/src/flow-designer/flow-designer.scss +0 -457
  77. package/src/flow-designer/flow-designer.ts +0 -611
  78. package/src/flow-designer/index.ts +0 -41
  79. package/src/flow-designer/layout.ts +0 -357
  80. package/src/flow-designer/types.ts +0 -166
  81. package/src/flow-designer/validation.ts +0 -284
  82. package/src/flow-designer/workflow-utils.ts +0 -282
  83. /package/dist/test/{flow-designer.test.d.ts → elevation.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"menu-item.js","sources":["../../src/__internal/mixins/NativeButtonMixin.ts","../../src/menu/menu-item/menu-item.ts"],"sourcesContent":["import { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { MixinConstructor } from './MixinConstructor.js';\n\n/**\n * 1. Define an interface for the members the mixin adds.\n * This makes the type annotation much cleaner.\n */\nexport interface NativeButtonInterface {\n htmlType: 'button' | 'submit' | 'reset';\n disabled: boolean;\n softDisabled: boolean;\n disabledReason: string;\n form: string;\n name: string;\n value: string;\n}\n\n/**\n * 2. Apply the type annotation to the variable.\n */\nconst NativeButtonMixin: <T extends MixinConstructor<LitElement>>(\n superclass: T,\n) => T & MixinConstructor<NativeButtonInterface> = <\n T extends MixinConstructor<LitElement>,\n>(\n superclass: T,\n) => {\n // Naming the class (BaseButtonElement) instead of using 'Mixin' or anonymous\n // prevents the \"__childPart\" visibility error.\n class ButtonElement extends superclass implements NativeButtonInterface {\n /**\n * The type of the underlying `<button>` element. Maps to the native `type` attribute.\n * Possible values are `\"button\"`, `\"submit\"`, `\"reset\"`. Defaults to `\"button\"`.\n */\n @property({ type: String }) htmlType: 'button' | 'submit' | 'reset' =\n 'button';\n\n /**\n * When `true`, the button is disabled and cannot be interacted with. Reflects to the `disabled` attribute. Defaults to `false`.\n */\n @property({ type: Boolean, reflect: true })\n disabled: boolean = false;\n\n /**\n * When `true`, the button is visually styled as disabled and cannot be interacted with, but remains focusable.\n * Use this in combination with `disabledReason` to communicate why the button is unavailable.\n * Reflects to the `soft-disabled` attribute. Defaults to `false`.\n */\n @property({ type: Boolean, reflect: true, attribute: 'soft-disabled' })\n softDisabled: boolean = false;\n\n /**\n * A human-readable explanation of why the button is disabled or soft-disabled.\n * Rendered as a visually hidden tooltip and linked via `aria-describedby` for accessibility.\n * Maps to the `disabled-reason` attribute.\n */\n @property({ attribute: 'disabled-reason' })\n disabledReason: string = '';\n\n /**\n * The `id` of the `<form>` element to associate the button with.\n * If omitted, the button is associated with its nearest ancestor form.\n * Maps to the native `form` attribute.\n */\n @property()\n form: string = '';\n\n /**\n * The name of the button, submitted as part of a name/value pair when the associated form is submitted.\n * Maps to the native `name` attribute.\n */\n @property()\n name: string = '';\n\n /**\n * The value of the button, submitted as part of a name/value pair when the associated form is submitted.\n * Maps to the native `value` attribute.\n */\n @property()\n value: string = '';\n }\n\n return ButtonElement as T & MixinConstructor<NativeButtonInterface>;\n};\n\nexport default NativeButtonMixin;\n","import { html, LitElement, nothing } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport styles from './menu-item.scss';\nimport colorStyles from './menu-item-colors.scss';\nimport NativeButtonMixin from '@/__internal/mixins/NativeButtonMixin.js';\nimport NativeHyperlinkMixin from '@/__internal/mixins/NativeHyperlinkMixin.js';\nimport { isLink } from '@/__internal/utils/is-link.js';\nimport IndividualComponent from '@/IndividualComponent.js';\nimport { classMap } from 'lit/directives/class-map.js';\n\n/**\n * @label Menu Item\n * @tag wc-menu-item\n * @rawTag menu-item\n * @summary An item in a menu list.\n * @tags navigation\n *\n * @example\n * ```html\n * <wc-menu-item>Menu Item</wc-menu-item>\n * ```\n */\n@IndividualComponent\nexport class MenuItem extends NativeButtonMixin(\n NativeHyperlinkMixin(LitElement),\n) {\n // ── Static ───────────────────────────────────────────────────────────────\n\n static styles = [styles, colorStyles];\n\n // ── Properties ───────────────────────────────────────────────────────────\n\n /** The value associated with this menu item, used to identify it on selection. */\n @property({ type: String }) value = '';\n\n /** Whether this menu item is currently selected/highlighted. */\n @property({ type: Boolean, reflect: true }) selected = false;\n\n /** When true, the menu stays open after this item is activated. */\n @property({ type: Boolean, attribute: 'keep-open' }) keepOpen = false;\n\n /** When true, indicates this item has an associated submenu. */\n @property({ type: Boolean, attribute: 'has-submenu' }) hasSubmenu = false;\n\n /** Whether the associated submenu is currently open. */\n @property({ type: Boolean, attribute: 'submenu-open' }) submenuOpen = false;\n\n /** Visual variant of the menu item. */\n @property({ type: String, reflect: true }) variant: 'standard' | 'vibrant' =\n 'standard';\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n @query('#menu-item') readonly itemElement!: HTMLElement | null;\n\n // ── Private fields ────────────────────────────────────────────────────────\n\n /** MutationObserver that triggers re-render when slotted content changes. */\n private readonly _contentObserver = new MutationObserver(() => {\n this.requestUpdate();\n });\n\n /** Roving tabindex value managed by the parent Menu. */\n private _rovingTabIndex = -1;\n\n connectedCallback() {\n // eslint-disable-next-line wc/guard-super-call\n super.connectedCallback();\n this._contentObserver.observe(this, {\n subtree: true,\n childList: true,\n characterData: true,\n attributes: true,\n attributeFilter: ['slot'],\n });\n }\n\n disconnectedCallback() {\n this._contentObserver.disconnect();\n super.disconnectedCallback();\n }\n\n override get tabIndex() {\n return this._rovingTabIndex;\n }\n\n override set tabIndex(value: number) {\n this._rovingTabIndex = value;\n this.requestUpdate();\n }\n\n override focus() {\n this.itemElement?.focus();\n }\n\n override blur() {\n this.itemElement?.blur();\n }\n\n private _hasNamedSlot(...names: string[]) {\n return names.some(name =>\n Array.from(this.children).some(\n child => child.getAttribute('slot') === name,\n ),\n );\n }\n\n private _hasDefaultSlot() {\n return Array.from(this.childNodes).some(node => {\n if (node.nodeType === Node.TEXT_NODE) {\n return Boolean(node.textContent?.trim());\n }\n\n return (\n node.nodeType === Node.ELEMENT_NODE &&\n !(node as Element).hasAttribute('slot')\n );\n });\n }\n\n render() {\n const isElementLink = isLink(this);\n const controls = this.getAttribute('aria-controls');\n\n const cssClasses = {\n 'menu-item': true,\n 'native-button': !isElementLink,\n 'native-link': isElementLink,\n };\n\n if (isElementLink) {\n return html`\n <a\n id=\"menu-item\"\n class=${classMap(cssClasses)}\n role=\"menuitem\"\n href=${ifDefined(this.href)}\n target=${this.target}\n ?rel=${this.rel}\n ?download=${this.download}\n tabindex=${this.disabled ? '-1' : String(this.tabIndex)}\n ?selected=${this.selected}\n aria-disabled=${this.disabled || this.softDisabled ? 'true' : nothing}\n aria-haspopup=${this.hasSubmenu ? 'menu' : nothing}\n aria-controls=${ifDefined(\n this.hasSubmenu && controls ? controls : undefined,\n )}\n aria-expanded=${ifDefined(\n this.hasSubmenu ? String(this.submenuOpen) : undefined,\n )}\n >\n ${this.renderContent()}\n </a>\n `;\n }\n\n return html`\n <button\n id=\"menu-item\"\n class=${classMap(cssClasses)}\n role=\"menuitem\"\n type=${this.htmlType}\n ?disabled=${this.disabled}\n tabindex=${String(this.tabIndex)}\n ?selected=${this.selected}\n aria-disabled=${this.softDisabled ? 'true' : nothing}\n aria-haspopup=${this.hasSubmenu ? 'menu' : nothing}\n aria-controls=${ifDefined(\n this.hasSubmenu && controls ? controls : undefined,\n )}\n aria-expanded=${ifDefined(\n this.hasSubmenu ? String(this.submenuOpen) : undefined,\n )}\n >\n ${this.renderContent()}\n </button>\n `;\n }\n\n renderContent() {\n return html`\n <div class=\"menu-item-background\"></div>\n <wc-item class=\"menu-item-content\">\n <wc-focus-ring\n class=\"focus-ring\"\n for=\"menu-item\"\n slot=\"container\"\n ></wc-focus-ring>\n <div class=\"background\" slot=\"container\"></div>\n <wc-ripple class=\"ripple\" for=\"menu-item\" slot=\"container\"></wc-ripple>\n\n <slot name=\"start\" slot=\"start\"></slot>\n <slot name=\"overline\" slot=\"overline\"></slot>\n <slot name=\"headline\" slot=\"headline\"></slot>\n <slot></slot>\n <slot name=\"supporting-text\" slot=\"supporting-text\"></slot>\n <slot\n name=\"trailing-supporting-text\"\n slot=\"trailing-supporting-text\"\n ></slot>\n <slot name=\"end\" slot=\"end\"></slot>\n </wc-item>\n `;\n }\n}\n"],"names":["property","LitElement","html","classMap","ifDefined","nothing","styles","colorStyles","query"],"mappings":"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"}
1
+ {"version":3,"file":"menu-item.js","sources":["../../src/__internal/mixins/NativeButtonMixin.ts","../../src/menu/menu-item/menu-item.ts"],"sourcesContent":["import { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport type { MixinConstructor } from './MixinConstructor.js';\n\n/**\n * 1. Define an interface for the members the mixin adds.\n * This makes the type annotation much cleaner.\n */\nexport interface NativeButtonInterface {\n htmlType: 'button' | 'submit' | 'reset';\n disabled: boolean;\n softDisabled: boolean;\n disabledReason: string;\n form: string;\n name: string;\n value: string;\n}\n\n/**\n * 2. Apply the type annotation to the variable.\n */\nconst NativeButtonMixin: <T extends MixinConstructor<LitElement>>(\n superclass: T,\n) => T & MixinConstructor<NativeButtonInterface> = <\n T extends MixinConstructor<LitElement>,\n>(\n superclass: T,\n) => {\n // Naming the class (BaseButtonElement) instead of using 'Mixin' or anonymous\n // prevents the \"__childPart\" visibility error.\n class ButtonElement extends superclass implements NativeButtonInterface {\n /**\n * The type of the underlying `<button>` element. Maps to the native `type` attribute.\n * Possible values are `\"button\"`, `\"submit\"`, `\"reset\"`. Defaults to `\"button\"`.\n */\n @property({ type: String }) htmlType: 'button' | 'submit' | 'reset' =\n 'button';\n\n /**\n * When `true`, the button is disabled and cannot be interacted with. Reflects to the `disabled` attribute. Defaults to `false`.\n */\n @property({ type: Boolean, reflect: true })\n disabled: boolean = false;\n\n /**\n * When `true`, the button is visually styled as disabled and cannot be interacted with, but remains focusable.\n * Use this in combination with `disabledReason` to communicate why the button is unavailable.\n * Reflects to the `soft-disabled` attribute. Defaults to `false`.\n */\n @property({ type: Boolean, reflect: true, attribute: 'soft-disabled' })\n softDisabled: boolean = false;\n\n /**\n * A human-readable explanation of why the button is disabled or soft-disabled.\n * Rendered as a visually hidden tooltip and linked via `aria-describedby` for accessibility.\n * Maps to the `disabled-reason` attribute.\n */\n @property({ attribute: 'disabled-reason' })\n disabledReason: string = '';\n\n /**\n * The `id` of the `<form>` element to associate the button with.\n * If omitted, the button is associated with its nearest ancestor form.\n * Maps to the native `form` attribute.\n */\n @property()\n form: string = '';\n\n /**\n * The name of the button, submitted as part of a name/value pair when the associated form is submitted.\n * Maps to the native `name` attribute.\n */\n @property()\n name: string = '';\n\n /**\n * The value of the button, submitted as part of a name/value pair when the associated form is submitted.\n * Maps to the native `value` attribute.\n */\n @property()\n value: string = '';\n }\n\n return ButtonElement as T & MixinConstructor<NativeButtonInterface>;\n};\n\nexport default NativeButtonMixin;\n","import { html, LitElement, nothing } from \"lit\";\nimport { property, query } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport styles from \"./menu-item.scss\";\nimport colorStyles from \"./menu-item-colors.scss\";\nimport NativeButtonMixin from \"@/__internal/mixins/NativeButtonMixin.js\";\nimport NativeHyperlinkMixin from \"@/__internal/mixins/NativeHyperlinkMixin.js\";\nimport { isLink } from \"@/__internal/utils/is-link.js\";\nimport IndividualComponent from \"@/IndividualComponent.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\n\n/**\n * @label Menu Item\n * @tag wc-menu-item\n * @rawTag menu-item\n * @summary An item in a menu list.\n * @tags navigation\n *\n * @example\n * ```html\n * <wc-menu-item>Menu Item</wc-menu-item>\n * ```\n */\n@IndividualComponent\nexport class MenuItem extends NativeButtonMixin(\n NativeHyperlinkMixin(LitElement),\n) {\n // ── Static ───────────────────────────────────────────────────────────────\n\n static styles = [styles, colorStyles];\n\n // ── Properties ───────────────────────────────────────────────────────────\n\n /** The value associated with this menu item, used to identify it on selection. */\n @property({ type: String })\n value = \"\";\n\n /** Whether this menu item is currently selected/highlighted. */\n @property({ type: Boolean, reflect: true })\n selected = false;\n\n /** When true, the menu stays open after this item is activated. */\n @property({ type: Boolean, attribute: \"keep-open\" })\n keepOpen = false;\n\n /** When true, indicates this item has an associated submenu. */\n @property({ type: Boolean, attribute: \"has-submenu\" })\n hasSubmenu = false;\n\n /** Whether the associated submenu is currently open. */\n @property({ type: Boolean, attribute: \"submenu-open\" })\n submenuOpen = false;\n\n // ── Queries ───────────────────────────────────────────────────────────────\n\n @query(\"#menu-item\")\n readonly itemElement!: HTMLElement | null;\n\n // ── Private fields ────────────────────────────────────────────────────────\n\n /** MutationObserver that triggers re-render when slotted content changes. */\n private readonly _contentObserver = new MutationObserver(() => {\n this.requestUpdate();\n });\n\n /** Roving tabindex value managed by the parent Menu. */\n private _rovingTabIndex = -1;\n\n connectedCallback() {\n // eslint-disable-next-line wc/guard-super-call\n super.connectedCallback();\n this._contentObserver.observe(this, {\n subtree: true,\n childList: true,\n characterData: true,\n attributes: true,\n attributeFilter: [\"slot\"],\n });\n }\n\n disconnectedCallback() {\n this._contentObserver.disconnect();\n super.disconnectedCallback();\n }\n\n override get tabIndex() {\n return this._rovingTabIndex;\n }\n\n override set tabIndex(value: number) {\n this._rovingTabIndex = value;\n this.requestUpdate();\n }\n\n override focus() {\n this.itemElement?.focus();\n }\n\n override blur() {\n this.itemElement?.blur();\n }\n\n private _hasNamedSlot(...names: string[]) {\n return names.some((name) =>\n Array.from(this.children).some(\n (child) => child.getAttribute(\"slot\") === name,\n )\n );\n }\n\n private _hasDefaultSlot() {\n return Array.from(this.childNodes).some((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n return Boolean(node.textContent?.trim());\n }\n\n return (\n node.nodeType === Node.ELEMENT_NODE &&\n !(node as Element).hasAttribute(\"slot\")\n );\n });\n }\n\n render() {\n const isElementLink = isLink(this);\n const controls = this.getAttribute(\"aria-controls\");\n\n const cssClasses = {\n \"menu-item\": true,\n \"native-button\": !isElementLink,\n \"native-link\": isElementLink,\n };\n\n if (isElementLink) {\n return html`\n <a\n id=\"menu-item\"\n class=\"${classMap(cssClasses)}\"\n role=\"menuitem\"\n href=\"${ifDefined(this.href)}\"\n target=\"${this.target}\"\n ?rel=\"${this.rel}\"\n ?download=\"${this.download}\"\n tabindex=\"${this.disabled ? \"-1\" : String(this.tabIndex)}\"\n ?selected=\"${this.selected}\"\n aria-disabled=\"${this.disabled || this.softDisabled\n ? \"true\"\n : nothing}\"\n aria-haspopup=\"${this.hasSubmenu ? \"menu\" : nothing}\"\n aria-controls=\"${ifDefined(\n this.hasSubmenu && controls ? controls : undefined,\n )}\"\n aria-expanded=\"${ifDefined(\n this.hasSubmenu ? String(this.submenuOpen) : undefined,\n )}\"\n >\n ${this.renderContent()}\n </a>\n `;\n }\n\n return html`\n <button\n id=\"menu-item\"\n class=\"${classMap(cssClasses)}\"\n role=\"menuitem\"\n type=\"${this.htmlType}\"\n ?disabled=\"${this.disabled}\"\n tabindex=\"${String(this.tabIndex)}\"\n ?selected=\"${this.selected}\"\n aria-disabled=\"${this.softDisabled ? \"true\" : nothing}\"\n aria-haspopup=\"${this.hasSubmenu ? \"menu\" : nothing}\"\n aria-controls=\"${ifDefined(\n this.hasSubmenu && controls ? controls : undefined,\n )}\"\n aria-expanded=\"${ifDefined(\n this.hasSubmenu ? String(this.submenuOpen) : undefined,\n )}\"\n >\n ${this.renderContent()}\n </button>\n `;\n }\n\n renderContent() {\n return html`\n <div class=\"menu-item-backdrop-background\"></div>\n <wc-elevation class=\"menu-item-backdrop-elevation\"></wc-elevation>\n\n <wc-item class=\"menu-item-content\">\n <wc-focus-ring\n class=\"focus-ring\"\n for=\"menu-item\"\n slot=\"container\"\n ></wc-focus-ring>\n <div class=\"background\" slot=\"container\"></div>\n <wc-ripple class=\"ripple\" for=\"menu-item\" slot=\"container\"></wc-ripple>\n\n <slot name=\"start\" slot=\"start\"></slot>\n <slot name=\"overline\" slot=\"overline\"></slot>\n <slot name=\"headline\" slot=\"headline\"></slot>\n <slot></slot>\n <slot name=\"supporting-text\" slot=\"supporting-text\"></slot>\n <slot\n name=\"trailing-supporting-text\"\n slot=\"trailing-supporting-text\"\n ></slot>\n <slot name=\"end\" slot=\"end\"></slot>\n </wc-item>\n `;\n }\n}\n"],"names":["property","LitElement","html","classMap","ifDefined","nothing","styles","colorStyles","query"],"mappings":"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"}
package/dist/menu.js CHANGED
@@ -67,23 +67,63 @@ var css_248z = i`* {
67
67
  z-index: 1;
68
68
  width: 100%;
69
69
  }
70
- .menu .menu-content ::slotted(:first-child) {
71
- --menu-item-container-shape-start-start: var(--shape-corner-medium);
72
- --menu-item-container-shape-start-end: var(--shape-corner-medium);
70
+ .menu .menu-content ::slotted([data-position-after-divider]) {
71
+ --menu-item-backdrop-container-shape-start-start: var(
72
+ --shape-corner-small
73
+ );
74
+ --menu-item-backdrop-container-shape-start-end: var(--shape-corner-small);
75
+ --sub-menu-item-backdrop-container-shape-start-start: var(
76
+ --shape-corner-small
77
+ );
78
+ --sub-menu-item-backdrop-container-shape-start-end: var(
79
+ --shape-corner-small
80
+ );
81
+ --menu-item-backdrop-elevation-level-block-start: 1;
73
82
  }
74
- .menu .menu-content ::slotted(:last-child) {
75
- --menu-item-container-shape-end-start: var(--shape-corner-medium);
76
- --menu-item-container-shape-end-end: var(--shape-corner-medium);
83
+ .menu .menu-content ::slotted([data-position-first]) {
84
+ --menu-item-backdrop-container-shape-start-start: var(
85
+ --shape-corner-large
86
+ );
87
+ --menu-item-backdrop-container-shape-start-end: var(--shape-corner-large);
88
+ --sub-menu-item-backdrop-container-shape-start-start: var(
89
+ --shape-corner-large
90
+ );
91
+ --sub-menu-item-backdrop-container-shape-start-end: var(
92
+ --shape-corner-large
93
+ );
94
+ --menu-item-backdrop-elevation-level-block-start: 1;
95
+ }
96
+ .menu .menu-content ::slotted([data-position-before-divider]) {
97
+ --menu-item-backdrop-elevation-level-block-end: 1;
98
+ --menu-item-backdrop-container-shape-end-start: var(--shape-corner-small);
99
+ --menu-item-backdrop-container-shape-end-end: var(--shape-corner-small);
100
+ --sub-menu-item-backdrop-container-shape-end-start: var(
101
+ --shape-corner-small
102
+ );
103
+ --sub-menu-item-backdrop-container-shape-end-end: var(
104
+ --shape-corner-small
105
+ );
106
+ }
107
+ .menu .menu-content ::slotted([data-position-last]) {
108
+ --menu-item-backdrop-elevation-level-block-end: 1;
109
+ --menu-item-backdrop-container-shape-end-start: var(--shape-corner-large);
110
+ --menu-item-backdrop-container-shape-end-end: var(--shape-corner-large);
111
+ --sub-menu-item-backdrop-container-shape-end-start: var(
112
+ --shape-corner-large
113
+ );
114
+ --sub-menu-item-backdrop-container-shape-end-end: var(
115
+ --shape-corner-large
116
+ );
77
117
  }
78
118
  .menu .menu-content ::slotted(wc-divider) {
79
- --divider-spacing: var(--spacing-100);
119
+ --divider-spacing: 1px;
80
120
  padding-inline: var(--spacing-050);
121
+ --divider-color: transparent;
81
122
  }
82
123
  .menu .background {
83
124
  display: block;
84
125
  position: absolute;
85
126
  inset: 0;
86
- border: 1px solid var(--color-red);
87
127
  border-start-start-radius: var(--_container-shape-start-start);
88
128
  border-start-end-radius: var(--_container-shape-start-end);
89
129
  border-end-start-radius: var(--_container-shape-end-start);
@@ -102,12 +142,6 @@ var css_248z = i`* {
102
142
  --_container-shape-start-end: var(--shape-corner-large);
103
143
  --_container-shape-end-start: var(--shape-corner-large);
104
144
  --_container-shape-end-end: var(--shape-corner-large);
105
- }
106
- .menu.variant-standard {
107
- --menu-item-container-color: var(--color-surface-container);
108
- }
109
- .menu.variant-vibrant {
110
- --menu-item-container-color: var(--color-tertiary-container);
111
145
  }`;
112
146
 
113
147
  var Menu_1;
@@ -132,9 +166,9 @@ let Menu = Menu_1 = class Menu extends i$1 {
132
166
  /** Whether the menu is currently visible. */
133
167
  this.open = false;
134
168
  /** Visual variant of the menu. `"vibrant"` applies stronger color emphasis. */
135
- this.variant = 'standard';
169
+ this.variant = "standard";
136
170
  /** ID of the anchor element the menu is positioned relative to. */
137
- this.anchor = '';
171
+ this.anchor = "";
138
172
  /** When true, renders the menu in a static preview state (always visible, no animation). */
139
173
  this.preview = false;
140
174
  /** When true, the menu will not close when a click occurs outside it. */
@@ -144,7 +178,7 @@ let Menu = Menu_1 = class Menu extends i$1 {
144
178
  /** Set to true when this menu is being used as a submenu inside another menu. */
145
179
  this.isSubmenu = false;
146
180
  /** Floating UI placement of the menu relative to its anchor. */
147
- this.placement = 'bottom-start';
181
+ this.placement = "bottom-start";
148
182
  /** Distance in pixels between the menu and its anchor element. */
149
183
  this.offset = 6;
150
184
  /** Index of the currently focused/active item within the enabled items list. */
@@ -153,20 +187,20 @@ let Menu = Menu_1 = class Menu extends i$1 {
153
187
  this.anchorElement = null;
154
188
  /** Controller managing floating-UI positioning. */
155
189
  this._floatingController = new FloatingController(this, {
156
- trigger: 'manual',
190
+ trigger: "manual",
157
191
  closeOnClickOutside: false,
158
- strategy: 'fixed',
159
- onOpenChange: isOpen => {
192
+ strategy: "fixed",
193
+ onOpenChange: (isOpen) => {
160
194
  if (isOpen || !this.open) {
161
195
  return;
162
196
  }
163
- this.close({ kind: 'outside-click' });
197
+ this.close({ kind: "outside-click" });
164
198
  },
165
199
  });
166
200
  /** Element that had focus before the menu opened; restored on close. */
167
201
  this._lastFocusedElement = null;
168
202
  /** Reason that triggered the most recent close, included in the `closed` event detail. */
169
- this._closeReason = { kind: 'programmatic' };
203
+ this._closeReason = { kind: "programmatic" };
170
204
  this._onClick = (event) => {
171
205
  if (!this.open) {
172
206
  return;
@@ -180,7 +214,7 @@ let Menu = Menu_1 = class Menu extends i$1 {
180
214
  if (item.keepOpen) {
181
215
  return;
182
216
  }
183
- this.close({ kind: 'click-selection' });
217
+ this.close({ kind: "click-selection" });
184
218
  };
185
219
  this._onKeyDown = (event) => {
186
220
  if (!this.open) {
@@ -194,33 +228,33 @@ let Menu = Menu_1 = class Menu extends i$1 {
194
228
  this._setActiveItem(eventItem);
195
229
  }
196
230
  switch (event.key) {
197
- case 'ArrowDown':
231
+ case "ArrowDown":
198
232
  event.preventDefault();
199
233
  this._setActiveByOffset(1);
200
234
  break;
201
- case 'ArrowUp':
235
+ case "ArrowUp":
202
236
  event.preventDefault();
203
237
  this._setActiveByOffset(-1);
204
238
  break;
205
- case 'Home':
239
+ case "Home":
206
240
  event.preventDefault();
207
241
  this._setBoundaryActive(0);
208
242
  break;
209
- case 'End': {
243
+ case "End": {
210
244
  event.preventDefault();
211
245
  const last = Math.max(this._enabledItems().length - 1, 0);
212
246
  this._setBoundaryActive(last);
213
247
  break;
214
248
  }
215
- case 'Escape':
249
+ case "Escape":
216
250
  event.preventDefault();
217
- this.close({ kind: 'keydown', key: 'Escape' });
251
+ this.close({ kind: "keydown", key: "Escape" });
218
252
  break;
219
- case 'Tab':
220
- this.close({ kind: 'keydown', key: 'Tab' });
253
+ case "Tab":
254
+ this.close({ kind: "keydown", key: "Tab" });
221
255
  break;
222
- case 'Enter':
223
- case ' ': {
256
+ case "Enter":
257
+ case " ": {
224
258
  event.preventDefault();
225
259
  const activeItem = this._getActiveItem() ?? this._getFirstEnabledItem();
226
260
  if (!activeItem) {
@@ -234,24 +268,25 @@ let Menu = Menu_1 = class Menu extends i$1 {
234
268
  };
235
269
  this._onSlotChange = () => {
236
270
  this._syncRovingTabIndex();
271
+ this._syncItemPositions();
237
272
  };
238
273
  }
239
274
  connectedCallback() {
240
275
  // eslint-disable-next-line wc/guard-super-call
241
276
  super.connectedCallback();
242
- this.setAttribute('role', 'menu');
243
- this.addEventListener('keydown', this._onKeyDown);
244
- this.addEventListener('click', this._onClick);
277
+ this.setAttribute("role", "menu");
278
+ this.addEventListener("keydown", this._onKeyDown);
279
+ this.addEventListener("click", this._onClick);
245
280
  this._syncAnchorAria();
246
281
  }
247
282
  disconnectedCallback() {
248
- this.removeEventListener('keydown', this._onKeyDown);
249
- this.removeEventListener('click', this._onClick);
283
+ this.removeEventListener("keydown", this._onKeyDown);
284
+ this.removeEventListener("click", this._onClick);
250
285
  this._floatingController.close();
251
286
  super.disconnectedCallback();
252
287
  }
253
288
  get items() {
254
- const slot = this.shadowRoot?.querySelector('slot');
289
+ const slot = this.shadowRoot?.querySelector("slot");
255
290
  const elements = slot?.assignedElements({ flatten: true }) ?? [];
256
291
  const items = [];
257
292
  for (const element of elements) {
@@ -271,10 +306,10 @@ let Menu = Menu_1 = class Menu extends i$1 {
271
306
  if (this.open) {
272
307
  return;
273
308
  }
274
- this._closeReason = { kind: 'programmatic' };
309
+ this._closeReason = { kind: "programmatic" };
275
310
  this.open = true;
276
311
  }
277
- close(reason = { kind: 'programmatic' }) {
312
+ close(reason = { kind: "programmatic" }) {
278
313
  if (!this.open) {
279
314
  return;
280
315
  }
@@ -293,7 +328,7 @@ let Menu = Menu_1 = class Menu extends i$1 {
293
328
  return null;
294
329
  }
295
330
  const root = this.getRootNode();
296
- if ('getElementById' in root) {
331
+ if ("getElementById" in root) {
297
332
  return root.getElementById(this.anchor);
298
333
  }
299
334
  return document.getElementById(this.anchor);
@@ -306,12 +341,12 @@ let Menu = Menu_1 = class Menu extends i$1 {
306
341
  if (!this.id) {
307
342
  this.id = `wc-menu-${Math.random().toString(36).slice(2, 9)}`;
308
343
  }
309
- anchorEl.setAttribute('aria-haspopup', 'menu');
310
- anchorEl.setAttribute('aria-controls', this.id);
311
- anchorEl.setAttribute('aria-expanded', String(this.open));
344
+ anchorEl.setAttribute("aria-haspopup", "menu");
345
+ anchorEl.setAttribute("aria-controls", this.id);
346
+ anchorEl.setAttribute("aria-expanded", String(this.open));
312
347
  }
313
348
  _enabledItems() {
314
- return this.items.filter(item => !item.disabled);
349
+ return this.items.filter((item) => !item.disabled);
315
350
  }
316
351
  _syncRovingTabIndex() {
317
352
  const ownedItems = this.items;
@@ -364,7 +399,7 @@ let Menu = Menu_1 = class Menu extends i$1 {
364
399
  }
365
400
  _isEventFromThisMenu(event) {
366
401
  const path = event.composedPath();
367
- const sourceMenu = path.find(target => target instanceof Menu_1);
402
+ const sourceMenu = path.find((target) => target instanceof Menu_1);
368
403
  return sourceMenu === this;
369
404
  }
370
405
  _ownedItemFromEvent(event) {
@@ -375,7 +410,7 @@ let Menu = Menu_1 = class Menu extends i$1 {
375
410
  const ownedItems = this.items;
376
411
  for (const target of path) {
377
412
  if (target instanceof MenuItem) {
378
- const ownedItem = ownedItems.find(item => item === target);
413
+ const ownedItem = ownedItems.find((item) => item === target);
379
414
  if (ownedItem) {
380
415
  return ownedItem;
381
416
  }
@@ -393,12 +428,61 @@ let Menu = Menu_1 = class Menu extends i$1 {
393
428
  this._syncRovingTabIndex();
394
429
  }
395
430
  _dispatchItemActivate(item) {
396
- this.dispatchEvent(new CustomEvent('menu-item-activate', {
431
+ this.dispatchEvent(new CustomEvent("menu-item-activate", {
397
432
  bubbles: true,
398
433
  composed: true,
399
434
  detail: { item },
400
435
  }));
401
436
  }
437
+ _syncItemPositions() {
438
+ const slot = this.shadowRoot?.querySelector("slot");
439
+ const elements = slot?.assignedElements({ flatten: true }) ?? [];
440
+ for (const el of elements) {
441
+ if (el instanceof HTMLElement) {
442
+ el.removeAttribute("data-position-first");
443
+ el.removeAttribute("data-position-last");
444
+ el.removeAttribute("data-position-after-divider");
445
+ el.removeAttribute("data-position-before-divider");
446
+ }
447
+ }
448
+ const items = elements.filter((el) => el.tagName.toLowerCase() !== "wc-divider");
449
+ if (items.length === 0) {
450
+ return;
451
+ }
452
+ const firstItem = items[0];
453
+ if (firstItem instanceof HTMLElement) {
454
+ firstItem.setAttribute("data-position-first", "");
455
+ }
456
+ const lastItem = items[items.length - 1];
457
+ if (lastItem instanceof HTMLElement) {
458
+ lastItem.setAttribute("data-position-last", "");
459
+ }
460
+ for (let i = 0; i < elements.length; i++) {
461
+ const el = elements[i];
462
+ if (el.tagName.toLowerCase() === "wc-divider") {
463
+ let prevItem = null;
464
+ for (let j = i - 1; j >= 0; j--) {
465
+ if (elements[j].tagName.toLowerCase() !== "wc-divider") {
466
+ prevItem = elements[j];
467
+ break;
468
+ }
469
+ }
470
+ if (prevItem instanceof HTMLElement) {
471
+ prevItem.setAttribute("data-position-before-divider", "");
472
+ }
473
+ let nextItem = null;
474
+ for (let j = i + 1; j < elements.length; j++) {
475
+ if (elements[j].tagName.toLowerCase() !== "wc-divider") {
476
+ nextItem = elements[j];
477
+ break;
478
+ }
479
+ }
480
+ if (nextItem instanceof HTMLElement) {
481
+ nextItem.setAttribute("data-position-after-divider", "");
482
+ }
483
+ }
484
+ }
485
+ }
402
486
  _applyPositioning() {
403
487
  if (!this.open || !this.menuListElement) {
404
488
  return;
@@ -410,21 +494,22 @@ let Menu = Menu_1 = class Menu extends i$1 {
410
494
  this._floatingController.setOptions({
411
495
  placement: this.placement,
412
496
  offset: this.offset,
413
- strategy: 'fixed',
497
+ strategy: "fixed",
414
498
  closeOnClickOutside: !this.stayOpenOnOutsideClick,
415
499
  });
416
500
  this._floatingController.setElements(anchorEl, this.menuListElement);
417
501
  this._floatingController.open();
418
502
  }
419
503
  updated(changedProperties) {
420
- if (changedProperties.has('anchor') || changedProperties.has('open')) {
504
+ if (changedProperties.has("anchor") || changedProperties.has("open")) {
421
505
  this._syncAnchorAria();
422
506
  }
423
- if (changedProperties.has('open')) {
507
+ if (changedProperties.has("open")) {
424
508
  if (this.open) {
425
509
  this._lastFocusedElement = document.activeElement;
426
510
  this._syncRovingTabIndex();
427
- this.dispatchEvent(new CustomEvent('opened', {
511
+ this._syncItemPositions();
512
+ this.dispatchEvent(new CustomEvent("opened", {
428
513
  bubbles: true,
429
514
  composed: true,
430
515
  }));
@@ -433,7 +518,7 @@ let Menu = Menu_1 = class Menu extends i$1 {
433
518
  else {
434
519
  this._floatingController.close();
435
520
  const reason = this._closeReason;
436
- this.dispatchEvent(new CustomEvent('close-menu', {
521
+ this.dispatchEvent(new CustomEvent("close-menu", {
437
522
  bubbles: true,
438
523
  composed: true,
439
524
  detail: {
@@ -441,42 +526,45 @@ let Menu = Menu_1 = class Menu extends i$1 {
441
526
  itemPath: [],
442
527
  },
443
528
  }));
444
- this.dispatchEvent(new CustomEvent('closed', {
529
+ this.dispatchEvent(new CustomEvent("closed", {
445
530
  bubbles: true,
446
531
  composed: true,
447
532
  detail: { reason },
448
533
  }));
449
- const shouldRestoreFocus = reason.kind !== 'keydown' || reason.key !== 'Tab';
534
+ const shouldRestoreFocus = reason.kind !== "keydown" ||
535
+ reason.key !== "Tab";
450
536
  if (!this.isSubmenu && shouldRestoreFocus) {
451
537
  this._lastFocusedElement?.focus();
452
538
  }
453
539
  }
454
540
  }
455
- if ((changedProperties.has('open') ||
456
- changedProperties.has('anchor') ||
457
- changedProperties.has('placement') ||
458
- changedProperties.has('offset')) &&
541
+ if ((changedProperties.has("open") ||
542
+ changedProperties.has("anchor") ||
543
+ changedProperties.has("placement") ||
544
+ changedProperties.has("offset")) &&
459
545
  this.open) {
460
546
  this._applyPositioning();
461
547
  }
462
548
  }
463
549
  render() {
464
- return b `<div
465
- class=${e$1({
550
+ return b `
551
+ <div
552
+ class="${e$1({
466
553
  menu: true,
467
554
  open: !this.preview && this.open,
468
555
  closed: !this.preview && !this.open,
469
556
  preview: this.preview,
470
557
  [`variant-${this.variant}`]: true,
471
- })}
472
- aria-hidden=${String(!this.open)}
473
- >
474
- <div class="background"></div>
558
+ })}"
559
+ aria-hidden="${String(!this.open)}"
560
+ >
561
+ <div class="background"></div>
475
562
 
476
- <div class="menu-content">
477
- <slot @slotchange=${this._onSlotChange}></slot>
563
+ <div class="menu-content">
564
+ <slot @slotchange="${this._onSlotChange}"></slot>
565
+ </div>
478
566
  </div>
479
- </div>`;
567
+ `;
480
568
  }
481
569
  };
482
570
  Menu.styles = [css_248z];
@@ -494,13 +582,13 @@ __decorate([
494
582
  n({ type: Boolean, reflect: true })
495
583
  ], Menu.prototype, "preview", void 0);
496
584
  __decorate([
497
- n({ type: Boolean, attribute: 'stay-open-on-outside-click' })
585
+ n({ type: Boolean, attribute: "stay-open-on-outside-click" })
498
586
  ], Menu.prototype, "stayOpenOnOutsideClick", void 0);
499
587
  __decorate([
500
- n({ type: Boolean, attribute: 'stay-open-on-focusout' })
588
+ n({ type: Boolean, attribute: "stay-open-on-focusout" })
501
589
  ], Menu.prototype, "stayOpenOnFocusout", void 0);
502
590
  __decorate([
503
- n({ type: Boolean, attribute: 'is-submenu' })
591
+ n({ type: Boolean, attribute: "is-submenu" })
504
592
  ], Menu.prototype, "isSubmenu", void 0);
505
593
  __decorate([
506
594
  n({ type: String })
@@ -512,7 +600,7 @@ __decorate([
512
600
  r()
513
601
  ], Menu.prototype, "activeIndex", void 0);
514
602
  __decorate([
515
- e('.menu')
603
+ e(".menu")
516
604
  ], Menu.prototype, "menuListElement", void 0);
517
605
  Menu = Menu_1 = __decorate([
518
606
  IndividualComponent