vaderjs-daisyui 0.0.1

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 (28) hide show
  1. package/Components/Actions/Button/index.tsx +63 -0
  2. package/Components/Actions/Dropdown/index.tsx +104 -0
  3. package/Components/Actions/Fab/index.tsx +76 -0
  4. package/Components/Actions/Modal/index.tsx +147 -0
  5. package/Components/Actions/Swap/index.tsx +52 -0
  6. package/Components/Actions/ThemeController/index.tsx +133 -0
  7. package/Components/Data/Display/Accordion/index.tsx +82 -0
  8. package/Components/Data/Display/Avatar/index.tsx +96 -0
  9. package/Components/Data/Display/Badge/index.tsx +46 -0
  10. package/Components/Data/Display/Card/index.tsx +72 -0
  11. package/Components/Data/Display/Carousel/index.tsx +72 -0
  12. package/Components/Data/Display/ChatBubble/index.tsx +57 -0
  13. package/Components/Data/Display/Collapse/index.tsx +60 -0
  14. package/Components/Data/Display/Countdown/index.tsx +97 -0
  15. package/Components/Data/Display/Diff/index.tsx +60 -0
  16. package/Components/Data/Display/Hover/Card/index.tsx +37 -0
  17. package/Components/Data/Display/Hover/Gallery/index.tsx +57 -0
  18. package/Components/Data/Display/Keyboard/index.tsx +31 -0
  19. package/Components/Data/Display/List/index.tsx +93 -0
  20. package/Components/Data/Display/Stat/index.tsx +114 -0
  21. package/Components/Data/Display/Table/index.tsx +33 -0
  22. package/Components/Data/Display/TextRotate/index.tsx +118 -0
  23. package/Components/Data/Display/Timeline/index.tsx +209 -0
  24. package/Components/Navigation/BreadCrumbs/index.tsx +201 -0
  25. package/Components/Navigation/Doc/index.tsx +394 -0
  26. package/Components/Navigation/Link/index.tsx +87 -0
  27. package/index.ts +130 -0
  28. package/package.json +15 -0
