@vllnt/ui 0.1.4 → 0.1.7-canary.2c4792f

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 (225) hide show
  1. package/dist/components/accordion/accordion.js +172 -0
  2. package/dist/components/accordion/index.js +12 -0
  3. package/dist/components/alert/alert.js +53 -0
  4. package/dist/components/alert/index.js +7 -0
  5. package/dist/components/alert-dialog/alert-dialog.js +117 -0
  6. package/dist/components/alert-dialog/index.js +26 -0
  7. package/dist/components/aspect-ratio/aspect-ratio.js +6 -0
  8. package/dist/components/aspect-ratio/index.js +4 -0
  9. package/dist/components/avatar/avatar.js +43 -0
  10. package/dist/components/avatar/index.js +6 -0
  11. package/dist/components/badge/badge.js +26 -0
  12. package/dist/components/badge/index.js +5 -0
  13. package/dist/components/blog-card/blog-card.js +50 -0
  14. package/dist/components/blog-card/index.js +5 -0
  15. package/dist/components/breadcrumb/breadcrumb.js +61 -0
  16. package/dist/components/breadcrumb/index.js +4 -0
  17. package/dist/components/button/button.js +48 -0
  18. package/dist/components/button/index.js +5 -0
  19. package/dist/components/calendar/calendar.js +71 -0
  20. package/dist/components/calendar/index.js +4 -0
  21. package/dist/components/callout/callout.js +59 -0
  22. package/dist/components/callout/index.js +4 -0
  23. package/dist/components/card/card.js +64 -0
  24. package/dist/components/card/index.js +16 -0
  25. package/dist/components/carousel/carousel.js +239 -0
  26. package/dist/components/carousel/index.js +14 -0
  27. package/dist/components/category-filter/category-filter.js +34 -0
  28. package/dist/components/category-filter/index.js +4 -0
  29. package/dist/components/chart/area-chart.js +99 -0
  30. package/dist/components/chart/bar-chart.js +80 -0
  31. package/dist/components/chart/index.js +3 -0
  32. package/dist/components/chart/line-chart.js +97 -0
  33. package/dist/components/checkbox/checkbox.js +28 -0
  34. package/dist/components/checkbox/index.js +4 -0
  35. package/dist/components/checklist/checklist.js +181 -0
  36. package/dist/components/checklist/index.js +6 -0
  37. package/dist/components/code-block/code-block.js +126 -0
  38. package/dist/components/code-block/index.js +4 -0
  39. package/dist/components/code-playground/code-playground.js +86 -0
  40. package/dist/components/code-playground/index.js +8 -0
  41. package/dist/components/collapsible/collapsible.js +10 -0
  42. package/dist/components/collapsible/index.js +10 -0
  43. package/dist/components/command/command.js +123 -0
  44. package/dist/components/command/index.js +22 -0
  45. package/dist/components/comparison/comparison.js +121 -0
  46. package/dist/components/comparison/index.js +8 -0
  47. package/dist/components/completion-dialog/completion-dialog.js +173 -0
  48. package/dist/components/completion-dialog/index.js +6 -0
  49. package/dist/components/content-intro/content-intro.js +144 -0
  50. package/dist/components/content-intro/index.js +6 -0
  51. package/dist/components/context-menu/context-menu.js +154 -0
  52. package/dist/components/context-menu/index.js +34 -0
  53. package/dist/components/cookie-consent/cookie-consent.js +175 -0
  54. package/dist/components/cookie-consent/index.js +8 -0
  55. package/dist/components/dialog/dialog.js +105 -0
  56. package/dist/components/dialog/index.js +24 -0
  57. package/dist/components/drawer/drawer.js +102 -0
  58. package/dist/components/drawer/index.js +24 -0
  59. package/dist/components/dropdown-menu/dropdown-menu.js +151 -0
  60. package/dist/components/dropdown-menu/index.js +34 -0
  61. package/dist/components/exercise/exercise.js +112 -0
  62. package/dist/components/exercise/index.js +4 -0
  63. package/dist/components/faq/faq.js +56 -0
  64. package/dist/components/faq/index.js +5 -0
  65. package/dist/components/filter-bar/filter-bar.js +244 -0
  66. package/dist/components/filter-bar/index.js +6 -0
  67. package/dist/components/floating-action-button/floating-action-button.js +35 -0
  68. package/dist/components/floating-action-button/index.js +6 -0
  69. package/dist/components/flow-diagram/flow-canvas.js +109 -0
  70. package/dist/components/flow-diagram/flow-controls.js +140 -0
  71. package/dist/components/flow-diagram/flow-diagram.js +114 -0
  72. package/dist/components/flow-diagram/flow-error-boundary.js +63 -0
  73. package/dist/components/flow-diagram/flow-fullscreen.js +58 -0
  74. package/dist/components/flow-diagram/index.js +12 -0
  75. package/dist/components/flow-diagram/types.js +0 -0
  76. package/dist/components/flow-diagram/use-flow-diagram.js +146 -0
  77. package/dist/components/horizontal-scroll-row/horizontal-scroll-row.js +66 -0
  78. package/dist/components/horizontal-scroll-row/index.js +6 -0
  79. package/dist/components/hover-card/hover-card.js +26 -0
  80. package/dist/components/hover-card/index.js +6 -0
  81. package/dist/components/index.js +641 -0
  82. package/dist/components/inline-input/index.js +4 -0
  83. package/dist/components/inline-input/inline-input.js +42 -0
  84. package/dist/components/input/index.js +4 -0
  85. package/dist/components/input/input.js +23 -0
  86. package/dist/components/input-otp/index.js +12 -0
  87. package/dist/components/input-otp/input-otp.js +54 -0
  88. package/dist/components/key-concept/index.js +8 -0
  89. package/dist/components/key-concept/key-concept.js +79 -0
  90. package/dist/components/keyboard-shortcuts-help/index.js +6 -0
  91. package/dist/components/keyboard-shortcuts-help/keyboard-shortcuts-help.js +121 -0
  92. package/dist/components/label/index.js +4 -0
  93. package/dist/components/label/label.js +21 -0
  94. package/dist/components/lang-provider/index.js +4 -0
  95. package/dist/components/lang-provider/lang-provider.js +18 -0
  96. package/dist/components/learning-objectives/index.js +10 -0
  97. package/dist/components/learning-objectives/learning-objectives.js +76 -0
  98. package/dist/components/mdx-content/index.js +4 -0
  99. package/dist/components/mdx-content/mdx-content.js +151 -0
  100. package/dist/components/menubar/index.js +36 -0
  101. package/dist/components/menubar/menubar.js +183 -0
  102. package/dist/components/model-selector/index.js +6 -0
  103. package/dist/components/model-selector/model-selector.js +374 -0
  104. package/dist/components/navbar-saas/index.js +6 -0
  105. package/dist/components/navbar-saas/navbar-saas.js +68 -0
  106. package/dist/components/navbar-saas/use-mobile.js +19 -0
  107. package/dist/components/navigation-menu/index.js +22 -0
  108. package/dist/components/navigation-menu/navigation-menu.js +108 -0
  109. package/dist/components/pagination/index.js +4 -0
  110. package/dist/components/pagination/pagination.js +44 -0
  111. package/dist/components/popover/index.js +12 -0
  112. package/dist/components/popover/popover.js +28 -0
  113. package/dist/components/pro-tip/index.js +8 -0
  114. package/dist/components/pro-tip/pro-tip.js +139 -0
  115. package/dist/components/profile-section/index.js +4 -0
  116. package/dist/components/profile-section/profile-section.js +45 -0
  117. package/dist/components/progress-bar/index.js +4 -0
  118. package/dist/components/progress-bar/progress-bar.js +56 -0
  119. package/dist/components/progress-card/index.js +6 -0
  120. package/dist/components/progress-card/progress-card.js +71 -0
  121. package/dist/components/quiz/index.js +4 -0
  122. package/dist/components/quiz/quiz.js +210 -0
  123. package/dist/components/radio-group/index.js +5 -0
  124. package/dist/components/radio-group/radio-group.js +36 -0
  125. package/dist/components/resizable/index.js +10 -0
  126. package/dist/components/resizable/resizable.js +39 -0
  127. package/dist/components/scroll-area/index.js +5 -0
  128. package/dist/components/scroll-area/scroll-area.js +39 -0
  129. package/dist/components/search-bar/index.js +4 -0
  130. package/dist/components/search-bar/search-bar.js +122 -0
  131. package/dist/components/search-dialog/index.js +4 -0
  132. package/dist/components/search-dialog/search-dialog.js +102 -0
  133. package/dist/components/select/index.js +24 -0
  134. package/dist/components/select/select.js +125 -0
  135. package/dist/components/separator/index.js +4 -0
  136. package/dist/components/separator/separator.js +25 -0
  137. package/dist/components/share-dialog/index.js +6 -0
  138. package/dist/components/share-dialog/share-dialog.js +121 -0
  139. package/dist/components/share-section/index.js +6 -0
  140. package/dist/components/share-section/share-section.js +57 -0
  141. package/dist/components/sheet/index.js +24 -0
  142. package/dist/components/sheet/sheet.js +116 -0
  143. package/dist/components/sidebar/index.js +4 -0
  144. package/dist/components/sidebar/sidebar.js +188 -0
  145. package/dist/components/sidebar-provider/index.js +5 -0
  146. package/dist/components/sidebar-provider/sidebar-provider.js +25 -0
  147. package/dist/components/sidebar-toggle/index.js +4 -0
  148. package/dist/components/sidebar-toggle/sidebar-toggle.js +36 -0
  149. package/dist/components/skeleton/index.js +4 -0
  150. package/dist/components/skeleton/skeleton.js +17 -0
  151. package/dist/components/slider/index.js +4 -0
  152. package/dist/components/slider/slider.js +24 -0
  153. package/dist/components/slideshow/index.js +6 -0
  154. package/dist/components/slideshow/slideshow.js +440 -0
  155. package/dist/components/social-fab/index.js +6 -0
  156. package/dist/components/social-fab/social-fab.js +211 -0
  157. package/dist/components/social-fab/use-social-fab.js +111 -0
  158. package/dist/components/spinner/index.js +4 -0
  159. package/dist/components/spinner/spinner.js +23 -0
  160. package/dist/components/step-by-step/index.js +8 -0
  161. package/dist/components/step-by-step/step-by-step.js +194 -0
  162. package/dist/components/step-navigation/index.js +4 -0
  163. package/dist/components/step-navigation/step-navigation.js +119 -0
  164. package/dist/components/switch/index.js +4 -0
  165. package/dist/components/switch/switch.js +28 -0
  166. package/dist/components/table/index.js +20 -0
  167. package/dist/components/table/table.js +87 -0
  168. package/dist/components/table-of-contents/index.js +4 -0
  169. package/dist/components/table-of-contents/table-of-contents.js +71 -0
  170. package/dist/components/table-of-contents-panel/index.js +6 -0
  171. package/dist/components/table-of-contents-panel/table-of-contents-panel.js +202 -0
  172. package/dist/components/tabs/index.js +12 -0
  173. package/dist/components/tabs/tabs.js +84 -0
  174. package/dist/components/terminal/index.js +8 -0
  175. package/dist/components/terminal/terminal.js +119 -0
  176. package/dist/components/textarea/index.js +4 -0
  177. package/dist/components/textarea/textarea.js +22 -0
  178. package/dist/components/theme-provider/index.js +4 -0
  179. package/dist/components/theme-provider/theme-provider.js +11 -0
  180. package/dist/components/theme-toggle/index.js +4 -0
  181. package/dist/components/theme-toggle/theme-toggle.js +170 -0
  182. package/dist/components/thinking-block/index.js +4 -0
  183. package/dist/components/thinking-block/thinking-block.js +56 -0
  184. package/dist/components/tldr-section/index.js +4 -0
  185. package/dist/components/tldr-section/tldr-section.js +101 -0
  186. package/dist/components/toast/index.js +18 -0
  187. package/dist/components/toast/toast.js +84 -0
  188. package/dist/components/toast/toaster.js +38 -0
  189. package/dist/components/toggle/index.js +5 -0
  190. package/dist/components/toggle/toggle.js +39 -0
  191. package/dist/components/toggle-group/index.js +5 -0
  192. package/dist/components/toggle-group/toggle-group.js +46 -0
  193. package/dist/components/tooltip/index.js +12 -0
  194. package/dist/components/tooltip/tooltip.js +27 -0
  195. package/dist/components/truncated-text/index.js +4 -0
  196. package/dist/components/truncated-text/truncated-text.js +25 -0
  197. package/dist/components/tutorial-card/index.js +6 -0
  198. package/dist/components/tutorial-card/tutorial-card.js +78 -0
  199. package/dist/components/tutorial-complete/index.js +6 -0
  200. package/dist/components/tutorial-complete/tutorial-complete.js +134 -0
  201. package/dist/components/tutorial-filters/index.js +6 -0
  202. package/dist/components/tutorial-filters/tutorial-filters.js +205 -0
  203. package/dist/components/tutorial-intro-content/index.js +6 -0
  204. package/dist/components/tutorial-intro-content/tutorial-intro-content.js +141 -0
  205. package/dist/components/tutorial-mdx/index.js +8 -0
  206. package/dist/components/tutorial-mdx/tutorial-mdx.js +219 -0
  207. package/dist/components/video-embed/index.js +4 -0
  208. package/dist/components/video-embed/video-embed.js +77 -0
  209. package/dist/components/view-switcher/index.js +6 -0
  210. package/dist/components/view-switcher/view-switcher.js +92 -0
  211. package/dist/index.d.ts +44 -2
  212. package/dist/index.js +14 -8556
  213. package/dist/lib/types.js +11 -0
  214. package/dist/lib/use-debounce.js +17 -0
  215. package/dist/lib/use-horizontal-scroll.js +60 -0
  216. package/dist/lib/use-mounted.js +17 -0
  217. package/dist/lib/utils.js +8 -0
  218. package/dist/tailwind-preset.d.ts +5 -0
  219. package/dist/tailwind-preset.js +9 -10
  220. package/dist/types/content.js +0 -0
  221. package/dist/types/index.js +0 -0
  222. package/package.json +42 -23
  223. package/LICENSE +0 -21
  224. package/dist/chunk-XRV5RSYH.js +0 -569
  225. package/dist/flow-diagram-N3EHM6VB.js +0 -2
