@bergetai/ui 0.17.0 → 0.18.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.
Files changed (40) hide show
  1. package/dist/components/code-block/CodeBlock.cjs +50 -48
  2. package/dist/components/code-block/CodeBlock.cjs.map +1 -1
  3. package/dist/components/code-block/CodeBlock.d.cts +27 -7
  4. package/dist/components/code-block/CodeBlock.d.cts.map +1 -1
  5. package/dist/components/code-block/CodeBlock.d.mts +27 -7
  6. package/dist/components/code-block/CodeBlock.d.mts.map +1 -1
  7. package/dist/components/code-block/CodeBlock.mjs +45 -50
  8. package/dist/components/code-block/CodeBlock.mjs.map +1 -1
  9. package/dist/components/code-block/index.d.cts +3 -0
  10. package/dist/components/code-block/index.d.mts +3 -0
  11. package/dist/components/container/Container.d.cts +2 -2
  12. package/dist/components/container/Container.d.mts +2 -2
  13. package/dist/hooks/use-highlighted-code.cjs +58 -0
  14. package/dist/hooks/use-highlighted-code.cjs.map +1 -0
  15. package/dist/hooks/use-highlighted-code.d.cts +5 -0
  16. package/dist/hooks/use-highlighted-code.d.cts.map +1 -0
  17. package/dist/hooks/use-highlighted-code.d.mts +5 -0
  18. package/dist/hooks/use-highlighted-code.d.mts.map +1 -0
  19. package/dist/hooks/use-highlighted-code.mjs +56 -0
  20. package/dist/hooks/use-highlighted-code.mjs.map +1 -0
  21. package/dist/index.cjs +10 -0
  22. package/dist/index.d.cts +5 -2
  23. package/dist/index.d.mts +5 -2
  24. package/dist/index.mjs +4 -2
  25. package/dist/lib/highlighter.cjs +81 -0
  26. package/dist/lib/highlighter.cjs.map +1 -0
  27. package/dist/lib/highlighter.mjs +79 -0
  28. package/dist/lib/highlighter.mjs.map +1 -0
  29. package/dist/primitives/button.d.cts +1 -1
  30. package/dist/primitives/button.d.mts +1 -1
  31. package/dist/primitives/code-block.cjs +133 -0
  32. package/dist/primitives/code-block.cjs.map +1 -0
  33. package/dist/primitives/code-block.d.cts +29 -0
  34. package/dist/primitives/code-block.d.cts.map +1 -0
  35. package/dist/primitives/code-block.d.mts +29 -0
  36. package/dist/primitives/code-block.d.mts.map +1 -0
  37. package/dist/primitives/code-block.mjs +124 -0
  38. package/dist/primitives/code-block.mjs.map +1 -0
  39. package/dist/styles/index.css +32 -0
  40. package/package.json +2 -1
