tembro 3.1.6 → 3.1.8

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 (137) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +241 -91
  3. package/dist/components/ui/dialog/index.d.ts +3 -1
  4. package/dist/components/ui/select/index.d.ts +6 -3
  5. package/dist/showcase/package-meta.d.ts +3 -3
  6. package/dist/showcase/premium/wizard/index.cjs +1 -0
  7. package/dist/showcase/premium/wizard/index.d.ts +2 -0
  8. package/dist/showcase/premium/wizard/index.js +1 -0
  9. package/dist/showcase/premium/wizard/mock.cjs +1 -0
  10. package/dist/showcase/premium/wizard/mock.d.ts +2 -0
  11. package/dist/showcase/premium/wizard/mock.js +1 -0
  12. package/dist/showcase/premium/wizard/showcase.cjs +1 -0
  13. package/dist/showcase/premium/wizard/showcase.d.ts +2 -0
  14. package/dist/showcase/premium/wizard/showcase.js +1 -0
  15. package/dist/showcase/search-utils.d.ts +1 -1
  16. package/dist/showcase/site-data.d.ts +6 -6
  17. package/dist/src/components/layout/app-sidebar.cjs +1 -1
  18. package/dist/src/components/layout/app-sidebar.js +59 -41
  19. package/dist/src/components/theme-provider.cjs +1 -1
  20. package/dist/src/components/theme-provider.js +1 -1
  21. package/dist/src/components/ui/dialog/index.cjs +1 -1
  22. package/dist/src/components/ui/dialog/index.js +14 -7
  23. package/dist/src/components/ui/select/index.cjs +1 -1
  24. package/dist/src/components/ui/select/index.js +30 -29
  25. package/dist/src/index.cjs +1 -1
  26. package/dist/src/index.js +101 -101
  27. package/dist/src/showcase/component-api-schema.cjs +1 -1
  28. package/dist/src/showcase/component-api-schema.js +868 -9
  29. package/dist/src/showcase/demo-snippets/forms/index.cjs +1 -1
  30. package/dist/src/showcase/demo-snippets/forms/index.js +1 -1
  31. package/dist/src/showcase/fallback.cjs +4 -4
  32. package/dist/src/showcase/fallback.js +354 -181
  33. package/dist/src/showcase/index.cjs +1 -1
  34. package/dist/src/showcase/index.js +2 -2
  35. package/dist/src/showcase/package-meta.cjs +1 -1
  36. package/dist/src/showcase/package-meta.js +1 -1
  37. package/dist/src/showcase/premium/app-sidebar/mock.cjs +3 -2
  38. package/dist/src/showcase/premium/app-sidebar/mock.js +1 -1
  39. package/dist/src/showcase/premium/app-sidebar/showcase.cjs +1 -1
  40. package/dist/src/showcase/premium/app-sidebar/showcase.js +1 -1
  41. package/dist/src/showcase/premium/async-select/showcase.cjs +1 -1
  42. package/dist/src/showcase/premium/async-select/showcase.js +118 -74
  43. package/dist/src/showcase/premium/avatar/showcase.cjs +1 -1
  44. package/dist/src/showcase/premium/avatar/showcase.js +5 -5
  45. package/dist/src/showcase/premium/dialog/mock.cjs +6 -1
  46. package/dist/src/showcase/premium/dialog/mock.js +1 -1
  47. package/dist/src/showcase/premium/dialog/showcase.cjs +1 -1
  48. package/dist/src/showcase/premium/dialog/showcase.js +101 -39
  49. package/dist/src/showcase/premium/form-wrapper/mock.cjs +2 -2
  50. package/dist/src/showcase/premium/form-wrapper/mock.js +2 -2
  51. package/dist/src/showcase/premium/form-wrapper/showcase.cjs +1 -1
  52. package/dist/src/showcase/premium/form-wrapper/showcase.js +1 -1
  53. package/dist/src/showcase/premium/index.cjs +1 -1
  54. package/dist/src/showcase/premium/index.js +9 -3
  55. package/dist/src/showcase/premium/input/showcase.cjs +1 -1
  56. package/dist/src/showcase/premium/input/showcase.js +1 -1
  57. package/dist/src/showcase/premium/json-input/showcase.cjs +1 -1
  58. package/dist/src/showcase/premium/json-input/showcase.js +1 -1
  59. package/dist/src/showcase/premium/select/showcase.cjs +1 -1
  60. package/dist/src/showcase/premium/select/showcase.js +53 -0
  61. package/dist/src/showcase/premium/table/mock.cjs +1 -1
  62. package/dist/src/showcase/premium/table/mock.js +1 -1
  63. package/dist/src/showcase/premium/types.cjs +1 -1
  64. package/dist/src/showcase/premium/types.js +1 -1
  65. package/dist/src/showcase/premium/wizard/index.cjs +1 -0
  66. package/dist/src/showcase/premium/wizard/index.js +3 -0
  67. package/dist/src/showcase/premium/wizard/mock.cjs +25 -0
  68. package/dist/src/showcase/premium/wizard/mock.js +32 -0
  69. package/dist/src/showcase/premium/wizard/showcase.cjs +1 -0
  70. package/dist/src/showcase/premium/wizard/showcase.js +130 -0
  71. package/dist/src/showcase/preview-registry.cjs +1 -1
  72. package/dist/src/showcase/preview-registry.js +6 -6
  73. package/dist/src/showcase/registry-quality.cjs +1 -1
  74. package/dist/src/showcase/registry-quality.js +5 -0
  75. package/dist/src/showcase/registry-specific.cjs +1 -1
  76. package/dist/src/showcase/registry-specific.js +2 -2
  77. package/dist/src/showcase/render-registry-preview.cjs +1 -1
  78. package/dist/src/showcase/render-registry-preview.js +2 -2
  79. package/dist/src/showcase/site-data.cjs +1 -1
  80. package/dist/src/showcase/site-data.js +198 -44
  81. package/dist/src/showcase/tembro-registry.json.cjs +1 -1
  82. package/dist/src/showcase/tembro-registry.json.js +1 -1
  83. package/dist/src/showcase/types.cjs +1 -1
  84. package/dist/src/showcase/types.js +1 -1
  85. package/package.json +7 -3
  86. package/packages/cli/dist/index.cjs +127 -127
  87. package/packages/cli/vendor/src/components/layout/app-sidebar.tsx +50 -20
  88. package/packages/cli/vendor/src/components/theme-provider.tsx +1 -1
  89. package/packages/cli/vendor/src/components/ui/dialog/index.tsx +15 -3
  90. package/packages/cli/vendor/src/components/ui/select/index.tsx +17 -9
  91. package/packages/cli/vendor/src/showcase/component-api-schema.ts +269 -39
  92. package/packages/cli/vendor/src/showcase/demo-snippets/forms/index.ts +1 -1
  93. package/packages/cli/vendor/src/showcase/fallback.tsx +202 -39
  94. package/packages/cli/vendor/src/showcase/index.ts +6 -6
  95. package/packages/cli/vendor/src/showcase/package-meta.ts +3 -3
  96. package/packages/cli/vendor/src/showcase/premium/app-sidebar/mock.ts +3 -2
  97. package/packages/cli/vendor/src/showcase/premium/app-sidebar/showcase.tsx +1 -1
  98. package/packages/cli/vendor/src/showcase/premium/async-select/showcase.tsx +50 -4
  99. package/packages/cli/vendor/src/showcase/premium/avatar/showcase.tsx +5 -5
  100. package/packages/cli/vendor/src/showcase/premium/dialog/mock.ts +6 -1
  101. package/packages/cli/vendor/src/showcase/premium/dialog/showcase.tsx +53 -1
  102. package/packages/cli/vendor/src/showcase/premium/form-wrapper/mock.ts +2 -2
  103. package/packages/cli/vendor/src/showcase/premium/form-wrapper/showcase.tsx +1 -1
  104. package/packages/cli/vendor/src/showcase/premium/index.ts +5 -3
  105. package/packages/cli/vendor/src/showcase/premium/input/showcase.tsx +1 -1
  106. package/packages/cli/vendor/src/showcase/premium/json-input/showcase.tsx +1 -1
  107. package/packages/cli/vendor/src/showcase/premium/select/showcase.tsx +38 -0
  108. package/packages/cli/vendor/src/showcase/premium/table/mock.ts +1 -1
  109. package/packages/cli/vendor/src/showcase/premium/types.ts +1 -1
  110. package/packages/cli/vendor/src/showcase/premium/wizard/index.ts +2 -0
  111. package/packages/cli/vendor/src/showcase/premium/wizard/mock.ts +41 -0
  112. package/packages/cli/vendor/src/showcase/premium/wizard/showcase.tsx +88 -0
  113. package/packages/cli/vendor/src/showcase/preview-registry.tsx +6 -6
  114. package/packages/cli/vendor/src/showcase/registry-quality.ts +5 -0
  115. package/packages/cli/vendor/src/showcase/registry-specific.tsx +2 -2
  116. package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +2 -2
  117. package/packages/cli/vendor/src/showcase/site-data.tsx +89 -32
  118. package/packages/cli/vendor/src/showcase/tembro-registry.json +1 -1
  119. package/packages/cli/vendor/src/showcase/types.ts +1 -1
  120. package/packages/cli/vendor/templates/showcase/src/App.tsx +107 -0
  121. package/packages/cli/vendor/templates/showcase/src/showcase/data/registry.ts +273 -0
  122. package/packages/cli/vendor/templates/showcase/src/showcase/layout/HeroSection.tsx +41 -0
  123. package/packages/cli/vendor/templates/showcase/src/showcase/layout/WorkbenchSidebar.tsx +82 -0
  124. package/packages/cli/vendor/templates/showcase/src/showcase/sections/CalendarSection.tsx +35 -0
  125. package/packages/cli/vendor/templates/showcase/src/showcase/sections/CategorySection.tsx +48 -0
  126. package/packages/cli/vendor/templates/showcase/src/showcase/sections/ComponentDetailSection.tsx +68 -0
  127. package/packages/cli/vendor/templates/showcase/src/showcase/sections/CoreUiSection.tsx +100 -0
  128. package/packages/cli/vendor/templates/showcase/src/showcase/sections/DataTableSection.tsx +45 -0
  129. package/packages/cli/vendor/templates/showcase/src/showcase/sections/FormsSection.tsx +26 -0
  130. package/packages/cli/vendor/templates/showcase/src/showcase/sections/InventorySection.tsx +38 -0
  131. package/packages/cli/vendor/templates/showcase/src/showcase/sections/KanbanSection.tsx +42 -0
  132. package/packages/cli/vendor/templates/showcase/src/showcase/sections/OverlaySection.tsx +62 -0
  133. package/packages/cli/vendor/templates/showcase/src/showcase/sections/PatternsSection.tsx +36 -0
  134. package/packages/cli/vendor/templates/showcase/src/showcase/sections/VerificationSection.tsx +42 -0
  135. package/packages/cli/vendor/templates/showcase/src/showcase/sections/WizardSection.tsx +44 -0
  136. package/packages/cli/vendor/templates/showcase/src/showcase/shared/SectionTitle.tsx +13 -0
  137. package/registry.json +1 -1
