@forthtilliath/shadcn-ui 0.2.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 (217) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/dist/components/accordion.d.ts +12 -0
  4. package/dist/components/accordion.d.ts.map +1 -0
  5. package/dist/components/accordion.js +28 -0
  6. package/dist/components/alert-dialog.d.ts +15 -0
  7. package/dist/components/alert-dialog.d.ts.map +1 -0
  8. package/dist/components/alert-dialog.js +39 -0
  9. package/dist/components/alert.d.ts +10 -0
  10. package/dist/components/alert.d.ts.map +1 -0
  11. package/dist/components/alert.js +24 -0
  12. package/dist/components/aspect-ratio.d.ts +4 -0
  13. package/dist/components/aspect-ratio.d.ts.map +1 -0
  14. package/dist/components/aspect-ratio.js +7 -0
  15. package/dist/components/avatar.d.ts +7 -0
  16. package/dist/components/avatar.d.ts.map +1 -0
  17. package/dist/components/avatar.js +14 -0
  18. package/dist/components/badge.d.ts +10 -0
  19. package/dist/components/badge.d.ts.map +1 -0
  20. package/dist/components/badge.js +22 -0
  21. package/dist/components/blocks/accordion.d.ts +56 -0
  22. package/dist/components/blocks/accordion.d.ts.map +1 -0
  23. package/dist/components/blocks/accordion.js +138 -0
  24. package/dist/components/blocks/animated-tabs.d.ts +17 -0
  25. package/dist/components/blocks/animated-tabs.d.ts.map +1 -0
  26. package/dist/components/blocks/animated-tabs.js +135 -0
  27. package/dist/components/blocks/animated-text.d.ts +43 -0
  28. package/dist/components/blocks/animated-text.d.ts.map +1 -0
  29. package/dist/components/blocks/animated-text.js +122 -0
  30. package/dist/components/blocks/avatar.d.ts +17 -0
  31. package/dist/components/blocks/avatar.d.ts.map +1 -0
  32. package/dist/components/blocks/avatar.js +31 -0
  33. package/dist/components/blocks/calendar-date-picker.d.ts +22 -0
  34. package/dist/components/blocks/calendar-date-picker.d.ts.map +1 -0
  35. package/dist/components/blocks/calendar-date-picker.js +377 -0
  36. package/dist/components/blocks/data-table-ext/pagination.d.ts +12 -0
  37. package/dist/components/blocks/data-table-ext/pagination.d.ts.map +1 -0
  38. package/dist/components/blocks/data-table-ext/pagination.js +65 -0
  39. package/dist/components/blocks/data-table-ext/utils/table-config.d.ts +16 -0
  40. package/dist/components/blocks/data-table-ext/utils/table-config.d.ts.map +1 -0
  41. package/dist/components/blocks/data-table-ext/utils/table-config.js +28 -0
  42. package/dist/components/blocks/data-table.d.ts +10 -0
  43. package/dist/components/blocks/data-table.d.ts.map +1 -0
  44. package/dist/components/blocks/data-table.js +59 -0
  45. package/dist/components/blocks/field.d.ts +10 -0
  46. package/dist/components/blocks/field.d.ts.map +1 -0
  47. package/dist/components/blocks/field.js +5 -0
  48. package/dist/components/blocks/form.d.ts +14 -0
  49. package/dist/components/blocks/form.d.ts.map +1 -0
  50. package/dist/components/blocks/form.js +12 -0
  51. package/dist/components/blocks/navbar-01.d.ts +12 -0
  52. package/dist/components/blocks/navbar-01.d.ts.map +1 -0
  53. package/dist/components/blocks/navbar-01.js +10 -0
  54. package/dist/components/blocks/navbar-02.d.ts +11 -0
  55. package/dist/components/blocks/navbar-02.d.ts.map +1 -0
  56. package/dist/components/blocks/navbar-02.js +12 -0
  57. package/dist/components/blocks/navbar-04.d.ts +12 -0
  58. package/dist/components/blocks/navbar-04.d.ts.map +1 -0
  59. package/dist/components/blocks/navbar-04.js +10 -0
  60. package/dist/components/breadcrumb.d.ts +12 -0
  61. package/dist/components/breadcrumb.d.ts.map +1 -0
  62. package/dist/components/breadcrumb.js +27 -0
  63. package/dist/components/button.d.ts +11 -0
  64. package/dist/components/button.d.ts.map +1 -0
  65. package/dist/components/button.js +31 -0
  66. package/dist/components/calendar.d.ts +10 -0
  67. package/dist/components/calendar.d.ts.map +1 -0
  68. package/dist/components/calendar.js +77 -0
  69. package/dist/components/card.d.ts +10 -0
  70. package/dist/components/card.d.ts.map +1 -0
  71. package/dist/components/card.js +24 -0
  72. package/dist/components/carousel.d.ts +20 -0
  73. package/dist/components/carousel.d.ts.map +1 -0
  74. package/dist/components/carousel.js +101 -0
  75. package/dist/components/chart.d.ts +40 -0
  76. package/dist/components/chart.d.ts.map +1 -0
  77. package/dist/components/chart.js +144 -0
  78. package/dist/components/checkbox.d.ts +5 -0
  79. package/dist/components/checkbox.d.ts.map +1 -0
  80. package/dist/components/checkbox.js +9 -0
  81. package/dist/components/collapsible.d.ts +6 -0
  82. package/dist/components/collapsible.d.ts.map +1 -0
  83. package/dist/components/collapsible.js +13 -0
  84. package/dist/components/command.d.ts +19 -0
  85. package/dist/components/command.d.ts.map +1 -0
  86. package/dist/components/command.js +34 -0
  87. package/dist/components/context-menu.d.ts +26 -0
  88. package/dist/components/context-menu.d.ts.map +1 -0
  89. package/dist/components/context-menu.js +51 -0
  90. package/dist/components/dialog.d.ts +16 -0
  91. package/dist/components/dialog.d.ts.map +1 -0
  92. package/dist/components/dialog.js +36 -0
  93. package/dist/components/drawer.d.ts +14 -0
  94. package/dist/components/drawer.d.ts.map +1 -0
  95. package/dist/components/drawer.js +35 -0
  96. package/dist/components/dropdown-menu.d.ts +26 -0
  97. package/dist/components/dropdown-menu.d.ts.map +1 -0
  98. package/dist/components/dropdown-menu.js +51 -0
  99. package/dist/components/form.d.ts +25 -0
  100. package/dist/components/form.d.ts.map +1 -0
  101. package/dist/components/form.js +54 -0
  102. package/dist/components/hover-card.d.ts +7 -0
  103. package/dist/components/hover-card.d.ts.map +1 -0
  104. package/dist/components/hover-card.js +14 -0
  105. package/dist/components/input-otp.d.ts +12 -0
  106. package/dist/components/input-otp.d.ts.map +1 -0
  107. package/dist/components/input-otp.js +21 -0
  108. package/dist/components/input.d.ts +4 -0
  109. package/dist/components/input.d.ts.map +1 -0
  110. package/dist/components/input.js +6 -0
  111. package/dist/components/label.d.ts +5 -0
  112. package/dist/components/label.d.ts.map +1 -0
  113. package/dist/components/label.js +8 -0
  114. package/dist/components/menubar.d.ts +27 -0
  115. package/dist/components/menubar.d.ts.map +1 -0
  116. package/dist/components/menubar.js +54 -0
  117. package/dist/components/navigation-menu.d.ts +15 -0
  118. package/dist/components/navigation-menu.d.ts.map +1 -0
  119. package/dist/components/navigation-menu.js +31 -0
  120. package/dist/components/pagination.d.ts +14 -0
  121. package/dist/components/pagination.d.ts.map +1 -0
  122. package/dist/components/pagination.js +29 -0
  123. package/dist/components/popover.d.ts +8 -0
  124. package/dist/components/popover.d.ts.map +1 -0
  125. package/dist/components/popover.js +17 -0
  126. package/dist/components/progress.d.ts +5 -0
  127. package/dist/components/progress.d.ts.map +1 -0
  128. package/dist/components/progress.js +8 -0
  129. package/dist/components/radio-group.d.ts +6 -0
  130. package/dist/components/radio-group.d.ts.map +1 -0
  131. package/dist/components/radio-group.js +12 -0
  132. package/dist/components/resizable.d.ts +9 -0
  133. package/dist/components/resizable.d.ts.map +1 -0
  134. package/dist/components/resizable.js +15 -0
  135. package/dist/components/scroll-area.d.ts +6 -0
  136. package/dist/components/scroll-area.d.ts.map +1 -0
  137. package/dist/components/scroll-area.js +13 -0
  138. package/dist/components/select.d.ts +16 -0
  139. package/dist/components/select.d.ts.map +1 -0
  140. package/dist/components/select.js +38 -0
  141. package/dist/components/separator.d.ts +5 -0
  142. package/dist/components/separator.d.ts.map +1 -0
  143. package/dist/components/separator.js +8 -0
  144. package/dist/components/sheet.d.ts +14 -0
  145. package/dist/components/sheet.d.ts.map +1 -0
  146. package/dist/components/sheet.js +40 -0
  147. package/dist/components/sidebar.d.ts +70 -0
  148. package/dist/components/sidebar.d.ts.map +1 -0
  149. package/dist/components/sidebar.js +221 -0
  150. package/dist/components/skeleton.d.ts +3 -0
  151. package/dist/components/skeleton.d.ts.map +1 -0
  152. package/dist/components/skeleton.js +6 -0
  153. package/dist/components/slider.d.ts +5 -0
  154. package/dist/components/slider.d.ts.map +1 -0
  155. package/dist/components/slider.js +14 -0
  156. package/dist/components/sonner.d.ts +4 -0
  157. package/dist/components/sonner.d.ts.map +1 -0
  158. package/dist/components/sonner.js +13 -0
  159. package/dist/components/switch.d.ts +5 -0
  160. package/dist/components/switch.d.ts.map +1 -0
  161. package/dist/components/switch.js +8 -0
  162. package/dist/components/table.d.ts +11 -0
  163. package/dist/components/table.d.ts.map +1 -0
  164. package/dist/components/table.js +28 -0
  165. package/dist/components/tabs.d.ts +8 -0
  166. package/dist/components/tabs.d.ts.map +1 -0
  167. package/dist/components/tabs.js +17 -0
  168. package/dist/components/textarea.d.ts +4 -0
  169. package/dist/components/textarea.d.ts.map +1 -0
  170. package/dist/components/textarea.js +6 -0
  171. package/dist/components/toggle-group.d.ts +8 -0
  172. package/dist/components/toggle-group.d.ts.map +1 -0
  173. package/dist/components/toggle-group.js +21 -0
  174. package/dist/components/toggle.d.ts +10 -0
  175. package/dist/components/toggle.d.ts.map +1 -0
  176. package/dist/components/toggle.js +26 -0
  177. package/dist/components/tooltip.d.ts +8 -0
  178. package/dist/components/tooltip.d.ts.map +1 -0
  179. package/dist/components/tooltip.js +17 -0
  180. package/dist/hooks/use-mobile.d.ts +2 -0
  181. package/dist/hooks/use-mobile.d.ts.map +1 -0
  182. package/dist/hooks/use-mobile.js +24 -0
  183. package/dist/lib/input-otp.d.ts +2 -0
  184. package/dist/lib/input-otp.d.ts.map +1 -0
  185. package/dist/lib/input-otp.js +1 -0
  186. package/dist/lib/react-hook-form.d.ts +3 -0
  187. package/dist/lib/react-hook-form.d.ts.map +1 -0
  188. package/dist/lib/react-hook-form.js +2 -0
  189. package/dist/lib/react-table.d.ts +2 -0
  190. package/dist/lib/react-table.d.ts.map +1 -0
  191. package/dist/lib/react-table.js +1 -0
  192. package/dist/lib/recharts.d.ts +2 -0
  193. package/dist/lib/recharts.d.ts.map +1 -0
  194. package/dist/lib/recharts.js +1 -0
  195. package/dist/lib/sonner.d.ts +2 -0
  196. package/dist/lib/sonner.d.ts.map +1 -0
  197. package/dist/lib/sonner.js +1 -0
  198. package/dist/lib/utils.d.ts +4 -0
  199. package/dist/lib/utils.d.ts.map +1 -0
  200. package/dist/lib/utils.js +5 -0
  201. package/dist/lib/zod.d.ts +2 -0
  202. package/dist/lib/zod.d.ts.map +1 -0
  203. package/dist/lib/zod.js +1 -0
  204. package/dist/styles/globals-static.css +71 -0
  205. package/dist/styles/globals.css +71 -0
  206. package/dist/styles/themes/blue.css +68 -0
  207. package/dist/styles/themes/bubblegum.css +113 -0
  208. package/dist/styles/themes/claymorphism.css +108 -0
  209. package/dist/styles/themes/default.css +69 -0
  210. package/dist/styles/themes/green.css +68 -0
  211. package/dist/styles/themes/orange.css +68 -0
  212. package/dist/styles/themes/red.css +68 -0
  213. package/dist/styles/themes/rose.css +68 -0
  214. package/dist/styles/themes/twitter.css +113 -0
  215. package/dist/styles/themes/violet.css +68 -0
  216. package/dist/styles/themes/yellow.css +68 -0
  217. package/package.json +97 -0