@@ -0,0 +1,124 @@
1
+ import { Button } from "./button.mjs";
2
+ import * as React from "react";
3
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
+ import { cva } from "class-variance-authority";
5
+ import { cn } from "cn";
6
+ import { CheckIcon, CopyIcon } from "lucide-react";
7
+ //#region src/primitives/code-block.tsx
8
+ const codeBlockVariants = cva("group/code-block relative flex w-full min-w-0 flex-col overflow-hidden rounded-lg text-sm has-[>[data-slot=code-block-content]:focus-visible]:ring-3 has-[>[data-slot=code-block-content]:focus-visible]:ring-ring/50 data-[size=sm]:text-xs", {
9
+ variants: { variant: {
10
+ default: "border border-input text-foreground has-[>[data-slot=code-block-content]:focus-visible]:border-ring dark:bg-input/30",
11
+ destructive: "border border-destructive/30 text-destructive dark:border-destructive/40"
12
+ } },
13
+ defaultVariants: { variant: "default" }
14
+ });
15
+ function CodeBlock({ className, variant = "default", size = "default", ...props }) {
16
+ return /* @__PURE__ */ jsx("div", {
17
+ "data-slot": "code-block",
18
+ "data-variant": variant,
19
+ "data-size": size,
20
+ className: cn(codeBlockVariants({ variant }), className),
21
+ ...props
22
+ });
23
+ }
24
+ function CodeBlockHeader({ className, ...props }) {
25
+ return /* @__PURE__ */ jsx("div", {
26
+ "data-slot": "code-block-header",
27
+ className: cn("flex min-w-0 shrink-0 items-center gap-2 px-3 pt-3 text-muted-foreground group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:pt-2.5 group-data-[variant=destructive]/code-block:text-destructive *:has-[>[data-slot=code-block-title]]:min-w-0", className),
28
+ ...props
29
+ });
30
+ }
31
+ function CodeBlockTitle({ className, ...props }) {
32
+ return /* @__PURE__ */ jsx("div", {
33
+ "data-slot": "code-block-title",
34
+ className: cn("min-w-0 truncate font-sans text-sm font-medium text-foreground group-data-[size=sm]/code-block:text-xs group-data-[variant=destructive]/code-block:text-destructive [&_svg]:pointer-events-none [&_svg]:inline-block [&_svg]:align-middle [&_svg:not([class*='size-'])]:size-3.5 *:[svg]:me-1.5", className),
35
+ ...props
36
+ });
37
+ }
38
+ function CodeBlockActions({ className, ...props }) {
39
+ return /* @__PURE__ */ jsx("div", {
40
+ "data-slot": "code-block-actions",
41
+ className: cn("-my-1 ms-auto -me-1.5 flex shrink-0 items-center gap-1 [[data-slot=code-block]>&]:absolute [[data-slot=code-block]>&]:end-2 [[data-slot=code-block]>&]:top-2 [[data-slot=code-block]>&]:z-10 [[data-slot=code-block]>&]:m-0 [[data-slot=code-block]>&]:opacity-0 [[data-slot=code-block]>&]:transition-opacity [[data-slot=code-block]>&]:group-focus-within/code-block:opacity-100 [[data-slot=code-block]>&]:group-hover/code-block:opacity-100 group-data-[size=sm]/code-block:[[data-slot=code-block]>&]:end-1.5 group-data-[size=sm]/code-block:[[data-slot=code-block]>&]:top-1.5 [[data-slot=code-block]>&]:pointer-coarse:opacity-100 [[data-slot=code-block]>&]:*:[button]:bg-background [[data-slot=code-block]>&]:*:[button]:ring-1 [[data-slot=code-block]>&]:*:[button]:ring-foreground/10", className),
42
+ ...props
43
+ });
44
+ }
45
+ function CodeBlockCopyButton({ value, variant = "ghost", size = "icon-xs", className, onClick, ...props }) {
46
+ const [copied, setCopied] = React.useState(false);
47
+ React.useEffect(() => {
48
+ if (!copied) return;
49
+ const timeout = setTimeout(() => setCopied(false), 2e3);
50
+ return () => clearTimeout(timeout);
51
+ }, [copied]);
52
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(Button, {
53
+ "data-slot": "code-block-copy-button",
54
+ "data-copied": copied || void 0,
55
+ variant,
56
+ size,
57
+ "aria-label": copied ? "Copied" : "Copy",
58
+ className: cn(className),
59
+ onClick: (event) => {
60
+ onClick?.(event);
61
+ navigator.clipboard.writeText(value).then(() => setCopied(true)).catch(() => {});
62
+ },
63
+ ...props,
64
+ children: copied ? /* @__PURE__ */ jsx(CheckIcon, {}) : /* @__PURE__ */ jsx(CopyIcon, {})
65
+ }), /* @__PURE__ */ jsx("span", {
66
+ "aria-live": "polite",
67
+ className: "sr-only",
68
+ children: copied ? "Copied" : ""
69
+ })] });
70
+ }
71
+ function CodeBlockContent({ className, children, style, wrap = false, lineNumbers = false, startLine = 1, ...props }) {
72
+ return /* @__PURE__ */ jsx("pre", {
73
+ "data-slot": "code-block-content",
74
+ "data-wrap": wrap || void 0,
75
+ "data-numbered": lineNumbers || void 0,
76
+ dir: "ltr",
77
+ tabIndex: 0,
78
+ style: {
79
+ counterReset: `line ${startLine - 1}`,
80
+ ...style
81
+ },
82
+ className: cn("min-h-0 min-w-0 scroll-fade-x scrollbar-thin overflow-auto px-3 py-3 text-start font-mono leading-relaxed outline-none group-has-data-[slot=code-block-footer]/code-block:pb-2 group-has-data-[slot=code-block-header]/code-block:pt-2 group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:py-2.5 group-data-[size=sm]/code-block:group-has-data-[slot=code-block-header]/code-block:pt-1.5 data-wrap:scroll-fade-y data-wrap:wrap-break-word data-wrap:whitespace-pre-wrap", className),
83
+ ...props,
84
+ children: /* @__PURE__ */ jsx("code", {
85
+ "data-slot": "code-block-code",
86
+ className: "grid min-h-lh min-w-max content-start in-data-numbered:grid-cols-[auto_1fr] in-data-wrap:min-w-0",
87
+ children: lineNumbers && typeof children === "string" ? children.replace(/\n$/, "").split("\n").map((line, index) => /* @__PURE__ */ jsx(CodeBlockLine, { children: line }, index)) : children
88
+ })
89
+ });
90
+ }
91
+ const codeBlockLineVariants = cva("relative -mx-3 block min-h-lh px-3 group-data-[size=sm]/code-block:-mx-2.5 group-data-[size=sm]/code-block:px-2.5 before:min-w-6 before:text-end before:text-muted-foreground after:absolute after:start-1 after:top-0 after:text-muted-foreground after:select-none in-data-numbered:col-span-2 in-data-numbered:grid in-data-numbered:grid-cols-subgrid in-data-numbered:gap-x-3 in-data-numbered:[counter-increment:line] in-data-numbered:before:content-[counter(line)] in-data-numbered:before:select-none in-data-numbered:supports-[content:counter(line)_/_'']:before:content-[counter(line)_/_'']", {
92
+ variants: { variant: {
93
+ default: "",
94
+ added: "bg-muted after:content-['+']",
95
+ removed: "bg-destructive/10 after:text-destructive after:content-['−']",
96
+ highlighted: "bg-muted"
97
+ } },
98
+ defaultVariants: { variant: "default" }
99
+ });
100
+ function CodeBlockLine({ className, variant = "default", children, ...props }) {
101
+ const empty = children === void 0 || children === null || children === "" || Array.isArray(children) && children.length === 0;
102
+ return /* @__PURE__ */ jsx("span", {
103
+ "data-slot": "code-block-line",
104
+ "data-variant": variant,
105
+ className: cn(codeBlockLineVariants({ variant }), className),
106
+ ...props,
107
+ children: /* @__PURE__ */ jsx("span", {
108
+ "data-slot": "code-block-line-content",
109
+ className: "min-w-0",
110
+ children: empty ? "\n" : children
111
+ })
112
+ });
113
+ }
114
+ function CodeBlockFooter({ className, ...props }) {
115
+ return /* @__PURE__ */ jsx("div", {
116
+ "data-slot": "code-block-footer",
117
+ className: cn("flex min-w-0 shrink-0 items-center gap-2 px-3 pb-3 text-muted-foreground group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:pb-2.5", className),
118
+ ...props
119
+ });
120
+ }
121
+ //#endregion
122
+ export { CodeBlock, CodeBlockActions, CodeBlockContent, CodeBlockCopyButton, CodeBlockFooter, CodeBlockHeader, CodeBlockLine, CodeBlockTitle };
123
+
124
+ //# sourceMappingURL=code-block.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-block.mjs","names":[],"sources":["../../src/primitives/code-block.tsx"],"sourcesContent":["import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"cn\"\n\nimport { Button } from \"@/primitives/button\"\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\n\nconst codeBlockVariants = cva(\n \"group/code-block relative flex w-full min-w-0 flex-col overflow-hidden rounded-lg text-sm has-[>[data-slot=code-block-content]:focus-visible]:ring-3 has-[>[data-slot=code-block-content]:focus-visible]:ring-ring/50 data-[size=sm]:text-xs\",\n {\n variants: {\n variant: {\n default:\n \"border border-input text-foreground has-[>[data-slot=code-block-content]:focus-visible]:border-ring dark:bg-input/30\",\n destructive:\n \"border border-destructive/30 text-destructive dark:border-destructive/40\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction CodeBlock({\n className,\n variant = \"default\",\n size = \"default\",\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof codeBlockVariants> & { size?: \"default\" | \"sm\" }) {\n return (\n <div\n data-slot=\"code-block\"\n data-variant={variant}\n data-size={size}\n className={cn(codeBlockVariants({ variant }), className)}\n {...props}\n />\n )\n}\n\nfunction CodeBlockHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"code-block-header\"\n className={cn(\n \"flex min-w-0 shrink-0 items-center gap-2 px-3 pt-3 text-muted-foreground group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:pt-2.5 group-data-[variant=destructive]/code-block:text-destructive *:has-[>[data-slot=code-block-title]]:min-w-0\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CodeBlockTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"code-block-title\"\n className={cn(\n \"min-w-0 truncate font-sans text-sm font-medium text-foreground group-data-[size=sm]/code-block:text-xs group-data-[variant=destructive]/code-block:text-destructive [&_svg]:pointer-events-none [&_svg]:inline-block [&_svg]:align-middle [&_svg:not([class*='size-'])]:size-3.5 *:[svg]:me-1.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CodeBlockActions({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"code-block-actions\"\n className={cn(\n \"-my-1 ms-auto -me-1.5 flex shrink-0 items-center gap-1 [[data-slot=code-block]>&]:absolute [[data-slot=code-block]>&]:end-2 [[data-slot=code-block]>&]:top-2 [[data-slot=code-block]>&]:z-10 [[data-slot=code-block]>&]:m-0 [[data-slot=code-block]>&]:opacity-0 [[data-slot=code-block]>&]:transition-opacity [[data-slot=code-block]>&]:group-focus-within/code-block:opacity-100 [[data-slot=code-block]>&]:group-hover/code-block:opacity-100 group-data-[size=sm]/code-block:[[data-slot=code-block]>&]:end-1.5 group-data-[size=sm]/code-block:[[data-slot=code-block]>&]:top-1.5 [[data-slot=code-block]>&]:pointer-coarse:opacity-100 [[data-slot=code-block]>&]:*:[button]:bg-background [[data-slot=code-block]>&]:*:[button]:ring-1 [[data-slot=code-block]>&]:*:[button]:ring-foreground/10\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction CodeBlockCopyButton({\n value,\n variant = \"ghost\",\n size = \"icon-xs\",\n className,\n onClick,\n ...props\n}: React.ComponentProps<typeof Button> & { value: string }) {\n const [copied, setCopied] = React.useState(false)\n\n React.useEffect(() => {\n if (!copied) {\n return\n }\n\n const timeout = setTimeout(() => setCopied(false), 2000)\n return () => clearTimeout(timeout)\n }, [copied])\n\n return (\n <>\n <Button\n data-slot=\"code-block-copy-button\"\n data-copied={copied || undefined}\n variant={variant}\n size={size}\n aria-label={copied ? \"Copied\" : \"Copy\"}\n className={cn(className)}\n onClick={(event) => {\n onClick?.(event)\n navigator.clipboard\n .writeText(value)\n .then(() => setCopied(true))\n .catch(() => {})\n }}\n {...props}\n >\n {copied ? (\n <CheckIcon\n />\n ) : (\n <CopyIcon\n />\n )}\n </Button>\n <span aria-live=\"polite\" className=\"sr-only\">\n {copied ? \"Copied\" : \"\"}\n </span>\n </>\n )\n}\n\nfunction CodeBlockContent({\n className,\n children,\n style,\n wrap = false,\n lineNumbers = false,\n startLine = 1,\n ...props\n}: React.ComponentProps<\"pre\"> & {\n wrap?: boolean\n lineNumbers?: boolean\n startLine?: number\n}) {\n return (\n <pre\n data-slot=\"code-block-content\"\n data-wrap={wrap || undefined}\n data-numbered={lineNumbers || undefined}\n dir=\"ltr\"\n tabIndex={0}\n style={{ counterReset: `line ${startLine - 1}`, ...style }}\n className={cn(\n \"min-h-0 min-w-0 scroll-fade-x scrollbar-thin overflow-auto px-3 py-3 text-start font-mono leading-relaxed outline-none group-has-data-[slot=code-block-footer]/code-block:pb-2 group-has-data-[slot=code-block-header]/code-block:pt-2 group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:py-2.5 group-data-[size=sm]/code-block:group-has-data-[slot=code-block-header]/code-block:pt-1.5 data-wrap:scroll-fade-y data-wrap:wrap-break-word data-wrap:whitespace-pre-wrap\",\n className\n )}\n {...props}\n >\n <code\n data-slot=\"code-block-code\"\n className=\"grid min-h-lh min-w-max content-start in-data-numbered:grid-cols-[auto_1fr] in-data-wrap:min-w-0\"\n >\n {lineNumbers && typeof children === \"string\"\n ? children\n .replace(/\\n$/, \"\")\n .split(\"\\n\")\n .map((line, index) => (\n <CodeBlockLine key={index}>{line}</CodeBlockLine>\n ))\n : children}\n </code>\n </pre>\n )\n}\n\nconst codeBlockLineVariants = cva(\n \"relative -mx-3 block min-h-lh px-3 group-data-[size=sm]/code-block:-mx-2.5 group-data-[size=sm]/code-block:px-2.5 before:min-w-6 before:text-end before:text-muted-foreground after:absolute after:start-1 after:top-0 after:text-muted-foreground after:select-none in-data-numbered:col-span-2 in-data-numbered:grid in-data-numbered:grid-cols-subgrid in-data-numbered:gap-x-3 in-data-numbered:[counter-increment:line] in-data-numbered:before:content-[counter(line)] in-data-numbered:before:select-none in-data-numbered:supports-[content:counter(line)_/_'']:before:content-[counter(line)_/_'']\",\n {\n variants: {\n variant: {\n default: \"\",\n added: \"bg-muted after:content-['+']\",\n removed: \"bg-destructive/10 after:text-destructive after:content-['−']\",\n highlighted: \"bg-muted\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nfunction CodeBlockLine({\n className,\n variant = \"default\",\n children,\n ...props\n}: React.ComponentProps<\"span\"> & VariantProps<typeof codeBlockLineVariants>) {\n // An empty line holds a newline so copying a selection keeps blank lines.\n const empty =\n children === undefined ||\n children === null ||\n children === \"\" ||\n (Array.isArray(children) && children.length === 0)\n\n return (\n <span\n data-slot=\"code-block-line\"\n data-variant={variant}\n className={cn(codeBlockLineVariants({ variant }), className)}\n {...props}\n >\n <span data-slot=\"code-block-line-content\" className=\"min-w-0\">\n {empty ? \"\\n\" : children}\n </span>\n </span>\n )\n}\n\nfunction CodeBlockFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"code-block-footer\"\n className={cn(\n \"flex min-w-0 shrink-0 items-center gap-2 px-3 pb-3 text-muted-foreground group-data-[size=sm]/code-block:px-2.5 group-data-[size=sm]/code-block:pb-2.5\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n CodeBlock,\n CodeBlockHeader,\n CodeBlockTitle,\n CodeBlockActions,\n CodeBlockCopyButton,\n CodeBlockContent,\n CodeBlockLine,\n CodeBlockFooter,\n}\n"],"mappings":"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"}
@@ -267,6 +267,22 @@
267
267
  --berget-shiki-token-parameter: var(--berget-brand-granite-50);