@@ -0,0 +1,45 @@
1
+ import type { ColumnDef } from "@tanstack/react-table"
2
+
3
+ import { DataTable } from "@/components/data-table/data-table"
4
+ import { Badge } from "@/components/ui/badge"
5
+ import { componentRows, type ComponentRow } from "@/showcase/data/registry"
6
+
7
+ const columns: ColumnDef<ComponentRow>[] = [
8
+ { accessorKey: "component", header: "Component" },
9
+ { accessorKey: "category", header: "Category" },
10
+ {
11
+ accessorKey: "status",
12
+ header: "Status",
13
+ cell: ({ row }) => {
14
+ const status = row.original.status
15
+ return (
16
+ <Badge
17
+ status={status === "Ready" ? "success" : status === "Testing" ? "info" : "warning"}
18
+ label={status}
19
+ variant="soft"
20
+ />
21
+ )
22
+ },
23
+ },
24
+ { accessorKey: "props", header: "Props shown" },
25
+ ]
26
+
27
+ export function DataTableSection() {
28
+ return (
29
+ <DataTable
30
+ columns={columns}
31
+ data={componentRows}
32
+ title="Component audit"
33
+ description="DataTable with search, column visibility, row actions, refresh, export and pagination features."
34
+ features={{ search: true, columnVisibility: true, rowActions: true, refresh: true, export: true }}
35
+ search={{ placeholder: "Search table", clearable: true }}
36
+ pagination={{ pageIndex: 0, pageSize: 5, rowCount: componentRows.length, showPageSize: true }}
37
+ rowActions={() => [
38
+ { key: "inspect", label: "Inspect", onSelect: () => undefined },
39
+ { key: "mark-ready", label: "Mark ready", onSelect: () => undefined },
40
+ ]}
41
+ onRefresh={() => undefined}
42
+ onExport={() => undefined}
43
+ />
44
+ )
45
+ }
@@ -0,0 +1,26 @@
1
+ import { ProgressCard } from "@/components/display/progress"
2
+ import { LoadingState } from "@/components/feedback/loading-state"
3
+ import { Rating } from "@/components/inputs/rating"
4
+ import { RangeSlider, Slider } from "@/components/inputs/slider"
5
+ import { Badge } from "@/components/ui/badge"
6
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
7
+
8
+ export function FormsSection() {
9
+ return (
10
+ <div className="grid gap-4 lg:grid-cols-3">
11
+ <Card>
12
+ <CardHeader>
13
+ <CardTitle>Advanced inputs</CardTitle>
14
+ <CardDescription>Rating and sliders.</CardDescription>
15
+ </CardHeader>
16
+ <CardContent className="grid gap-5">
17
+ <Rating defaultValue={4} />
18
+ <Slider defaultValue={72} label="Quality" showValue formatValue={(value) => `${value}%`} />
19
+ <RangeSlider defaultValue={[20, 80]} label="Range" showValue />
20
+ </CardContent>
21
+ </Card>
22
+ <ProgressCard title="Form completeness" description="input, select, switch, textarea" value={86} tone="success" footer={<Badge label="forms" status="success" />} />
23
+ <LoadingState label="Loading state" description="Spinner/skeleton/progress state component." />
24
+ </div>
25
+ )
26
+ }
@@ -0,0 +1,38 @@
1
+ import { Badge } from "@/components/ui/badge"
2
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
3
+ import { Tag } from "@/components/display/tag"
4
+ import { registryGroups } from "@/showcase/data/registry"
5
+ import { SectionTitle } from "@/showcase/shared/SectionTitle"
6
+
7
+ export function InventorySection() {
8
+ return (
9
+ <section>
10
+ <SectionTitle
11
+ title="Complete Registry Component Inventory"
12
+ description="Bu yerda `tembro add <name>` bilan chaqiriladigan aniq component nomlari ko‘rinadi."
13
+ />
14
+ <div className="grid gap-3 md:grid-cols-2 xl:grid-cols-3">
15
+ {registryGroups.map((group) => (
16
+ <Card key={group.name} variant="outline" className="min-w-0">
17
+ <CardHeader>
18
+ <div className="flex items-center justify-between gap-3">
19
+ <CardTitle>{group.name}</CardTitle>
20
+ <Badge label={group.components.length} variant="secondary" />
21
+ </div>
22
+ <CardDescription>src/components/{group.name}</CardDescription>
23
+ </CardHeader>
24
+ <CardContent>
25
+ <div className="flex flex-wrap gap-2">
26
+ {group.components.map((component) => (
27
+ <Tag key={component.name} size="sm" tone="neutral">
28
+ {component.name}
29
+ </Tag>
30
+ ))}
31
+ </div>
32
+ </CardContent>
33
+ </Card>
34
+ ))}
35
+ </div>
36
+ </section>
37
+ )
38
+ }
@@ -0,0 +1,42 @@
1
+ import { useMemo } from "react"
2
+
3
+ import { KanbanBoard, type KanbanColumn } from "@/components/display/kanban"
4
+ import { Badge } from "@/components/ui/badge"
5
+
6
+ export function KanbanSection() {
7
+ const kanbanColumns = useMemo<KanbanColumn[]>(
8
+ () => [
9
+ {
10
+ key: "todo",
11
+ title: "Todo",
12
+ count: 2,
13
+ cards: [
14
+ { key: "sidebar", title: "Sidebar", description: "Navigation, badges, collapsed state", meta: <Badge label="layout" /> },
15
+ { key: "upload", title: "Upload", description: "file-upload and image-upload components", meta: <Badge label="upload" /> },
16
+ ],
17
+ },
18
+ {
19
+ key: "doing",
20
+ title: "Doing",
21
+ count: 2,
22
+ cards: [
23
+ { key: "kanban", title: "Kanban board", description: "Drag cards between columns", meta: <Badge status="info" label="dnd" /> },
24
+ { key: "wizard", title: "Wizard flow", description: "Stepper and wizard controls", meta: <Badge status="warning" label="flow" /> },
25
+ ],
26
+ },
27
+ {
28
+ key: "done",
29
+ title: "Done",
30
+ count: 3,
31
+ cards: [
32
+ { key: "ui", title: "UI controls", description: "Button, input, select, tabs, card", meta: <Badge status="success" label="ready" /> },
33
+ { key: "calendar", title: "Calendar", description: "Calendar and DatePicker", meta: <Badge status="success" label="ready" /> },
34
+ { key: "table", title: "DataTable", description: "Search, actions, pagination", meta: <Badge status="success" label="ready" /> },
35
+ ],
36
+ },
37
+ ],
38
+ []
39
+ )
40
+
41
+ return <KanbanBoard defaultColumns={kanbanColumns} />
42
+ }
@@ -0,0 +1,62 @@
1
+ import { useState } from "react"
2
+
3
+ import { StatusLegend } from "@/components/display/status-legend"
4
+ import { Alert } from "@/components/feedback/alert"
5
+ import { ConfirmDialog } from "@/components/overlay/confirm-dialog"
6
+ import { Drawer, DrawerCloseButton } from "@/components/overlay/drawer"
7
+ import { Button } from "@/components/ui/button"
8
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
9
+
10
+ export function OverlaySection() {
11
+ const [drawerOpen, setDrawerOpen] = useState(false)
12
+ const [confirmOpen, setConfirmOpen] = useState(false)
13
+
14
+ return (
15
+ <div className="grid gap-4 lg:grid-cols-3">
16
+ <Card>
17
+ <CardHeader>
18
+ <CardTitle>Drawer</CardTitle>
19
+ <CardDescription>Right-side overlay component.</CardDescription>
20
+ </CardHeader>
21
+ <CardContent>
22
+ <Drawer
23
+ open={drawerOpen}
24
+ onOpenChange={setDrawerOpen}
25
+ trigger={<Button onClick={() => setDrawerOpen(true)}>Open drawer</Button>}
26
+ title="Drawer preview"
27
+ description="Overlay/drawer module rendered from local Tembro code."
28
+ footer={<DrawerCloseButton>Close drawer</DrawerCloseButton>}
29
+ >
30
+ <StatusLegend
31
+ title="Drawer content"
32
+ items={[
33
+ { key: "one", label: "Overlay API", count: 3, tone: "info" },
34
+ { key: "two", label: "Dialog base", count: 1, tone: "success" },
35
+ ]}
36
+ />
37
+ </Drawer>
38
+ </CardContent>
39
+ </Card>
40
+ <Card>
41
+ <CardHeader>
42
+ <CardTitle>ConfirmDialog</CardTitle>
43
+ <CardDescription>Controlled confirm modal.</CardDescription>
44
+ </CardHeader>
45
+ <CardContent>
46
+ <ConfirmDialog
47
+ open={confirmOpen}
48
+ onOpenChange={setConfirmOpen}
49
+ trigger={<Button variant="outline" onClick={() => setConfirmOpen(true)}>Open confirm</Button>}
50
+ title="Confirm action"
51
+ description="This is a Tembro ConfirmDialog."
52
+ confirmText="Confirm"
53
+ cancelText="Cancel"
54
+ >
55
+ <p className="text-sm text-muted-foreground">Dialog content area is rendered and styled by the component.</p>
56
+ </ConfirmDialog>
57
+ </CardContent>
58
+ </Card>
59
+ <Alert tone="warning" title="Overlay components" description="alert-dialog, confirm-dialog and drawer are installed. Dialog primitives are under ui/dialog." />
60
+ </div>
61
+ )
62
+ }
@@ -0,0 +1,36 @@
1
+ import { StatusLegend } from "@/components/display/status-legend"
2
+ import { Timeline } from "@/components/display/timeline"
3
+ import { EmptyState } from "@/components/patterns/empty-state"
4
+
5
+ export function PatternsSection() {
6
+ return (
7
+ <div className="grid gap-4 lg:grid-cols-3">
8
+ <EmptyState
9
+ title="EmptyState pattern"
10
+ description="Pattern components are installed: resource pages, settings pages, page toolbar, data view and form builder."
11
+ primaryAction={{ label: "Primary action" }}
12
+ secondaryAction={{ label: "Secondary action", variant: "outline" }}
13
+ />
14
+ <StatusLegend
15
+ title="StatusLegend"
16
+ description="Display module with counts."
17
+ orientation="grid"
18
+ items={[
19
+ { key: "ready", label: "Ready", description: "Can be tested", count: 62, tone: "success" },
20
+ { key: "large", label: "Large components", description: "sidebar, kanban, data-table", count: 8, tone: "info" },
21
+ { key: "forms", label: "Form components", description: "inputs and shells", count: 18, tone: "warning" },
22
+ { key: "overlay", label: "Overlay components", description: "dialog, drawer", count: 3, tone: "default" },
23
+ ]}
24
+ />
25
+ <Timeline
26
+ items={[
27
+ { key: "init", title: "tembro init", description: "Project initialized", time: "done", tone: "success" },
28
+ { key: "add", title: "tembro add", description: "All registry entries copied", time: "done", tone: "success" },
29
+ { key: "show", title: "Workbench", description: "Visible app surface", time: "now", tone: "info" },
30
+ ]}
31
+ pending
32
+ pendingLabel="Manual component QA"
33
+ />
34
+ </div>
35
+ )
36
+ }
@@ -0,0 +1,42 @@
1
+ import { CheckCircle2Icon, Layers3Icon, ShieldCheckIcon } from "lucide-react"
2
+
3
+ import { Card, CardContent } from "@/components/ui/card"
4
+ import { moduleCount, registryGroups } from "@/showcase/data/registry"
5
+ import { SectionTitle } from "@/showcase/shared/SectionTitle"
6
+
7
+ export function VerificationSection() {
8
+ return (
9
+ <section>
10
+ <SectionTitle title="Verification" description="Package va project setup holati." />
11
+ <div className="grid gap-4 md:grid-cols-3">
12
+ <Card>
13
+ <CardContent className="flex items-start gap-3 pt-6">
14
+ <CheckCircle2Icon className="mt-1 size-5 text-emerald-600" />
15
+ <div>
16
+ <div className="font-medium">Doctor passed</div>
17
+ <p className="text-sm text-muted-foreground">Tembro theme tokens recognized.</p>
18
+ </div>
19
+ </CardContent>
20
+ </Card>
21
+ <Card>
22
+ <CardContent className="flex items-start gap-3 pt-6">
23
+ <Layers3Icon className="mt-1 size-5 text-blue-600" />
24
+ <div>
25
+ <div className="font-medium">All categories listed</div>
26
+ <p className="text-sm text-muted-foreground">{registryGroups.length} groups and {moduleCount} registry components.</p>
27
+ </div>
28
+ </CardContent>
29
+ </Card>
30
+ <Card>
31
+ <CardContent className="flex items-start gap-3 pt-6">
32
+ <ShieldCheckIcon className="mt-1 size-5 text-amber-600" />
33
+ <div>
34
+ <div className="font-medium">Build checked</div>
35
+ <p className="text-sm text-muted-foreground">Vite starter screen removed.</p>
36
+ </div>
37
+ </CardContent>
38
+ </Card>
39
+ </div>
40
+ </section>
41
+ )
42
+ }
@@ -0,0 +1,44 @@
1
+ import { useState } from "react"
2
+
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"
4
+ import { Stepper } from "@/components/wizard/stepper"
5
+ import { Wizard } from "@/components/wizard/wizard"
6
+ import { wizardSteps } from "@/showcase/data/registry"
7
+
8
+ export function WizardSection() {
9
+ const [step, setStep] = useState("test")
10
+
11
+ return (
12
+ <div className="grid gap-4 lg:grid-cols-[1fr_0.8fr]">
13
+ <Card>
14
+ <CardHeader>
15
+ <CardTitle>Stepper</CardTitle>
16
+ <CardDescription>Horizontal and clickable stepper.</CardDescription>
17
+ </CardHeader>
18
+ <CardContent>
19
+ <Stepper steps={wizardSteps} currentStep={step} onStepChange={setStep} />
20
+ </CardContent>
21
+ </Card>
22
+ <Card>
23
+ <CardHeader>
24
+ <CardTitle>Wizard</CardTitle>
25
+ <CardDescription>Wizard footer, previous/next and content slot.</CardDescription>
26
+ </CardHeader>
27
+ <CardContent>
28
+ <Wizard
29
+ steps={wizardSteps}
30
+ currentStep={step}
31
+ onStepChange={setStep}
32
+ onPrevious={() => setStep("add")}
33
+ onNext={() => setStep("test")}
34
+ onFinish={() => setStep("test")}
35
+ >
36
+ <div className="rounded-lg border bg-muted/25 p-4 text-sm">
37
+ Current step: <span className="font-semibold">{step}</span>
38
+ </div>
39
+ </Wizard>
40
+ </CardContent>
41
+ </Card>
42
+ </div>
43
+ )
44
+ }
@@ -0,0 +1,13 @@
1
+ type SectionTitleProps = {
2
+ title: string
3
+ description: string
4
+ }
5
+
6
+ export function SectionTitle({ title, description }: SectionTitleProps) {
7
+ return (
8
+ <div className="mb-4">
9
+ <h2 className="text-xl font-semibold tracking-tight">{title}</h2>
10
+ <p className="mt-1 max-w-3xl text-sm leading-6 text-muted-foreground">{description}</p>
11
+ </div>
12
+ )
13
+ }
package/registry.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://tembro.dev/registry.schema.json",
3
3
  "name": "tembro",
4
- "version": "3.1.6",
4
+ "version": "3.1.8",
5
5
  "description": "Reusable React + TypeScript UI kit registry",
6
6
  "groups": {
7
7
  "ui": [