fix(ui): allow trigger-anchored dropdowns on mobile

This commit is contained in:
Clintchiz committed 2026-08-26 21:06:35 +05:30
1 parent 9d90418490
commit b1db287f2a
4 files changed
+27 -4

No files matched your search

+1 -1
View File
@@ -688,7 +688,7 @@
}, },
"packages/ui": { "packages/ui": {
"name": "@wrnexus/ui", "name": "@wrnexus/ui",
"version": "0.8.64", "version": "0.8.65",
"dependencies": { "dependencies": {
"@wrnexus/core": "workspace:*", "@wrnexus/core": "workspace:*",
}, },
+3 -1
View File
@@ -17,6 +17,7 @@ items: unknown[] = []
showChevron: boolean = true showChevron: boolean = true
menuLabel: string = "Dropdown menu" menuLabel: string = "Dropdown menu"
placement: string = "bottom-start" placement: string = "bottom-start"
mobilePanel: string = "sheet"
width: string = "md" width: string = "md"
size: string = "default" size: string = "default"
color: string = "primary" color: string = "primary"
@@ -151,6 +152,7 @@ items: unknown[] = []
data-ui-component="Dropdown" data-ui-component="Dropdown"
data-open='{open || visible ? "true" : "false"}' data-open='{open || visible ? "true" : "false"}'
data-placement='{placement}' data-placement='{placement}'
data-mobile-panel='{mobilePanel}'
data-width='{width}' data-width='{width}'
data-size='{size}' data-size='{size}'
data-color='{color}' data-color='{color}'
@@ -572,7 +574,7 @@ items: unknown[] = []
} }
@media (max-width: 639px) { @media (max-width: 639px) {
.wrn-dropdown[data-placement] .wrn-dropdown__panel { .wrn-dropdown[data-placement][data-mobile-panel="sheet"] .wrn-dropdown__panel {
position: fixed; position: fixed;
right: 0.75rem; right: 0.75rem;
bottom: 0.75rem; bottom: 0.75rem;
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@wrnexus/ui", "name": "@wrnexus/ui",
"version": "0.8.64", "version": "0.8.65",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "src/index.ts", "main": "src/index.ts",
@@ -8,6 +8,25 @@ import { Window } from "happy-dom";
const source = (name: string) => readFileSync(uiComponentPath(name), "utf8"); const source = (name: string) => readFileSync(uiComponentPath(name), "utf8");
describe("account shell UI regressions", () => { describe("account shell UI regressions", () => {
test("Dropdown allows anchored mobile menus without changing existing sheet defaults", async () => {
for (const mobilePanel of [undefined, "dropdown", "sheet"]) {
const dom = mountHtml(
await renderComponent(source("Dropdown"), {
label: "User",
placement: "bottom-end",
...(mobilePanel ? { mobilePanel } : {}),
}),
);
expect(dom.querySelector(".wrn-dropdown")?.getAttribute("data-mobile-panel")).toBe(
mobilePanel ?? "sheet",
);
(dom.querySelector(".wrn-dropdown__trigger") as HTMLButtonElement).click();
expect(dom.querySelector(".wrn-dropdown__panel")?.hasAttribute("hidden")).toBe(false);
}
expect(source("Dropdown")).not.toContain(
".wrn-dropdown[data-placement] .wrn-dropdown__panel {",
);
});
test("Dropdown is natively hidden before CSS or hydration and still toggles afterward", async () => { test("Dropdown is natively hidden before CSS or hydration and still toggles afterward", async () => {
for (const props of [{}, { open: true }, { defaultOpen: true }]) { for (const props of [{}, { open: true }, { defaultOpen: true }]) {
const html = await renderComponent(source("Dropdown"), { label: "User", ...props }); const html = await renderComponent(source("Dropdown"), { label: "User", ...props });
@@ -189,7 +208,9 @@ describe("account shell UI regressions", () => {
/\.wrn-sidebar__icon\s*\{[^}]*width: 1.05rem;[^}]*height: 1.05rem;/s, /\.wrn-sidebar__icon\s*\{[^}]*width: 1.05rem;[^}]*height: 1.05rem;/s,
); );
expect(source("Sidebar")).toContain("margin-inline-start"); expect(source("Sidebar")).toContain("margin-inline-start");
expect(source("Dropdown")).toContain(".wrn-dropdown[data-placement] .wrn-dropdown__panel"); expect(source("Dropdown")).toContain(
'.wrn-dropdown[data-placement][data-mobile-panel="sheet"] .wrn-dropdown__panel',
);
expect(source("Footer")).toMatch(/\.wrn-footer__copyright-left\s*\{\s*grid-column: 1;/); expect(source("Footer")).toMatch(/\.wrn-footer__copyright-left\s*\{\s*grid-column: 1;/);
expect(source("Footer")).toMatch(/\.wrn-footer__copyright-right\s*\{\s*grid-column: 3;/); expect(source("Footer")).toMatch(/\.wrn-footer__copyright-right\s*\{\s*grid-column: 3;/);
}); });