diff --git a/.sync/nuxt-ui.json b/.sync/nuxt-ui.json index cc416c11..ff498a5c 100644 --- a/.sync/nuxt-ui.json +++ b/.sync/nuxt-ui.json @@ -1717,8 +1717,8 @@ "summary": "fix(SelectMenu): prevent search input focus on open with `autofocus: false` (nuxt/ui #6905) — PORT, verbatim. FocusScope trapped focuses the first focusable descendant when the menu opens, which is the search input, regardless of what searchInput.autofocus says — so :search-input=\"{ autofocus: false }\" had no effect on open and the virtual keyboard came up anyway on touch devices. Fix intercepts the scope's own event: onMountAutoFocus calls event.preventDefault() when searchInputProps.value.autofocus === false, bound as @mount-auto-focus on the FocusScope, plus a line on the searchInput prop doc and a ::note in the docs page. Our pre-image is upstream's — FocusScope trapped data-slot=\"focusScope\" with no handler, function onClear() immediately followed by const viewportRef = useTemplateRef('viewportRef') which is upstream's insertion point, and the docs page carries the same anchor paragraph with ### Content after it; only the standing ui -> b24ui class-binding rewrite applies (§1). The searchInput doc comment differs in its example ({ placeholder: 'Search...', type: 'text', size: 'md' } here against upstream's { placeholder: 'Search...', variant: 'none' }), a long-standing divergence, and the new sentence appends after it either way. TESTS COVER LESS THAN THEY LOOK, and that is the finding of this port. Upstream's two cases port structurally with one selector change — this fork puts data-slot=\"input\" on the control itself where upstream puts it on a wrapper, so [data-slot=\"input\"] input matches nothing here and becomes input[data-slot=\"input\"]; left as upstream wrote it the assertion fails on an empty wrapper rather than on the behaviour. The ported handler is NOT covered here and this was measured, not assumed: three mutations — removing @mount-auto-focus, inverting the condition to !== false, and calling preventDefault() unconditionally — all leave both tests green, and instrumenting onMountAutoFocus with a counter shows it called ZERO times, because reka's FocusScope does not emit mountAutoFocus under happy-dom. Read stage by stage, focus is BODY after mount, DIV[data-slot=root] after flushPromises, and INPUT[data-slot=input] only after a macrotask and only when autofocus is not false — so focus never lands on the input via FocusScope in this environment; it arrives from Input.vue's own autofocus, which is why upstream's symptom does not reproduce under happy-dom at all. The tests are not vacuous but guard a different thing: they pin the observable contract (searchInput: { autofocus: false } leaves the input unfocused on open) through the Input.vue path — verified by rewriting props.autofocus to true in Input.vue, which turns one of them red. The port is still right: in a real browser FocusScope does focus the first focusable descendant, so upstream's bug reproduces here too and the test environment merely cannot run that path; the handler is correct by construction and costs nothing. What is not claimed is coverage — the comment on the test block says so in as many words, so a later reader does not mistake green for verified." }, "12722057b3974acee4789f6a34aab05a18f6e835": { - "pr": "pending-merge", - "b24ui_sha": "pending-merge", + "pr": 534, + "b24ui_sha": "19fe6cdf252d5efec6e9d73935ca3da4cc24e989", "decision": "port", "summary": "docs: fix raw markdown served to agents (nuxt/ui #6914) — PORT, partial: the stringifier fix applies here, the nuxt-agent-discovery half does not. The reflex answer was a third skip and it would have been wrong. Its two predecessors on that line ARE skips — 9ef3ee39 built upstream's agent-discovery surface and ae243116 refactored it into the nuxt-agent-discovery module, neither of which this fork has — but reading the diff rather than the subject splits this one in two. Half is the module (bumping nuxt-agent-discovery ^0.1.1 -> ^0.4.0, deleting the prerenderRoutes() calls that fed it, moving its contentFilters), and none of that exists here. The other half fixes two defects in minimark/stringify, which THIS FORK USES TOO through the same call in docs/server/routes/raw/[...slug].md.get.ts: stringify({...page.body, type:'minimark'}, {format:'markdown/html'}). Both defects measured against our own installed minimark rather than inferred — a `table` node comes out as a literal