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(