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.
- package/Components/Actions/Button/index.tsx +63 -0
- package/Components/Actions/Dropdown/index.tsx +104 -0
- package/Components/Actions/Fab/index.tsx +76 -0
- package/Components/Actions/Modal/index.tsx +147 -0
- package/Components/Actions/Swap/index.tsx +52 -0
- package/Components/Actions/ThemeController/index.tsx +133 -0
- package/Components/Data/Display/Accordion/index.tsx +82 -0
- package/Components/Data/Display/Avatar/index.tsx +96 -0
- package/Components/Data/Display/Badge/index.tsx +46 -0
- package/Components/Data/Display/Card/index.tsx +72 -0
- package/Components/Data/Display/Carousel/index.tsx +72 -0
- package/Components/Data/Display/ChatBubble/index.tsx +57 -0
- package/Components/Data/Display/Collapse/index.tsx +60 -0
- package/Components/Data/Display/Countdown/index.tsx +97 -0
- package/Components/Data/Display/Diff/index.tsx +60 -0
- package/Components/Data/Display/Hover/Card/index.tsx +37 -0
- package/Components/Data/Display/Hover/Gallery/index.tsx +57 -0
- package/Components/Data/Display/Keyboard/index.tsx +31 -0
- package/Components/Data/Display/List/index.tsx +93 -0
- package/Components/Data/Display/Stat/index.tsx +114 -0
- package/Components/Data/Display/Table/index.tsx +33 -0
- package/Components/Data/Display/TextRotate/index.tsx +118 -0
- package/Components/Data/Display/Timeline/index.tsx +209 -0
- package/Components/Navigation/BreadCrumbs/index.tsx +201 -0
- package/Components/Navigation/Doc/index.tsx +394 -0
- package/Components/Navigation/Link/index.tsx +87 -0
- package/index.ts +130 -0
- 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;
|