@boxcustodia/library 2.0.0-alpha.13 → 2.0.0-alpha.15

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 (174) hide show
  1. package/dist/index.cjs.js +1 -138
  2. package/dist/index.d.ts +1083 -717
  3. package/dist/index.es.js +7059 -56179
  4. package/dist/theme.css +1 -1
  5. package/package.json +34 -26
  6. package/src/__doc__/Changelog.mdx +6 -6
  7. package/src/__doc__/Examples.tsx +1 -1
  8. package/src/__doc__/Intro.mdx +3 -3
  9. package/src/__doc__/Tabs.mdx +112 -0
  10. package/src/__doc__/V2.mdx +1245 -0
  11. package/src/components/accordion/accordion.stories.tsx +143 -0
  12. package/src/components/accordion/accordion.tsx +135 -0
  13. package/src/components/accordion/index.ts +1 -0
  14. package/src/components/alert/alert.stories.tsx +24 -4
  15. package/src/components/alert/alert.tsx +17 -9
  16. package/src/components/alert-dialog/alert-dialog.stories.tsx +24 -0
  17. package/src/components/alert-dialog/alert-dialog.test.tsx +1 -1
  18. package/src/components/alert-dialog/alert-dialog.tsx +58 -10
  19. package/src/components/auto-complete/auto-complete.stories.tsx +615 -200
  20. package/src/components/auto-complete/auto-complete.tsx +420 -68
  21. package/src/components/auto-complete/index.ts +0 -1
  22. package/src/components/avatar/avatar.stories.tsx +162 -21
  23. package/src/components/avatar/avatar.tsx +79 -20
  24. package/src/components/button/button.stories.tsx +236 -294
  25. package/src/components/button/button.test.tsx +10 -17
  26. package/src/components/button/button.tsx +53 -18
  27. package/src/components/button/components/base-button.tsx +25 -53
  28. package/src/components/button/index.ts +0 -1
  29. package/src/components/calendar/calendar.stories.tsx +1 -1
  30. package/src/components/calendar/calendar.tsx +4 -4
  31. package/src/components/card/card.stories.tsx +140 -69
  32. package/src/components/card/card.tsx +155 -54
  33. package/src/components/center/center.stories.tsx +22 -39
  34. package/src/components/checkbox/checkbox.stories.tsx +25 -5
  35. package/src/components/checkbox/checkbox.tsx +76 -15
  36. package/src/components/checkbox-group/checkbox-group.stories.tsx +116 -28
  37. package/src/components/checkbox-group/checkbox-group.tsx +84 -3
  38. package/src/components/combobox/combobox.stories.tsx +33 -23
  39. package/src/components/combobox/combobox.tsx +120 -104
  40. package/src/components/date-picker/date-input.stories.tsx +14 -6
  41. package/src/components/date-picker/date-input.tsx +3 -3
  42. package/src/components/date-picker/date-picker.model.ts +13 -4
  43. package/src/components/date-picker/date-picker.stories.tsx +38 -12
  44. package/src/components/date-picker/date-picker.tsx +29 -15
  45. package/src/components/dialog/dialog.stories.tsx +18 -0
  46. package/src/components/dialog/dialog.test.tsx +1 -1
  47. package/src/components/dialog/dialog.tsx +51 -20
  48. package/src/components/divider/divider.stories.tsx +6 -0
  49. package/src/components/dropzone/dropzone.stories.tsx +70 -90
  50. package/src/components/dropzone/dropzone.tsx +383 -105
  51. package/src/components/dropzone/index.ts +0 -1
  52. package/src/components/empty/empty.stories.tsx +164 -0
  53. package/src/components/empty/empty.tsx +156 -0
  54. package/src/components/empty/index.ts +1 -0
  55. package/src/components/field/field.stories.tsx +226 -3
  56. package/src/components/field/field.tsx +77 -42
  57. package/src/components/form/form.stories.tsx +320 -197
  58. package/src/components/form/form.tsx +3 -23
  59. package/src/components/index.ts +2 -6
  60. package/src/components/input/input.stories.tsx +5 -5
  61. package/src/components/input/input.tsx +5 -5
  62. package/src/components/kbd/kbd.stories.tsx +1 -0
  63. package/src/components/label/label.stories.tsx +16 -0
  64. package/src/components/label/label.tsx +13 -2
  65. package/src/components/loader/loader.stories.tsx +7 -5
  66. package/src/components/loader/loader.tsx +8 -3
  67. package/src/components/menu/menu-primitives.tsx +207 -196
  68. package/src/components/menu/menu.stories.tsx +275 -146
  69. package/src/components/menu/menu.tsx +146 -54
  70. package/src/components/number-input/number-input.stories.tsx +27 -4
  71. package/src/components/number-input/number-input.test.tsx +2 -2
  72. package/src/components/number-input/number-input.tsx +29 -33
  73. package/src/components/otp/index.ts +1 -0
  74. package/src/components/otp/otp.stories.tsx +209 -0
  75. package/src/components/otp/otp.tsx +100 -0
  76. package/src/components/pagination/index.ts +1 -0
  77. package/src/components/pagination/pagination.model.ts +2 -0
  78. package/src/components/pagination/pagination.stories.tsx +153 -59
  79. package/src/components/pagination/pagination.test.tsx +122 -57
  80. package/src/components/pagination/pagination.tsx +575 -77
  81. package/src/components/password/password.stories.tsx +18 -3
  82. package/src/components/password/password.tsx +26 -10
  83. package/src/components/popover/popover.stories.tsx +26 -5
  84. package/src/components/popover/popover.tsx +15 -23
  85. package/src/components/progress/progress.stories.tsx +1 -0
  86. package/src/components/radio-group/index.ts +1 -0
  87. package/src/components/radio-group/radio-group.stories.tsx +251 -0
  88. package/src/components/radio-group/radio-group.tsx +212 -0
  89. package/src/components/scroll-area/scroll-area.stories.tsx +1 -0
  90. package/src/components/select/select.stories.tsx +118 -19
  91. package/src/components/select/select.tsx +67 -62
  92. package/src/components/skeleton/skeleton.stories.tsx +1 -0
  93. package/src/components/stack/stack.stories.tsx +179 -89
  94. package/src/components/stack/stack.tsx +2 -2
  95. package/src/components/stepper/index.ts +1 -1
  96. package/src/components/stepper/stepper.stories.tsx +766 -83
  97. package/src/components/stepper/stepper.test.tsx +18 -18
  98. package/src/components/stepper/stepper.tsx +554 -0
  99. package/src/components/switch/switch.stories.tsx +15 -1
  100. package/src/components/switch/switch.tsx +17 -4
  101. package/src/components/table/index.ts +0 -2
  102. package/src/components/table/table.stories.tsx +131 -18
  103. package/src/components/table/table.test.tsx +1 -1
  104. package/src/components/table/table.tsx +183 -77
  105. package/src/components/tabs/tabs.stories.tsx +372 -155
  106. package/src/components/tabs/tabs.test.tsx +12 -12
  107. package/src/components/tabs/tabs.tsx +72 -149
  108. package/src/components/tag/index.ts +0 -1
  109. package/src/components/tag/tag.stories.tsx +147 -120
  110. package/src/components/tag/tag.tsx +47 -95
  111. package/src/components/textarea/textarea.stories.tsx +8 -22
  112. package/src/components/textarea/textarea.tsx +17 -79
  113. package/src/components/timeline/timeline.stories.tsx +322 -42
  114. package/src/components/timeline/timeline.tsx +359 -132
  115. package/src/components/toast/toast.stories.tsx +1 -0
  116. package/src/components/tooltip/tooltip.tsx +11 -9
  117. package/src/components/tree/index.ts +0 -1
  118. package/src/components/tree/tree.stories.tsx +364 -408
  119. package/src/components/tree/tree.test.tsx +163 -0
  120. package/src/components/tree/tree.tsx +212 -36
  121. package/src/hooks/useAsync/__doc__/useAsync.stories.tsx +5 -5
  122. package/src/hooks/useClipboard/__doc__/useClipboard.stories.tsx +1 -3
  123. package/src/hooks/useDebounceCallback/__doc__/useDebouncedCallback.stories.tsx +6 -6
  124. package/src/hooks/useDocumentTitle/__doc__/useDocumentTitle.stories.tsx +1 -1
  125. package/src/hooks/useEventListener/__test__/useEventListener.test.tsx +1 -1
  126. package/src/hooks/useLocalStorage/__doc__/useLocalStorage.stories.tsx +1 -1
  127. package/src/hooks/usePagination/usePagination.tsx +36 -24
  128. package/src/styles/theme.css +1 -1
  129. package/src/utils/form.tsx +69 -37
  130. package/src/utils/index.ts +1 -1
  131. package/src/__doc__/Migration.mdx +0 -451
  132. package/src/components/auto-complete/auto-complete-primitives.tsx +0 -155
  133. package/src/components/background-image/background-image.stories.tsx +0 -21
  134. package/src/components/background-image/background-image.test.tsx +0 -29
  135. package/src/components/background-image/background-image.tsx +0 -23
  136. package/src/components/background-image/index.ts +0 -1
  137. package/src/components/button/button.variants.ts +0 -44
  138. package/src/components/button/components/loader-overlay.tsx +0 -21
  139. package/src/components/button/components/loading-icon.tsx +0 -47
  140. package/src/components/dropzone/upload-primitives.tsx +0 -310
  141. package/src/components/dropzone/use-dropzone.ts +0 -122
  142. package/src/components/empty-state/empty-state.stories.tsx +0 -56
  143. package/src/components/empty-state/empty-state.tsx +0 -39
  144. package/src/components/empty-state/index.ts +0 -1
  145. package/src/components/heading/heading.stories.tsx +0 -74
  146. package/src/components/heading/heading.tsx +0 -28
  147. package/src/components/heading/heading.variants.ts +0 -27
  148. package/src/components/heading/index.ts +0 -1
  149. package/src/components/kbd/kbd.variants.ts +0 -26
  150. package/src/components/menu/util/render-menu-item.tsx +0 -54
  151. package/src/components/multi-select/hooks/use-multi-select.ts +0 -66
  152. package/src/components/multi-select/index.ts +0 -1
  153. package/src/components/multi-select/multi-select.stories.tsx +0 -294
  154. package/src/components/multi-select/multi-select.tsx +0 -300
  155. package/src/components/multi-select/multi-select.variants.ts +0 -22
  156. package/src/components/pagination/components/pagination-option.tsx +0 -27
  157. package/src/components/show/index.ts +0 -1
  158. package/src/components/show/show.stories.tsx +0 -197
  159. package/src/components/show/show.test.tsx +0 -41
  160. package/src/components/show/show.tsx +0 -16
  161. package/src/components/stepper/Stepper.tsx +0 -190
  162. package/src/components/stepper/context/stepper-context.tsx +0 -11
  163. package/src/components/table/table-primitives.tsx +0 -122
  164. package/src/components/table/table.model.ts +0 -20
  165. package/src/components/table-pagination/index.ts +0 -2
  166. package/src/components/table-pagination/table-pagination.model.ts +0 -2
  167. package/src/components/table-pagination/table-pagination.stories.tsx +0 -23
  168. package/src/components/table-pagination/table-pagination.test.tsx +0 -32
  169. package/src/components/table-pagination/table-pagination.tsx +0 -108
  170. package/src/components/tabs/context/tabs-context.tsx +0 -14
  171. package/src/components/tag/tag.variants.ts +0 -31
  172. package/src/components/timeline/timeline-status.ts +0 -5
  173. package/src/components/tree/hooks/use-controllable-tree-state.ts +0 -80
  174. package/src/components/tree/tree-primitives.tsx +0 -126
