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.
- package/package.json +25 -0
- package/src/components/ui/badge.tsx +63 -0
- package/src/components/ui/breadcrumb.tsx +109 -0
- package/src/components/ui/button-group.tsx +89 -0
- package/src/components/ui/button.tsx +65 -0
- package/src/components/ui/card.tsx +92 -0
- package/src/components/ui/cell.tsx +104 -0
- package/src/components/ui/collapsible.tsx +33 -0
- package/src/components/ui/combobox.tsx +310 -0
- package/src/components/ui/data-table.tsx +275 -0
- package/src/components/ui/dialog.tsx +160 -0
- package/src/components/ui/dropdown-menu.tsx +257 -0
- package/src/components/ui/input-group.tsx +170 -0
- package/src/components/ui/input.tsx +21 -0
- package/src/components/ui/label.tsx +26 -0
- package/src/components/ui/pagination.tsx +127 -0
- package/src/components/ui/select.tsx +198 -0
- package/src/components/ui/separator.tsx +28 -0
- package/src/components/ui/sheet.tsx +145 -0
- package/src/components/ui/sidebar.tsx +726 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/table.tsx +142 -0
- package/src/components/ui/tabs.tsx +109 -0
- package/src/components/ui/textarea.tsx +18 -0
- package/src/components/ui/tooltip.tsx +57 -0
- package/src/hooks/use-mobile.ts +19 -0
- package/src/index.ts +28 -0
- package/src/lib/utils.ts +33 -0
- package/tokens/primitives.css +227 -0
- package/tokens/text-utilities.css +44 -0
|
@@ -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"
|
package/src/lib/utils.ts
ADDED
|
@@ -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
|
+
}
|