@object-ui/components 0.3.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.
- package/CHANGELOG.md +46 -0
- package/LICENSE +21 -0
- package/README.md +170 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +46186 -0
- package/dist/index.umd.cjs +92 -0
- package/dist/src/hooks/use-mobile.d.ts +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.test.d.ts +1 -0
- package/dist/src/lib/utils.d.ts +4 -0
- package/dist/src/new-components.test.d.ts +1 -0
- package/dist/src/renderers/basic/div.d.ts +1 -0
- package/dist/src/renderers/basic/html.d.ts +1 -0
- package/dist/src/renderers/basic/icon.d.ts +1 -0
- package/dist/src/renderers/basic/image.d.ts +1 -0
- package/dist/src/renderers/basic/index.d.ts +0 -0
- package/dist/src/renderers/basic/separator.d.ts +1 -0
- package/dist/src/renderers/basic/span.d.ts +1 -0
- package/dist/src/renderers/basic/text.d.ts +1 -0
- package/dist/src/renderers/complex/__tests__/data-table.test.d.ts +0 -0
- package/dist/src/renderers/complex/calendar-view.d.ts +1 -0
- package/dist/src/renderers/complex/carousel.d.ts +1 -0
- package/dist/src/renderers/complex/chatbot.d.ts +1 -0
- package/dist/src/renderers/complex/chatbot.test.d.ts +1 -0
- package/dist/src/renderers/complex/data-table.d.ts +1 -0
- package/dist/src/renderers/complex/filter-builder.d.ts +1 -0
- package/dist/src/renderers/complex/index.d.ts +0 -0
- package/dist/src/renderers/complex/resizable.d.ts +1 -0
- package/dist/src/renderers/complex/scroll-area.d.ts +1 -0
- package/dist/src/renderers/complex/table.d.ts +1 -0
- package/dist/src/renderers/complex/timeline.d.ts +1 -0
- package/dist/src/renderers/data-display/alert.d.ts +1 -0
- package/dist/src/renderers/data-display/avatar.d.ts +1 -0
- package/dist/src/renderers/data-display/badge.d.ts +1 -0
- package/dist/src/renderers/data-display/index.d.ts +0 -0
- package/dist/src/renderers/data-display/list.d.ts +1 -0
- package/dist/src/renderers/data-display/statistic.d.ts +1 -0
- package/dist/src/renderers/data-display/tree-view.d.ts +1 -0
- package/dist/src/renderers/disclosure/accordion.d.ts +1 -0
- package/dist/src/renderers/disclosure/collapsible.d.ts +1 -0
- package/dist/src/renderers/disclosure/index.d.ts +0 -0
- package/dist/src/renderers/feedback/index.d.ts +0 -0
- package/dist/src/renderers/feedback/loading.d.ts +1 -0
- package/dist/src/renderers/feedback/progress.d.ts +1 -0
- package/dist/src/renderers/feedback/skeleton.d.ts +1 -0
- package/dist/src/renderers/feedback/toaster.d.ts +1 -0
- package/dist/src/renderers/form/button.d.ts +1 -0
- package/dist/src/renderers/form/calendar.d.ts +1 -0
- package/dist/src/renderers/form/checkbox.d.ts +1 -0
- package/dist/src/renderers/form/date-picker.d.ts +1 -0
- package/dist/src/renderers/form/file-upload.d.ts +1 -0
- package/dist/src/renderers/form/form.d.ts +1 -0
- package/dist/src/renderers/form/index.d.ts +0 -0
- package/dist/src/renderers/form/input-otp.d.ts +1 -0
- package/dist/src/renderers/form/input.d.ts +1 -0
- package/dist/src/renderers/form/label.d.ts +1 -0
- package/dist/src/renderers/form/radio-group.d.ts +1 -0
- package/dist/src/renderers/form/select.d.ts +1 -0
- package/dist/src/renderers/form/slider.d.ts +1 -0
- package/dist/src/renderers/form/switch.d.ts +1 -0
- package/dist/src/renderers/form/textarea.d.ts +1 -0
- package/dist/src/renderers/form/toggle.d.ts +1 -0
- package/dist/src/renderers/index.d.ts +0 -0
- package/dist/src/renderers/layout/card.d.ts +1 -0
- package/dist/src/renderers/layout/container.d.ts +1 -0
- package/dist/src/renderers/layout/flex.d.ts +1 -0
- package/dist/src/renderers/layout/grid.d.ts +1 -0
- package/dist/src/renderers/layout/index.d.ts +0 -0
- package/dist/src/renderers/layout/page.d.ts +7 -0
- package/dist/src/renderers/layout/semantic.d.ts +1 -0
- package/dist/src/renderers/layout/stack.d.ts +1 -0
- package/dist/src/renderers/layout/tabs.d.ts +1 -0
- package/dist/src/renderers/navigation/header-bar.d.ts +1 -0
- package/dist/src/renderers/navigation/index.d.ts +0 -0
- package/dist/src/renderers/navigation/sidebar.d.ts +1 -0
- package/dist/src/renderers/overlay/alert-dialog.d.ts +1 -0
- package/dist/src/renderers/overlay/context-menu.d.ts +1 -0
- package/dist/src/renderers/overlay/dialog.d.ts +1 -0
- package/dist/src/renderers/overlay/drawer.d.ts +1 -0
- package/dist/src/renderers/overlay/dropdown-menu.d.ts +1 -0
- package/dist/src/renderers/overlay/hover-card.d.ts +1 -0
- package/dist/src/renderers/overlay/index.d.ts +0 -0
- package/dist/src/renderers/overlay/popover.d.ts +1 -0
- package/dist/src/renderers/overlay/sheet.d.ts +1 -0
- package/dist/src/renderers/overlay/tooltip.d.ts +1 -0
- package/dist/src/ui/accordion.d.ts +7 -0
- package/dist/src/ui/alert-dialog.d.ts +14 -0
- package/dist/src/ui/alert.d.ts +9 -0
- package/dist/src/ui/aspect-ratio.d.ts +3 -0
- package/dist/src/ui/avatar.d.ts +6 -0
- package/dist/src/ui/badge.d.ts +9 -0
- package/dist/src/ui/breadcrumb.d.ts +11 -0
- package/dist/src/ui/button-group.d.ts +11 -0
- package/dist/src/ui/button.d.ts +13 -0
- package/dist/src/ui/calendar-view.d.ts +21 -0
- package/dist/src/ui/calendar.d.ts +8 -0
- package/dist/src/ui/card.d.ts +9 -0
- package/dist/src/ui/carousel.d.ts +19 -0
- package/dist/src/ui/chatbot.d.ts +36 -0
- package/dist/src/ui/checkbox.d.ts +4 -0
- package/dist/src/ui/collapsible.d.ts +5 -0
- package/dist/src/ui/command.d.ts +18 -0
- package/dist/src/ui/context-menu.d.ts +25 -0
- package/dist/src/ui/dialog.d.ts +15 -0
- package/dist/src/ui/drawer.d.ts +13 -0
- package/dist/src/ui/dropdown-menu.d.ts +25 -0
- package/dist/src/ui/empty.d.ts +11 -0
- package/dist/src/ui/field.d.ts +24 -0
- package/dist/src/ui/filter-builder.d.ts +31 -0
- package/dist/src/ui/form.d.ts +24 -0
- package/dist/src/ui/hover-card.d.ts +6 -0
- package/dist/src/ui/index.d.ts +56 -0
- package/dist/src/ui/input-group.d.ts +16 -0
- package/dist/src/ui/input-otp.d.ts +11 -0
- package/dist/src/ui/input.d.ts +3 -0
- package/dist/src/ui/item.d.ts +23 -0
- package/dist/src/ui/kbd.d.ts +3 -0
- package/dist/src/ui/label.d.ts +4 -0
- package/dist/src/ui/menubar.d.ts +26 -0
- package/dist/src/ui/navigation-menu.d.ts +14 -0
- package/dist/src/ui/pagination.d.ts +13 -0
- package/dist/src/ui/popover.d.ts +7 -0
- package/dist/src/ui/progress.d.ts +4 -0
- package/dist/src/ui/radio-group.d.ts +5 -0
- package/dist/src/ui/resizable.d.ts +10 -0
- package/dist/src/ui/scroll-area.d.ts +5 -0
- package/dist/src/ui/select.d.ts +15 -0
- package/dist/src/ui/separator.d.ts +4 -0
- package/dist/src/ui/sheet.d.ts +13 -0
- package/dist/src/ui/sidebar.d.ts +69 -0
- package/dist/src/ui/skeleton.d.ts +2 -0
- package/dist/src/ui/slider.d.ts +4 -0
- package/dist/src/ui/sonner.d.ts +3 -0
- package/dist/src/ui/spinner.d.ts +3 -0
- package/dist/src/ui/switch.d.ts +4 -0
- package/dist/src/ui/table.d.ts +10 -0
- package/dist/src/ui/tabs.d.ts +7 -0
- package/dist/src/ui/textarea.d.ts +3 -0
- package/dist/src/ui/timeline.d.ts +25 -0
- package/dist/src/ui/toggle-group.d.ts +9 -0
- package/dist/src/ui/toggle.d.ts +9 -0
- package/dist/src/ui/tooltip.d.ts +7 -0
- package/docs/FilterBuilder.md +268 -0
- package/metadata/Chart.component.yml +30 -0
- package/metadata/FilterBuilder.component.yml +39 -0
- package/metadata/GridLayout.component.yml +27 -0
- package/metadata/Menu.component.yml +31 -0
- package/metadata/ObjectForm.component.yml +34 -0
- package/metadata/ObjectTable.component.yml +41 -0
- package/metadata/Page.component.yml +24 -0
- package/package.json +87 -0
- package/postcss.config.js +6 -0
- package/src/hooks/use-mobile.tsx +19 -0
- package/src/index.css +76 -0
- package/src/index.test.ts +7 -0
- package/src/index.ts +10 -0
- package/src/lib/utils.tsx +27 -0
- package/src/new-components.test.ts +74 -0
- package/src/renderers/basic/div.tsx +41 -0
- package/src/renderers/basic/html.tsx +34 -0
- package/src/renderers/basic/icon.tsx +25 -0
- package/src/renderers/basic/image.tsx +37 -0
- package/src/renderers/basic/index.ts +7 -0
- package/src/renderers/basic/separator.tsx +48 -0
- package/src/renderers/basic/span.tsx +44 -0
- package/src/renderers/basic/text.tsx +42 -0
- package/src/renderers/complex/README-KANBAN.md +208 -0
- package/src/renderers/complex/TIMELINE.md +353 -0
- package/src/renderers/complex/__tests__/data-table.test.ts +52 -0
- package/src/renderers/complex/calendar-view.tsx +219 -0
- package/src/renderers/complex/carousel.tsx +60 -0
- package/src/renderers/complex/chatbot.test.ts +44 -0
- package/src/renderers/complex/chatbot.tsx +185 -0
- package/src/renderers/complex/data-table.tsx +650 -0
- package/src/renderers/complex/filter-builder.tsx +68 -0
- package/src/renderers/complex/index.ts +10 -0
- package/src/renderers/complex/resizable.tsx +54 -0
- package/src/renderers/complex/scroll-area.tsx +32 -0
- package/src/renderers/complex/table.tsx +86 -0
- package/src/renderers/complex/timeline.tsx +466 -0
- package/src/renderers/data-display/alert.tsx +37 -0
- package/src/renderers/data-display/avatar.tsx +29 -0
- package/src/renderers/data-display/badge.tsx +46 -0
- package/src/renderers/data-display/index.ts +6 -0
- package/src/renderers/data-display/list.tsx +95 -0
- package/src/renderers/data-display/statistic.tsx +98 -0
- package/src/renderers/data-display/tree-view.tsx +180 -0
- package/src/renderers/disclosure/accordion.tsx +60 -0
- package/src/renderers/disclosure/collapsible.tsx +44 -0
- package/src/renderers/disclosure/index.ts +2 -0
- package/src/renderers/feedback/index.ts +4 -0
- package/src/renderers/feedback/loading.tsx +69 -0
- package/src/renderers/feedback/progress.tsx +20 -0
- package/src/renderers/feedback/skeleton.tsx +22 -0
- package/src/renderers/feedback/toaster.tsx +26 -0
- package/src/renderers/form/button.tsx +61 -0
- package/src/renderers/form/calendar.tsx +25 -0
- package/src/renderers/form/checkbox.tsx +41 -0
- package/src/renderers/form/date-picker.tsx +75 -0
- package/src/renderers/form/file-upload.tsx +175 -0
- package/src/renderers/form/form.tsx +417 -0
- package/src/renderers/form/index.ts +16 -0
- package/src/renderers/form/input-otp.tsx +31 -0
- package/src/renderers/form/input.tsx +79 -0
- package/src/renderers/form/label.tsx +36 -0
- package/src/renderers/form/radio-group.tsx +54 -0
- package/src/renderers/form/select.tsx +66 -0
- package/src/renderers/form/slider.tsx +45 -0
- package/src/renderers/form/switch.tsx +39 -0
- package/src/renderers/form/textarea.tsx +45 -0
- package/src/renderers/form/toggle.tsx +76 -0
- package/src/renderers/index.ts +9 -0
- package/src/renderers/layout/card.tsx +69 -0
- package/src/renderers/layout/container.tsx +113 -0
- package/src/renderers/layout/flex.tsx +123 -0
- package/src/renderers/layout/grid.tsx +155 -0
- package/src/renderers/layout/index.ts +10 -0
- package/src/renderers/layout/page.tsx +82 -0
- package/src/renderers/layout/semantic.tsx +39 -0
- package/src/renderers/layout/stack.tsx +123 -0
- package/src/renderers/layout/tabs.tsx +63 -0
- package/src/renderers/navigation/header-bar.tsx +50 -0
- package/src/renderers/navigation/index.ts +2 -0
- package/src/renderers/navigation/sidebar.tsx +189 -0
- package/src/renderers/overlay/alert-dialog.tsx +63 -0
- package/src/renderers/overlay/context-menu.tsx +91 -0
- package/src/renderers/overlay/dialog.tsx +68 -0
- package/src/renderers/overlay/drawer.tsx +68 -0
- package/src/renderers/overlay/dropdown-menu.tsx +90 -0
- package/src/renderers/overlay/hover-card.tsx +46 -0
- package/src/renderers/overlay/index.ts +9 -0
- package/src/renderers/overlay/popover.tsx +47 -0
- package/src/renderers/overlay/sheet.tsx +68 -0
- package/src/renderers/overlay/tooltip.tsx +58 -0
- package/src/ui/accordion.tsx +64 -0
- package/src/ui/alert-dialog.tsx +155 -0
- package/src/ui/alert.tsx +78 -0
- package/src/ui/aspect-ratio.tsx +11 -0
- package/src/ui/avatar.tsx +51 -0
- package/src/ui/badge.tsx +46 -0
- package/src/ui/breadcrumb.tsx +109 -0
- package/src/ui/button-group.tsx +83 -0
- package/src/ui/button.tsx +65 -0
- package/src/ui/calendar-view.tsx +503 -0
- package/src/ui/calendar.tsx +237 -0
- package/src/ui/card.tsx +138 -0
- package/src/ui/carousel.tsx +239 -0
- package/src/ui/chatbot.tsx +240 -0
- package/src/ui/checkbox.tsx +32 -0
- package/src/ui/collapsible.tsx +31 -0
- package/src/ui/command.tsx +182 -0
- package/src/ui/context-menu.tsx +247 -0
- package/src/ui/dialog.tsx +141 -0
- package/src/ui/drawer.tsx +135 -0
- package/src/ui/dropdown-menu.tsx +254 -0
- package/src/ui/empty.tsx +104 -0
- package/src/ui/field.tsx +246 -0
- package/src/ui/filter-builder.tsx +359 -0
- package/src/ui/form.tsx +167 -0
- package/src/ui/hover-card.tsx +44 -0
- package/src/ui/index.ts +56 -0
- package/src/ui/input-group.tsx +170 -0
- package/src/ui/input-otp.tsx +81 -0
- package/src/ui/input.tsx +24 -0
- package/src/ui/item.tsx +193 -0
- package/src/ui/kbd.tsx +28 -0
- package/src/ui/label.tsx +24 -0
- package/src/ui/menubar.tsx +274 -0
- package/src/ui/navigation-menu.tsx +168 -0
- package/src/ui/pagination.tsx +127 -0
- package/src/ui/popover.tsx +48 -0
- package/src/ui/progress.tsx +41 -0
- package/src/ui/radio-group.tsx +45 -0
- package/src/ui/resizable.tsx +55 -0
- package/src/ui/scroll-area.tsx +58 -0
- package/src/ui/select.tsx +188 -0
- package/src/ui/separator.tsx +31 -0
- package/src/ui/sheet.tsx +137 -0
- package/src/ui/sidebar.tsx +726 -0
- package/src/ui/skeleton.tsx +20 -0
- package/src/ui/slider.tsx +63 -0
- package/src/ui/sonner.tsx +43 -0
- package/src/ui/spinner.tsx +38 -0
- package/src/ui/switch.tsx +31 -0
- package/src/ui/table.tsx +120 -0
- package/src/ui/tabs.tsx +86 -0
- package/src/ui/textarea.tsx +18 -0
- package/src/ui/timeline.tsx +266 -0
- package/src/ui/toggle-group.tsx +87 -0
- package/src/ui/toggle.tsx +50 -0
- package/src/ui/tooltip.tsx +61 -0
- package/tailwind.config.js +75 -0
- package/tsconfig.json +18 -0
- package/vite.config.ts +44 -0
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
# Timeline Component
|
|
2
|
+
|
|
3
|
+
A comprehensive, feature-rich timeline component for Object UI that supports three distinct variants: vertical, horizontal, and Gantt-style (Airtable-like) timelines.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🎯 **Three Variants**: Vertical, Horizontal, and Gantt/Airtable-style timelines
|
|
8
|
+
- 🎨 **Color Variants**: Support for default, success, warning, danger, and info colors
|
|
9
|
+
- 📅 **Date Formatting**: Configurable date formats (short, long, ISO)
|
|
10
|
+
- ⏱️ **Time Scales**: Gantt view supports day, week, and month scales
|
|
11
|
+
- 🔄 **Interactive**: Click handlers for timeline items
|
|
12
|
+
- 🎭 **Icon Support**: Add custom icons or emojis to timeline markers
|
|
13
|
+
- 📊 **Multi-track**: Gantt view supports multiple rows/tracks
|
|
14
|
+
- 🔢 **Auto-calculated**: Automatic date range calculation for Gantt view
|
|
15
|
+
- 💅 **Tailwind CSS**: Fully styled with Tailwind, customizable with className
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
The timeline component is included in `@object-ui/components`.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install @object-ui/components @object-ui/react @object-ui/core
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
### Vertical Timeline
|
|
28
|
+
|
|
29
|
+
Perfect for showing project milestones, history, or chronological events.
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"type": "timeline",
|
|
34
|
+
"variant": "vertical",
|
|
35
|
+
"dateFormat": "long",
|
|
36
|
+
"items": [
|
|
37
|
+
{
|
|
38
|
+
"time": "2024-01-15",
|
|
39
|
+
"title": "Project Kickoff",
|
|
40
|
+
"description": "Initial meeting with stakeholders and project planning",
|
|
41
|
+
"variant": "success",
|
|
42
|
+
"icon": "🚀"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"time": "2024-02-01",
|
|
46
|
+
"title": "Design Phase Complete",
|
|
47
|
+
"description": "UI/UX designs approved and ready for development",
|
|
48
|
+
"variant": "info",
|
|
49
|
+
"icon": "🎨"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"time": "2024-03-15",
|
|
53
|
+
"title": "Beta Release",
|
|
54
|
+
"description": "Internal testing phase begins",
|
|
55
|
+
"variant": "warning",
|
|
56
|
+
"icon": "⚡"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"time": "2024-04-01",
|
|
60
|
+
"title": "Official Launch",
|
|
61
|
+
"description": "Product goes live to all users",
|
|
62
|
+
"variant": "success",
|
|
63
|
+
"icon": "🎉"
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Horizontal Timeline
|
|
70
|
+
|
|
71
|
+
Ideal for roadmaps, quarterly plans, or linear progressions.
|
|
72
|
+
|
|
73
|
+
```json
|
|
74
|
+
{
|
|
75
|
+
"type": "timeline",
|
|
76
|
+
"variant": "horizontal",
|
|
77
|
+
"dateFormat": "short",
|
|
78
|
+
"items": [
|
|
79
|
+
{
|
|
80
|
+
"time": "2024-01-01",
|
|
81
|
+
"title": "Q1 2024",
|
|
82
|
+
"description": "Planning & Design",
|
|
83
|
+
"variant": "success"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"time": "2024-04-01",
|
|
87
|
+
"title": "Q2 2024",
|
|
88
|
+
"description": "Development",
|
|
89
|
+
"variant": "info"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"time": "2024-07-01",
|
|
93
|
+
"title": "Q3 2024",
|
|
94
|
+
"description": "Testing & QA",
|
|
95
|
+
"variant": "warning"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"time": "2024-10-01",
|
|
99
|
+
"title": "Q4 2024",
|
|
100
|
+
"description": "Launch & Scale",
|
|
101
|
+
"variant": "success"
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Gantt Timeline (Airtable Style)
|
|
108
|
+
|
|
109
|
+
Perfect for project management, resource planning, and multi-track timelines.
|
|
110
|
+
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"type": "timeline",
|
|
114
|
+
"variant": "gantt",
|
|
115
|
+
"dateFormat": "short",
|
|
116
|
+
"timeScale": "month",
|
|
117
|
+
"rowLabel": "Project Tasks",
|
|
118
|
+
"items": [
|
|
119
|
+
{
|
|
120
|
+
"label": "Backend Development",
|
|
121
|
+
"items": [
|
|
122
|
+
{
|
|
123
|
+
"title": "API Design",
|
|
124
|
+
"startDate": "2024-01-01",
|
|
125
|
+
"endDate": "2024-01-31",
|
|
126
|
+
"variant": "success"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"title": "Database Schema",
|
|
130
|
+
"startDate": "2024-01-15",
|
|
131
|
+
"endDate": "2024-02-15",
|
|
132
|
+
"variant": "info"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"title": "API Implementation",
|
|
136
|
+
"startDate": "2024-02-01",
|
|
137
|
+
"endDate": "2024-03-31",
|
|
138
|
+
"variant": "default"
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"label": "Frontend Development",
|
|
144
|
+
"items": [
|
|
145
|
+
{
|
|
146
|
+
"title": "UI Design",
|
|
147
|
+
"startDate": "2024-01-15",
|
|
148
|
+
"endDate": "2024-02-15",
|
|
149
|
+
"variant": "warning"
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"title": "Component Library",
|
|
153
|
+
"startDate": "2024-02-01",
|
|
154
|
+
"endDate": "2024-03-15",
|
|
155
|
+
"variant": "info"
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"title": "Integration",
|
|
159
|
+
"startDate": "2024-03-01",
|
|
160
|
+
"endDate": "2024-04-15",
|
|
161
|
+
"variant": "default"
|
|
162
|
+
}
|
|
163
|
+
]
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"label": "Testing & QA",
|
|
167
|
+
"items": [
|
|
168
|
+
{
|
|
169
|
+
"title": "Unit Tests",
|
|
170
|
+
"startDate": "2024-02-15",
|
|
171
|
+
"endDate": "2024-03-15",
|
|
172
|
+
"variant": "success"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
"title": "Integration Tests",
|
|
176
|
+
"startDate": "2024-03-01",
|
|
177
|
+
"endDate": "2024-04-01",
|
|
178
|
+
"variant": "info"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"title": "User Acceptance Testing",
|
|
182
|
+
"startDate": "2024-04-01",
|
|
183
|
+
"endDate": "2024-04-30",
|
|
184
|
+
"variant": "danger"
|
|
185
|
+
}
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Props
|
|
193
|
+
|
|
194
|
+
### Common Props
|
|
195
|
+
|
|
196
|
+
| Prop | Type | Default | Description |
|
|
197
|
+
|------|------|---------|-------------|
|
|
198
|
+
| `variant` | `'vertical' \| 'horizontal' \| 'gantt'` | `'vertical'` | Timeline variant to render |
|
|
199
|
+
| `dateFormat` | `'short' \| 'long' \| 'iso'` | `'short'` | Date formatting style |
|
|
200
|
+
| `items` | `TimelineItem[]` | `[]` | Array of timeline items (structure varies by variant) |
|
|
201
|
+
| `className` | `string` | - | Additional CSS classes |
|
|
202
|
+
|
|
203
|
+
### Vertical/Horizontal Item Props
|
|
204
|
+
|
|
205
|
+
| Prop | Type | Description |
|
|
206
|
+
|------|------|-------------|
|
|
207
|
+
| `time` | `string` | ISO date string (e.g., "2024-01-15") |
|
|
208
|
+
| `title` | `string` | Item title |
|
|
209
|
+
| `description` | `string` | Item description |
|
|
210
|
+
| `variant` | `'default' \| 'success' \| 'warning' \| 'danger' \| 'info'` | Color variant |
|
|
211
|
+
| `icon` | `string` | Icon or emoji to display in marker |
|
|
212
|
+
| `content` | `SchemaNode` | Custom content schema |
|
|
213
|
+
| `className` | `string` | Additional CSS classes |
|
|
214
|
+
|
|
215
|
+
### Gantt-Specific Props
|
|
216
|
+
|
|
217
|
+
| Prop | Type | Default | Description |
|
|
218
|
+
|------|------|---------|-------------|
|
|
219
|
+
| `timeScale` | `'day' \| 'week' \| 'month'` | `'month'` | Time scale for the timeline header |
|
|
220
|
+
| `rowLabel` | `string` | `'Items'` | Label for the row header column |
|
|
221
|
+
| `minDate` | `string` | Auto-calculated | Override minimum date (YYYY-MM-DD) |
|
|
222
|
+
| `maxDate` | `string` | Auto-calculated | Override maximum date (YYYY-MM-DD) |
|
|
223
|
+
|
|
224
|
+
### Gantt Item Structure
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
{
|
|
228
|
+
label: string; // Row label
|
|
229
|
+
items: Array<{
|
|
230
|
+
title: string; // Bar label
|
|
231
|
+
startDate: string; // ISO date string
|
|
232
|
+
endDate: string; // ISO date string
|
|
233
|
+
variant?: string; // Color variant
|
|
234
|
+
}>;
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Color Variants
|
|
239
|
+
|
|
240
|
+
The timeline component supports 5 color variants:
|
|
241
|
+
|
|
242
|
+
- `default` - Blue (default color)
|
|
243
|
+
- `success` - Green
|
|
244
|
+
- `warning` - Yellow/Orange
|
|
245
|
+
- `danger` - Red
|
|
246
|
+
- `info` - Purple
|
|
247
|
+
|
|
248
|
+
Each variant applies to markers (vertical/horizontal) or bars (Gantt).
|
|
249
|
+
|
|
250
|
+
## Date Formats
|
|
251
|
+
|
|
252
|
+
- `short` - MM/DD/YYYY (e.g., "1/15/2024")
|
|
253
|
+
- `long` - Month DD, YYYY (e.g., "January 15, 2024")
|
|
254
|
+
- `iso` - YYYY-MM-DD (e.g., "2024-01-15")
|
|
255
|
+
|
|
256
|
+
## Time Scales (Gantt Only)
|
|
257
|
+
|
|
258
|
+
- `day` - Daily granularity
|
|
259
|
+
- `week` - Weekly granularity
|
|
260
|
+
- `month` - Monthly granularity (default)
|
|
261
|
+
|
|
262
|
+
## Advanced Usage
|
|
263
|
+
|
|
264
|
+
### Custom Styling
|
|
265
|
+
|
|
266
|
+
Use Tailwind CSS classes for custom styling:
|
|
267
|
+
|
|
268
|
+
```json
|
|
269
|
+
{
|
|
270
|
+
"type": "timeline",
|
|
271
|
+
"variant": "vertical",
|
|
272
|
+
"className": "max-w-3xl mx-auto",
|
|
273
|
+
"items": [
|
|
274
|
+
{
|
|
275
|
+
"time": "2024-01-15",
|
|
276
|
+
"title": "Custom Styled Item",
|
|
277
|
+
"className": "bg-blue-50 p-4 rounded-lg",
|
|
278
|
+
"variant": "info"
|
|
279
|
+
}
|
|
280
|
+
]
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### With Custom Content
|
|
285
|
+
|
|
286
|
+
You can add custom content schemas to vertical/horizontal timeline items:
|
|
287
|
+
|
|
288
|
+
```json
|
|
289
|
+
{
|
|
290
|
+
"type": "timeline",
|
|
291
|
+
"variant": "vertical",
|
|
292
|
+
"items": [
|
|
293
|
+
{
|
|
294
|
+
"time": "2024-01-15",
|
|
295
|
+
"title": "Custom Content",
|
|
296
|
+
"content": [
|
|
297
|
+
{
|
|
298
|
+
"type": "button",
|
|
299
|
+
"label": "View Details",
|
|
300
|
+
"className": "mt-2"
|
|
301
|
+
}
|
|
302
|
+
]
|
|
303
|
+
}
|
|
304
|
+
]
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### Interactive Items
|
|
309
|
+
|
|
310
|
+
Handle item clicks in Gantt view:
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
// In React component
|
|
314
|
+
<SchemaRenderer
|
|
315
|
+
schema={{
|
|
316
|
+
type: 'timeline',
|
|
317
|
+
variant: 'gantt',
|
|
318
|
+
onItemClick: (item, row, rowIndex, itemIndex) => {
|
|
319
|
+
console.log('Clicked:', item.title, 'in row:', row.label);
|
|
320
|
+
},
|
|
321
|
+
items: [...]
|
|
322
|
+
}}
|
|
323
|
+
/>
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## UI Components
|
|
327
|
+
|
|
328
|
+
The timeline component is built using these base UI components:
|
|
329
|
+
|
|
330
|
+
### Vertical/Horizontal
|
|
331
|
+
- `Timeline` - Container
|
|
332
|
+
- `TimelineItem` - Individual item
|
|
333
|
+
- `TimelineMarker` - Marker/dot
|
|
334
|
+
- `TimelineContent` - Content wrapper
|
|
335
|
+
- `TimelineTitle` - Title heading
|
|
336
|
+
- `TimelineTime` - Time display
|
|
337
|
+
- `TimelineDescription` - Description text
|
|
338
|
+
|
|
339
|
+
### Gantt
|
|
340
|
+
- `TimelineGantt` - Container
|
|
341
|
+
- `TimelineGanttHeader` - Header with time scale
|
|
342
|
+
- `TimelineGanttRow` - Individual row
|
|
343
|
+
- `TimelineGanttLabel` - Row label
|
|
344
|
+
- `TimelineGanttBar` - Task bar
|
|
345
|
+
- `TimelineGanttBarContent` - Bar content/text
|
|
346
|
+
|
|
347
|
+
## Examples
|
|
348
|
+
|
|
349
|
+
See the [prototype app](../../examples/prototype/src/App.tsx) for comprehensive examples of all three timeline variants in action.
|
|
350
|
+
|
|
351
|
+
## License
|
|
352
|
+
|
|
353
|
+
MIT
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll } from 'vitest';
|
|
2
|
+
import { ComponentRegistry } from '@object-ui/core';
|
|
3
|
+
|
|
4
|
+
// Import the component to ensure it's registered
|
|
5
|
+
import '../data-table';
|
|
6
|
+
|
|
7
|
+
describe('Data Table Component', () => {
|
|
8
|
+
it('should register data-table component', () => {
|
|
9
|
+
expect(ComponentRegistry.has('data-table')).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('should have correct component metadata', () => {
|
|
13
|
+
const config = ComponentRegistry.getConfig('data-table');
|
|
14
|
+
expect(config).toBeDefined();
|
|
15
|
+
expect(config?.label).toBe('Data Table');
|
|
16
|
+
expect(config?.inputs).toBeDefined();
|
|
17
|
+
expect(config?.defaultProps).toBeDefined();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('should have required inputs defined', () => {
|
|
21
|
+
const config = ComponentRegistry.getConfig('data-table');
|
|
22
|
+
const inputNames = config?.inputs?.map(input => input.name) || [];
|
|
23
|
+
|
|
24
|
+
expect(inputNames).toContain('columns');
|
|
25
|
+
expect(inputNames).toContain('data');
|
|
26
|
+
expect(inputNames).toContain('pagination');
|
|
27
|
+
expect(inputNames).toContain('searchable');
|
|
28
|
+
expect(inputNames).toContain('selectable');
|
|
29
|
+
expect(inputNames).toContain('sortable');
|
|
30
|
+
expect(inputNames).toContain('exportable');
|
|
31
|
+
expect(inputNames).toContain('rowActions');
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('should have default props with sample data', () => {
|
|
35
|
+
const config = ComponentRegistry.getConfig('data-table');
|
|
36
|
+
expect(config?.defaultProps).toBeDefined();
|
|
37
|
+
expect(config?.defaultProps?.columns).toBeDefined();
|
|
38
|
+
expect(Array.isArray(config?.defaultProps?.columns)).toBe(true);
|
|
39
|
+
expect(config?.defaultProps?.data).toBeDefined();
|
|
40
|
+
expect(Array.isArray(config?.defaultProps?.data)).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should have correct default feature flags', () => {
|
|
44
|
+
const config = ComponentRegistry.getConfig('data-table');
|
|
45
|
+
expect(config?.defaultProps?.pagination).toBe(true);
|
|
46
|
+
expect(config?.defaultProps?.searchable).toBe(true);
|
|
47
|
+
expect(config?.defaultProps?.selectable).toBe(true);
|
|
48
|
+
expect(config?.defaultProps?.sortable).toBe(true);
|
|
49
|
+
expect(config?.defaultProps?.exportable).toBe(true);
|
|
50
|
+
expect(config?.defaultProps?.rowActions).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { ComponentRegistry } from '@object-ui/core';
|
|
2
|
+
import type { CalendarViewSchema, CalendarEvent } from '@object-ui/types';
|
|
3
|
+
import { CalendarView } from '../../ui';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
|
|
6
|
+
// Calendar View Renderer - Airtable-style calendar for displaying records as events
|
|
7
|
+
ComponentRegistry.register('calendar-view',
|
|
8
|
+
({ schema, className, onAction, ...props }: { schema: CalendarViewSchema; className?: string; onAction?: (action: any) => void; [key: string]: any }) => {
|
|
9
|
+
// Transform schema data to CalendarEvent format
|
|
10
|
+
const events = React.useMemo(() => {
|
|
11
|
+
if (!schema.data || !Array.isArray(schema.data)) return [];
|
|
12
|
+
|
|
13
|
+
return schema.data.map((record: any, index: number) => {
|
|
14
|
+
/** Field name to use for event title display */
|
|
15
|
+
const titleField = schema.titleField || 'title';
|
|
16
|
+
/** Field name containing the event start date/time */
|
|
17
|
+
const startField = schema.startDateField || 'start';
|
|
18
|
+
/** Field name containing the event end date/time (optional) */
|
|
19
|
+
const endField = schema.endDateField || 'end';
|
|
20
|
+
/** Field name to determine event color or color category */
|
|
21
|
+
const colorField = schema.colorField || 'color';
|
|
22
|
+
/** Field name indicating if event is all-day */
|
|
23
|
+
const allDayField = schema.allDayField || 'allDay';
|
|
24
|
+
|
|
25
|
+
const title = record[titleField] || 'Untitled';
|
|
26
|
+
const start = record[startField] ? new Date(record[startField]) : new Date();
|
|
27
|
+
const end = record[endField] ? new Date(record[endField]) : undefined;
|
|
28
|
+
const allDay = record[allDayField] !== undefined ? record[allDayField] : false;
|
|
29
|
+
|
|
30
|
+
// Handle color mapping
|
|
31
|
+
let color = record[colorField];
|
|
32
|
+
if (color && schema.colorMapping && schema.colorMapping[color]) {
|
|
33
|
+
color = schema.colorMapping[color];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
id: String(record.id || record._id || index),
|
|
38
|
+
title,
|
|
39
|
+
start,
|
|
40
|
+
end,
|
|
41
|
+
allDay,
|
|
42
|
+
color,
|
|
43
|
+
data: record,
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
}, [schema.data, schema.titleField, schema.startDateField, schema.endDateField, schema.colorField, schema.allDayField, schema.colorMapping]);
|
|
47
|
+
|
|
48
|
+
const handleEventClick = React.useCallback((event: any) => {
|
|
49
|
+
if (onAction) {
|
|
50
|
+
onAction({
|
|
51
|
+
type: 'event_click',
|
|
52
|
+
payload: { event: event.data, eventId: event.id }
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (schema.onEventClick) {
|
|
56
|
+
schema.onEventClick(event.data);
|
|
57
|
+
}
|
|
58
|
+
}, [onAction, schema]);
|
|
59
|
+
|
|
60
|
+
const handleDateClick = React.useCallback((date: Date) => {
|
|
61
|
+
if (onAction) {
|
|
62
|
+
onAction({
|
|
63
|
+
type: 'date_click',
|
|
64
|
+
payload: { date }
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (schema.onDateClick) {
|
|
68
|
+
schema.onDateClick(date);
|
|
69
|
+
}
|
|
70
|
+
}, [onAction, schema]);
|
|
71
|
+
|
|
72
|
+
const handleViewChange = React.useCallback((view: "month" | "week" | "day") => {
|
|
73
|
+
if (onAction) {
|
|
74
|
+
onAction({
|
|
75
|
+
type: 'view_change',
|
|
76
|
+
payload: { view }
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (schema.onViewChange) {
|
|
80
|
+
schema.onViewChange(view);
|
|
81
|
+
}
|
|
82
|
+
}, [onAction, schema]);
|
|
83
|
+
|
|
84
|
+
const handleNavigate = React.useCallback((date: Date) => {
|
|
85
|
+
if (onAction) {
|
|
86
|
+
onAction({
|
|
87
|
+
type: 'navigate',
|
|
88
|
+
payload: { date }
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (schema.onNavigate) {
|
|
92
|
+
schema.onNavigate(date);
|
|
93
|
+
}
|
|
94
|
+
}, [onAction, schema]);
|
|
95
|
+
|
|
96
|
+
return (
|
|
97
|
+
<CalendarView
|
|
98
|
+
events={events as any[]}
|
|
99
|
+
view={(schema.view as any) || 'month'}
|
|
100
|
+
currentDate={schema.currentDate ? new Date(schema.currentDate) : undefined}
|
|
101
|
+
onEventClick={handleEventClick}
|
|
102
|
+
onDateClick={schema.allowCreate || schema.onDateClick ? handleDateClick : undefined}
|
|
103
|
+
onViewChange={handleViewChange}
|
|
104
|
+
onNavigate={handleNavigate}
|
|
105
|
+
className={className}
|
|
106
|
+
{...props}
|
|
107
|
+
/>
|
|
108
|
+
);
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
label: 'Calendar View',
|
|
112
|
+
inputs: [
|
|
113
|
+
{
|
|
114
|
+
name: 'data',
|
|
115
|
+
type: 'array',
|
|
116
|
+
label: 'Data',
|
|
117
|
+
description: 'Array of record objects to display as events'
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: 'titleField',
|
|
121
|
+
type: 'string',
|
|
122
|
+
label: 'Title Field',
|
|
123
|
+
defaultValue: 'title',
|
|
124
|
+
description: 'Field name to use for event title'
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
name: 'startDateField',
|
|
128
|
+
type: 'string',
|
|
129
|
+
label: 'Start Date Field',
|
|
130
|
+
defaultValue: 'start',
|
|
131
|
+
description: 'Field name for event start date'
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: 'endDateField',
|
|
135
|
+
type: 'string',
|
|
136
|
+
label: 'End Date Field',
|
|
137
|
+
defaultValue: 'end',
|
|
138
|
+
description: 'Field name for event end date (optional)'
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: 'allDayField',
|
|
142
|
+
type: 'string',
|
|
143
|
+
label: 'All Day Field',
|
|
144
|
+
defaultValue: 'allDay',
|
|
145
|
+
description: 'Field name for all-day flag'
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
name: 'colorField',
|
|
149
|
+
type: 'string',
|
|
150
|
+
label: 'Color Field',
|
|
151
|
+
defaultValue: 'color',
|
|
152
|
+
description: 'Field name for event color'
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: 'colorMapping',
|
|
156
|
+
type: 'object',
|
|
157
|
+
label: 'Color Mapping',
|
|
158
|
+
description: 'Map field values to colors (e.g., {meeting: "blue", deadline: "red"})'
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
name: 'view',
|
|
162
|
+
type: 'enum',
|
|
163
|
+
enum: ['month', 'week', 'day'],
|
|
164
|
+
defaultValue: 'month',
|
|
165
|
+
label: 'View Mode',
|
|
166
|
+
description: 'Calendar view mode (month, week, or day)'
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
name: 'currentDate',
|
|
170
|
+
type: 'string',
|
|
171
|
+
label: 'Current Date',
|
|
172
|
+
description: 'ISO date string for initial calendar date'
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: 'allowCreate',
|
|
176
|
+
type: 'boolean',
|
|
177
|
+
label: 'Allow Create',
|
|
178
|
+
defaultValue: false,
|
|
179
|
+
description: 'Allow creating events by clicking on dates'
|
|
180
|
+
},
|
|
181
|
+
{ name: 'className', type: 'string', label: 'CSS Class' }
|
|
182
|
+
],
|
|
183
|
+
defaultProps: {
|
|
184
|
+
view: 'month',
|
|
185
|
+
titleField: 'title',
|
|
186
|
+
startDateField: 'start',
|
|
187
|
+
endDateField: 'end',
|
|
188
|
+
allDayField: 'allDay',
|
|
189
|
+
colorField: 'color',
|
|
190
|
+
allowCreate: false,
|
|
191
|
+
data: [
|
|
192
|
+
{
|
|
193
|
+
id: 1,
|
|
194
|
+
title: 'Team Meeting',
|
|
195
|
+
start: new Date(new Date().setHours(10, 0, 0, 0)).toISOString(),
|
|
196
|
+
end: new Date(new Date().setHours(11, 0, 0, 0)).toISOString(),
|
|
197
|
+
color: '#3b82f6',
|
|
198
|
+
allDay: false
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
id: 2,
|
|
202
|
+
title: 'Project Deadline',
|
|
203
|
+
start: new Date(new Date().setDate(new Date().getDate() + 3)).toISOString(),
|
|
204
|
+
color: '#ef4444',
|
|
205
|
+
allDay: true
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
id: 3,
|
|
209
|
+
title: 'Conference',
|
|
210
|
+
start: new Date(new Date().setDate(new Date().getDate() + 7)).toISOString(),
|
|
211
|
+
end: new Date(new Date().setDate(new Date().getDate() + 9)).toISOString(),
|
|
212
|
+
color: '#10b981',
|
|
213
|
+
allDay: true
|
|
214
|
+
}
|
|
215
|
+
],
|
|
216
|
+
className: 'h-[600px] border rounded-lg'
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ComponentRegistry } from '@object-ui/core';
|
|
2
|
+
import type { CarouselSchema } from '@object-ui/types';
|
|
3
|
+
import {
|
|
4
|
+
Carousel,
|
|
5
|
+
CarouselContent,
|
|
6
|
+
CarouselItem,
|
|
7
|
+
CarouselPrevious,
|
|
8
|
+
CarouselNext
|
|
9
|
+
} from '../../ui';
|
|
10
|
+
import { renderChildren } from '../../lib/utils';
|
|
11
|
+
|
|
12
|
+
ComponentRegistry.register('carousel',
|
|
13
|
+
({ schema, className, ...props }: { schema: CarouselSchema; className?: string; [key: string]: any }) => (
|
|
14
|
+
<Carousel
|
|
15
|
+
opts={schema.opts}
|
|
16
|
+
orientation={schema.orientation || 'horizontal'}
|
|
17
|
+
className={className}
|
|
18
|
+
{...props}
|
|
19
|
+
>
|
|
20
|
+
<CarouselContent>
|
|
21
|
+
{schema.items?.map((item: any, index: number) => (
|
|
22
|
+
<CarouselItem key={index} className={schema.itemClassName}>
|
|
23
|
+
{renderChildren(item)}
|
|
24
|
+
</CarouselItem>
|
|
25
|
+
))}
|
|
26
|
+
</CarouselContent>
|
|
27
|
+
{schema.showArrows && (
|
|
28
|
+
<>
|
|
29
|
+
<CarouselPrevious />
|
|
30
|
+
<CarouselNext />
|
|
31
|
+
</>
|
|
32
|
+
)}
|
|
33
|
+
</Carousel>
|
|
34
|
+
),
|
|
35
|
+
{
|
|
36
|
+
label: 'Carousel',
|
|
37
|
+
inputs: [
|
|
38
|
+
{ name: 'orientation', type: 'enum', enum: ['horizontal', 'vertical'], defaultValue: 'horizontal', label: 'Orientation' },
|
|
39
|
+
{ name: 'showArrows', type: 'boolean', label: 'Show Arrows', defaultValue: true },
|
|
40
|
+
{
|
|
41
|
+
name: 'items',
|
|
42
|
+
type: 'array',
|
|
43
|
+
label: 'Items',
|
|
44
|
+
description: 'Array of content schemas'
|
|
45
|
+
},
|
|
46
|
+
{ name: 'itemClassName', type: 'string', label: 'Item CSS Class' },
|
|
47
|
+
{ name: 'className', type: 'string', label: 'Container CSS Class' }
|
|
48
|
+
],
|
|
49
|
+
defaultProps: {
|
|
50
|
+
orientation: 'horizontal',
|
|
51
|
+
showArrows: true,
|
|
52
|
+
items: [
|
|
53
|
+
[{ type: 'div', className: 'p-8 border rounded bg-slate-50', body: [{ type: 'text', content: 'Slide 1' }] }],
|
|
54
|
+
[{ type: 'div', className: 'p-8 border rounded bg-slate-50', body: [{ type: 'text', content: 'Slide 2' }] }],
|
|
55
|
+
[{ type: 'div', className: 'p-8 border rounded bg-slate-50', body: [{ type: 'text', content: 'Slide 3' }] }]
|
|
56
|
+
],
|
|
57
|
+
className: 'w-full max-w-xs'
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
);
|