@@ -1,84 +1,364 @@
1
- import { Meta, StoryObj } from "@storybook/react-vite";
2
- import { Settings, UserCheck } from "lucide-react";
3
- import { Timeline } from ".";
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+ import {
3
+ GitCompareArrowsIcon,
4
+ GitForkIcon,
5
+ GitMergeIcon,
6
+ GitPullRequestArrowIcon,
7
+ } from "lucide-react";
8
+ import { useState } from "react";
9
+ import { Tag } from "../tag/tag";
10
+ import {
11
+ Timeline,
12
+ TimelineContent,
13
+ TimelineDate,
14
+ TimelineHeader,
15
+ TimelineIndicator,
16
+ TimelineItem,
17
+ TimelineRoot,
18
+ TimelineSeparator,
19
+ TimelineTitle,
20
+ } from "./timeline";
4
21
 
22
+ /**
23
+ * Vertical or horizontal timeline that highlights progress up to an active step.
24
+ * Use the composite `Timeline` for simple item lists, or compose primitives
25
+ * (`TimelineRoot`, `TimelineItem`, `TimelineHeader`, `TimelineTitle`, `TimelineDate`,
26
+ * `TimelineIndicator`, `TimelineSeparator`, `TimelineContent`) for full control.
27
+ * The `value` / `defaultValue` prop marks the active step — every item with
28
+ * `step <= value` renders as completed.
29
+ */
5
30
  const meta: Meta<typeof Timeline> = {
6
- title: "Data display/Timeline",
31
+ title: "Components/Timeline",
7
32
  component: Timeline,
33
+ args: {
34
+ defaultValue: 2,
35
+ items: [
36
+ {
37
+ date: "Mar 15, 2024",
38
+ title: "Project kickoff",
39
+ content: "Initial planning and team alignment session.",
40
+ },
41
+ {
42
+ date: "Mar 22, 2024",
43
+ title: "Design review",
44
+ content: "First round of feedback on wireframes.",
45
+ },
46
+ {
47
+ date: "Apr 02, 2024",
48
+ title: "Development",
49
+ content: "Implementation of core features begins.",
50
+ },
51
+ {
52
+ date: "Apr 18, 2024",
53
+ title: "Launch",
54
+ content: "Public release and marketing rollout.",
55
+ },
56
+ ],
57
+ },
58
+ parameters: {
59
+ layout: "centered",
60
+ },
8
61
  };