@@ -0,0 +1,135 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import React, { useState } from "react";
4
+ import { AnimatePresence, motion } from "motion/react";
5
+ import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
6
+ const defaultOptions = {
7
+ transition: {
8
+ type: "tween",
9
+ ease: "easeOut",
10
+ duration: 0.15,
11
+ },
12
+ };
13
+ const getHoverAnimationProps = (hoveredRect, navRect) => ({
14
+ x: hoveredRect.left - navRect.left - 10,
15
+ y: hoveredRect.top - navRect.top - 4,
16
+ width: hoveredRect.width + 20,
17
+ height: hoveredRect.height + 10,
18
+ });
19
+ const TabContent = ({ tab, transition }) => {
20
+ if (!tab)
21
+ return null;
22
+ return (_jsx(motion.div, { initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: -10 }, transition: transition, className: "p-6 bg-zinc-50 dark:bg-zinc-900 rounded-lg mt-4 h-[55vh]", children: tab.component }));
23
+ };
24
+ const Tabs = ({ tabs, selectedTabIndex, setSelectedTab, transition, }) => {
25
+ const buttonNodesRef = React.useRef([]);
26
+ const navRef = React.useRef(null);
27
+ const [hoveredTabIndex, setHoveredTabIndex] = React.useState(null);
28
+ const [rects, setRects] = React.useState({ nav: null, selected: null, hovered: null });
29
+ // Refs are populated during commit, before this runs, so measuring here
30
+ // (rather than reading ref.current during render) avoids stale/impure
31
+ // reads and still updates before the browser paints. This is React's own
32
+ // documented pattern for "measure layout, then setState" (useLayoutEffect
33
+ // exists specifically for this), so the set-state-in-effect warning here
34
+ // is a known false positive for this case.
35
+ React.useLayoutEffect(() => {
36
+ buttonNodesRef.current = buttonNodesRef.current.slice(0, tabs.length);
37
+ // eslint-disable-next-line @eslint-react/set-state-in-effect
38
+ setRects({
39
+ nav: navRef.current?.getBoundingClientRect() ?? null,
40
+ selected: buttonNodesRef.current[selectedTabIndex]?.getBoundingClientRect() ??
41
+ null,
42
+ hovered: hoveredTabIndex !== null
43
+ ? (buttonNodesRef.current[hoveredTabIndex]?.getBoundingClientRect() ??
44
+ null)
45
+ : null,
46
+ });
47
+ }, [tabs.length, selectedTabIndex, hoveredTabIndex]);
48
+ const { nav: navRect, selected: selectedRect, hovered: hoveredRect } = rects;
49
+ return (_jsxs("nav", { ref: navRef, className: "flex flex-shrink-0 justify-center items-center relative z-0 py-2", onPointerLeave: () => {
50
+ setHoveredTabIndex(null);
51
+ }, children: [tabs.map((item, i) => {
52
+ const isActive = selectedTabIndex === i;
53
+ return (_jsx("button", { className: "text-sm relative rounded-md flex items-center h-8 px-4 z-20 bg-transparent cursor-pointer select-none transition-colors", onPointerEnter: () => {
54
+ setHoveredTabIndex(i);
55
+ }, onFocus: () => {
56
+ setHoveredTabIndex(i);
57
+ }, onClick: () => {
58
+ setSelectedTab([i, i > selectedTabIndex ? 1 : -1]);
59
+ }, children: _jsx(motion.span, { ref: (el) => {
60
+ buttonNodesRef.current[i] = el;
61
+ }, className: cn("block", {
62
+ "text-zinc-500": !isActive,
63
+ "text-black dark:text-white font-semibold": isActive,
64
+ }), children: _jsx("small", { className: item.value === "danger-zone" ? "text-red-500" : "", children: item.label }) }) }, item.value));
65
+ }), _jsx(AnimatePresence, { children: hoveredRect && navRect && (_jsx(motion.div, { className: `absolute z-10 top-0 left-0 rounded-md ${hoveredTabIndex ===
66
+ tabs.findIndex(({ value }) => value === "danger-zone")
67
+ ? "bg-red-100 dark:bg-red-500/30"
68
+ : "bg-zinc-100 dark:bg-zinc-800"}`, initial: {
69
+ ...getHoverAnimationProps(hoveredRect, navRect),
70
+ opacity: 0,
71
+ }, animate: {
72
+ ...getHoverAnimationProps(hoveredRect, navRect),
73
+ opacity: 1,
74
+ }, exit: {
75
+ ...getHoverAnimationProps(hoveredRect, navRect),
76
+ opacity: 0,
77
+ }, transition: transition }, "hover")) }), _jsx(AnimatePresence, { children: selectedRect && navRect && (_jsx(motion.div, { className: `absolute z-10 bottom-0 left-0 h-[2px] ${selectedTabIndex ===
78
+ tabs.findIndex(({ value }) => value === "danger-zone")
79
+ ? "bg-red-500"
80
+ : "bg-black dark:bg-white"}`, initial: false, animate: {
81
+ width: selectedRect.width + 18,
82
+ x: `calc(${String(selectedRect.left - navRect.left - 9)}px)`,
83
+ opacity: 1,
84
+ }, transition: transition })) })] }));
85
+ };
86
+ export function AnimatedTabs({ tabs, defaultTabValue, options: opt = {}, }) {
87
+ const options = { ...opt, ...defaultOptions };
88
+ // `initialTabId` only matters for useTabs' lazy useState initializer,
89
+ // which React only ever calls once (on mount), so it doesn't need to be
90
+ // frozen in a ref — passing `tabs` live also means it stays in sync if
91
+ // the prop changes after mount, instead of being stuck with the first one.
92
+ const framer = useTabs({
93
+ tabs: [...tabs],
94
+ initialTabId: defaultTabValue ?? tabs[0].value,
95
+ });
96
+ return (_jsxs("div", { className: "w-full", children: [_jsx("div", { className: "relative flex w-full items-center justify-between border-b dark:border-dark-4 overflow-x-auto overflow-y-hidden", children: _jsx(Tabs, { ...framer.tabProps, transition: options.transition }) }), _jsx(AnimatePresence, { mode: "wait", children: _jsx(TabContent, { tab: framer.selectedTab, transition: options.transition }) })] }));
97
+ }
98
+ function useTabs({ tabs, initialTabId, onChange, }) {
99
+ const [selectedTab, setSelectedTab] = useState(() => {
100
+ const indexOfInitialTab = tabs.findIndex((tab) => tab.value === initialTabId);
101
+ return [indexOfInitialTab === -1 ? 0 : indexOfInitialTab, 0];
102
+ });
103
+ const [selectedTabIndex, direction] = selectedTab;
104
+ /**
105
+ * Returns the tabs prop, the selected tab, and the content props.
106
+ *
107
+ * The tabs prop is an object with the following properties:
108
+ * - tabs: The array of tabs.
109
+ * - selectedTabIndex: The index of the selected tab.
110
+ * - onChange: The function to call when the selected tab changes.
111
+ * - setSelectedTab: The function to call to change the selected tab.
112
+ *
113
+ * The selected tab is the currently selected tab object.
114
+ *
115
+ * The content props is an object with the following properties:
116
+ * - ref: The ref for the content element.
117
+ * - className: The class name for the content element.
118
+ * - "aria-hidden": Whether the content element is hidden.
119
+ * - "aria-labelledby": The id of the tab element that labels the content element.
120
+ * - role: The role of the content element.
121
+ */
122
+ return {
123
+ tabProps: {
124
+ tabs,
125
+ selectedTabIndex,
126
+ onChange,
127
+ setSelectedTab,
128
+ },
129
+ selectedTab: tabs[selectedTabIndex],
130
+ contentProps: {
131
+ direction,
132
+ selectedTabIndex,
133
+ },
134
+ };
135
+ }
@@ -0,0 +1,43 @@
1
+ interface BaseProps {
2
+ variant: "circle" | "reveal" | "ripple" | "scramble" | "split";
3
+ children?: React.ReactNode;
4
+ className?: string;
5
+ }
6
+ type PropsCircle = BaseProps & {
7
+ variant: "circle";
8
+ duration?: number;
9
+ };
10
+ type PropsReveal = BaseProps & {
11
+ variant: "reveal";
12
+ blur?: number;
13
+ delay?: number;
14
+ duration?: number;
15
+ from?: "top" | "bottom";
16
+ split?: "word" | "letter";
17
+ };
18
+ type PropsRipple = BaseProps & {
19
+ maxScale?: number;
20
+ falloff?: number;
21
+ };
22
+ type PropsScramble = BaseProps & {
23
+ speed?: number;
24
+ characterSet?: string;
25
+ };
26
+ type PropsSplit = BaseProps & {
27
+ topClassName?: string;
28
+ bottomClassName?: string;
29
+ maxMove?: number;
30
+ falloff?: number;
31
+ };
32
+ type TextAnimatedProps<T> = Omit<T, "variant" | "children"> & {
33
+ text: string;
34
+ };
35
+ type Props = PropsCircle | PropsReveal | PropsRipple | PropsScramble | PropsSplit;
36
+ export declare function AnimatedText({ variant, children: text, ...props }: Props): import("react").JSX.Element | null;
37
+ export declare function TextCircle({ text, duration, className, }: TextAnimatedProps<PropsCircle>): import("react").JSX.Element;
38
+ export declare const TextReveal: ({ text, className, blur, delay, duration, from, split, }: TextAnimatedProps<PropsReveal>) => import("react").JSX.Element;
39
+ export declare function TextRipple({ text, className, maxScale, falloff, }: TextAnimatedProps<PropsRipple>): import("react").JSX.Element;
40
+ export declare const TextScramble: ({ text: textInput, speed, characterSet, className, ...motionProps }: TextAnimatedProps<PropsScramble>) => import("react").JSX.Element;
41
+ export declare function TextSplit({ text, className, topClassName, bottomClassName, maxMove, falloff, }: TextAnimatedProps<PropsSplit>): import("react").JSX.Element;
42
+ export {};
43
+ //# sourceMappingURL=animated-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animated-text.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/animated-text.tsx"],"names":[],"mappings":"AASA,UAAU,SAAS;IACjB,OAAO,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;IAC/D,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,KAAK,WAAW,GAAG,SAAS,GAAG;IAC7B,OAAO,EAAE,QAAQ,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AACF,KAAK,WAAW,GAAG,SAAS,GAAG;IAC7B,OAAO,EAAE,QAAQ,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B,CAAC;AACF,KAAK,WAAW,GAAG,SAAS,GAAG;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AACF,KAAK,aAAa,GAAG,SAAS,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AACF,KAAK,UAAU,GAAG,SAAS,GAAG;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,KAAK,iBAAiB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC,GAAG;IAC5D,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AACF,KAAK,KAAK,GACR,WAAW,GAAG,WAAW,GAAG,WAAW,GAAG,aAAa,GAAG,UAAU,CAAC;AAEvE,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,sCAmBxE;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,QAAa,EACb,SAAS,GACV,EAAE,iBAAiB,CAAC,WAAW,CAAC,+BAkChC;AAED,eAAO,MAAM,UAAU,GAAI,0DAQxB,iBAAiB,CAAC,WAAW,CAAC,gCA+BhC,CAAC;AAEF,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,SAAS,EACT,QAAY,EACZ,OAAa,GACd,EAAE,iBAAiB,CAAC,WAAW,CAAC,+BA6BhC;AASD,eAAO,MAAM,YAAY,GAAI,qEAM1B,iBAAiB,CAAC,aAAa,CAAC,gCAqClC,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,eAAe,EACf,OAAY,EACZ,OAAa,GACd,EAAE,iBAAiB,CAAC,UAAU,CAAC,+BAoD/B"}
@@ -0,0 +1,122 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useState } from "react";
4
+ import { motion } from "motion/react";
5
+ import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
6
+ export function AnimatedText({ variant, children: text, ...props }) {
7
+ if (typeof text !== "string") {
8
+ throw new Error("TextAnimated must have a string child");
9
+ }
10
+ switch (variant) {
11
+ case "circle": {
12
+ return _jsx(TextCircle, { text: text, ...props });
13
+ }
14
+ case "reveal":
15
+ return _jsx(TextReveal, { text: text, ...props });
16
+ case "ripple":
17
+ return _jsx(TextRipple, { text: text, ...props });
18
+ case "scramble":
19
+ return _jsx(TextScramble, { text: text, ...props });
20
+ case "split":
21
+ return _jsx(TextSplit, { text: text, ...props });
22
+ default:
23
+ return null;
24
+ }
25
+ }
26
+ export function TextCircle({ text, duration = 20, className, }) {
27
+ const letters = Array.from(text);
28
+ return (_jsx(motion.div, { initial: { rotate: 0 }, animate: { rotate: 360 }, transition: {
29
+ repeat: Infinity,
30
+ repeatType: "loop",
31
+ duration,
32
+ ease: "linear",
33
+ }, className: cn("relative rounded-full w-[200px] h-[200px] text-zinc-900 dark:text-zinc-50 font-semibold text-center text-2xl", className), children: letters.map((letter, i) => {
34
+ const angle = (360 / letters.length) * i;
35
+ const factor = Number((Math.PI / letters.length).toFixed(0));
36
+ const x = factor * i;
37
+ const y = factor * i;
38
+ const transform = `rotateZ(${String(angle)}deg) translate3d(${String(x)}px, ${String(y)}px, 0)`;
39
+ return (_jsx("span", { className: "absolute inset-0", style: { transform }, children: letter }, i));
40
+ }) }));
41
+ }
42
+ export const TextReveal = ({ text, className, blur = 10, delay = 0.1, duration = 1, from = "bottom", split = "word", }) => {
43
+ const segments = split === "word" ? text.split(" ") : text.split(/(?=.)/);
44
+ return (_jsxs("div", { children: [segments.map((c, index) => (_jsx(motion.span, { initial: {
45
+ opacity: 0,
46
+ y: from === "bottom" ? "50%" : "-50%",
47
+ filter: `blur(${String(blur)}px)`,
48
+ }, animate: { opacity: 1, y: 0, filter: "blur(0px)" }, transition: {
49
+ delay: index * delay,
50
+ duration,
51
+ ease: [0.18, 0.89, 0.82, 1.04],
52
+ }, className: cn("inline-flex leading-none", split === "word" ? "mr-[0.2em]" : "", className), children: c === " " ? "\u00A0" : c }, `${c}-${String(index)}`))), _jsx("div", { className: "sr-only", children: text })] }));
53
+ };
54
+ export function TextRipple({ text, className, maxScale = 2, falloff = 0.3, }) {
55
+ const [hoveredIndex, setHoveredIndex] = useState(null);
56
+ const chars = text.split("");
57
+ const getScaleY = (index) => {
58
+ if (hoveredIndex === null)
59
+ return 1;
60
+ const distance = Math.abs(index - hoveredIndex);
61
+ return Math.max(1, maxScale - distance * falloff);
62
+ };
63
+ return (_jsx("div", { className: cn("relative font-bold text-2xl", className), children: chars.map((s, index) => (_jsx(motion.span, { onMouseEnter: () => {
64
+ setHoveredIndex(index);
65
+ }, onMouseLeave: () => {
66
+ setHoveredIndex(null);
67
+ }, className: "inline-block origin-bottom leading-[0.7]", animate: { scaleY: getScaleY(index) }, children: s === " " ? "\u00A0" : s }, `${s}-${String(index)}`))) }));
68
+ }
69
+ const DEFAULT_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
70
+ function getRandomChar(charSet) {
71
+ return charSet[Math.floor(Math.random() * charSet.length)];
72
+ }
73
+ export const TextScramble = ({ text: textInput, speed = 50, characterSet = DEFAULT_CHARS, className, ...motionProps }) => {
74
+ const [text, setText] = useState(textInput);
75
+ useEffect(() => {
76
+ let step = 0;
77
+ const interval = setInterval(() => {
78
+ let scrambled = "";
79
+ for (let i = 0; i < textInput.length; i++) {
80
+ if (i < step) {
81
+ scrambled += textInput[i] ?? "";
82
+ }
83
+ else if (textInput[i] === " ") {
84
+ scrambled += " ";
85
+ }
86
+ else {
87
+ scrambled += getRandomChar(characterSet) ?? "";
88
+ }
89
+ }
90
+ setText(scrambled);
91
+ step++;
92
+ if (step > textInput.length) {
93
+ clearInterval(interval);
94
+ setText(textInput);
95
+ }
96
+ }, speed);
97
+ return () => {
98
+ clearInterval(interval);
99
+ };
100
+ }, [textInput, speed, characterSet]);
101
+ return (_jsx(motion.span, { className: className, ...motionProps, children: text }));
102
+ };
103
+ export function TextSplit({ text, className, topClassName, bottomClassName, maxMove = 50, falloff = 0.3, }) {
104
+ const [hoverIndex, setHoverIndex] = useState(null);
105
+ const getOffset = (index) => {
106
+ if (hoverIndex === null)
107
+ return 0;
108
+ const distance = Math.abs(index - hoverIndex);
109
+ return Math.max(0, maxMove * (1 - distance * falloff));
110
+ };
111
+ return (_jsx("div", { className: cn("relative flex items-center justify-center ", className), children: text.split("").map((char, index) => {
112
+ const offset = getOffset(index);
113
+ const displayChar = char === " " ? "\u00A0" : char;
114
+ return (_jsxs("div", { className: "relative flex flex-col h-[1em] w-auto leading-none", onMouseEnter: () => {
115
+ setHoverIndex(index);
116
+ }, onMouseLeave: () => {
117
+ setHoverIndex(null);
118
+ }, children: [_jsx(motion.span, { initial: false, animate: {
119
+ y: `-${String(offset)}%`,
120
+ }, transition: { duration: 0.3, ease: "easeInOut" }, className: cn("overflow-hidden", topClassName), children: displayChar }), _jsx(motion.span, { initial: false, animate: { y: `${String(offset)}%` }, transition: { duration: 0.3, ease: "easeInOut" }, className: cn("overflow-hidden", bottomClassName), children: _jsx("span", { className: "block -translate-y-1/2", children: displayChar }) })] }, `${char}-${String(index)}`));
121
+ }) }));
122
+ }
@@ -0,0 +1,17 @@
1
+ import { type VariantProps } from "class-variance-authority";
2
+ import { Avatar as AvatarPrimitive } from "@forthtilliath/shadcn-ui/components/avatar";
3
+ declare const avatarVariants: (props?: ({
4
+ rounded?: "none" | "lg" | "md" | "full" | null | undefined;
5
+ size?: 8 | 24 | 10 | 20 | 12 | 14 | 16 | null | undefined;
6
+ ring?: boolean | null | undefined;
7
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
8
+ interface Props extends React.ComponentProps<typeof AvatarPrimitive>, VariantProps<typeof avatarVariants> {
9
+ src: string;
10
+ alt: string;
11
+ fallback: string;
12
+ classNameImage?: string;
13
+ classNameFallback?: string;
14
+ }
15
+ export declare function Avatar({ src, alt, fallback, className, classNameImage, classNameFallback, rounded, ring, size, ...props }: Props): import("react").JSX.Element;
16
+ export {};
17
+ //# sourceMappingURL=avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EACL,MAAM,IAAI,eAAe,EAG1B,MAAM,4CAA4C,CAAC;AAGpD,QAAA,MAAM,cAAc;;;;8EAuBlB,CAAC;AAEH,UAAU,KACR,SACE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,EAC5C,YAAY,CAAC,OAAO,cAAc,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,MAAM,CAAC,EACrB,GAAG,EACH,GAAG,EACH,QAAQ,EACR,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,KAAK,+BAcP"}
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cva } from "class-variance-authority";
3
+ import { Avatar as AvatarPrimitive, AvatarFallback, AvatarImage, } from "@forthtilliath/shadcn-ui/components/avatar";
4
+ import { cn } from "@forthtilliath/shadcn-ui/lib/utils";
5
+ const avatarVariants = cva("", {
6
+ variants: {
7
+ rounded: {
8
+ full: "rounded-full",
9
+ lg: "rounded-lg",
10
+ md: "rounded-md",
11
+ none: "rounded-none",
12
+ },
13
+ size: {
14
+ 8: "size-8",
15
+ 10: "size-10",
16
+ 12: "size-12",
17
+ 14: "size-14",
18
+ 16: "size-16",
19
+ 20: "size-20",
20
+ 24: "size-24",
21
+ },
22
+ ring: {
23
+ false: "",
24
+ true: "ring-2 ring-green-500 ring-offset-[3px] ring-offset-background",
25
+ },
26
+ },
27
+ defaultVariants: { rounded: "full", ring: false },
28
+ });
29
+ export function Avatar({ src, alt, fallback, className, classNameImage, classNameFallback, rounded, ring, size, ...props }) {
30
+ return (_jsxs(AvatarPrimitive, { className: cn(avatarVariants({ rounded, ring, size }), className), ...props, children: [_jsx(AvatarImage, { src: src, alt: alt, className: cn(classNameImage) }), _jsx(AvatarFallback, { className: cn(avatarVariants({ rounded }), classNameFallback), children: fallback })] }));
31
+ }
@@ -0,0 +1,22 @@
1
+ import * as React from "react";
2
+ import { type DateRange } from "react-day-picker";
3
+ import { type VariantProps } from "class-variance-authority";
4
+ declare const multiSelectVariants: (props?: ({
5
+ variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ interface CalendarDatePickerProps extends React.HTMLAttributes<HTMLButtonElement>, VariantProps<typeof multiSelectVariants> {
8
+ id?: string;
9
+ className?: string;
10
+ date: DateRange;
11
+ closeOnSelect?: boolean;
12
+ numberOfMonths?: 1 | 2;
13
+ yearsRange?: number;
14
+ onDateSelect: (range: {
15
+ from: Date;
16
+ to: Date;
17
+ }) => void;
18
+ ref?: React.Ref<HTMLButtonElement>;
19
+ }
20
+ export declare function CalendarDatePicker({ id, className, date, closeOnSelect, numberOfMonths, yearsRange, onDateSelect, variant, ref, ...props }: CalendarDatePickerProps): React.JSX.Element;
21
+ export {};
22
+ //# sourceMappingURL=calendar-date-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar-date-picker.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/calendar-date-picker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA8ClE,QAAA,MAAM,mBAAmB;;8EAoBxB,CAAC;AAEF,UAAU,uBACR,SACE,KAAK,CAAC,cAAc,CAAC,iBAAiB,CAAC,EACvC,YAAY,CAAC,OAAO,mBAAmB,CAAC;IAC1C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IACxD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,EAA2B,EAC3B,SAAS,EACT,IAAI,EACJ,aAAqB,EACrB,cAAkB,EAClB,UAAe,EACf,YAAY,EACZ,OAAO,EACP,GAAG,EACH,GAAG,KAAK,EACT,EAAE,uBAAuB,qBA+nBzB"}