From 93eb274d5980d637c13011f6fd80c721c68440ff Mon Sep 17 00:00:00 2001 From: LuLaValva Date: Wed, 12 Aug 2026 08:56:15 -0700 Subject: [PATCH 1/2] feat(evo-menu): replace @item separator with @group attribute tag Adds <@group> to evo-menu and evo-menu-button: each group has its own selected/selectedChange and nested <@item> tags, with separators rendered automatically between groups. Top-level items render first as an implicit group sharing the menu-level selected. selected now also accepts null (single-select with nothing selected), and default item values are unique across the whole menu so roving focus works across groups. Co-Authored-By: Claude Fable 5 --- .changeset/hungry-melons-repeat.md | 5 + .../evo-menu-button/examples/groups.marko | 16 + .../evo-menu-button/examples/separator.marko | 13 - .../src/tags/evo-menu-button/index.marko | 6 +- .../evo-menu-button/menu-button.stories.ts | 9 +- .../test/__snapshots__/test.server.ts.snap | 290 +++++------ .../tags/evo-menu-button/test/test.server.ts | 6 +- .../tags/evo-menu/examples/controlled.marko | 25 + .../src/tags/evo-menu/examples/groups.marko | 13 + .../tags/evo-menu/examples/separator.marko | 8 - .../evo-marko/src/tags/evo-menu/index.marko | 111 +++-- .../src/tags/evo-menu/menu.stories.ts | 35 +- .../test/__snapshots__/test.server.ts.snap | 471 +++++++++++++++++- .../src/tags/evo-menu/test/test.browser.ts | 135 ++++- .../src/tags/evo-menu/test/test.server.ts | 27 +- 15 files changed, 915 insertions(+), 255 deletions(-) create mode 100644 .changeset/hungry-melons-repeat.md create mode 100644 packages/evo-marko/src/tags/evo-menu-button/examples/groups.marko delete mode 100644 packages/evo-marko/src/tags/evo-menu-button/examples/separator.marko create mode 100644 packages/evo-marko/src/tags/evo-menu/examples/controlled.marko create mode 100644 packages/evo-marko/src/tags/evo-menu/examples/groups.marko delete mode 100644 packages/evo-marko/src/tags/evo-menu/examples/separator.marko diff --git a/.changeset/hungry-melons-repeat.md b/.changeset/hungry-melons-repeat.md new file mode 100644 index 00000000000..b1bd231ed1f --- /dev/null +++ b/.changeset/hungry-melons-repeat.md @@ -0,0 +1,5 @@ +--- +"@evo-web/marko": minor +--- + +BREAKING: `` / ``: replace the `separator` attribute on `<@item>` with a new `<@group>` attribute tag. Each `<@group>` accepts its own `selected`/`selectedChange` and nested `<@item>` tags, and adjacent groups are divided by separators automatically. Top-level `<@item>` tags may be combined with `<@group>` tags and always render first, sharing the menu-level `selected`. `selected` (on the menu or a `<@group>`) now also accepts `null`, meaning single-select with nothing selected yet, whereas omitting `selected` means the items are not selectable. diff --git a/packages/evo-marko/src/tags/evo-menu-button/examples/groups.marko b/packages/evo-marko/src/tags/evo-menu-button/examples/groups.marko new file mode 100644 index 00000000000..ea4c0f689e2 --- /dev/null +++ b/packages/evo-marko/src/tags/evo-menu-button/examples/groups.marko @@ -0,0 +1,16 @@ + + + + eBay Menu groups + <@group selected:=sortSelected> + <@item value="price-low">Price: low to high + <@item value="price-high">Price: high to low + + <@group selected:=formatSelected> + <@item value="shipping-free">Free shipping + <@item value="buy-it-now">Buy It Now + <@item value="auction">Auction + + diff --git a/packages/evo-marko/src/tags/evo-menu-button/examples/separator.marko b/packages/evo-marko/src/tags/evo-menu-button/examples/separator.marko deleted file mode 100644 index 0dfc150cf17..00000000000 --- a/packages/evo-marko/src/tags/evo-menu-button/examples/separator.marko +++ /dev/null @@ -1,13 +0,0 @@ - - eBay Menu separator - <@item>item 1 - <@item>item 2 - <@item separator/> - <@item>item 3 - <@item>item 4 - <@item separator/> - <@item>item 5 - <@item>item 6 - diff --git a/packages/evo-marko/src/tags/evo-menu-button/index.marko b/packages/evo-marko/src/tags/evo-menu-button/index.marko index 750bca1d47f..35c3a155907 100644 --- a/packages/evo-marko/src/tags/evo-menu-button/index.marko +++ b/packages/evo-marko/src/tags/evo-menu-button/index.marko @@ -38,6 +38,7 @@ export interface Input< disabled, variant, item: items, + group: groups, label, selected: inputSelected, selectedChange, @@ -75,7 +76,7 @@ export interface Input< tagName = FilterChip; isSelected = Array.isArray(selected) ? selected.length > 0 - : selected !== -1; + : selected != null && selected !== -1; } else { tagName = Button; split = inputSplit; @@ -156,5 +157,6 @@ export interface Input< onClick() { if (collapseOnSelect) open = false; } - item=items/> + item=items + group=groups/> diff --git a/packages/evo-marko/src/tags/evo-menu-button/menu-button.stories.ts b/packages/evo-marko/src/tags/evo-menu-button/menu-button.stories.ts index d670185b83e..6d4f2b9cc6a 100644 --- a/packages/evo-marko/src/tags/evo-menu-button/menu-button.stories.ts +++ b/packages/evo-marko/src/tags/evo-menu-button/menu-button.stories.ts @@ -10,8 +10,8 @@ import IconTemplate from "./examples/icon-with-text.marko"; import IconTemplateCode from "./examples/icon-with-text.marko?raw"; import TypeaheadTemplate from "./examples/typeahead.marko"; import TypeaheadTemplateCode from "./examples/typeahead.marko?raw"; -import SeparatorTemplate from "./examples/separator.marko"; -import SeparatorTemplateCode from "./examples/separator.marko?raw"; +import GroupsTemplate from "./examples/groups.marko"; +import GroupsTemplateCode from "./examples/groups.marko?raw"; import PrefixLabelTemplate from "./examples/prefix-label.marko"; import PrefixLabelTemplateCode from "./examples/prefix-label.marko?raw"; import FilterTemplate from "./examples/filter.marko"; @@ -143,10 +143,7 @@ export const Default = buildExtensionTemplate( DefaultTemplateCode, ); export const IconText = buildExtensionTemplate(IconTemplate, IconTemplateCode); -export const Separator = buildExtensionTemplate( - SeparatorTemplate, - SeparatorTemplateCode, -); +export const Groups = buildExtensionTemplate(GroupsTemplate, GroupsTemplateCode); export const Typeahead = buildExtensionTemplate( TypeaheadTemplate, TypeaheadTemplateCode, diff --git a/packages/evo-marko/src/tags/evo-menu-button/test/__snapshots__/test.server.ts.snap b/packages/evo-marko/src/tags/evo-menu-button/test/__snapshots__/test.server.ts.snap index 92a2c61defb..56a2649a14f 100644 --- a/packages/evo-marko/src/tags/evo-menu-button/test/__snapshots__/test.server.ts.snap +++ b/packages/evo-marko/src/tags/evo-menu-button/test/__snapshots__/test.server.ts.snap @@ -42,7 +42,6 @@ exports[`menu-button > renders basic version 1`] = ` id="GENERATED-1" role="menu" > -