9
62
 
10
63
  export default meta;
11
-
12
64
  type Story = StoryObj<typeof Timeline>;
13
65
 
14
66
  export const Default: Story = {
67
+ render: (args) => (
68
+ <div className="w-[400px]">
69
+ <Timeline {...args} />
70
+ </div>
71
+ ),
72
+ };
73
+
74
+ export const Horizontal: Story = {
75
+ args: {
76
+ orientation: "horizontal",
77
+ },
78
+ render: (args) => (
79
+ <div className="w-full">
80
+ <Timeline {...args} />
81
+ </div>
82
+ ),
83
+ };
84
+
85
+ /**
86
+ * Controlled timeline — external state drives which step is active.
87
+ */
88
+ export const Controlled: Story = {
89
+ render: (args) => {
90
+ const [value, setValue] = useState(1);
91
+ return (
92
+ <div className="flex w-[400px] flex-col gap-4">
93
+ <Timeline {...args} value={value} onValueChange={setValue} />
94
+ <div className="flex gap-2">
95
+ {args.items?.map((_, i) => (
96
+ <button
97
+ key={i}
98
+ type="button"
99
+ onClick={() => setValue(i + 1)}
100
+ className="rounded border px-3 py-1 text-sm"
101
+ >
102
+ Step {i + 1}
103
+ </button>
104
+ ))}
105
+ </div>
106
+ </div>
107
+ );
108
+ },
109
+ };
110
+
111
+ /**
112
+ * Custom indicators with icons inside larger dots, and the date moved below
113
+ * the description via primitives composed in `description`. Override the
114
+ * `indicator`, `separator`, `item` and `title` slots in `classNames` to
115
+ * retune offsets when the dot size changes.
116
+ */
117
+ export const WithIndicator: Story = {
15
118
  args: {
119
+ defaultValue: 3,
120
+ className: "w-full max-w-md",
121
+ classNames: {
122
+ item: "group-data-[orientation=vertical]/timeline:ms-10",
123
+ title: "mt-0.5",
124
+ indicator:
125
+ "bg-primary/10 group-data-completed/timeline-item:bg-primary group-data-completed/timeline-item:text-primary-foreground flex size-6 items-center justify-center border-none group-data-[orientation=vertical]/timeline:-left-7",
126
+ separator:
127
+ "group-data-[orientation=vertical]/timeline:-left-7 group-data-[orientation=vertical]/timeline:h-[calc(100%-1.5rem-0.25rem)] group-data-[orientation=vertical]/timeline:translate-y-6.5",
128
+ },
16
129
  items: [
17
130
  {
18
- content: "First",
19
- color: "green",
131
+ title: "Forked Repository",
132
+ content: (
133
+ <>
134
+ Forked the repository to create a new branch for development.
135
+ <TimelineDate className="mt-2 mb-0">15 minutes ago</TimelineDate>
136
+ </>
137
+ ),
138
+ indicator: <GitForkIcon className="size-4" />,
20
139
  },
21
140
  {
22
- content: "Second",
23
- icon: <UserCheck />,
24
- status: "done",
141
+ title: "Pull Request Submitted",
142
+ content: (
143
+ <>
144
+ Submitted PR #342 with new feature implementation. Waiting for code
145
+ review.
146
+ <TimelineDate className="mt-2 mb-0">10 minutes ago</TimelineDate>
147
+ </>
148
+ ),
149
+ indicator: <GitPullRequestArrowIcon className="size-3.5" />,
25
150
  },
26
151
  {
27
- content: "Third",
28
- icon: <Settings />,
29
- status: "pending",
152
+ title: (
153
+ <span className="inline-flex items-center gap-2">
154
+ Comparing Branches
155
+ <Tag variant="error">Build failed</Tag>
156
+ </span>
157
+ ),
158
+ content: (
159
+ <>
160
+ CI build failed on the feature branch. Tests are red — review
161
+ required before merge.
162
+ <TimelineDate className="mt-2 mb-0">5 minutes ago</TimelineDate>
163
+ </>
164
+ ),
165
+ indicator: <GitCompareArrowsIcon className="size-3.5" />,
166
+ },
167
+ {
168
+ title: "Merged Branch",
169
+ content: (
170
+ <>
171
+ Merged the feature branch into the main branch. Ready for
172
+ deployment.
173
+ <TimelineDate className="mt-2 mb-0">Just now</TimelineDate>
174
+ </>
175
+ ),
176
+ indicator: <GitMergeIcon className="size-3.5" />,
30
177
  },
31
178
  ],
32
179
  },
33
180
  };