@@ -0,0 +1,93 @@
1
+ // List.ts
2
+ import { component, createElement } from "vaderjs";
3
+
4
+ /* -------------------------------------------------------
5
+ * List (container)
6
+ * ----------------------------------------------------- */
7
+
8
+ export interface ListProps {
9
+ children: any;
10
+ className?: string;
11
+ as?: "ul" | "ol" | "div";
12
+ }
13
+
14
+ export const List = component(
15
+ ({ children, className = "", as = "ul" }: ListProps) => {
16
+ const Tag = as;
17
+
18
+ return createElement(
19
+ Tag,
20
+ {
21
+ class: `list ${className}`.trim(),
22
+ },
23
+ children
24
+ );
25
+ }
26
+ );
27
+
28
+ /* -------------------------------------------------------
29
+ * ListRow
30
+ * ----------------------------------------------------- */
31
+
32
+ export interface ListRowProps {
33
+ children: any;
34
+ className?: string;
35
+ }
36
+
37
+ export const ListRow = component(
38
+ ({ children, className = "" }: ListRowProps) =>
39
+ createElement(
40
+ "li",
41
+ {
42
+ class: `list-row ${className}`.trim(),
43
+ },
44
+ children
45
+ )
46
+ );
47
+
48
+ /* -------------------------------------------------------
49
+ * ListCol (optional helper)
50
+ * ----------------------------------------------------- */
51
+
52
+ export interface ListColProps {
53
+ children: any;
54
+ grow?: boolean;
55
+ wrap?: boolean;
56
+ className?: string;
57
+ as?: string;
58
+ }
59
+
60
+ /**
61
+ * ListCol
62
+ * Helper wrapper for list-row children
63
+ *
64
+ * grow โ†’ fills remaining space (list-col-grow)
65
+ * wrap โ†’ moves to next row (list-col-wrap)
66
+ */
67
+ export const ListCol = component(
68
+ ({
69
+ children,
70
+ grow = false,
71
+ wrap = false,
72
+ className = "",
73
+ as = "div",
74
+ }: ListColProps) => {
75
+ const Tag = as;
76
+
77
+ return createElement(
78
+ Tag,
79
+ {
80
+ class: [
81
+ grow && "list-col-grow",
82
+ wrap && "list-col-wrap",
83
+ className,
84
+ ]
85
+ .filter(Boolean)
86
+ .join(" "),
87
+ },
88
+ children
89
+ );
90
+ }
91
+ );
92
+
93
+ export default List;
@@ -0,0 +1,114 @@
1
+ import { component, createElement } from "vaderjs";
2
+
3
+ /* ================================
4
+ TYPES
5
+ ================================ */
6
+
7
+ export interface StatsProps {
8
+ children: any;
9
+ className?: string;
10
+ direction?: "horizontal" | "vertical";
11
+ responsive?: boolean; // vertical on small, horizontal on lg
12
+ }
13
+
14
+ export interface StatProps {
15
+ children: any;
16
+ className?: string;
17
+ centered?: boolean;
18
+ }
19
+
20
+ export interface StatPartProps {
21
+ children: any;
22
+ className?: string;
23
+ }
24
+
25
+ /* ================================
26
+ ROOT: <Stats>
27
+ ================================ */
28
+
29
+ export const Stats = component(
30
+ ({
31
+ children,
32
+ className = "",
33
+ direction = "horizontal",
34
+ responsive = false,
35
+ }: StatsProps) => {
36
+ const dirClass =
37
+ responsive
38
+ ? "stats-vertical lg:stats-horizontal"
39
+ : direction === "vertical"
40
+ ? "stats-vertical"
41
+ : "stats-horizontal";
42
+
43
+ return createElement(
44
+ "div",
45
+ {
46
+ class: `stats ${dirClass} ${className}`.trim(),
47
+ },
48
+ children
49
+ );
50
+ }
51
+ );
52
+
53
+ /* ================================
54
+ <Stat>
55
+ ================================ */
56
+
57
+ export const Stat = component(
58
+ ({
59
+ children,
60
+ className = "",
61
+ centered = false,
62
+ }: StatProps) => {
63
+ return createElement(
64
+ "div",
65
+ {
66
+ class: `stat ${centered ? "place-items-center" : ""} ${className}`.trim(),
67
+ },
68
+ children
69
+ );
70
+ }
71
+ );
72
+
73
+ /* ================================
74
+ PARTS
75
+ ================================ */
76
+
77
+ export const StatTitle = component(
78
+ ({ children, className = "" }: StatPartProps) =>
79
+ createElement("div", { class: `stat-title ${className}`.trim() }, children)
80
+ );
81
+
82
+ export const StatValue = component(
83
+ ({ children, className = "" }: StatPartProps) =>
84
+ createElement("div", { class: `stat-value ${className}`.trim() }, children)
85
+ );
86
+
87
+ export const StatDesc = component(
88
+ ({ children, className = "" }: StatPartProps) =>
89
+ createElement("div", { class: `stat-desc ${className}`.trim() }, children)
90
+ );
91
+
92
+ export const StatFigure = component(
93
+ ({ children, className = "" }: StatPartProps) =>
94
+ createElement("div", { class: `stat-figure ${className}`.trim() }, children)
95
+ );
96
+
97
+ export const StatActions = component(
98
+ ({ children, className = "" }: StatPartProps) =>
99
+ createElement("div", { class: `stat-actions ${className}`.trim() }, children)
100
+ );
101
+
102
+ /* ================================
103
+ DEFAULT EXPORT (OPTIONAL)
104
+ ================================ */
105
+
106
+ export default {
107
+ Stats,
108
+ Stat,
109
+ StatTitle,
110
+ StatValue,
111
+ StatDesc,
112
+ StatFigure,
113
+ StatActions,
114
+ };
@@ -0,0 +1,33 @@
1
+ import { createElement } from "vaderjs";
2
+
3
+ export interface TableProps {
4
+ zebra?: boolean;
5
+ size?: "xs" | "sm" | "md" | "lg" | "xl";
6
+ pinRows?: boolean;
7
+ pinCols?: boolean;
8
+ class?: string;
9
+ }
10
+
11
+ const Table = ({
12
+ zebra,
13
+ size = "md",
14
+ pinRows,
15
+ pinCols,
16
+ class: className,
17
+ children,
18
+ }: TableProps & { children?: any }) => {
19
+ const classes = [
20
+ "table",
21
+ zebra && "table-zebra",
22
+ pinRows && "table-pin-rows",
23
+ pinCols && "table-pin-cols",
24
+ size && `table-${size}`,
25
+ className,
26
+ ]
27
+ .filter(Boolean)
28
+ .join(" ");
29
+
30
+ return createElement("table", { class: classes }, children);
31
+ };
32
+
33
+ export default Table
@@ -0,0 +1,118 @@
1
+ import { component, createElement, VNode } from "vaderjs";
2
+
3
+ export type TextRotateProps = {
4
+ words: string[] | VNode[];
5
+ duration?: number; // in milliseconds
6
+ className?: string;
7
+ wordClassName?: string;
8
+ containerClassName?: string;
9
+ pauseOnHover?: boolean;
10
+ lineHeight?: string; // e.g., "leading-[2]"
11
+ colorVariant?: "single" | "gradient" | "individual";
12
+ };
13
+
14
+ export const TextRotate = component((props: TextRotateProps) => {
15
+ const {
16
+ words,
17
+ duration = 10000, // 10 seconds default
18
+ className = "",
19
+ wordClassName = "",
20
+ containerClassName = "",
21
+ pauseOnHover = true,
22
+ lineHeight = "",
23
+ colorVariant = "single",
24
+ } = props;
25
+
26
+ // Calculate animation delay for each word
27
+ const wordDuration = duration / words.length;
28
+
29
+ const containerClasses = [
30
+ "text-rotate",
31
+ pauseOnHover ? "hover:pause" : "",
32
+ className,
33
+ lineHeight,
34
+ ].filter(Boolean).join(" ");
35
+
36
+ const innerContainerClasses = [
37
+ "grid justify-items-start", // DaisyUI text-rotate uses grid
38
+ containerClassName,
39
+ ].filter(Boolean).join(" ");
40
+
41
+ // Generate individual word styles
42
+ const generateWordStyles = (index: number) => {
43
+ const baseDelay = index * wordDuration;
44
+
45
+ // Individual colors if specified
46
+ const colorClasses = colorVariant === "individual"
47
+ ? [
48
+ "bg-teal-400 text-teal-800 px-2",
49
+ "bg-red-400 text-red-800 px-2",
50
+ "bg-blue-400 text-blue-800 px-2",
51
+ "bg-purple-400 text-purple-800 px-2",
52
+ "bg-yellow-400 text-yellow-800 px-2",
53
+ "bg-pink-400 text-pink-800 px-2",
54
+ ][index % 6]
55
+ : colorVariant === "gradient"
56
+ ? "bg-gradient-to-r from-primary to-secondary text-primary-content px-2"
57
+ : wordClassName;
58
+
59
+ return `${colorClasses} animate-fade-in-out`;
60
+ };
61
+
62
+ return createElement(
63
+ "span",
64
+ {
65
+ className: containerClasses,
66
+ style: `--duration: ${duration}ms;`,
67
+ },
68
+ createElement(
69
+ "span",
70
+ { className: innerContainerClasses },
71
+ words.map((word, index) => {
72
+ const isVNode = typeof word !== 'string';
73
+
74
+ return createElement(
75
+ "span",
76
+ {
77
+ key: index,
78
+ className: generateWordStyles(index),
79
+ style: `animation-delay: ${index * wordDuration}ms;`,
80
+ },
81
+ isVNode ? word : word
82
+ );
83
+ })
84
+ )
85
+ );
86
+ });
87
+
88
+ // Helper component for text rotate in sentences
89
+ export type TextRotateInlineProps = {
90
+ prefix?: string;
91
+ words: string[];
92
+ suffix?: string;
93
+ duration?: number;
94
+ className?: string;
95
+ wordClassName?: string;
96
+ };
97
+
98
+ export const TextRotateInline = component((props: TextRotateInlineProps) => {
99
+ const { prefix, words, suffix, duration, className, wordClassName } = props;
100
+
101
+ return createElement(
102
+ "span",
103
+ { className: `inline-flex items-center ${className || ""}` },
104
+ [
105
+ prefix ? createElement("span", { key: "prefix" }, `${prefix} `) : null,
106
+ createElement(TextRotate, {
107
+ key: "rotate",
108
+ words,
109
+ duration,
110
+ wordClassName,
111
+ containerClassName: "inline-block",
112
+ }),
113
+ suffix ? createElement("span", { key: "suffix" }, ` ${suffix}`) : null,
114
+ ].filter(Boolean)
115
+ );
116
+ });
117
+
118
+ export default TextRotate;
@@ -0,0 +1,209 @@
1
+ import { component, createElement, VNode } from "vaderjs";
2
+
3
+ export type TimelineItem = {
4
+ id?: string | number;
5
+ start?: VNode | string;
6
+ middle?: VNode | string;
7
+ end?: VNode | string;
8
+ showLine?: boolean;
9
+ lineColor?: string; // e.g., "bg-primary", "bg-secondary"
10
+ box?: boolean; // whether to apply timeline-box class
11
+ className?: string;
12
+ };
13
+
14
+ export type TimelineProps = {
15
+ items: TimelineItem[];
16
+ vertical?: boolean;
17
+ snapIcon?: boolean;
18
+ compact?: boolean;
19
+ responsive?: boolean; // vertical on mobile, horizontal on desktop
20
+ className?: string;
21
+ direction?: "vertical" | "horizontal";
22
+ reverse?: boolean;
23
+ };
24
+
25
+ export const Timeline = component((props: TimelineProps) => {
26
+ const {
27
+ items,
28
+ vertical = false,
29
+ snapIcon = false,
30
+ compact = false,
31
+ responsive = false,
32
+ className = "",
33
+ direction,
34
+ reverse = false,
35
+ } = props;
36
+
37
+ // Determine direction
38
+ const actualDirection = direction || (vertical ? "vertical" : "horizontal");
39
+
40
+ const timelineClasses = [
41
+ "timeline",
42
+ actualDirection === "vertical" ? "timeline-vertical" : "",
43
+ snapIcon ? "timeline-snap-icon" : "",
44
+ compact ? "timeline-compact" : "",
45
+ responsive ? "timeline-vertical lg:timeline-horizontal" : "",
46
+ className,
47
+ ].filter(Boolean).join(" ");
48
+
49
+ const renderItem = (item: TimelineItem, index: number) => {
50
+ const {
51
+ start,
52
+ middle,
53
+ end,
54
+ showLine = true,
55
+ lineColor = "",
56
+ box = false,
57
+ className: itemClassName = "",
58
+ } = item;
59
+
60
+ const itemClasses = [
61
+ box && start ? "timeline-box" : "",
62
+ box && end ? "timeline-box" : "",
63
+ itemClassName,
64
+ ].filter(Boolean).join(" ");
65
+
66
+ const lineClass = lineColor ? `${lineColor}` : "";
67
+
68
+ return createElement(
69
+ "li",
70
+ { key: item.id || index, className: itemClasses },
71
+ [
72
+ // First line before the item (except first item)
73
+ index > 0 && showLine
74
+ ? createElement("hr", { className: lineClass })
75
+ : null,
76
+
77
+ // Start content
78
+ start
79
+ ? createElement(
80
+ "div",
81
+ { className: "timeline-start" },
82
+ typeof start === "string" ? start : start
83
+ )
84
+ : null,
85
+
86
+ // Middle content (icon)
87
+ middle
88
+ ? createElement(
89
+ "div",
90
+ { className: "timeline-middle" },
91
+ typeof middle === "string" ? middle : middle
92
+ )
93
+ : null,
94
+
95
+ // End content
96
+ end
97
+ ? createElement(
98
+ "div",
99
+ { className: "timeline-end" },
100
+ typeof end === "string" ? end : end
101
+ )
102
+ : null,
103
+
104
+ // Line after the item (except last item)
105
+ index < items.length - 1 && showLine
106
+ ? createElement("hr", { className: lineClass })
107
+ : null,
108
+ ].filter(Boolean)
109
+ );
110
+ };
111
+
112
+ // Reverse items if needed
113
+ const displayItems = reverse ? [...items].reverse() : items;
114
+
115
+ return createElement(
116
+ "ul",
117
+ { className: timelineClasses },
118
+ displayItems.map(renderItem)
119
+ );
120
+ });
121
+
122
+ // Helper for common timeline use cases
123
+ export const TimelineExample = {
124
+ AppleHistory: () => {
125
+ const checkIcon = createElement(
126
+ "svg",
127
+ {
128
+ xmlns: "http://www.w3.org/2000/svg",
129
+ viewBox: "0 0 20 20",
130
+ fill: "currentColor",
131
+ className: "w-5 h-5",
132
+ },
133
+ createElement("path", {
134
+ fillRule: "evenodd",
135
+ d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z",
136
+ clipRule: "evenodd",
137
+ })
138
+ );
139
+
140
+ const items: TimelineItem[] = [
141
+ {
142
+ start: "1984",
143
+ middle: checkIcon,
144
+ end: "First Macintosh computer",
145
+ box: true,
146
+ lineColor: "bg-primary",
147
+ },
148
+ {
149
+ start: "1998",
150
+ middle: checkIcon,
151
+ end: "iMac",
152
+ box: true,
153
+ lineColor: "bg-primary",
154
+ },
155
+ {
156
+ start: "2001",
157
+ middle: checkIcon,
158
+ end: "iPod",
159
+ box: true,
160
+ lineColor: "bg-primary",
161
+ },
162
+ {
163
+ start: "2007",
164
+ middle: checkIcon,
165
+ end: "iPhone",
166
+ box: true,
167
+ },
168
+ {
169
+ start: "2015",
170
+ middle: checkIcon,
171
+ end: "Apple Watch",
172
+ box: true,
173
+ showLine: false,
174
+ },
175
+ ];
176
+
177
+ return createElement(Timeline, { items });
178
+ },
179
+
180
+ DevelopmentProcess: () => {
181
+ const items: TimelineItem[] = [
182
+ {
183
+ middle: "๐Ÿ“",
184
+ end: "Design Phase - Wireframing and prototyping",
185
+ box: true,
186
+ },
187
+ {
188
+ middle: "โŒจ๏ธ",
189
+ end: "Development - Writing code and implementing features",
190
+ box: true,
191
+ },
192
+ {
193
+ middle: "๐Ÿงช",
194
+ end: "Testing - Quality assurance and bug fixing",
195
+ box: true,
196
+ },
197
+ {
198
+ middle: "๐Ÿš€",
199
+ end: "Deployment - Launching to production",
200
+ box: true,
201
+ showLine: false,
202
+ },
203
+ ];
204
+
205
+ return createElement(Timeline, { items, vertical: true });
206
+ },
207
+ };
208
+
209
+ export default Timeline;