@@ -0,0 +1,172 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ createContext,
5
+ useCallback,
6
+ useContext,
7
+ useMemo,
8
+ useState
9
+ } from "react";
10
+ import { cn } from "../../lib/utils";
11
+ const AccordionContext = createContext(null);
12
+ function useAccordionContext() {
13
+ const context = useContext(AccordionContext);
14
+ if (!context) {
15
+ throw new Error("AccordionItem must be used within an Accordion");
16
+ }
17
+ return context;
18
+ }
19
+ function Accordion({
20
+ children,
21
+ className,
22
+ defaultValue,
23
+ type = "single"
24
+ }) {
25
+ const [openItems, setOpenItems] = useState(() => {
26
+ if (!defaultValue) return /* @__PURE__ */ new Set();
27
+ if (Array.isArray(defaultValue)) return new Set(defaultValue);
28
+ return /* @__PURE__ */ new Set([defaultValue]);
29
+ });
30
+ const toggleItem = useCallback(
31
+ (value) => {
32
+ setOpenItems((previous) => {
33
+ const newSet = new Set(previous);
34
+ if (newSet.has(value)) {
35
+ newSet.delete(value);
36
+ } else {
37
+ if (type === "single") {
38
+ newSet.clear();
39
+ }
40
+ newSet.add(value);
41
+ }
42
+ return newSet;
43
+ });
44
+ },
45
+ [type]
46
+ );
47
+ const contextValue = useMemo(
48
+ () => ({ openItems, toggleItem, type }),
49
+ [openItems, toggleItem, type]
50
+ );
51
+ return /* @__PURE__ */ jsx(AccordionContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(
52
+ "div",
53
+ {
54
+ className: cn(
55
+ "my-6 divide-y divide-border rounded-lg border",
56
+ className
57
+ ),
58
+ children
59
+ }
60
+ ) });
61
+ }
62
+ function AccordionItem({
63
+ children,
64
+ className,
65
+ value
66
+ }) {
67
+ return /* @__PURE__ */ jsx(
68
+ "div",
69
+ {
70
+ className: cn(
71
+ "first:rounded-t-lg last:rounded-b-lg overflow-hidden",
72
+ className
73
+ ),
74
+ "data-value": value,
75
+ children
76
+ }
77
+ );
78
+ }
79
+ function AccordionTrigger({
80
+ children,
81
+ className,
82
+ icon,
83
+ value
84
+ }) {
85
+ const { openItems, toggleItem } = useAccordionContext();
86
+ const isOpen = openItems.has(value);
87
+ return /* @__PURE__ */ jsxs(
88
+ "button",
89
+ {
90
+ "aria-expanded": isOpen,
91
+ className: cn(
92
+ "w-full flex items-center justify-between p-4 text-left font-medium transition-colors",
93
+ "hover:bg-muted/50",
94
+ isOpen && "bg-muted/30",
95
+ className
96
+ ),
97
+ onClick: () => {
98
+ toggleItem(value);
99
+ },
100
+ type: "button",
101
+ children: [
102
+ /* @__PURE__ */ jsx("span", { className: "text-sm", children }),
103
+ icon ? /* @__PURE__ */ jsx(
104
+ "span",
105
+ {
106
+ className: cn(
107
+ "h-4 w-4 flex-shrink-0 transition-transform duration-200",
108
+ isOpen && "rotate-180"
109
+ ),
110
+ children: icon
111
+ }
112
+ ) : /* @__PURE__ */ jsx(
113
+ "svg",
114
+ {
115
+ className: cn(
116
+ "h-4 w-4 flex-shrink-0 transition-transform duration-200",
117
+ isOpen && "rotate-180"
118
+ ),
119
+ fill: "none",
120
+ stroke: "currentColor",
121
+ viewBox: "0 0 24 24",
122
+ children: /* @__PURE__ */ jsx(
123
+ "path",
124
+ {
125
+ d: "m6 9 6 6 6-6",
126
+ strokeLinecap: "round",
127
+ strokeLinejoin: "round",
128
+ strokeWidth: 2
129
+ }
130
+ )
131
+ }
132
+ )
133
+ ]
134
+ }
135
+ );
136
+ }
137
+ function AccordionContent({
138
+ children,
139
+ className,
140
+ value
141
+ }) {
142
+ const { openItems } = useAccordionContext();
143
+ const isOpen = openItems.has(value);
144
+ return /* @__PURE__ */ jsx(
145
+ "div",
146
+ {
147
+ className: cn(
148
+ "overflow-hidden transition-all duration-200",
149
+ isOpen ? "max-h-[1000px] opacity-100" : "max-h-0 opacity-0"
150
+ ),
151
+ children: /* @__PURE__ */ jsx(
152
+ "div",
153
+ {
154
+ className: cn(
155
+ "p-4 pt-0 text-sm text-muted-foreground [&>p]:mb-2 [&>pre]:my-2",
156
+ className
157
+ ),
158
+ children
159
+ }
160
+ )
161
+ }
162
+ );
163
+ }
164
+ Accordion.Item = AccordionItem;
165
+ Accordion.Trigger = AccordionTrigger;
166
+ Accordion.Content = AccordionContent;
167
+ export {
168
+ Accordion,
169
+ AccordionContent,
170
+ AccordionItem,
171
+ AccordionTrigger
172
+ };
@@ -0,0 +1,12 @@
1
+ import {
2
+ Accordion,
3
+ AccordionContent,
4
+ AccordionItem,
5
+ AccordionTrigger
6
+ } from "./accordion";
7
+ export {
8
+ Accordion,
9
+ AccordionContent,
10
+ AccordionItem,
11
+ AccordionTrigger
12
+ };
@@ -0,0 +1,53 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { cva } from "class-variance-authority";
4
+ import { cn } from "../../lib/utils";
5
+ const alertVariants = cva(
6
+ "relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",
7
+ {
8
+ defaultVariants: {
9
+ variant: "default"
10
+ },
11
+ variants: {
12
+ variant: {
13
+ default: "bg-background text-foreground",
14
+ destructive: "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive"
15
+ }
16
+ }
17
+ }
18
+ );
19
+ const Alert = forwardRef(({ className, variant, ...props }, ref) => /* @__PURE__ */ jsx(
20
+ "div",
21
+ {
22
+ className: cn(alertVariants({ variant }), className),
23
+ ref,
24
+ role: "alert",
25
+ ...props
26
+ }
27
+ ));
28
+ Alert.displayName = "Alert";
29
+ const AlertTitle = forwardRef(({ children, className, ...props }, ref) => /* @__PURE__ */ jsx(
30
+ "h5",
31
+ {
32
+ className: cn("mb-1 font-medium leading-none tracking-tight", className),
33
+ ref,
34
+ ...props,
35
+ children
36
+ }
37
+ ));
38
+ AlertTitle.displayName = "AlertTitle";
39
+ const AlertDescription = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
40
+ "div",
41
+ {
42
+ className: cn("text-sm [&_p]:leading-relaxed", className),
43
+ ref,
44
+ ...props
45
+ }
46
+ ));
47
+ AlertDescription.displayName = "AlertDescription";
48
+ export {
49
+ Alert,
50
+ AlertDescription,
51
+ AlertTitle,
52
+ alertVariants
53
+ };
@@ -0,0 +1,7 @@
1
+ import { Alert, AlertDescription, AlertTitle, alertVariants } from "./alert";
2
+ export {
3
+ Alert,
4
+ AlertDescription,
5
+ AlertTitle,
6
+ alertVariants
7
+ };
@@ -0,0 +1,117 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
5
+ import { cn } from "../../lib/utils";
6
+ import { buttonVariants } from "../button/button";
7
+ const AlertDialog = AlertDialogPrimitive.Root;
8
+ const AlertDialogTrigger = AlertDialogPrimitive.Trigger;
9
+ const AlertDialogPortal = AlertDialogPrimitive.Portal;
10
+ const AlertDialogOverlay = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
11
+ AlertDialogPrimitive.Overlay,
12
+ {
13
+ className: cn(
14
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
15
+ className
16
+ ),
17
+ ...props,
18
+ ref
19
+ }
20
+ ));
21
+ AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
22
+ const AlertDialogContent = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs(AlertDialogPortal, { children: [
23
+ /* @__PURE__ */ jsx(AlertDialogOverlay, {}),
24
+ /* @__PURE__ */ jsx(
25
+ AlertDialogPrimitive.Content,
26
+ {
27
+ className: cn(
28
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
29
+ className
30
+ ),
31
+ ref,
32
+ ...props
33
+ }
34
+ )
35
+ ] }));
36
+ AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
37
+ const AlertDialogHeader = ({
38
+ className,
39
+ ...props
40
+ }) => /* @__PURE__ */ jsx(
41
+ "div",
42
+ {
43
+ className: cn(
44
+ "flex flex-col space-y-2 text-center sm:text-left",
45
+ className
46
+ ),
47
+ ...props
48
+ }
49
+ );
50
+ AlertDialogHeader.displayName = "AlertDialogHeader";
51
+ const AlertDialogFooter = ({
52
+ className,
53
+ ...props
54
+ }) => /* @__PURE__ */ jsx(
55
+ "div",
56
+ {
57
+ className: cn(
58
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
59
+ className
60
+ ),
61
+ ...props
62
+ }
63
+ );
64
+ AlertDialogFooter.displayName = "AlertDialogFooter";
65
+ const AlertDialogTitle = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
66
+ AlertDialogPrimitive.Title,
67
+ {
68
+ className: cn("text-lg font-semibold", className),
69
+ ref,
70
+ ...props
71
+ }
72
+ ));
73
+ AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
74
+ const AlertDialogDescription = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
75
+ AlertDialogPrimitive.Description,
76
+ {
77
+ className: cn("text-sm text-muted-foreground", className),
78
+ ref,
79
+ ...props
80
+ }
81
+ ));
82
+ AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
83
+ const AlertDialogAction = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
84
+ AlertDialogPrimitive.Action,
85
+ {
86
+ className: cn(buttonVariants(), className),
87
+ ref,
88
+ ...props
89
+ }
90
+ ));
91
+ AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
92
+ const AlertDialogCancel = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
93
+ AlertDialogPrimitive.Cancel,
94
+ {
95
+ className: cn(
96
+ buttonVariants({ variant: "outline" }),
97
+ "mt-2 sm:mt-0",
98
+ className
99
+ ),
100
+ ref,
101
+ ...props
102
+ }
103
+ ));
104
+ AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;
105
+ export {
106
+ AlertDialog,
107
+ AlertDialogAction,
108
+ AlertDialogCancel,
109
+ AlertDialogContent,
110
+ AlertDialogDescription,
111
+ AlertDialogFooter,
112
+ AlertDialogHeader,
113
+ AlertDialogOverlay,
114
+ AlertDialogPortal,
115
+ AlertDialogTitle,
116
+ AlertDialogTrigger
117
+ };
@@ -0,0 +1,26 @@
1
+ import {
2
+ AlertDialog,
3
+ AlertDialogAction,
4
+ AlertDialogCancel,
5
+ AlertDialogContent,
6
+ AlertDialogDescription,
7
+ AlertDialogFooter,
8
+ AlertDialogHeader,
9
+ AlertDialogOverlay,
10
+ AlertDialogPortal,
11
+ AlertDialogTitle,
12
+ AlertDialogTrigger
13
+ } from "./alert-dialog";
14
+ export {
15
+ AlertDialog,
16
+ AlertDialogAction,
17
+ AlertDialogCancel,
18
+ AlertDialogContent,
19
+ AlertDialogDescription,
20
+ AlertDialogFooter,
21
+ AlertDialogHeader,
22
+ AlertDialogOverlay,
23
+ AlertDialogPortal,
24
+ AlertDialogTitle,
25
+ AlertDialogTrigger
26
+ };
@@ -0,0 +1,6 @@
1
+ "use client";
2
+ import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
3
+ const AspectRatio = AspectRatioPrimitive.Root;
4
+ export {
5
+ AspectRatio
6
+ };
@@ -0,0 +1,4 @@
1
+ import { AspectRatio } from "./aspect-ratio";
2
+ export {
3
+ AspectRatio
4
+ };
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { forwardRef } from "react";
4
+ import * as AvatarPrimitive from "@radix-ui/react-avatar";
5
+ import { cn } from "../../lib/utils";
6
+ const Avatar = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
7
+ AvatarPrimitive.Root,
8
+ {
9
+ className: cn(
10
+ "relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full",
11
+ className
12
+ ),
13
+ ref,
14
+ ...props
15
+ }
16
+ ));
17
+ Avatar.displayName = AvatarPrimitive.Root.displayName;
18
+ const AvatarImage = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
19
+ AvatarPrimitive.Image,
20
+ {
21
+ className: cn("aspect-square h-full w-full", className),
22
+ ref,
23
+ ...props
24
+ }
25
+ ));
26
+ AvatarImage.displayName = AvatarPrimitive.Image.displayName;
27
+ const AvatarFallback = forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
28
+ AvatarPrimitive.Fallback,
29
+ {
30
+ className: cn(
31
+ "flex h-full w-full items-center justify-center rounded-full bg-muted",
32
+ className
33
+ ),
34
+ ref,
35
+ ...props
36
+ }
37
+ ));
38
+ AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
39
+ export {
40
+ Avatar,
41
+ AvatarFallback,
42
+ AvatarImage
43
+ };
@@ -0,0 +1,6 @@
1
+ import { Avatar, AvatarFallback, AvatarImage } from "./avatar";
2
+ export {
3
+ Avatar,
4
+ AvatarFallback,
5
+ AvatarImage
6
+ };
@@ -0,0 +1,26 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { cva } from "class-variance-authority";
3
+ import { cn } from "../../lib/utils";
4
+ const badgeVariants = cva(
5
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
6
+ {
7
+ defaultVariants: {
8
+ variant: "default"
9
+ },
10
+ variants: {
11
+ variant: {
12
+ default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
13
+ destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
14
+ outline: "text-foreground",
15
+ secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80"
16
+ }
17
+ }
18
+ }
19
+ );
20
+ function Badge({ className, variant, ...props }) {
21
+ return /* @__PURE__ */ jsx("span", { className: cn(badgeVariants({ variant }), className), ...props });
22
+ }
23
+ export {
24
+ Badge,
25
+ badgeVariants
26
+ };
@@ -0,0 +1,5 @@
1
+ import { Badge, badgeVariants } from "./badge";
2
+ export {
3
+ Badge,
4
+ badgeVariants
5
+ };
@@ -0,0 +1,50 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import Link from "next/link";
3
+ import { Badge } from "../badge";
4
+ import {
5
+ Card,
6
+ CardContent,
7
+ CardDescription,
8
+ CardHeader,
9
+ CardTitle
10
+ } from "../card";
11
+ function ContentCard({
12
+ formatDate,
13
+ href,
14
+ lang,
15
+ post,
16
+ readMoreLabel,
17
+ showBadge = true,
18
+ showDate = true,
19
+ showReadMore = true,
20
+ updatedLabel
21
+ }) {
22
+ const shouldShowBadge = showBadge && post.tags && post.tags.length > 0;
23
+ const shouldShowDate = showDate && post.date && formatDate && lang;
24
+ const shouldShowUpdatedDate = showDate && post.updatedDate && formatDate && lang;
25
+ const shouldShowHeaderMeta = shouldShowBadge || shouldShowDate || shouldShowUpdatedDate;
26
+ return /* @__PURE__ */ jsx(Link, { className: "block h-full", href, children: /* @__PURE__ */ jsxs(Card, { className: "h-full flex flex-col hover:shadow-lg transition-shadow cursor-pointer", children: [
27
+ /* @__PURE__ */ jsxs(CardHeader, { children: [
28
+ shouldShowHeaderMeta ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 mb-2", children: [
29
+ shouldShowBadge ? /* @__PURE__ */ jsx(Badge, { className: "text-xs", variant: "secondary", children: post.tags?.[0] }) : null,
30
+ shouldShowDate && post.date && lang ? /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: formatDate(post.date, lang) }) : null,
31
+ shouldShowUpdatedDate && post.updatedDate && lang ? /* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground", children: [
32
+ updatedLabel ? `${updatedLabel} ` : "",
33
+ formatDate(post.updatedDate, lang)
34
+ ] }) : null
35
+ ] }) : null,
36
+ /* @__PURE__ */ jsx(CardTitle, { className: "text-lg line-clamp-2", children: post.title }),
37
+ /* @__PURE__ */ jsx(CardDescription, { className: "line-clamp-3", children: post.description })
38
+ ] }),
39
+ showReadMore && readMoreLabel ? /* @__PURE__ */ jsx(CardContent, { className: "mt-auto", children: /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-sm text-muted-foreground", children: [
40
+ readMoreLabel,
41
+ " ",
42
+ /* @__PURE__ */ jsx("span", { className: "text-sm", children: "\u2192" })
43
+ ] }) }) : null
44
+ ] }) });
45
+ }
46
+ const BlogCard = ContentCard;
47
+ export {
48
+ BlogCard,
49
+ ContentCard
50
+ };
@@ -0,0 +1,5 @@
1
+ import { BlogCard, ContentCard } from "./blog-card";
2
+ export {
3
+ BlogCard,
4
+ ContentCard
5
+ };
@@ -0,0 +1,61 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import Link from "next/link";
3
+ import { cn } from "../../lib/utils";
4
+ const SEPARATOR_CHARS = {
5
+ arrow: "\u2192",
6
+ chevron: "\u203A",
7
+ slash: "/"
8
+ };
9
+ function SeparatorIcon({ type }) {
10
+ return /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-muted-foreground", children: SEPARATOR_CHARS[type] ?? "\u203A" });
11
+ }
12
+ function Breadcrumb({
13
+ className,
14
+ items,
15
+ separator = "chevron",
16
+ variant = "default"
17
+ }) {
18
+ return /* @__PURE__ */ jsx(
19
+ "nav",
20
+ {
21
+ "aria-label": "Breadcrumb",
22
+ className: cn("flex items-center space-x-1 text-sm", className),
23
+ children: items.map((item, index) => /* @__PURE__ */ jsxs("div", { className: "flex items-center", children: [
24
+ index > 0 && /* @__PURE__ */ jsx("span", { className: "mx-2", children: /* @__PURE__ */ jsx(SeparatorIcon, { type: separator }) }),
25
+ item.href ? /* @__PURE__ */ jsxs(
26
+ Link,
27
+ {
28
+ className: "flex items-center gap-1 hover:text-foreground transition-colors",
29
+ href: item.href,
30
+ children: [
31
+ item.icon ? /* @__PURE__ */ jsx("span", { className: "flex-shrink-0", children: item.icon }) : null,
32
+ /* @__PURE__ */ jsx(
33
+ "span",
34
+ {
35
+ className: cn(
36
+ // Truncate plain string labels; custom React elements handle their own overflow
37
+ typeof item.label === "string" && "truncate",
38
+ variant === "minimal" ? "text-muted-foreground" : "text-foreground"
39
+ ),
40
+ children: item.label
41
+ }
42
+ )
43
+ ]
44
+ }
45
+ ) : /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-muted-foreground", children: [
46
+ item.icon ? /* @__PURE__ */ jsx("span", { className: "flex-shrink-0", children: item.icon }) : null,
47
+ /* @__PURE__ */ jsx(
48
+ "span",
49
+ {
50
+ className: cn(typeof item.label === "string" && "truncate"),
51
+ children: item.label
52
+ }
53
+ )
54
+ ] })
55
+ ] }, index))
56
+ }
57
+ );
58
+ }
59
+ export {
60
+ Breadcrumb
61
+ };
@@ -0,0 +1,4 @@
1
+ import { Breadcrumb } from "./breadcrumb";
2
+ export {
3
+ Breadcrumb
4
+ };
@@ -0,0 +1,48 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from "react";
3
+ import { Slot } from "@radix-ui/react-slot";
4
+ import { cva } from "class-variance-authority";
5
+ import { cn } from "../../lib/utils";
6
+ const buttonVariants = cva(
7
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
8
+ {
9
+ defaultVariants: {
10
+ size: "default",
11
+ variant: "default"
12
+ },
13
+ variants: {
14
+ size: {
15
+ default: "h-10 px-4 py-2",
16
+ icon: "h-10 w-10",
17
+ lg: "h-11 rounded-md px-8",
18
+ sm: "h-9 rounded-md px-3"
19
+ },
20
+ variant: {
21
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
22
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
23
+ ghost: "hover:bg-accent hover:text-accent-foreground",
24
+ link: "text-primary underline-offset-4 hover:underline",
25
+ outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
26
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80"
27
+ }
28
+ }
29
+ }
30
+ );
31
+ const Button = forwardRef(
32
+ ({ asChild = false, className, size, variant, ...props }, reference) => {
33
+ const Comp = asChild ? Slot : "button";
34
+ return /* @__PURE__ */ jsx(
35
+ Comp,
36
+ {
37
+ className: cn(buttonVariants({ className, size, variant })),
38
+ ref: reference,
39
+ ...props
40
+ }
41
+ );
42
+ }
43
+ );
44
+ Button.displayName = "Button";
45
+ export {
46
+ Button,
47
+ buttonVariants
48
+ };
@@ -0,0 +1,5 @@
1
+ import { Button, buttonVariants } from "./button";
2
+ export {
3
+ Button,
4
+ buttonVariants
5
+ };