From 9375304e1a4e31fe4bba66a81b7ec9deb9f4b5c7 Mon Sep 17 00:00:00 2001 From: robonen Date: Wed, 10 Jun 2026 16:16:12 +0700 Subject: [PATCH] feat(navigation-menu): enhance context handling and lifecycle management --- docs/modules/extractor/extract.ts | 17 +- .../src/aspect-ratio/AspectRatio.vue | 5 +- .../aspect-ratio/__test__/AspectRatio.test.ts | 12 + .../src/calendar/CalendarCellTrigger.vue | 14 +- vue/primitives/src/calendar/CalendarRoot.vue | 3 +- .../src/calendar/__test__/Calendar.test.ts | 107 +++++++ ...should-be-called-only-once--warnings-1.png | Bin 0 -> 2082 bytes .../src/calendar/__test__/date-utils.test.ts | 8 + vue/primitives/src/calendar/date-utils.ts | 10 + vue/primitives/src/calendar/utils.ts | 13 +- .../collection/__test__/useCollection.test.ts | 106 +++++++ .../src/collection/useCollection.ts | 38 ++- .../src/combobox/ComboboxContentImpl.vue | 14 +- vue/primitives/src/combobox/ComboboxInput.vue | 4 +- vue/primitives/src/combobox/ComboboxItem.vue | 9 +- vue/primitives/src/combobox/ComboboxRoot.vue | 37 +-- .../src/combobox/__test__/Combobox.test.ts | 228 ++++++++++++++ vue/primitives/src/combobox/utils.ts | 3 + .../src/context-menu/ContextMenuTrigger.vue | 13 +- .../context-menu/__test__/ContextMenu.test.ts | 175 +++++++++++ .../dismissable-layer/DismissableLayer.vue | 29 +- .../__test__/DismissableLayer.test.ts | 97 ++++++ .../src/dropdown-menu/DropdownMenuContent.vue | 10 +- .../src/dropdown-menu/DropdownMenuTrigger.vue | 15 +- .../__test__/DropdownMenu.test.ts | 146 +++++++++ .../src/editable/EditableCancelTrigger.vue | 1 + .../src/editable/EditableEditTrigger.vue | 1 + vue/primitives/src/editable/EditableInput.vue | 2 +- .../src/editable/EditablePreview.vue | 2 +- vue/primitives/src/editable/EditableRoot.vue | 20 +- .../src/editable/EditableSubmitTrigger.vue | 1 + .../src/editable/__test__/Editable.test.ts | 102 +++++++ vue/primitives/src/menu/MenuCheckboxItem.vue | 8 +- vue/primitives/src/menu/MenuContentImpl.vue | 19 +- vue/primitives/src/menu/MenuItem.vue | 9 +- vue/primitives/src/menu/MenuItemImpl.vue | 10 +- vue/primitives/src/menu/MenuRadioItem.vue | 8 +- .../src/menu/MenuRootContentModal.vue | 2 +- .../src/menu/MenuRootContentNonModal.vue | 2 +- vue/primitives/src/menu/MenuSubTrigger.vue | 16 +- vue/primitives/src/menu/__test__/Menu.test.ts | 277 ++++++++++++++++++ .../navigation-menu/NavigationMenuContent.vue | 17 +- .../NavigationMenuContentImpl.vue | 19 +- .../navigation-menu/NavigationMenuRoot.vue | 4 +- .../src/navigation-menu/NavigationMenuSub.vue | 3 +- .../navigation-menu/NavigationMenuTrigger.vue | 39 ++- .../NavigationMenu.regression.test.ts | 200 +++++++++++++ vue/primitives/src/navigation-menu/utils.ts | 8 + .../src/tags-input/TagsInputInput.vue | 5 +- .../src/tags-input/TagsInputItem.vue | 2 +- .../src/tags-input/__test__/TagsInput.test.ts | 69 +++++ vue/primitives/src/tags-input/demo.vue | 75 ++--- vue/primitives/src/toolbar/ToolbarRoot.vue | 23 +- .../src/toolbar/ToolbarSeparator.vue | 3 +- .../src/toolbar/__test__/Toolbar.test.ts | 116 +++++++- 55 files changed, 1997 insertions(+), 179 deletions(-) create mode 100644 vue/primitives/src/calendar/__test__/Calendar.test.ts create mode 100644 vue/primitives/src/calendar/__test__/__screenshots__/Calendar.test.ts/Calendar-mounts-cell-triggers-without--expose---should-be-called-only-once--warnings-1.png create mode 100644 vue/primitives/src/collection/__test__/useCollection.test.ts create mode 100644 vue/primitives/src/combobox/__test__/Combobox.test.ts create mode 100644 vue/primitives/src/context-menu/__test__/ContextMenu.test.ts create mode 100644 vue/primitives/src/dropdown-menu/__test__/DropdownMenu.test.ts create mode 100644 vue/primitives/src/menu/__test__/Menu.test.ts create mode 100644 vue/primitives/src/navigation-menu/__test__/NavigationMenu.regression.test.ts diff --git a/docs/modules/extractor/extract.ts b/docs/modules/extractor/extract.ts index 8dce030..035c6bd 100644 --- a/docs/modules/extractor/extract.ts +++ b/docs/modules/extractor/extract.ts @@ -154,11 +154,26 @@ function getDescription(jsdocs: JSDoc[], tags: JSDocTag[]): string { return ''; } +/** + * Example text straight from the tag SOURCE. `getCommentText()` runs through + * the TS JSDoc parser, which strips each line's leading whitespace — code + * indentation is gone. Instead take the raw tag text and remove only the + * comment scaffolding (`@example` head, per-line ` * ` prefixes). + */ +function rawExampleText(tag: JSDocTag): string { + return tag.getText() + .replace(/^@example[ \t]?/, '') + .split('\n') + .map(line => line.replace(/^\s*\*(?: |\/\s*$)?/, '')) + .join('\n') + .replace(/\s*\*?\/?\s*$/, ''); +} + function getExamples(tags: JSDocTag[]): string[] { return tags .filter(t => t.getTagName() === 'example') .map((t) => { - let text = t.getCommentText()?.trim() ?? ''; + let text = rawExampleText(t).trim(); // A leading `…` (JSDoc example title) isn't valid code — // turn it into a leading comment so the snippet stays clean & highlightable. let caption = ''; diff --git a/vue/primitives/src/aspect-ratio/AspectRatio.vue b/vue/primitives/src/aspect-ratio/AspectRatio.vue index f3227ba..b0cfe3b 100644 --- a/vue/primitives/src/aspect-ratio/AspectRatio.vue +++ b/vue/primitives/src/aspect-ratio/AspectRatio.vue @@ -17,6 +17,7 @@ export interface AspectRatioProps extends PrimitiveProps {