diff --git a/bun.lock b/bun.lock index 83407c53..2215a535 100644 --- a/bun.lock +++ b/bun.lock @@ -688,7 +688,7 @@ }, "packages/ui": { "name": "@wrnexus/ui", - "version": "0.8.60", + "version": "0.8.61", "dependencies": { "@wrnexus/core": "workspace:*", }, diff --git a/packages/ui/components/select.wrn b/packages/ui/components/select.wrn index b53ebcda..3b029963 100644 --- a/packages/ui/components/select.wrn +++ b/packages/ui/components/select.wrn @@ -57,7 +57,7 @@ size: string = "default" {#if !multiple}{/if} {#each options as option}{/each} - {#if !multiple}{/if} + {#if !multiple}{/if} {#if variant === "floating"}{label}{/if} {#if helperText}{helperText}{/if} @@ -79,7 +79,11 @@ size: string = "default" .wrn-next__select-indicator { position: absolute; - right: 0.85rem; + inset-inline-end: 0.85rem; + top: 50%; + transform: translateY(-50%); + width: 1rem; + height: 1rem; color: var(--wrn-color-muted); pointer-events: none; } diff --git a/packages/ui/package.json b/packages/ui/package.json index 864d5789..ef7feacc 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@wrnexus/ui", - "version": "0.8.60", + "version": "0.8.61", "private": true, "type": "module", "main": "src/index.ts", diff --git a/packages/ui/test/ui.test.ts b/packages/ui/test/ui.test.ts index df4c7361..de199b4b 100644 --- a/packages/ui/test/ui.test.ts +++ b/packages/ui/test/ui.test.ts @@ -1372,6 +1372,26 @@ test("basic fields suppress native popups and render package constraint messages expect(selectSource).toContain("wrn-next__select-indicator"); }); +test("Select renders its own directional indicator without app icon CSS", async () => { + const source = readFileSync(uiComponentPath("Select"), "utf8"); + const dom = mountHtml( + await renderComponent(source, { + name: "method", + value: "totp", + options: [{ label: "Authenticator app", value: "totp" }], + }), + ); + const indicator = dom.querySelector("svg.wrn-next__select-indicator"); + expect(indicator?.getAttribute("width")).toBe("16"); + expect(indicator?.getAttribute("height")).toBe("16"); + expect(indicator?.getAttribute("aria-hidden")).toBe("true"); + expect(indicator?.querySelector("path")?.getAttribute("d")).toBe("m6 9 6 6 6-6"); + expect(source).toContain("inset-inline-end: 0.85rem"); + expect(source).not.toContain("icon-[lucide--chevron-down]"); + const multiple = mountHtml(await renderComponent(source, { multiple: true })); + expect(multiple.querySelector(".wrn-next__select-indicator")).toBeNull(); +}); + test("OTP inputs accept six digits and show custom inline errors without native popups", async () => { const source = readFileSync(uiComponentPath("Input"), "utf8"); const dom = mountHtml(