minka-ds 0.1.0

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.
@@ -0,0 +1,13 @@
1
+ import { cn } from "../../lib/utils"
2
+
3
+ function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
4
+ return (
5
+ <div
6
+ data-slot="skeleton"
7
+ className={cn("animate-pulse [border-radius:var(--radius-card)] bg-[var(--color-bg-disabled)]", className)}
8
+ {...props}
9
+ />
10
+ )
11
+ }
12
+
13
+ export { Skeleton }
@@ -0,0 +1,142 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cva, type VariantProps } from "class-variance-authority"
5
+
6
+ import { cn } from "../../lib/utils"
7
+
8
+ const tableCellAlignVariants = cva("", {
9
+ variants: {
10
+ align: {
11
+ left: "text-left",
12
+ right: "text-right",
13
+ },
14
+ },
15
+ defaultVariants: {
16
+ align: "left",
17
+ },
18
+ })
19
+
20
+ function Table({ className, ...props }: React.ComponentProps<"table">) {
21
+ return (
22
+ <div
23
+ data-slot="table-container"
24
+ className="relative w-full overflow-x-auto"
25
+ >
26
+ <table
27
+ data-slot="table"
28
+ className={cn("w-full caption-bottom text-body-sm", className)}
29
+ {...props}
30
+ />
31
+ </div>
32
+ )
33
+ }
34
+
35
+ function TableHeader({ className, ...props }: React.ComponentProps<"thead">) {
36
+ return (
37
+ <thead
38
+ data-slot="table-header"
39
+ className={cn(
40
+ "[&_tr]:border-b [&_tr]:border-[var(--color-border-subtle)] [&_tr]:hover:bg-transparent",
41
+ className
42
+ )}
43
+ {...props}
44
+ />
45
+ )
46
+ }
47
+
48
+ function TableBody({ className, ...props }: React.ComponentProps<"tbody">) {
49
+ return (
50
+ <tbody
51
+ data-slot="table-body"
52
+ className={cn("[&_tr:last-child]:border-0", className)}
53
+ {...props}
54
+ />
55
+ )
56
+ }
57
+
58
+ function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) {
59
+ return (
60
+ <tfoot
61
+ data-slot="table-footer"
62
+ className={cn(
63
+ "border-t border-[var(--color-border-subtle)] bg-[var(--color-bg-raised)] text-label-sm [&>tr]:last:border-b-0",
64
+ className
65
+ )}
66
+ {...props}
67
+ />
68
+ )
69
+ }
70
+
71
+ function TableRow({ className, ...props }: React.ComponentProps<"tr">) {
72
+ return (
73
+ <tr
74
+ data-slot="table-row"
75
+ className={cn(
76
+ "border-b border-[var(--color-border-subtle)] transition-colors hover:bg-[var(--color-bg-table-hover)] has-aria-expanded:bg-[var(--color-bg-table-hover)] data-[state=selected]:bg-[var(--color-action-ghost-hover)]",
77
+ className
78
+ )}
79
+ {...props}
80
+ />
81
+ )
82
+ }
83
+
84
+ function TableHead({
85
+ className,
86
+ align,
87
+ ...props
88
+ }: React.ComponentProps<"th"> & VariantProps<typeof tableCellAlignVariants>) {
89
+ return (
90
+ <th
91
+ data-slot="table-head"
92
+ className={cn(
93
+ "h-10 px-2 align-middle text-label-sm text-[var(--color-text-default)] whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
94
+ tableCellAlignVariants({ align }),
95
+ className
96
+ )}
97
+ {...props}
98
+ />
99
+ )
100
+ }
101
+
102
+ function TableCell({
103
+ className,
104
+ align,
105
+ ...props
106
+ }: React.ComponentProps<"td"> & VariantProps<typeof tableCellAlignVariants>) {
107
+ return (
108
+ <td
109
+ data-slot="table-cell"
110
+ className={cn(
111
+ "p-2 align-middle whitespace-nowrap text-[var(--color-text-default)] [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",
112
+ tableCellAlignVariants({ align }),
113
+ className
114
+ )}
115
+ {...props}
116
+ />
117
+ )
118
+ }
119
+
120
+ function TableCaption({
121
+ className,
122
+ ...props
123
+ }: React.ComponentProps<"caption">) {
124
+ return (
125
+ <caption
126
+ data-slot="table-caption"
127
+ className={cn("mt-4 text-body-sm text-[var(--color-text-muted)]", className)}
128
+ {...props}
129
+ />
130
+ )
131
+ }
132
+
133
+ export {
134
+ Table,
135
+ TableHeader,
136
+ TableBody,
137
+ TableFooter,
138
+ TableHead,
139
+ TableRow,
140
+ TableCell,
141
+ TableCaption,
142
+ }
@@ -0,0 +1,109 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cva, type VariantProps } from "class-variance-authority"
5
+ import { Tabs as TabsPrimitive } from "radix-ui"
6
+
7
+ import { cn } from "../../lib/utils"
8
+
9
+ function Tabs({
10
+ className,
11
+ orientation = "horizontal",
12
+ ...props
13
+ }: React.ComponentProps<typeof TabsPrimitive.Root>) {
14
+ return (
15
+ <TabsPrimitive.Root
16
+ data-slot="tabs"
17
+ data-orientation={orientation}
18
+ orientation={orientation}
19
+ className={cn(
20
+ "group/tabs flex gap-2 data-[orientation=horizontal]:flex-col",
21
+ className
22
+ )}
23
+ {...props}
24
+ />
25
+ )
26
+ }
27
+
28
+ const tabsListVariants = cva(
29
+ "group/tabs-list inline-flex w-fit items-center justify-center p-[3px] text-[var(--color-text-muted)] group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none",
30
+ {
31
+ variants: {
32
+ variant: {
33
+ default: "[border-radius:var(--radius-card)] bg-[var(--color-bg-disabled)]",
34
+ line: "gap-1 rounded-none bg-transparent",
35
+ },
36
+ },
37
+ defaultVariants: {
38
+ variant: "default",
39
+ },
40
+ }
41
+ )
42
+
43
+ function TabsList({
44
+ className,
45
+ variant = "default",
46
+ ...props
47
+ }: React.ComponentProps<typeof TabsPrimitive.List> &
48
+ VariantProps<typeof tabsListVariants>) {
49
+ return (
50
+ <TabsPrimitive.List
51
+ data-slot="tabs-list"
52
+ data-variant={variant}
53
+ className={cn(tabsListVariants({ variant }), className)}
54
+ {...props}
55
+ />
56
+ )
57
+ }
58
+
59
+ function TabsTrigger({
60
+ className,
61
+ children,
62
+ ...props
63
+ }: React.ComponentProps<typeof TabsPrimitive.Trigger>) {
64
+ return (
65
+ <TabsPrimitive.Trigger
66
+ data-slot="tabs-trigger"
67
+ className={cn(
68
+ "relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 [border-radius:var(--radius-button)] border border-transparent px-2 py-1 text-body-sm whitespace-nowrap transition-all outline-none",
69
+ "text-[var(--color-text-muted)] hover:text-[var(--color-text-default)] data-[state=active]:font-bold",
70
+ "group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start",
71
+ "focus-visible:border-[var(--color-border-focus)] focus-visible:ring-[3px] focus-visible:ring-[var(--color-border-focus)]/50",
72
+ "disabled:pointer-events-none disabled:text-[var(--color-text-disabled)]",
73
+ // default variant — active tab gets raised surface
74
+ "group-data-[variant=default]/tabs-list:data-[state=active]:bg-[var(--color-bg-raised)] group-data-[variant=default]/tabs-list:data-[state=active]:text-[var(--color-text-default)] group-data-[variant=default]/tabs-list:data-[state=active]:shadow-[var(--shadow-card)]",
75
+ // line variant — active tab is transparent, underline indicator
76
+ "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:text-[var(--color-text-default)] group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none",
77
+ // underline indicator for line variant
78
+ "after:absolute after:bg-[var(--color-text-default)] after:opacity-0 after:transition-opacity",
79
+ "group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5",
80
+ "group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5",
81
+ "group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100",
82
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
83
+ className
84
+ )}
85
+ {...props}
86
+ >
87
+ {/* Grid overlap reserves bold width at all times — prevents layout shift on weight change */}
88
+ <span className="grid items-center justify-items-center [grid-template-areas:'stack']">
89
+ <span className="[grid-area:stack] invisible font-bold pointer-events-none select-none" aria-hidden>{children}</span>
90
+ <span className="[grid-area:stack]">{children}</span>
91
+ </span>
92
+ </TabsPrimitive.Trigger>
93
+ )
94
+ }
95
+
96
+ function TabsContent({
97
+ className,
98
+ ...props
99
+ }: React.ComponentProps<typeof TabsPrimitive.Content>) {
100
+ return (
101
+ <TabsPrimitive.Content
102
+ data-slot="tabs-content"
103
+ className={cn("flex-1 outline-none", className)}
104
+ {...props}
105
+ />
106
+ )
107
+ }
108
+
109
+ export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }
@@ -0,0 +1,18 @@
1
+ import * as React from "react"
2
+
3
+ import { cn } from "../../lib/utils"
4
+
5
+ function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
6
+ return (
7
+ <textarea
8
+ data-slot="textarea"
9
+ className={cn(
10
+ "flex field-sizing-content min-h-16 w-full [border-radius:var(--radius-input)] border border-[var(--color-border-default)] bg-transparent px-3 py-2 text-body-sm shadow-xs transition-[color,box-shadow] outline-none placeholder:text-[var(--color-text-hint)] focus-visible:border-[var(--color-border-focus)] focus-visible:ring-[3px] focus-visible:ring-[var(--color-border-focus)]/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-[var(--color-border-error)] aria-invalid:ring-[3px] aria-invalid:ring-[var(--color-border-error)]/20",
11
+ className
12
+ )}
13
+ {...props}
14
+ />
15
+ )
16
+ }
17
+
18
+ export { Textarea }
@@ -0,0 +1,57 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { Tooltip as TooltipPrimitive } from "radix-ui"
5
+
6
+ import { cn } from "../../lib/utils"
7
+
8
+ function TooltipProvider({
9
+ delayDuration = 0,
10
+ ...props
11
+ }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
12
+ return (
13
+ <TooltipPrimitive.Provider
14
+ data-slot="tooltip-provider"
15
+ delayDuration={delayDuration}
16
+ {...props}
17
+ />
18
+ )
19
+ }
20
+
21
+ function Tooltip({
22
+ ...props
23
+ }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
24
+ return <TooltipPrimitive.Root data-slot="tooltip" {...props} />
25
+ }
26
+
27
+ function TooltipTrigger({
28
+ ...props
29
+ }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
30
+ return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
31
+ }
32
+
33
+ function TooltipContent({
34
+ className,
35
+ sideOffset = 0,
36
+ children,
37
+ ...props
38
+ }: React.ComponentProps<typeof TooltipPrimitive.Content>) {
39
+ return (
40
+ <TooltipPrimitive.Portal>
41
+ <TooltipPrimitive.Content
42
+ data-slot="tooltip-content"
43
+ sideOffset={sideOffset}
44
+ className={cn(
45
+ "[z-index:var(--z-tooltip)] w-fit origin-(--radix-tooltip-content-transform-origin) animate-in [border-radius:var(--radius-tooltip)] bg-[var(--color-bg-inverted)] px-3 py-1.5 text-caption text-balance text-[var(--color-text-inverse)] fade-in-0 zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
46
+ className
47
+ )}
48
+ {...props}
49
+ >
50
+ {children}
51
+ <TooltipPrimitive.Arrow className="[z-index:var(--z-tooltip)] size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-[var(--color-bg-inverted)] fill-[var(--color-bg-inverted)]" />
52
+ </TooltipPrimitive.Content>
53
+ </TooltipPrimitive.Portal>
54
+ )
55
+ }
56
+
57
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
@@ -0,0 +1,19 @@
1
+ import * as React from "react"
2
+
3
+ const MOBILE_BREAKPOINT = 768
4
+
5
+ export function useIsMobile() {
6
+ const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)
7
+
8
+ React.useEffect(() => {
9
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)
10
+ const onChange = () => {
11
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
12
+ }
13
+ mql.addEventListener("change", onChange)
14
+ setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)
15
+ return () => mql.removeEventListener("change", onChange)
16
+ }, [])
17
+
18
+ return !!isMobile
19
+ }
package/src/index.ts ADDED
@@ -0,0 +1,28 @@
1
+ // Utilities
2
+ export { cn } from "./lib/utils"
3
+
4
+ // Components
5
+ export * from "./components/ui/badge"
6
+ export * from "./components/ui/cell"
7
+ export * from "./components/ui/breadcrumb"
8
+ export * from "./components/ui/button"
9
+ export * from "./components/ui/button-group"
10
+ export * from "./components/ui/card"
11
+ export * from "./components/ui/collapsible"
12
+ export * from "./components/ui/combobox"
13
+ export * from "./components/ui/data-table"
14
+ export * from "./components/ui/dialog"
15
+ export * from "./components/ui/dropdown-menu"
16
+ export * from "./components/ui/input"
17
+ export * from "./components/ui/input-group"
18
+ export * from "./components/ui/label"
19
+ export * from "./components/ui/pagination"
20
+ export * from "./components/ui/select"
21
+ export * from "./components/ui/separator"
22
+ export * from "./components/ui/sheet"
23
+ export * from "./components/ui/sidebar"
24
+ export * from "./components/ui/skeleton"
25
+ export * from "./components/ui/table"
26
+ export * from "./components/ui/tabs"
27
+ export * from "./components/ui/textarea"
28
+ export * from "./components/ui/tooltip"
@@ -0,0 +1,33 @@
1
+ import { clsx, type ClassValue } from "clsx"
2
+ import { extendTailwindMerge } from "tailwind-merge"
3
+
4
+ // tailwind-merge treats all `text-*` classes as a single conflict group, so
5
+ // `text-label` gets silently dropped when any `text-[color-var]` is on the
6
+ // same element (which every button variant has). Registering custom text-*
7
+ // utilities in the font-size group keeps both classes alive.
8
+ const twMerge = extendTailwindMerge({
9
+ extend: {
10
+ classGroups: {
11
+ "font-size": [
12
+ {
13
+ text: [
14
+ "display",
15
+ "heading-1", "heading-2", "heading-3", "heading-4",
16
+ "paragraph-lg", "paragraph", "paragraph-sm",
17
+ "body-lg", "body", "body-sm",
18
+ "body-lg-light", "body-light", "body-sm-light",
19
+ "label", "label-sm",
20
+ "caption", "caption-sm",
21
+ "caption-light", "caption-sm-light",
22
+ "overline",
23
+ "code",
24
+ ],
25
+ },
26
+ ],
27
+ },
28
+ },
29
+ })
30
+
31
+ export function cn(...inputs: ClassValue[]) {
32
+ return twMerge(clsx(inputs))
33
+ }
@@ -0,0 +1,227 @@
1
+ /*
2
+ * Primitive tokens — raw scale values, no semantic meaning.
3
+ * These are the source of truth. Never use them directly in components.
4
+ * Semantic tokens (semantic.css) consume these and are what components use.
5
+ */
6
+
7
+ :root {
8
+ /* --- Neutral scale --- */
9
+ --primitive-neutral-0: #ffffff;
10
+ --primitive-neutral-50: #eeeeee;
11
+ --primitive-neutral-100: #e6e6e6;
12
+ --primitive-neutral-200: #d9d9d9;
13
+ --primitive-neutral-300: #c7c7c7;
14
+ --primitive-neutral-400: #b6b6b6;
15
+ --primitive-neutral-500: #a1a1a1;
16
+ --primitive-neutral-600: #838383;
17
+ --primitive-neutral-700: #6f6f6f;
18
+ --primitive-neutral-800: #4a4a4a;
19
+ --primitive-neutral-900: #2e2e2e;
20
+ --primitive-neutral-950: #1f1f1f;
21
+ --primitive-neutral-1000: #000000;
22
+
23
+ /* --- Color scales --- */
24
+
25
+ --primitive-red-50: oklch(0.95 0.03 28);
26
+ --primitive-red-100: oklch(0.93 0.05 28);
27
+ --primitive-red-200: oklch(0.89 0.07 28);
28
+ --primitive-red-300: oklch(0.84 0.11 28);
29
+ --primitive-red-400: oklch(0.79 0.16 28);
30
+ --primitive-red-500: oklch(0.73 0.21 28);
31
+ --primitive-red-600: oklch(0.63 0.29 28);
32
+ --primitive-red-700: oklch(0.55 0.25 28);
33
+ --primitive-red-800: oklch(0.41 0.19 28);
34
+ --primitive-red-900: oklch(0.29 0.13 28);
35
+ --primitive-red-950: oklch(0.24 0.11 28);
36
+
37
+ --primitive-bronze-50: oklch(0.95 0.04 63);
38
+ --primitive-bronze-100: oklch(0.93 0.06 63);
39
+ --primitive-bronze-200: oklch(0.89 0.09 63);
40
+ --primitive-bronze-300: oklch(0.84 0.14 63);
41
+ --primitive-bronze-400: oklch(0.78 0.2 63);
42
+ --primitive-bronze-500: oklch(0.72 0.19 63);
43
+ --primitive-bronze-600: oklch(0.62 0.16 63);
44
+ --primitive-bronze-700: oklch(0.55 0.14 63);
45
+ --primitive-bronze-800: oklch(0.42 0.11 63);
46
+ --primitive-bronze-900: oklch(0.3 0.08 63);
47
+ --primitive-bronze-950: oklch(0.25 0.06 63);
48
+
49
+ --primitive-yellow-50: oklch(0.94 0.12 98);
50
+ --primitive-yellow-100: oklch(0.92 0.17 98);
51
+ --primitive-yellow-200: oklch(0.88 0.21 98);
52
+ --primitive-yellow-300: oklch(0.83 0.2 98);
53
+ --primitive-yellow-400: oklch(0.77 0.18 98);
54
+ --primitive-yellow-500: oklch(0.71 0.17 98);
55
+ --primitive-yellow-600: oklch(0.61 0.15 98);
56
+ --primitive-yellow-700: oklch(0.54 0.13 98);
57
+ --primitive-yellow-800: oklch(0.41 0.1 98);
58
+ --primitive-yellow-900: oklch(0.3 0.07 98);
59
+ --primitive-yellow-950: oklch(0.25 0.06 98);
60
+
61
+ --primitive-lulo-50: oklch(0.94 0.24 112);
62
+ --primitive-lulo-100: oklch(0.92 0.23 112);
63
+ --primitive-lulo-200: oklch(0.87 0.22 112);
64
+ --primitive-lulo-300: oklch(0.82 0.21 112);
65
+ --primitive-lulo-400: oklch(0.76 0.2 112);
66
+ --primitive-lulo-500: oklch(0.7 0.18 112);
67
+ --primitive-lulo-600: oklch(0.61 0.15 112);
68
+ --primitive-lulo-700: oklch(0.53 0.14 112);
69
+ --primitive-lulo-800: oklch(0.41 0.1 112);
70
+ --primitive-lulo-900: oklch(0.3 0.08 112);
71
+ --primitive-lulo-950: oklch(0.24 0.06 112);
72
+
73
+ --primitive-green-50: oklch(0.93 0.15 139);
74
+ --primitive-green-100: oklch(0.9 0.23 139);
75
+ --primitive-green-200: oklch(0.85 0.32 139);
76
+ --primitive-green-300: oklch(0.8 0.3 139);
77
+ --primitive-green-400: oklch(0.75 0.28 139);
78
+ --primitive-green-500: oklch(0.69 0.25 139);
79
+ --primitive-green-600: oklch(0.59 0.22 139);
80
+ --primitive-green-700: oklch(0.52 0.19 139);
81
+ --primitive-green-800: oklch(0.4 0.15 139);
82
+ --primitive-green-900: oklch(0.29 0.11 139);
83
+ --primitive-green-950: oklch(0.24 0.09 139);
84
+
85
+ --primitive-aquamarine-50: oklch(0.93 0.12 167);
86
+ --primitive-aquamarine-100: oklch(0.9 0.17 167);
87
+ --primitive-aquamarine-200: oklch(0.85 0.24 167);
88
+ --primitive-aquamarine-300: oklch(0.8 0.22 167);
89
+ --primitive-aquamarine-400: oklch(0.74 0.21 167);
90
+ --primitive-aquamarine-500: oklch(0.68 0.19 167);
91
+ --primitive-aquamarine-600: oklch(0.59 0.16 167);
92
+ --primitive-aquamarine-700: oklch(0.52 0.14 167);
93
+ --primitive-aquamarine-800: oklch(0.39 0.11 167);
94
+ --primitive-aquamarine-900: oklch(0.29 0.08 167);
95
+ --primitive-aquamarine-950: oklch(0.23 0.07 167);
96
+
97
+ --primitive-sea-50: oklch(0.94 0.04 220);
98
+ --primitive-sea-100: oklch(0.92 0.06 220);
99
+ --primitive-sea-200: oklch(0.88 0.1 220);
100
+ --primitive-sea-300: oklch(0.82 0.15 220);
101
+ --primitive-sea-400: oklch(0.75 0.18 220);
102
+ --primitive-sea-500: oklch(0.69 0.17 220);
103
+ --primitive-sea-600: oklch(0.6 0.14 220);
104
+ --primitive-sea-700: oklch(0.52 0.13 220);
105
+ --primitive-sea-800: oklch(0.4 0.1 220);
106
+ --primitive-sea-900: oklch(0.29 0.07 220);
107
+ --primitive-sea-950: oklch(0.24 0.06 220);
108
+
109
+ --primitive-blue-50: oklch(0.95 0.03 257);
110
+ --primitive-blue-100: oklch(0.93 0.04 257);
111
+ --primitive-blue-200: oklch(0.88 0.06 257);
112
+ --primitive-blue-300: oklch(0.83 0.09 257);
113
+ --primitive-blue-400: oklch(0.77 0.13 257);
114
+ --primitive-blue-500: oklch(0.71 0.16 257);
115
+ --primitive-blue-600: oklch(0.62 0.23 257);
116
+ --primitive-blue-700: oklch(0.54 0.24 257);
117
+ --primitive-blue-800: oklch(0.41 0.18 257);
118
+ --primitive-blue-900: oklch(0.3 0.13 257);
119
+ --primitive-blue-950: oklch(0.24 0.11 257);
120
+
121
+ --primitive-purple-50: oklch(0.95 0.03 289);
122
+ --primitive-purple-100: oklch(0.93 0.04 289);
123
+ --primitive-purple-200: oklch(0.89 0.06 289);
124
+ --primitive-purple-300: oklch(0.84 0.1 289);
125
+ --primitive-purple-400: oklch(0.78 0.13 289);
126
+ --primitive-purple-500: oklch(0.72 0.17 289);
127
+ --primitive-purple-600: oklch(0.63 0.23 289);
128
+ --primitive-purple-700: oklch(0.56 0.28 289);
129
+ --primitive-purple-800: oklch(0.42 0.25 289);
130
+ --primitive-purple-900: oklch(0.3 0.18 289);
131
+ --primitive-purple-950: oklch(0.24 0.14 289);
132
+
133
+ --primitive-fuchsia-50: oklch(0.95 0.04 320);
134
+ --primitive-fuchsia-100: oklch(0.93 0.06 320);
135
+ --primitive-fuchsia-200: oklch(0.89 0.09 320);
136
+ --primitive-fuchsia-300: oklch(0.85 0.14 320);
137
+ --primitive-fuchsia-400: oklch(0.79 0.19 320);
138
+ --primitive-fuchsia-500: oklch(0.74 0.24 320);
139
+ --primitive-fuchsia-600: oklch(0.64 0.33 320);
140
+ --primitive-fuchsia-700: oklch(0.56 0.29 320);
141
+ --primitive-fuchsia-800: oklch(0.42 0.22 320);
142
+ --primitive-fuchsia-900: oklch(0.3 0.16 320);
143
+ --primitive-fuchsia-950: oklch(0.24 0.13 320);
144
+
145
+ --primitive-flamingo-50: oklch(0.95 0.03 360);
146
+ --primitive-flamingo-100: oklch(0.93 0.05 360);
147
+ --primitive-flamingo-200: oklch(0.89 0.08 360);
148
+ --primitive-flamingo-300: oklch(0.84 0.12 360);
149
+ --primitive-flamingo-400: oklch(0.79 0.17 360);
150
+ --primitive-flamingo-500: oklch(0.74 0.23 360);
151
+ --primitive-flamingo-600: oklch(0.63 0.29 360);
152
+ --primitive-flamingo-700: oklch(0.55 0.25 360);
153
+ --primitive-flamingo-800: oklch(0.42 0.19 360);
154
+ --primitive-flamingo-900: oklch(0.3 0.13 360);
155
+ --primitive-flamingo-950: oklch(0.24 0.11 360);
156
+
157
+ /* --- Radius scale --- */
158
+ --primitive-radius-none: 0;
159
+ --primitive-radius-xs: 0.25rem;
160
+ --primitive-radius-sm: 0.375rem;
161
+ --primitive-radius-md: 0.5rem;
162
+ --primitive-radius-lg: 0.625rem;
163
+ --primitive-radius-xl: 0.875rem;
164
+ --primitive-radius-2xl: 1.25rem;
165
+ --primitive-radius-full: 9999px;
166
+
167
+ /* --- Spacing scale (extends Tailwind, documented here for reference) --- */
168
+ --primitive-space-1: 0.25rem;
169
+ --primitive-space-2: 0.5rem;
170
+ --primitive-space-3: 0.75rem;
171
+ --primitive-space-4: 1rem;
172
+ --primitive-space-5: 1.25rem;
173
+ --primitive-space-6: 1.5rem;
174
+ --primitive-space-8: 2rem;
175
+ --primitive-space-10: 2.5rem;
176
+ --primitive-space-12: 3rem;
177
+ --primitive-space-16: 4rem;
178
+
179
+ /* --- Typography scale --- */
180
+ --primitive-font-size-2xs: 0.625rem; /* 10px */
181
+ --primitive-font-size-xs: 0.75rem; /* 12px */
182
+ --primitive-font-size-sm: 0.875rem; /* 14px */
183
+ --primitive-font-size-base: 1rem; /* 16px */
184
+ --primitive-font-size-lg: 1.125rem; /* 18px */
185
+ --primitive-font-size-xl: 1.25rem; /* 20px */
186
+ --primitive-font-size-2xl: 1.5rem; /* 24px */
187
+ --primitive-font-size-3xl: 1.875rem; /* 30px */
188
+ --primitive-font-size-4xl: 2.25rem; /* 36px */
189
+ --primitive-font-size-5xl: 3rem; /* 48px */
190
+ --primitive-font-size-6xl: 3.75rem; /* 60px */
191
+ --primitive-font-size-7xl: 4.5rem; /* 72px */
192
+ --primitive-font-size-8xl: 6rem; /* 96px */
193
+
194
+ --primitive-font-weight-400: 400;
195
+ --primitive-font-weight-500: 500;
196
+ --primitive-font-weight-600: 600;
197
+
198
+ --primitive-font-style-normal: normal;
199
+ --primitive-font-style-italic: italic;
200
+
201
+ --primitive-line-height-none: 1; /* single-line headings, labels */
202
+ --primitive-line-height-tight: 1.25; /* large display, hero */
203
+ --primitive-line-height-snug: 1.375; /* subheadings */
204
+ --primitive-line-height-normal: 1.5; /* default body */
205
+ --primitive-line-height-relaxed: 1.625; /* long-form paragraphs */
206
+ --primitive-line-height-loose: 1.75; /* editorial, very readable body */
207
+
208
+ /* --- Letter spacing --- */
209
+ --primitive-letter-spacing-tight: -0.04em; /* display, hero text */
210
+ --primitive-letter-spacing-normal: 0em; /* body, default */
211
+ --primitive-letter-spacing-wide: 0.1em; /* uppercase labels, overlines */
212
+
213
+ /* --- Shadow scale --- */
214
+ --primitive-shadow-xs: 0 1px 2px oklch(0 0 0 / 0.05);
215
+ --primitive-shadow-sm: 0 1px 3px oklch(0 0 0 / 0.10), 0 1px 2px oklch(0 0 0 / 0.06);
216
+ --primitive-shadow-md: 0 4px 6px oklch(0 0 0 / 0.07), 0 2px 4px oklch(0 0 0 / 0.06);
217
+ --primitive-shadow-lg: 0 10px 15px oklch(0 0 0 / 0.10), 0 4px 6px oklch(0 0 0 / 0.05);
218
+ --primitive-shadow-xl: 0 20px 25px oklch(0 0 0 / 0.10), 0 8px 10px oklch(0 0 0 / 0.04);
219
+
220
+ /* --- Z-index scale --- */
221
+ --primitive-z-base: 0;
222
+ --primitive-z-raised: 10;
223
+ --primitive-z-overlay: 100;
224
+ --primitive-z-modal: 200;
225
+ --primitive-z-toast: 300;
226
+ --primitive-z-tooltip: 400;
227
+ }