268
268
  --berget-shiki-token-string-expression: var(--berget-brand-moss-300);
269
269
  --berget-shiki-token-punctuation: var(--berget-brand-granite-50);
270
+ --berget-shiki-ansi-black: var(--berget-brand-granite-400);
271
+ --berget-shiki-ansi-red: var(--berget-brand-muscaria-400);
272
+ --berget-shiki-ansi-green: var(--berget-brand-moss-400);
273
+ --berget-shiki-ansi-yellow: var(--berget-brand-chanterelle-300);
274
+ --berget-shiki-ansi-blue: var(--berget-brand-fjord-400);
275
+ --berget-shiki-ansi-magenta: var(--berget-brand-muscaria-300);
276
+ --berget-shiki-ansi-cyan: var(--berget-brand-fjord-300);
277
+ --berget-shiki-ansi-white: var(--berget-brand-granite-50);
278
+ --berget-shiki-ansi-bright-black: var(--berget-brand-granite-500);
279
+ --berget-shiki-ansi-bright-red: var(--berget-brand-muscaria-300);
280
+ --berget-shiki-ansi-bright-green: var(--berget-brand-moss-300);
281
+ --berget-shiki-ansi-bright-yellow: var(--berget-brand-chanterelle-200);
282
+ --berget-shiki-ansi-bright-blue: var(--berget-brand-fjord-300);
283
+ --berget-shiki-ansi-bright-magenta: var(--berget-brand-muscaria-200);
284
+ --berget-shiki-ansi-bright-cyan: var(--berget-brand-fjord-200);
285
+ --berget-shiki-ansi-bright-white: var(--berget-brand-granite-50);
270
286
 
