feat(ui): add workspace customization and simplify navigation

This commit is contained in:
poyrazavsever
2026-07-17 12:47:54 +03:00
parent b04031a3e3
commit dafd9eb344
24 changed files with 855 additions and 224 deletions
+57 -1
View File
@@ -6,6 +6,11 @@ const repoRoot = process.cwd();
const packageJson = JSON.parse(fs.readFileSync(path.join(repoRoot, "package.json"), "utf8"));
const globalsCss = fs.readFileSync(path.join(repoRoot, "app/globals.css"), "utf8");
const appShell = fs.readFileSync(path.join(repoRoot, "components/layout/app-shell.tsx"), "utf8");
const rootLayout = fs.readFileSync(path.join(repoRoot, "app/layout.tsx"), "utf8");
const settingsPage = fs.readFileSync(
path.join(repoRoot, "app/(dashboard)/settings/page.tsx"),
"utf8",
);
assert.match(packageJson.dependencies["poyraz-ui"] ?? "", /^\^?3\./, "poyraz-ui must use major v3");
assert.match(
@@ -22,7 +27,6 @@ for (const component of [
"SidebarProvider",
"SidebarPanel",
"SidebarHeader",
"SidebarBranding",
"SidebarContent",
"SidebarMenu",
"SidebarMenuItem",
@@ -33,6 +37,58 @@ for (const component of [
assert.ok(appShell.includes(component), `App shell must compose the Poyraz ${component} organism`);
}
assert.ok(appShell.includes("WorkspaceLogo"), "Sidebar header must render the workspace logo");
assert.ok(
appShell.includes('<SidebarProvider variant="default">'),
"Desktop sidebar must use the fixed-width Poyraz default variant",
);
assert.ok(
!appShell.includes('<SidebarProvider variant="collapsible">'),
"Desktop sidebar must not be collapsible",
);
assert.ok(!appShell.includes("SidebarRail"), "Desktop sidebar must not expose a collapse rail");
assert.doesNotMatch(
appShell,
/<DropdownMenuItem(?=[^>]*\basChild\b)(?=[^>]*\bmedia=)[^>]*>/s,
"Poyraz DropdownMenuItem must not combine asChild with rich media because Radix cannot inject accessibility props into the generated Fragment",
);
assert.doesNotMatch(
appShell,
/<DropdownMenuItem[^>]*\binteractiveMotion=/s,
"Poyraz UI 3.0.2 leaks DropdownMenuItem interactiveMotion to the DOM",
);
assert.match(settingsPage, /\bRadioGroup\b/, "Settings must use the Poyraz RadioGroup for theme selection");
for (const workspaceControl of [
'name="workspaceName"',
'name="logo"',
'name="primaryColor"',
]) {
assert.ok(
settingsPage.includes(workspaceControl),
`Settings must expose workspace branding control ${workspaceControl}`,
);
}
for (const colorMode of ["light", "dark", "system"]) {
assert.ok(
settingsPage.includes(`value: "${colorMode}"`),
`Settings must expose the ${colorMode} color mode`,
);
}
assert.ok(
rootLayout.includes("COLOR_MODE_COOKIE"),
"Root layout must resolve the persisted color mode before rendering",
);
assert.ok(
appShell.includes("ColorModeSync"),
"Authenticated shells must synchronize the database-backed color mode",
);
assert.ok(
fs.existsSync(path.join(repoRoot, "server/settings/preferences.ts")),
"Missing database-backed user preferences service",
);
const requiredSystemCompositions = [
"components/system/page-header.tsx",
"components/system/feedback-state.tsx",