34
181
 
35
- export const OnlyRight: Story = {
182
+ /**
183
+ * Custom content in `description` — pass any ReactNode to render rich layouts
184
+ * (links, lists, badges, avatars) inside each item.
185
+ */
186
+ export const CustomContent: Story = {
36
187
  args: {
188
+ defaultValue: 2,
37
189
  items: [
38
190
  {
191
+ date: "Mar 15, 2024",
192
+ title: "Pull request merged",
39
193
  content: (
40
- <div>
41
- <time className="text-gray-400 text-sm">12/12/2022</time>
42
- <p>Argentina Campeón Mundial</p>
43
- <p>El dibu héroe de un país</p>
44
- <p>Messi mejor jugador del mundo</p>
45
- <p>Mejor país del mundo</p>
46
- </div>
47
- ),
48
- status: "done",
49
- },
50
- {
51
- content: (
52
- <div>
53
- <time className="text-gray-400 text-sm">10/12/2023</time>
54
- <p>Milei electo</p>
194
+ <div className="flex flex-col gap-2">
195
+ <p>
196
+ <a
197
+ href="#"
198
+ className="font-medium text-foreground underline underline-offset-2"
199
+ >
200
+ #482 — Add Timeline component
201
+ </a>{" "}
202
+ merged into <code className="text-xs">main</code>.
203
+ </p>
204
+ <div className="flex flex-wrap gap-1">
205
+ <span className="rounded-md bg-success/10 px-2 py-0.5 text-xs font-medium text-success">
206
+ +1.2k
207
+ </span>
208
+ <span className="rounded-md bg-error/10 px-2 py-0.5 text-xs font-medium text-error">
209
+ -34
210
+ </span>
211
+ <span className="rounded-md bg-muted px-2 py-0.5 text-xs font-medium">
212
+ 6 files
213
+ </span>
214
+ </div>
55
215
  </div>
56
216
  ),
57
- status: "done",
58
217
  },
59
218
  {
219
+ date: "Mar 22, 2024",
220
+ title: "Review requested",
60
221
  content: (
61
- <div>
62
- <time className="text-gray-400 text-sm">14/10/2024</time>
63
- <p>Año de recuperación del país</p>
64
- </div>
222
+ <ul className="list-disc space-y-1 pl-4">
223
+ <li>Add stories covering horizontal orientation</li>
224
+ <li>Document the controlled API in the meta JSDoc</li>
225
+ <li>Verify line alignment in RTL mode</li>
226
+ </ul>
65
227
  ),
66
- status: "done",
67
228
  },
68
229
  {
230
+ date: "Apr 02, 2024",
231
+ title: "Released",
69
232
  content: (
70
- <div>
71
- <time className="text-gray-400 text-sm">1/1/2025</time>
72
- <p>Nuevo año</p>
73
- </div>
233
+ <p>
234
+ Shipped in{" "}
235
+ <code className="rounded bg-muted px-1 py-0.5 text-xs">
236
+ v2.0.0-alpha.15
237
+ </code>
238
+ . See the{" "}
239
+ <a
240
+ href="#"
241
+ className="font-medium text-foreground underline underline-offset-2"
242
+ >
243
+ changelog
244
+ </a>
245
+ .
246
+ </p>
74
247
  ),
75
- status: "pending",
76
248
  },
77
249
  ],
78
250
  },
79
- render: (args) => (
251
+ };
252
+
253
+ const roadmap = [
254
+ {
255
+ date: "Jan 2025",
256
+ title: "AI Engine Integration",
257
+ content:
258
+ "Deep integration of advanced LLMs for real-time code generation and context-aware suggestions.",
259
+ },
260
+ {
261
+ date: "Feb 2025",
262
+ title: "Collaborative Editing",
263
+ content:
264
+ "Multi-user real-time collaboration with shared cursors and instant synchronization across workspaces.",
265
+ },
266
+ {
267
+ date: "Mar 2025",
268
+ title: "Visual Theme Builder",
269
+ content:
270
+ "Interactive interface for creating and managing custom design systems with automated CSS variable generation.",
271
+ },
272
+ {
273
+ date: "Apr 2025",
274
+ title: "Enterprise Security",
275
+ content:
276
+ "Role-based access control, SOC2 compliance audit, and enhanced data encryption protocols.",
277
+ },
278
+ ];
279
+
280
+ const milestones = [
281
+ {
282
+ date: "Jan 2024",
283
+ title: "Seed Funding",
284
+ content: "$2M raised to kick off product development.",
285
+ },
286
+ {
287
+ date: "Mar 2024",
288
+ title: "Product MVP",
289
+ content: "First working version shipped to beta testers.",
290
+ },
291
+ {
292
+ date: "May 2024",
293
+ title: "First Client",
294
+ content: "Signed first enterprise deal with a Fortune 500.",
295
+ },
296
+ {
297
+ date: "Jul 2024",
298
+ title: "Series A",
299
+ content: "$18M round led by Accel Partners.",
300
+ },
301
+ {
302
+ date: "Sep 2024",
303
+ title: "Global Expansion",
304
+ content: "Opened offices in London and Singapore.",
305
+ },
306
+ ];
307
+
308
+ export const DateLeft: Story = {
309
+ args: {
310
+ variant: "date-left",
311
+ defaultValue: 2,
312
+ className: "w-full max-w-md",
313
+ items: roadmap,
314
+ },
315
+ };
316
+
317
+ export const Alternate: Story = {
318
+ args: {
319
+ variant: "alternate",
320
+ defaultValue: 3,
321
+ className: "w-[24rem]",
322
+ items: milestones,
323
+ },
324
+ };
325
+
326
+ /**
327
+ * Build the timeline manually with primitives when you need custom slots,
328
+ * extra markup, or conditional content per step.
329
+ */
330
+ export const Primitive: Story = {
331
+ render: () => (
80
332
  <div className="w-[400px]">
81
- <Timeline {...args} />
333
+ <TimelineRoot defaultValue={2}>
334
+ <TimelineItem step={1}>
335
+ <TimelineHeader>
336
+ <TimelineDate>Mar 15, 2024</TimelineDate>
337
+ <TimelineTitle>Kickoff</TimelineTitle>
338
+ </TimelineHeader>
339
+ <TimelineIndicator />
340
+ <TimelineSeparator />
341
+ <TimelineContent>Project planning starts.</TimelineContent>
342
+ </TimelineItem>
343
+ <TimelineItem step={2}>
344
+ <TimelineHeader>
345
+ <TimelineDate>Apr 02, 2024</TimelineDate>
346
+ <TimelineTitle>Development</TimelineTitle>
347
+ </TimelineHeader>
348
+ <TimelineIndicator />
349
+ <TimelineSeparator />
350
+ <TimelineContent>Feature implementation in progress.</TimelineContent>
351
+ </TimelineItem>
352
+ <TimelineItem step={3}>
353
+ <TimelineHeader>
354
+ <TimelineDate>Apr 18, 2024</TimelineDate>
355
+ <TimelineTitle>Launch</TimelineTitle>
356
+ </TimelineHeader>
357
+ <TimelineIndicator />
358
+ <TimelineSeparator />
359
+ <TimelineContent>Public release.</TimelineContent>
360
+ </TimelineItem>
361
+ </TimelineRoot>
82
362
  </div>
83
363
  ),
84
364
  };