minutework 0.1.40 → 0.1.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/EXTERNAL_ALPHA.md +17 -1
- package/README.md +21 -1
- package/assets/claude-local/bundle.json +2 -1
- package/assets/claude-local/preambles/base.md +13 -0
- package/assets/claude-local/preambles/mobile.md +17 -0
- package/assets/claude-local/preambles/tenant.md +17 -0
- package/assets/claude-local/preambles/vuilder.md +29 -0
- package/assets/claude-local/skills/README.md +5 -0
- package/assets/claude-local/skills/app-pack-authoring/SKILL.md +15 -0
- package/assets/claude-local/skills/generated-workspace-architecture/SKILL.md +25 -9
- package/assets/claude-local/skills/shell-architecture/SKILL.md +15 -0
- package/assets/claude-local/skills/vuilder-public-site-authoring/SKILL.md +10 -4
- package/assets/claude-local/skills/vuilder-workspace-architecture/SKILL.md +78 -0
- package/assets/templates/vuilder-public-site/.env.example +13 -0
- package/assets/templates/vuilder-public-site/README.md +15 -0
- package/assets/templates/vuilder-public-site/eslint.config.mjs +6 -0
- package/assets/templates/vuilder-public-site/next-env.d.ts +4 -0
- package/assets/templates/vuilder-public-site/next.config.mjs +28 -0
- package/assets/templates/vuilder-public-site/package.json +40 -0
- package/assets/templates/vuilder-public-site/postcss.config.mjs +5 -0
- package/assets/templates/vuilder-public-site/src/app/api/onboarding/start/route.ts +19 -0
- package/assets/templates/vuilder-public-site/src/app/blog/[slug]/page.tsx +25 -0
- package/assets/templates/vuilder-public-site/src/app/blog/page.tsx +26 -0
- package/assets/templates/vuilder-public-site/src/app/globals.css +103 -0
- package/assets/templates/vuilder-public-site/src/app/layout.tsx +18 -0
- package/assets/templates/vuilder-public-site/src/app/onboarding/[[...step]]/page.tsx +39 -0
- package/assets/templates/vuilder-public-site/src/app/page.tsx +43 -0
- package/assets/templates/vuilder-public-site/src/lib/env.server.test.ts +47 -0
- package/assets/templates/vuilder-public-site/src/lib/env.server.ts +92 -0
- package/assets/templates/vuilder-public-site/src/lib/platform.server.ts +47 -0
- package/assets/templates/vuilder-public-site/src/lib/public-dj.server.ts +86 -0
- package/assets/templates/vuilder-public-site/src/lib/public-dj.test.ts +8 -0
- package/assets/templates/vuilder-public-site/src/lib/routes.test.ts +13 -0
- package/assets/templates/vuilder-public-site/src/lib/routes.ts +12 -0
- package/assets/templates/vuilder-public-site/template.json +21 -0
- package/assets/templates/vuilder-public-site/test/server-only-stub.ts +1 -0
- package/assets/templates/vuilder-public-site/tools/env/check-dev-env.mjs +109 -0
- package/assets/templates/vuilder-public-site/tools/env/check-dev-env.test.ts +49 -0
- package/assets/templates/vuilder-public-site/tools/template/validate-template.mjs +44 -0
- package/assets/templates/vuilder-public-site/tsconfig.json +23 -0
- package/assets/templates/vuilder-public-site/vitest.config.ts +15 -0
- package/assets/templates/vuilder-shell/.env.example +8 -0
- package/assets/templates/vuilder-shell/.storybook/main.ts +19 -0
- package/assets/templates/vuilder-shell/.storybook/preview.tsx +38 -0
- package/assets/templates/vuilder-shell/README.md +49 -0
- package/assets/templates/vuilder-shell/components.json +21 -0
- package/assets/templates/vuilder-shell/eslint.config.mjs +41 -0
- package/assets/templates/vuilder-shell/next-env.d.ts +6 -0
- package/assets/templates/vuilder-shell/next.config.mjs +33 -0
- package/assets/templates/vuilder-shell/package.json +61 -0
- package/assets/templates/vuilder-shell/postcss.config.mjs +8 -0
- package/assets/templates/vuilder-shell/public/.gitkeep +1 -0
- package/assets/templates/vuilder-shell/src/app/api/auth/accept-shell-session/route.test.ts +105 -0
- package/assets/templates/vuilder-shell/src/app/api/auth/accept-shell-session/route.ts +63 -0
- package/assets/templates/vuilder-shell/src/app/api/auth/logout/route.test.ts +63 -0
- package/assets/templates/vuilder-shell/src/app/api/auth/logout/route.ts +24 -0
- package/assets/templates/vuilder-shell/src/app/api/auth/session/route.test.ts +70 -0
- package/assets/templates/vuilder-shell/src/app/api/auth/session/route.ts +27 -0
- package/assets/templates/vuilder-shell/src/app/app/layout.tsx +17 -0
- package/assets/templates/vuilder-shell/src/app/app/page.tsx +30 -0
- package/assets/templates/vuilder-shell/src/app/blog/[slug]/page.tsx +15 -0
- package/assets/templates/vuilder-shell/src/app/blog/page.tsx +15 -0
- package/assets/templates/vuilder-shell/src/app/docs/[...slug]/page.tsx +15 -0
- package/assets/templates/vuilder-shell/src/app/docs/page.tsx +15 -0
- package/assets/templates/vuilder-shell/src/app/globals.css +70 -0
- package/assets/templates/vuilder-shell/src/app/layout.tsx +69 -0
- package/assets/templates/vuilder-shell/src/app/login/route.test.ts +33 -0
- package/assets/templates/vuilder-shell/src/app/login/route.ts +21 -0
- package/assets/templates/vuilder-shell/src/app/page.tsx +16 -0
- package/assets/templates/vuilder-shell/src/app/pricing/page.tsx +15 -0
- package/assets/templates/vuilder-shell/src/app/providers.tsx +25 -0
- package/assets/templates/vuilder-shell/src/app/robots.ts +21 -0
- package/assets/templates/vuilder-shell/src/app/sitemap.ts +33 -0
- package/assets/templates/vuilder-shell/src/app/w/[workspace_slug]/connect/page.tsx +31 -0
- package/assets/templates/vuilder-shell/src/app/w/[workspace_slug]/page.tsx +54 -0
- package/assets/templates/vuilder-shell/src/components/ui/button.tsx +59 -0
- package/assets/templates/vuilder-shell/src/components/ui/input.tsx +21 -0
- package/assets/templates/vuilder-shell/src/design-system/docs/governance.mdx +26 -0
- package/assets/templates/vuilder-shell/src/design-system/patterns/panel-frame.stories.tsx +48 -0
- package/assets/templates/vuilder-shell/src/design-system/patterns/panel-frame.tsx +26 -0
- package/assets/templates/vuilder-shell/src/design-system/patterns/status-badge.stories.tsx +26 -0
- package/assets/templates/vuilder-shell/src/design-system/patterns/status-badge.tsx +35 -0
- package/assets/templates/vuilder-shell/src/design-system/patterns/theme-mode-toggle.stories.tsx +21 -0
- package/assets/templates/vuilder-shell/src/design-system/patterns/theme-mode-toggle.tsx +75 -0
- package/assets/templates/vuilder-shell/src/design-system/primitives/button.stories.tsx +37 -0
- package/assets/templates/vuilder-shell/src/design-system/primitives/button.ts +1 -0
- package/assets/templates/vuilder-shell/src/design-system/primitives/input.stories.tsx +26 -0
- package/assets/templates/vuilder-shell/src/design-system/primitives/input.ts +1 -0
- package/assets/templates/vuilder-shell/src/design-system/recipes/chrome.ts +28 -0
- package/assets/templates/vuilder-shell/src/design-system/tokens/foundation.css +31 -0
- package/assets/templates/vuilder-shell/src/design-system/tokens/index.css +3 -0
- package/assets/templates/vuilder-shell/src/design-system/tokens/manifest.json +85 -0
- package/assets/templates/vuilder-shell/src/design-system/tokens/manifest.ts +87 -0
- package/assets/templates/vuilder-shell/src/design-system/tokens/semantic.css +105 -0
- package/assets/templates/vuilder-shell/src/design-system/tokens/theme.css +59 -0
- package/assets/templates/vuilder-shell/src/design-system/tokens/tokens.stories.tsx +71 -0
- package/assets/templates/vuilder-shell/src/features/dashboard/components/tenant-dashboard.tsx +134 -0
- package/assets/templates/vuilder-shell/src/features/public-shell/components/static-public-page.tsx +58 -0
- package/assets/templates/vuilder-shell/src/features/shell/components/authenticated-app-layout-shell.tsx +84 -0
- package/assets/templates/vuilder-shell/src/features/shell/components/private-app-shell.tsx +22 -0
- package/assets/templates/vuilder-shell/src/features/vuilder-shell/components/vuilder-connect-screen.tsx +89 -0
- package/assets/templates/vuilder-shell/src/features/vuilder-shell/components/vuilder-workspace-screen.tsx +49 -0
- package/assets/templates/vuilder-shell/src/lib/app-routes.test.ts +37 -0
- package/assets/templates/vuilder-shell/src/lib/app-routes.ts +86 -0
- package/assets/templates/vuilder-shell/src/lib/auth-routes.server.test.ts +26 -0
- package/assets/templates/vuilder-shell/src/lib/auth-routes.server.ts +53 -0
- package/assets/templates/vuilder-shell/src/lib/http/same-origin.test.ts +23 -0
- package/assets/templates/vuilder-shell/src/lib/http/same-origin.ts +18 -0
- package/assets/templates/vuilder-shell/src/lib/platform/client.server.test.ts +201 -0
- package/assets/templates/vuilder-shell/src/lib/platform/client.server.ts +540 -0
- package/assets/templates/vuilder-shell/src/lib/platform/contracts.ts +190 -0
- package/assets/templates/vuilder-shell/src/lib/platform/endpoints.server.ts +29 -0
- package/assets/templates/vuilder-shell/src/lib/platform/env.server.ts +82 -0
- package/assets/templates/vuilder-shell/src/lib/platform/route-response.ts +33 -0
- package/assets/templates/vuilder-shell/src/lib/platform/session.server.ts +145 -0
- package/assets/templates/vuilder-shell/src/lib/public-site.test.ts +20 -0
- package/assets/templates/vuilder-shell/src/lib/public-site.ts +48 -0
- package/assets/templates/vuilder-shell/src/lib/theme-config.ts +10 -0
- package/assets/templates/vuilder-shell/src/lib/theme.tsx +159 -0
- package/assets/templates/vuilder-shell/src/lib/utils.ts +6 -0
- package/assets/templates/vuilder-shell/template.json +28 -0
- package/assets/templates/vuilder-shell/template.schema.json +171 -0
- package/assets/templates/vuilder-shell/test/server-only-stub.ts +1 -0
- package/assets/templates/vuilder-shell/tools/design-system/build-token-manifest.mjs +3 -0
- package/assets/templates/vuilder-shell/tools/design-system/check-imports.mjs +9 -0
- package/assets/templates/vuilder-shell/tools/design-system/check-stories.mjs +9 -0
- package/assets/templates/vuilder-shell/tools/design-system/check-values.mjs +9 -0
- package/assets/templates/vuilder-shell/tools/design-system/checks.mjs +238 -0
- package/assets/templates/vuilder-shell/tools/design-system/eslint-plugin-design-system.mjs +184 -0
- package/assets/templates/vuilder-shell/tools/design-system/playwright.config.mjs +34 -0
- package/assets/templates/vuilder-shell/tools/design-system/run-checks.mjs +22 -0
- package/assets/templates/vuilder-shell/tools/design-system/shared.mjs +166 -0
- package/assets/templates/vuilder-shell/tools/design-system/visual.spec.ts +41 -0
- package/assets/templates/vuilder-shell/tools/template/validate-route-contract.mjs +373 -0
- package/assets/templates/vuilder-shell/tools/template/validate-template.mjs +45 -0
- package/assets/templates/vuilder-shell/tools/template/with-public-site-fixture.mjs +45 -0
- package/assets/templates/vuilder-shell/tsconfig.json +42 -0
- package/assets/templates/vuilder-shell/vitest.config.ts +23 -0
- package/dist/auth.js +97 -31
- package/dist/auth.js.map +1 -1
- package/dist/deploy-state.d.ts +1 -0
- package/dist/deploy-state.js.map +1 -1
- package/dist/deploy.js +18 -4
- package/dist/deploy.js.map +1 -1
- package/dist/developer-client.d.ts +2 -1
- package/dist/developer-client.js.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/init-prompt.js +21 -13
- package/dist/init-prompt.js.map +1 -1
- package/dist/init.d.ts +3 -1
- package/dist/init.js +105 -13
- package/dist/init.js.map +1 -1
- package/dist/orchestrator-context.js +17 -5
- package/dist/orchestrator-context.js.map +1 -1
- package/dist/orchestrator-state.d.ts +2 -2
- package/dist/orchestrator-state.js.map +1 -1
- package/dist/publish.js +12 -2
- package/dist/publish.js.map +1 -1
- package/dist/sandbox.js +11 -1
- package/dist/sandbox.js.map +1 -1
- package/dist/state.d.ts +2 -0
- package/dist/state.js +9 -0
- package/dist/state.js.map +1 -1
- package/dist/workspace-assets.d.ts +13 -0
- package/dist/workspace-assets.js +86 -5
- package/dist/workspace-assets.js.map +1 -1
- package/dist/workspace-bootstrap.d.ts +47 -2
- package/dist/workspace-bootstrap.js +45 -1
- package/dist/workspace-bootstrap.js.map +1 -1
- package/package.json +3 -3
- package/vendor/workspace-mcp/context.d.ts +3 -1
- package/vendor/workspace-mcp/context.js +134 -21
- package/vendor/workspace-mcp/context.js.map +1 -1
- package/vendor/workspace-mcp/types.d.ts +72 -7
- package/vendor/workspace-mcp/types.js +8 -4
- package/vendor/workspace-mcp/types.js.map +1 -1
- package/assets/templates/fastapi-sidecar/poetry.lock +0 -757
- package/assets/templates/next-tenant-app/package-lock.json +0 -9682
- package/assets/templates/next-tenant-app/pnpm-lock.yaml +0 -6062
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
4
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
5
|
+
|
|
6
|
+
import { cn } from "@/lib/utils";
|
|
7
|
+
|
|
8
|
+
const buttonVariants = cva(
|
|
9
|
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
|
|
10
|
+
{
|
|
11
|
+
variants: {
|
|
12
|
+
variant: {
|
|
13
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/90",
|
|
14
|
+
destructive:
|
|
15
|
+
"bg-destructive text-white hover:bg-destructive/90 dark:bg-destructive/60",
|
|
16
|
+
outline:
|
|
17
|
+
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
|
|
18
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
|
|
19
|
+
ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
|
|
20
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
21
|
+
},
|
|
22
|
+
size: {
|
|
23
|
+
default: "h-9 px-4 py-2 has-[>svg]:px-3",
|
|
24
|
+
sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
|
|
25
|
+
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
|
|
26
|
+
icon: "size-9",
|
|
27
|
+
"icon-sm": "size-8",
|
|
28
|
+
"icon-lg": "size-10",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
defaultVariants: {
|
|
32
|
+
variant: "default",
|
|
33
|
+
size: "default",
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
function Button({
|
|
39
|
+
className,
|
|
40
|
+
variant,
|
|
41
|
+
size,
|
|
42
|
+
asChild = false,
|
|
43
|
+
...props
|
|
44
|
+
}: React.ComponentProps<"button"> &
|
|
45
|
+
VariantProps<typeof buttonVariants> & {
|
|
46
|
+
asChild?: boolean;
|
|
47
|
+
}) {
|
|
48
|
+
const Comp = asChild ? Slot : "button";
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<Comp
|
|
52
|
+
data-slot="button"
|
|
53
|
+
className={cn(buttonVariants({ variant, size, className }))}
|
|
54
|
+
{...props}
|
|
55
|
+
/>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { Button, buttonVariants };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
import { cn } from "@/lib/utils";
|
|
4
|
+
|
|
5
|
+
function Input({ className, type, ...props }: React.ComponentProps<"input">) {
|
|
6
|
+
return (
|
|
7
|
+
<input
|
|
8
|
+
type={type}
|
|
9
|
+
data-slot="input"
|
|
10
|
+
className={cn(
|
|
11
|
+
"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 dark:bg-input/30 md:text-sm",
|
|
12
|
+
"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
|
|
13
|
+
"aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
|
|
14
|
+
className,
|
|
15
|
+
)}
|
|
16
|
+
{...props}
|
|
17
|
+
/>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { Input };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Meta } from "@storybook/addon-docs/blocks";
|
|
2
|
+
|
|
3
|
+
<Meta title="Design System/Governance" />
|
|
4
|
+
|
|
5
|
+
# Governance
|
|
6
|
+
|
|
7
|
+
The design system lives under `src/design-system` and is the only public visual API for application code.
|
|
8
|
+
|
|
9
|
+
## Import contract
|
|
10
|
+
|
|
11
|
+
- Allowed in route and feature code: `@/design-system/primitives/*`, `@/design-system/patterns/*`, `@/design-system/recipes/*`, and `@/design-system/tokens/manifest`.
|
|
12
|
+
- Forbidden outside `src/design-system`: `@/components/ui/*`, `@radix-ui/*`, and direct raw token CSS imports.
|
|
13
|
+
|
|
14
|
+
## Authoring rules
|
|
15
|
+
|
|
16
|
+
- Literal color values belong only in `src/design-system/tokens`.
|
|
17
|
+
- Route and feature code compose primitives and patterns instead of creating one-off inline visual systems.
|
|
18
|
+
- Inline styles are allowed only for CSS variable references or truly dynamic layout values.
|
|
19
|
+
- Reused UI should be promoted into `src/design-system/patterns`.
|
|
20
|
+
|
|
21
|
+
## Enforcement
|
|
22
|
+
|
|
23
|
+
- `pnpm validate` runs template validation, type generation, token regeneration, `pnpm design-system:check`, and the app test/build pipeline.
|
|
24
|
+
- `pnpm design-system:check` validates imports, raw values, and story coverage.
|
|
25
|
+
- `pnpm build-storybook` keeps documentation coverage intact.
|
|
26
|
+
- `pnpm design-system:visual` is optional for local visual baselines, but `tools/design-system/__screenshots__/` is not shipped in the canonical template bundle.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/nextjs-vite";
|
|
2
|
+
|
|
3
|
+
import { Button } from "@/design-system/primitives/button";
|
|
4
|
+
import { PanelFrame } from "@/design-system/patterns/panel-frame";
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
title: "Design System/Patterns/Panel Frame",
|
|
8
|
+
component: PanelFrame,
|
|
9
|
+
tags: ["autodocs"],
|
|
10
|
+
} satisfies Meta<typeof PanelFrame>;
|
|
11
|
+
|
|
12
|
+
export default meta;
|
|
13
|
+
|
|
14
|
+
type Story = StoryObj<typeof meta>;
|
|
15
|
+
|
|
16
|
+
export const Raised: Story = {
|
|
17
|
+
render: () => (
|
|
18
|
+
<PanelFrame tone="raised" className="w-96 space-y-4">
|
|
19
|
+
<div className="space-y-1">
|
|
20
|
+
<p className="text-xs font-semibold uppercase tracking-wide text-muted-foreground">
|
|
21
|
+
Tenant thread
|
|
22
|
+
</p>
|
|
23
|
+
<h3 className="text-lg font-semibold text-foreground">Missing rent receipt</h3>
|
|
24
|
+
<p className="text-sm text-muted-foreground">
|
|
25
|
+
Keep recurring workspace panels visually consistent across login, command, and status
|
|
26
|
+
surfaces.
|
|
27
|
+
</p>
|
|
28
|
+
</div>
|
|
29
|
+
<div className="flex gap-2">
|
|
30
|
+
<Button size="sm">Follow up</Button>
|
|
31
|
+
<Button size="sm" variant="outline">
|
|
32
|
+
Open details
|
|
33
|
+
</Button>
|
|
34
|
+
</div>
|
|
35
|
+
</PanelFrame>
|
|
36
|
+
),
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const Sidebar: Story = {
|
|
40
|
+
render: () => (
|
|
41
|
+
<PanelFrame tone="sidebar" radius="none" className="w-80 space-y-3 border-l">
|
|
42
|
+
<h3 className="text-sm font-semibold text-foreground">Shell surface</h3>
|
|
43
|
+
<p className="text-sm text-muted-foreground">
|
|
44
|
+
Use the sidebar tone for docked navigation or support surfaces.
|
|
45
|
+
</p>
|
|
46
|
+
</PanelFrame>
|
|
47
|
+
),
|
|
48
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
import { type VariantProps } from "class-variance-authority";
|
|
4
|
+
|
|
5
|
+
import { panelFrameVariants } from "@/design-system/recipes/chrome";
|
|
6
|
+
import { cn } from "@/lib/utils";
|
|
7
|
+
|
|
8
|
+
type PanelFrameProps = React.ComponentProps<"div"> &
|
|
9
|
+
VariantProps<typeof panelFrameVariants>;
|
|
10
|
+
|
|
11
|
+
function PanelFrame({
|
|
12
|
+
className,
|
|
13
|
+
tone,
|
|
14
|
+
radius,
|
|
15
|
+
padding,
|
|
16
|
+
...props
|
|
17
|
+
}: PanelFrameProps) {
|
|
18
|
+
return (
|
|
19
|
+
<div
|
|
20
|
+
className={cn(panelFrameVariants({ tone, radius, padding }), className)}
|
|
21
|
+
{...props}
|
|
22
|
+
/>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { PanelFrame, panelFrameVariants };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/nextjs-vite";
|
|
2
|
+
|
|
3
|
+
import { StatusBadge } from "@/design-system/patterns/status-badge";
|
|
4
|
+
|
|
5
|
+
const meta = {
|
|
6
|
+
title: "Design System/Patterns/Status Badge",
|
|
7
|
+
component: StatusBadge,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
} satisfies Meta<typeof StatusBadge>;
|
|
10
|
+
|
|
11
|
+
export default meta;
|
|
12
|
+
|
|
13
|
+
type Story = StoryObj<typeof meta>;
|
|
14
|
+
|
|
15
|
+
export const AllTones: Story = {
|
|
16
|
+
render: () => (
|
|
17
|
+
<div className="flex flex-wrap gap-2">
|
|
18
|
+
<StatusBadge tone="default">Draft</StatusBadge>
|
|
19
|
+
<StatusBadge tone="primary">AI suggested</StatusBadge>
|
|
20
|
+
<StatusBadge tone="success">Completed</StatusBadge>
|
|
21
|
+
<StatusBadge tone="warning">Needs review</StatusBadge>
|
|
22
|
+
<StatusBadge tone="danger">Failed</StatusBadge>
|
|
23
|
+
<StatusBadge tone="info">Queued</StatusBadge>
|
|
24
|
+
</div>
|
|
25
|
+
),
|
|
26
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
4
|
+
|
|
5
|
+
import { cn } from "@/lib/utils";
|
|
6
|
+
|
|
7
|
+
const statusBadgeVariants = cva(
|
|
8
|
+
"inline-flex items-center rounded px-2 py-0.5 text-xs font-medium",
|
|
9
|
+
{
|
|
10
|
+
variants: {
|
|
11
|
+
tone: {
|
|
12
|
+
default: "bg-muted text-muted-foreground",
|
|
13
|
+
primary: "bg-primary/15 text-text-link",
|
|
14
|
+
success: "bg-success/20 text-success",
|
|
15
|
+
warning: "bg-warning/20 text-warning",
|
|
16
|
+
danger: "bg-danger/20 text-danger",
|
|
17
|
+
info: "bg-info/20 text-info",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
defaultVariants: {
|
|
21
|
+
tone: "default",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
type StatusBadgeProps = React.ComponentProps<"span"> &
|
|
27
|
+
VariantProps<typeof statusBadgeVariants>;
|
|
28
|
+
|
|
29
|
+
function StatusBadge({ className, tone, ...props }: StatusBadgeProps) {
|
|
30
|
+
return (
|
|
31
|
+
<span className={cn(statusBadgeVariants({ tone }), className)} {...props} />
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export { StatusBadge, statusBadgeVariants };
|
package/assets/templates/vuilder-shell/src/design-system/patterns/theme-mode-toggle.stories.tsx
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/nextjs-vite";
|
|
2
|
+
|
|
3
|
+
import { ThemeModeToggle } from "@/design-system/patterns/theme-mode-toggle";
|
|
4
|
+
|
|
5
|
+
const meta = {
|
|
6
|
+
title: "Design System/Patterns/Theme Mode Toggle",
|
|
7
|
+
component: ThemeModeToggle,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
} satisfies Meta<typeof ThemeModeToggle>;
|
|
10
|
+
|
|
11
|
+
export default meta;
|
|
12
|
+
|
|
13
|
+
type Story = StoryObj<typeof meta>;
|
|
14
|
+
|
|
15
|
+
export const Default: Story = {
|
|
16
|
+
render: () => (
|
|
17
|
+
<div className="w-80 rounded-xl border border-border bg-surface p-4">
|
|
18
|
+
<ThemeModeToggle />
|
|
19
|
+
</div>
|
|
20
|
+
),
|
|
21
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
|
|
5
|
+
import { Monitor, Moon, Sun } from "lucide-react";
|
|
6
|
+
|
|
7
|
+
import { Button } from "@/design-system/primitives/button";
|
|
8
|
+
import { useTheme } from "@/lib/theme";
|
|
9
|
+
import { cn } from "@/lib/utils";
|
|
10
|
+
|
|
11
|
+
type ThemeMode = "light" | "dark" | "system";
|
|
12
|
+
|
|
13
|
+
const themeOptions: Array<{
|
|
14
|
+
icon: React.ComponentType<{ className?: string }>;
|
|
15
|
+
label: string;
|
|
16
|
+
value: ThemeMode;
|
|
17
|
+
}> = [
|
|
18
|
+
{ icon: Sun, label: "Light", value: "light" },
|
|
19
|
+
{ icon: Moon, label: "Dark", value: "dark" },
|
|
20
|
+
{ icon: Monitor, label: "System", value: "system" },
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
export function ThemeModeToggle({
|
|
24
|
+
className,
|
|
25
|
+
}: React.ComponentProps<"section">) {
|
|
26
|
+
const { resolvedTheme, setTheme, theme } = useTheme();
|
|
27
|
+
const [mounted, setMounted] = React.useState(false);
|
|
28
|
+
|
|
29
|
+
React.useEffect(() => {
|
|
30
|
+
setMounted(true);
|
|
31
|
+
}, []);
|
|
32
|
+
|
|
33
|
+
const activeTheme = mounted ? ((theme ?? "system") as ThemeMode) : "system";
|
|
34
|
+
const resolvedLabel = mounted
|
|
35
|
+
? activeTheme === "system"
|
|
36
|
+
? `Following your OS: ${resolvedTheme ?? "light"}`
|
|
37
|
+
: `Locked to ${activeTheme}`
|
|
38
|
+
: "Loading preference";
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<section className={cn("space-y-2", className)}>
|
|
42
|
+
<div className="space-y-0.5">
|
|
43
|
+
<p className="text-xs font-semibold uppercase tracking-wide text-muted-foreground">
|
|
44
|
+
Theme
|
|
45
|
+
</p>
|
|
46
|
+
<p className="text-xs text-muted-foreground">{resolvedLabel}</p>
|
|
47
|
+
</div>
|
|
48
|
+
<div className="grid grid-cols-3 gap-1 rounded-xl border border-border bg-muted/60 p-1">
|
|
49
|
+
{themeOptions.map(({ icon: Icon, label, value }) => {
|
|
50
|
+
const isActive = activeTheme === value;
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<Button
|
|
54
|
+
key={value}
|
|
55
|
+
type="button"
|
|
56
|
+
size="sm"
|
|
57
|
+
variant="ghost"
|
|
58
|
+
aria-pressed={isActive}
|
|
59
|
+
onClick={() => setTheme(value)}
|
|
60
|
+
className={cn(
|
|
61
|
+
"h-8 justify-center gap-1.5 rounded-lg border px-2 text-xs",
|
|
62
|
+
isActive
|
|
63
|
+
? "border-primary/20 bg-primary/10 text-text-link shadow-sm hover:bg-primary/15 hover:text-text-link dark:border-primary/40 dark:bg-primary dark:text-primary-foreground dark:hover:bg-primary/90 dark:hover:text-primary-foreground"
|
|
64
|
+
: "border-transparent text-muted-foreground hover:bg-background hover:text-foreground dark:hover:bg-surface-raised",
|
|
65
|
+
)}
|
|
66
|
+
>
|
|
67
|
+
<Icon className="size-3.5" />
|
|
68
|
+
<span>{label}</span>
|
|
69
|
+
</Button>
|
|
70
|
+
);
|
|
71
|
+
})}
|
|
72
|
+
</div>
|
|
73
|
+
</section>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/nextjs-vite";
|
|
2
|
+
import { ArrowRight } from "lucide-react";
|
|
3
|
+
|
|
4
|
+
import { Button } from "@/design-system/primitives/button";
|
|
5
|
+
|
|
6
|
+
const meta = {
|
|
7
|
+
title: "Design System/Primitives/Button",
|
|
8
|
+
component: Button,
|
|
9
|
+
tags: ["autodocs"],
|
|
10
|
+
args: {
|
|
11
|
+
children: "Send follow-up",
|
|
12
|
+
},
|
|
13
|
+
} satisfies Meta<typeof Button>;
|
|
14
|
+
|
|
15
|
+
export default meta;
|
|
16
|
+
|
|
17
|
+
type Story = StoryObj<typeof meta>;
|
|
18
|
+
|
|
19
|
+
export const Primary: Story = {};
|
|
20
|
+
|
|
21
|
+
export const Outline: Story = {
|
|
22
|
+
args: {
|
|
23
|
+
variant: "outline",
|
|
24
|
+
children: "Review details",
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const WithIcon: Story = {
|
|
29
|
+
args: {
|
|
30
|
+
children: (
|
|
31
|
+
<>
|
|
32
|
+
Assign owner
|
|
33
|
+
<ArrowRight className="size-4" />
|
|
34
|
+
</>
|
|
35
|
+
),
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Button, buttonVariants } from "@/components/ui/button";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/nextjs-vite";
|
|
2
|
+
|
|
3
|
+
import { Input } from "@/design-system/primitives/input";
|
|
4
|
+
|
|
5
|
+
const meta = {
|
|
6
|
+
title: "Design System/Primitives/Input",
|
|
7
|
+
component: Input,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
args: {
|
|
10
|
+
placeholder: "Search tenants or tasks",
|
|
11
|
+
className: "w-72",
|
|
12
|
+
},
|
|
13
|
+
} satisfies Meta<typeof Input>;
|
|
14
|
+
|
|
15
|
+
export default meta;
|
|
16
|
+
|
|
17
|
+
type Story = StoryObj<typeof meta>;
|
|
18
|
+
|
|
19
|
+
export const Default: Story = {};
|
|
20
|
+
|
|
21
|
+
export const Invalid: Story = {
|
|
22
|
+
args: {
|
|
23
|
+
defaultValue: "late invoice",
|
|
24
|
+
"aria-invalid": true,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Input } from "@/components/ui/input";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { cva } from "class-variance-authority";
|
|
2
|
+
|
|
3
|
+
export const panelFrameVariants = cva("border border-border text-foreground", {
|
|
4
|
+
variants: {
|
|
5
|
+
tone: {
|
|
6
|
+
surface: "bg-surface",
|
|
7
|
+
raised: "bg-surface-raised",
|
|
8
|
+
sidebar: "bg-sidebar",
|
|
9
|
+
floating: "bg-surface shadow-xl",
|
|
10
|
+
},
|
|
11
|
+
radius: {
|
|
12
|
+
none: "rounded-none",
|
|
13
|
+
lg: "rounded-lg",
|
|
14
|
+
xl: "rounded-xl",
|
|
15
|
+
},
|
|
16
|
+
padding: {
|
|
17
|
+
none: "",
|
|
18
|
+
sm: "p-3",
|
|
19
|
+
md: "p-4",
|
|
20
|
+
lg: "p-6",
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
defaultVariants: {
|
|
24
|
+
tone: "surface",
|
|
25
|
+
radius: "lg",
|
|
26
|
+
padding: "md",
|
|
27
|
+
},
|
|
28
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--ds-foundation-white: #ffffff;
|
|
3
|
+
--ds-foundation-neutral-50: #f7f8fb;
|
|
4
|
+
--ds-foundation-neutral-100: #e5e7eb;
|
|
5
|
+
--ds-foundation-neutral-200: #d7dce5;
|
|
6
|
+
--ds-foundation-neutral-500: #6b7280;
|
|
7
|
+
--ds-foundation-neutral-600: #4b5563;
|
|
8
|
+
--ds-foundation-neutral-700: #2a2d35;
|
|
9
|
+
--ds-foundation-neutral-800: #22262f;
|
|
10
|
+
--ds-foundation-neutral-850: #1a1d23;
|
|
11
|
+
--ds-foundation-neutral-900: #111316;
|
|
12
|
+
--ds-foundation-neutral-950: #0b0d0f;
|
|
13
|
+
--ds-foundation-ink-500: #183247;
|
|
14
|
+
--ds-foundation-ink-700: #102233;
|
|
15
|
+
--ds-foundation-cyan-50: #eef9fd;
|
|
16
|
+
--ds-foundation-cyan-100: #d9f1fb;
|
|
17
|
+
--ds-foundation-cyan-200: #b7e4f3;
|
|
18
|
+
--ds-foundation-cyan-300: #89d4f0;
|
|
19
|
+
--ds-foundation-violet-300: #a78bfa;
|
|
20
|
+
--ds-foundation-violet-500: #7c3aed;
|
|
21
|
+
--ds-foundation-violet-700: #2d1f7a;
|
|
22
|
+
--ds-foundation-cyan-500: #0ea5e9;
|
|
23
|
+
--ds-foundation-cyan-600: #0284c7;
|
|
24
|
+
--ds-foundation-cyan-700: #0f6787;
|
|
25
|
+
--ds-foundation-green-500: #22c55e;
|
|
26
|
+
--ds-foundation-blue-500: #3b82f6;
|
|
27
|
+
--ds-foundation-yellow-500: #f59e0b;
|
|
28
|
+
--ds-foundation-red-500: #ef4444;
|
|
29
|
+
--ds-foundation-overlay-50: rgb(0 0 0 / 0.5);
|
|
30
|
+
--ds-foundation-overlay-60: rgb(0 0 0 / 0.6);
|
|
31
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"foundation": {
|
|
3
|
+
"ds-foundation-white": "#ffffff",
|
|
4
|
+
"ds-foundation-neutral-50": "#f7f8fb",
|
|
5
|
+
"ds-foundation-neutral-100": "#e5e7eb",
|
|
6
|
+
"ds-foundation-neutral-200": "#d7dce5",
|
|
7
|
+
"ds-foundation-neutral-500": "#6b7280",
|
|
8
|
+
"ds-foundation-neutral-600": "#4b5563",
|
|
9
|
+
"ds-foundation-neutral-700": "#2a2d35",
|
|
10
|
+
"ds-foundation-neutral-800": "#22262f",
|
|
11
|
+
"ds-foundation-neutral-850": "#1a1d23",
|
|
12
|
+
"ds-foundation-neutral-900": "#111316",
|
|
13
|
+
"ds-foundation-neutral-950": "#0b0d0f",
|
|
14
|
+
"ds-foundation-ink-500": "#183247",
|
|
15
|
+
"ds-foundation-ink-700": "#102233",
|
|
16
|
+
"ds-foundation-cyan-50": "#eef9fd",
|
|
17
|
+
"ds-foundation-cyan-100": "#d9f1fb",
|
|
18
|
+
"ds-foundation-cyan-200": "#b7e4f3",
|
|
19
|
+
"ds-foundation-cyan-300": "#89d4f0",
|
|
20
|
+
"ds-foundation-violet-300": "#a78bfa",
|
|
21
|
+
"ds-foundation-violet-500": "#7c3aed",
|
|
22
|
+
"ds-foundation-violet-700": "#2d1f7a",
|
|
23
|
+
"ds-foundation-cyan-500": "#0ea5e9",
|
|
24
|
+
"ds-foundation-cyan-600": "#0284c7",
|
|
25
|
+
"ds-foundation-cyan-700": "#0f6787",
|
|
26
|
+
"ds-foundation-green-500": "#22c55e",
|
|
27
|
+
"ds-foundation-blue-500": "#3b82f6",
|
|
28
|
+
"ds-foundation-yellow-500": "#f59e0b",
|
|
29
|
+
"ds-foundation-red-500": "#ef4444",
|
|
30
|
+
"ds-foundation-overlay-50": "rgb(0 0 0 / 0.5)",
|
|
31
|
+
"ds-foundation-overlay-60": "rgb(0 0 0 / 0.6)"
|
|
32
|
+
},
|
|
33
|
+
"semantic": {
|
|
34
|
+
"background": "var(--ds-foundation-neutral-950)",
|
|
35
|
+
"foreground": "var(--ds-foundation-neutral-100)",
|
|
36
|
+
"card": "var(--ds-foundation-neutral-850)",
|
|
37
|
+
"card-foreground": "var(--ds-foundation-neutral-100)",
|
|
38
|
+
"popover": "var(--ds-foundation-neutral-850)",
|
|
39
|
+
"popover-foreground": "var(--ds-foundation-neutral-100)",
|
|
40
|
+
"primary": "var(--ds-foundation-cyan-500)",
|
|
41
|
+
"primary-foreground": "var(--ds-foundation-white)",
|
|
42
|
+
"secondary": "var(--ds-foundation-neutral-800)",
|
|
43
|
+
"secondary-foreground": "var(--ds-foundation-neutral-100)",
|
|
44
|
+
"muted": "var(--ds-foundation-neutral-850)",
|
|
45
|
+
"muted-foreground": "var(--ds-foundation-neutral-500)",
|
|
46
|
+
"accent": "var(--ds-foundation-ink-700)",
|
|
47
|
+
"accent-foreground": "var(--ds-foundation-neutral-100)",
|
|
48
|
+
"destructive": "var(--ds-foundation-red-500)",
|
|
49
|
+
"destructive-foreground": "var(--ds-foundation-white)",
|
|
50
|
+
"border": "var(--ds-foundation-neutral-700)",
|
|
51
|
+
"input": "var(--ds-foundation-neutral-800)",
|
|
52
|
+
"ring": "var(--ds-foundation-cyan-500)",
|
|
53
|
+
"chart-1": "var(--ds-foundation-cyan-500)",
|
|
54
|
+
"chart-2": "var(--ds-foundation-green-500)",
|
|
55
|
+
"chart-3": "var(--ds-foundation-blue-500)",
|
|
56
|
+
"chart-4": "var(--ds-foundation-yellow-500)",
|
|
57
|
+
"chart-5": "var(--ds-foundation-red-500)",
|
|
58
|
+
"radius": "0.5rem",
|
|
59
|
+
"sidebar": "var(--ds-foundation-neutral-900)",
|
|
60
|
+
"sidebar-foreground": "var(--ds-foundation-neutral-100)",
|
|
61
|
+
"sidebar-primary": "var(--ds-foundation-cyan-500)",
|
|
62
|
+
"sidebar-primary-foreground": "var(--ds-foundation-white)",
|
|
63
|
+
"sidebar-accent": "var(--ds-foundation-neutral-800)",
|
|
64
|
+
"sidebar-accent-foreground": "var(--ds-foundation-neutral-100)",
|
|
65
|
+
"sidebar-border": "var(--ds-foundation-neutral-700)",
|
|
66
|
+
"sidebar-ring": "var(--ds-foundation-cyan-500)",
|
|
67
|
+
"surface": "var(--ds-foundation-neutral-850)",
|
|
68
|
+
"surface-raised": "var(--ds-foundation-neutral-800)",
|
|
69
|
+
"text-link": "var(--ds-foundation-cyan-300)",
|
|
70
|
+
"success": "var(--ds-foundation-green-500)",
|
|
71
|
+
"warning": "var(--ds-foundation-yellow-500)",
|
|
72
|
+
"danger": "var(--ds-foundation-red-500)",
|
|
73
|
+
"info": "var(--ds-foundation-blue-500)",
|
|
74
|
+
"ai-bubble": "var(--ds-foundation-neutral-850)",
|
|
75
|
+
"user-bubble": "var(--ds-foundation-cyan-600)",
|
|
76
|
+
"tenant-rail": "var(--ds-foundation-neutral-950)",
|
|
77
|
+
"tenant-rail-foreground": "var(--ds-foundation-white)",
|
|
78
|
+
"tenant-rail-muted": "rgb(255 255 255 / 0.72)",
|
|
79
|
+
"tenant-rail-border": "rgb(255 255 255 / 0.08)",
|
|
80
|
+
"tenant-rail-surface": "rgb(255 255 255 / 0.06)",
|
|
81
|
+
"overlay": "var(--ds-foundation-overlay-50)",
|
|
82
|
+
"overlay-strong": "var(--ds-foundation-overlay-60)",
|
|
83
|
+
"strong-foreground": "var(--ds-foundation-white)"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export const tokenManifest = {
|
|
2
|
+
"foundation": {
|
|
3
|
+
"ds-foundation-white": "#ffffff",
|
|
4
|
+
"ds-foundation-neutral-50": "#f7f8fb",
|
|
5
|
+
"ds-foundation-neutral-100": "#e5e7eb",
|
|
6
|
+
"ds-foundation-neutral-200": "#d7dce5",
|
|
7
|
+
"ds-foundation-neutral-500": "#6b7280",
|
|
8
|
+
"ds-foundation-neutral-600": "#4b5563",
|
|
9
|
+
"ds-foundation-neutral-700": "#2a2d35",
|
|
10
|
+
"ds-foundation-neutral-800": "#22262f",
|
|
11
|
+
"ds-foundation-neutral-850": "#1a1d23",
|
|
12
|
+
"ds-foundation-neutral-900": "#111316",
|
|
13
|
+
"ds-foundation-neutral-950": "#0b0d0f",
|
|
14
|
+
"ds-foundation-ink-500": "#183247",
|
|
15
|
+
"ds-foundation-ink-700": "#102233",
|
|
16
|
+
"ds-foundation-cyan-50": "#eef9fd",
|
|
17
|
+
"ds-foundation-cyan-100": "#d9f1fb",
|
|
18
|
+
"ds-foundation-cyan-200": "#b7e4f3",
|
|
19
|
+
"ds-foundation-cyan-300": "#89d4f0",
|
|
20
|
+
"ds-foundation-violet-300": "#a78bfa",
|
|
21
|
+
"ds-foundation-violet-500": "#7c3aed",
|
|
22
|
+
"ds-foundation-violet-700": "#2d1f7a",
|
|
23
|
+
"ds-foundation-cyan-500": "#0ea5e9",
|
|
24
|
+
"ds-foundation-cyan-600": "#0284c7",
|
|
25
|
+
"ds-foundation-cyan-700": "#0f6787",
|
|
26
|
+
"ds-foundation-green-500": "#22c55e",
|
|
27
|
+
"ds-foundation-blue-500": "#3b82f6",
|
|
28
|
+
"ds-foundation-yellow-500": "#f59e0b",
|
|
29
|
+
"ds-foundation-red-500": "#ef4444",
|
|
30
|
+
"ds-foundation-overlay-50": "rgb(0 0 0 / 0.5)",
|
|
31
|
+
"ds-foundation-overlay-60": "rgb(0 0 0 / 0.6)"
|
|
32
|
+
},
|
|
33
|
+
"semantic": {
|
|
34
|
+
"background": "var(--ds-foundation-neutral-950)",
|
|
35
|
+
"foreground": "var(--ds-foundation-neutral-100)",
|
|
36
|
+
"card": "var(--ds-foundation-neutral-850)",
|
|
37
|
+
"card-foreground": "var(--ds-foundation-neutral-100)",
|
|
38
|
+
"popover": "var(--ds-foundation-neutral-850)",
|
|
39
|
+
"popover-foreground": "var(--ds-foundation-neutral-100)",
|
|
40
|
+
"primary": "var(--ds-foundation-cyan-500)",
|
|
41
|
+
"primary-foreground": "var(--ds-foundation-white)",
|
|
42
|
+
"secondary": "var(--ds-foundation-neutral-800)",
|
|
43
|
+
"secondary-foreground": "var(--ds-foundation-neutral-100)",
|
|
44
|
+
"muted": "var(--ds-foundation-neutral-850)",
|
|
45
|
+
"muted-foreground": "var(--ds-foundation-neutral-500)",
|
|
46
|
+
"accent": "var(--ds-foundation-ink-700)",
|
|
47
|
+
"accent-foreground": "var(--ds-foundation-neutral-100)",
|
|
48
|
+
"destructive": "var(--ds-foundation-red-500)",
|
|
49
|
+
"destructive-foreground": "var(--ds-foundation-white)",
|
|
50
|
+
"border": "var(--ds-foundation-neutral-700)",
|
|
51
|
+
"input": "var(--ds-foundation-neutral-800)",
|
|
52
|
+
"ring": "var(--ds-foundation-cyan-500)",
|
|
53
|
+
"chart-1": "var(--ds-foundation-cyan-500)",
|
|
54
|
+
"chart-2": "var(--ds-foundation-green-500)",
|
|
55
|
+
"chart-3": "var(--ds-foundation-blue-500)",
|
|
56
|
+
"chart-4": "var(--ds-foundation-yellow-500)",
|
|
57
|
+
"chart-5": "var(--ds-foundation-red-500)",
|
|
58
|
+
"radius": "0.5rem",
|
|
59
|
+
"sidebar": "var(--ds-foundation-neutral-900)",
|
|
60
|
+
"sidebar-foreground": "var(--ds-foundation-neutral-100)",
|
|
61
|
+
"sidebar-primary": "var(--ds-foundation-cyan-500)",
|
|
62
|
+
"sidebar-primary-foreground": "var(--ds-foundation-white)",
|
|
63
|
+
"sidebar-accent": "var(--ds-foundation-neutral-800)",
|
|
64
|
+
"sidebar-accent-foreground": "var(--ds-foundation-neutral-100)",
|
|
65
|
+
"sidebar-border": "var(--ds-foundation-neutral-700)",
|
|
66
|
+
"sidebar-ring": "var(--ds-foundation-cyan-500)",
|
|
67
|
+
"surface": "var(--ds-foundation-neutral-850)",
|
|
68
|
+
"surface-raised": "var(--ds-foundation-neutral-800)",
|
|
69
|
+
"text-link": "var(--ds-foundation-cyan-300)",
|
|
70
|
+
"success": "var(--ds-foundation-green-500)",
|
|
71
|
+
"warning": "var(--ds-foundation-yellow-500)",
|
|
72
|
+
"danger": "var(--ds-foundation-red-500)",
|
|
73
|
+
"info": "var(--ds-foundation-blue-500)",
|
|
74
|
+
"ai-bubble": "var(--ds-foundation-neutral-850)",
|
|
75
|
+
"user-bubble": "var(--ds-foundation-cyan-600)",
|
|
76
|
+
"tenant-rail": "var(--ds-foundation-neutral-950)",
|
|
77
|
+
"tenant-rail-foreground": "var(--ds-foundation-white)",
|
|
78
|
+
"tenant-rail-muted": "rgb(255 255 255 / 0.72)",
|
|
79
|
+
"tenant-rail-border": "rgb(255 255 255 / 0.08)",
|
|
80
|
+
"tenant-rail-surface": "rgb(255 255 255 / 0.06)",
|
|
81
|
+
"overlay": "var(--ds-foundation-overlay-50)",
|
|
82
|
+
"overlay-strong": "var(--ds-foundation-overlay-60)",
|
|
83
|
+
"strong-foreground": "var(--ds-foundation-white)"
|
|
84
|
+
}
|
|
85
|
+
} as const
|
|
86
|
+
|
|
87
|
+
export default tokenManifest
|