271
287
  /* ── Badge component-scoped tokens ──────────────────────────────── */
272
288
  /* Tinted status style: 15% brand tint bg with a same-hue accent fg.
@@ -636,6 +652,22 @@
636
652
  --berget-shiki-token-parameter: var(--berget-brand-granite-900);
637
653
  --berget-shiki-token-string-expression: var(--berget-brand-moss-500);
638
654
  --berget-shiki-token-punctuation: var(--berget-brand-granite-900);
655
+ --berget-shiki-ansi-black: var(--berget-brand-granite-800);
656
+ --berget-shiki-ansi-red: var(--berget-brand-muscaria-600);
657
+ --berget-shiki-ansi-green: var(--berget-brand-moss-600);
658
+ --berget-shiki-ansi-yellow: var(--berget-brand-chanterelle-400);
659
+ --berget-shiki-ansi-blue: var(--berget-brand-fjord-600);
660
+ --berget-shiki-ansi-magenta: var(--berget-brand-muscaria-500);
661
+ --berget-shiki-ansi-cyan: var(--berget-brand-fjord-500);
662
+ --berget-shiki-ansi-white: var(--berget-brand-granite-600);
663
+ --berget-shiki-ansi-bright-black: var(--berget-brand-granite-700);
664
+ --berget-shiki-ansi-bright-red: var(--berget-brand-muscaria-500);
665
+ --berget-shiki-ansi-bright-green: var(--berget-brand-moss-500);
666
+ --berget-shiki-ansi-bright-yellow: var(--berget-brand-chanterelle-300);
667
+ --berget-shiki-ansi-bright-blue: var(--berget-brand-fjord-500);
668
+ --berget-shiki-ansi-bright-magenta: var(--berget-brand-muscaria-400);
669
+ --berget-shiki-ansi-bright-cyan: var(--berget-brand-fjord-400);
670
+ --berget-shiki-ansi-bright-white: var(--berget-brand-granite-600);
639
671
 
640
672
  /* ── Badge component-scoped tokens (light) ──────────────────────── */
641
673
  --berget-badge-default-bg: color-mix(in oklch, var(--berget-brand-moss-400) 15%, transparent);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bergetai/ui",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "Berget Design System - Scandinavian-inspired design system with console aesthetic",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -52,6 +52,7 @@
52
52
  "clsx": "^2.1.1",
53
53
  "cmdk": "^1.1.1",
54
54
  "cn": "^0.2.4",
55
+ "shadcn": "^4.22.1",
55
56
  "tailwind-merge": "^3.5.0"
56
57
  },
57
58
  "peerDependencies": {