@hanzo/ui 5.0.2 → 5.1.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/dist/accordion.js +1 -0
- package/dist/accordion.mjs +1 -0
- package/dist/alert-dialog.js +1 -0
- package/dist/alert-dialog.mjs +1 -0
- package/dist/alert.js +1 -0
- package/dist/alert.mjs +1 -0
- package/dist/avatar.js +1 -0
- package/dist/avatar.mjs +1 -0
- package/dist/badge.js +1 -0
- package/dist/badge.mjs +1 -0
- package/dist/breadcrumb.js +1 -0
- package/dist/breadcrumb.mjs +1 -0
- package/dist/calendar.js +1 -0
- package/dist/calendar.mjs +1 -0
- package/dist/carousel.js +1 -0
- package/dist/carousel.mjs +1 -0
- package/dist/checkbox.js +1 -0
- package/dist/checkbox.mjs +1 -0
- package/dist/chunk-3H5S2OQ3.mjs +1 -0
- package/dist/chunk-5GRJ7UQX.js +1 -0
- package/dist/chunk-63HNMH7C.js +1 -0
- package/dist/chunk-72TOQ4DM.mjs +1 -0
- package/dist/chunk-7AEFTV5R.mjs +1 -0
- package/dist/chunk-7M4AVV2R.js +1 -0
- package/dist/chunk-DKPVJSBC.js +1 -0
- package/dist/chunk-EI7MMDWY.js +1 -0
- package/dist/chunk-GANGDIZG.mjs +1 -0
- package/dist/chunk-GRGT2Z4K.js +1 -0
- package/dist/chunk-JCUUC6NY.mjs +1 -0
- package/dist/chunk-JUQMWLIN.js +1 -0
- package/dist/chunk-PRVEIITE.js +1 -0
- package/dist/chunk-SH52AKNZ.js +1 -0
- package/dist/chunk-TU67EJEW.mjs +1 -0
- package/dist/chunk-WN5KN73U.mjs +1 -0
- package/dist/chunk-YSXGDEY5.mjs +1 -0
- package/dist/chunk-Z76OOVUE.mjs +1 -0
- package/dist/collapsible.js +1 -0
- package/dist/collapsible.mjs +1 -0
- package/dist/command.js +1 -0
- package/dist/command.mjs +1 -0
- package/dist/context-menu.js +1 -0
- package/dist/context-menu.mjs +1 -0
- package/dist/dialog.js +1 -0
- package/dist/dialog.mjs +1 -0
- package/dist/drawer.js +1 -0
- package/dist/drawer.mjs +1 -0
- package/dist/dropdown-menu.js +1 -0
- package/dist/dropdown-menu.mjs +1 -0
- package/dist/form.js +1 -0
- package/dist/form.mjs +1 -0
- package/dist/hover-card.js +1 -0
- package/dist/hover-card.mjs +1 -0
- package/dist/index.js +1 -9079
- package/dist/index.mjs +1 -8700
- package/dist/input-otp.js +1 -0
- package/dist/input-otp.mjs +1 -0
- package/dist/lib/utils.js +1 -0
- package/dist/lib/utils.mjs +1 -0
- package/dist/navigation-menu.js +1 -0
- package/dist/navigation-menu.mjs +1 -0
- package/dist/popover.js +1 -0
- package/dist/popover.mjs +1 -0
- package/dist/progress.js +1 -0
- package/dist/progress.mjs +1 -0
- package/dist/radio-group.js +1 -0
- package/dist/radio-group.mjs +1 -0
- package/dist/resizable.js +1 -0
- package/dist/resizable.mjs +1 -0
- package/dist/scroll-area.js +1 -0
- package/dist/scroll-area.mjs +1 -0
- package/dist/select.js +1 -0
- package/dist/select.mjs +1 -0
- package/dist/separator.js +1 -0
- package/dist/separator.mjs +1 -0
- package/dist/sheet.js +1 -0
- package/dist/sheet.mjs +1 -0
- package/dist/skeleton.js +1 -0
- package/dist/skeleton.mjs +1 -0
- package/dist/slider.js +1 -0
- package/dist/slider.mjs +1 -0
- package/dist/sonner.js +1 -0
- package/dist/sonner.mjs +1 -0
- package/dist/src/utils.js +1 -0
- package/dist/src/utils.mjs +1 -0
- package/dist/switch.js +1 -0
- package/dist/switch.mjs +1 -0
- package/dist/table.js +1 -0
- package/dist/table.mjs +1 -0
- package/dist/tabs.js +1 -0
- package/dist/tabs.mjs +1 -0
- package/dist/tailwind/index.js +1 -0
- package/dist/tailwind/index.mjs +1 -0
- package/dist/textarea.js +1 -0
- package/dist/textarea.mjs +1 -0
- package/dist/toggle-group.js +1 -0
- package/dist/toggle-group.mjs +1 -0
- package/dist/toggle.js +1 -0
- package/dist/toggle.mjs +1 -0
- package/dist/tooltip.js +1 -0
- package/dist/tooltip.mjs +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.mjs +1 -0
- package/package.json +110 -81
- package/assets/ai-icons.tsx +0 -207
- package/assets/crypto.tsx +0 -33
- package/assets/file-type-icon.tsx +0 -66
- package/assets/file.tsx +0 -45
- package/assets/general.tsx +0 -2318
- package/assets/hanzo-logo.svg +0 -9
- package/assets/hanzo-logo.tsx +0 -17
- package/assets/index.ts +0 -122
- package/assets/index.tsx +0 -4
- package/assets/llm-provider.tsx +0 -1094
- package/blocks/auth/index.ts +0 -6
- package/blocks/auth/login-2fa.tsx +0 -165
- package/blocks/auth/login-basic.tsx +0 -94
- package/blocks/auth/login-social.tsx +0 -148
- package/blocks/auth/magic-link.tsx +0 -129
- package/blocks/auth/password-reset.tsx +0 -97
- package/blocks/auth/signup.tsx +0 -157
- package/blocks/components/accordian-block.tsx +0 -48
- package/blocks/components/block-component-props.ts +0 -11
- package/blocks/components/bullet-cards-block.tsx +0 -46
- package/blocks/components/card-block/index.tsx +0 -171
- package/blocks/components/card-block/link-out-button.tsx +0 -20
- package/blocks/components/card-block/util.ts +0 -28
- package/blocks/components/carte-blanche-block/index.tsx +0 -127
- package/blocks/components/carte-blanche-block/variant-content-left.tsx +0 -49
- package/blocks/components/content.tsx +0 -70
- package/blocks/components/cta-block.tsx +0 -115
- package/blocks/components/enh-heading-block.tsx +0 -204
- package/blocks/components/grid-block/grid-block-mutator.ts +0 -12
- package/blocks/components/grid-block/index.tsx +0 -83
- package/blocks/components/grid-block/mutator-registry.ts +0 -10
- package/blocks/components/grid-block/table-borders.mutator.ts +0 -47
- package/blocks/components/group-block.tsx +0 -83
- package/blocks/components/heading-block.tsx +0 -88
- package/blocks/components/image-block.tsx +0 -111
- package/blocks/components/index.ts +0 -30
- package/blocks/components/screenful-block/content.tsx +0 -123
- package/blocks/components/screenful-block/index.tsx +0 -107
- package/blocks/components/screenful-block/poster-background.tsx +0 -34
- package/blocks/components/screenful-block/video-background.tsx +0 -45
- package/blocks/components/space-block.tsx +0 -66
- package/blocks/components/video-block.tsx +0 -138
- package/blocks/data-display/activity-feed.tsx +0 -242
- package/blocks/data-display/data-table.tsx +0 -235
- package/blocks/data-display/stats-grid.tsx +0 -194
- package/blocks/def/accordian-block.ts +0 -14
- package/blocks/def/block.ts +0 -7
- package/blocks/def/bullet-cards-block.ts +0 -22
- package/blocks/def/card-block.ts +0 -22
- package/blocks/def/carte-blanche-block.ts +0 -21
- package/blocks/def/cta-block.ts +0 -19
- package/blocks/def/element-block.ts +0 -11
- package/blocks/def/enh-heading-block.ts +0 -44
- package/blocks/def/grid-block.ts +0 -16
- package/blocks/def/group-block.ts +0 -11
- package/blocks/def/heading-block.ts +0 -15
- package/blocks/def/image-block.ts +0 -31
- package/blocks/def/index.ts +0 -35
- package/blocks/def/screenful-block.ts +0 -54
- package/blocks/def/space-block.ts +0 -64
- package/blocks/def/video-block.ts +0 -9
- package/blocks/ecommerce/checkout.tsx +0 -242
- package/blocks/ecommerce/index.ts +0 -7
- package/blocks/ecommerce/product-detail.tsx +0 -257
- package/blocks/ecommerce/product-grid.tsx +0 -148
- package/blocks/ecommerce/shopping-cart.tsx +0 -181
- package/blocks/index.ts +0 -2
- package/blocks/marketing/cta-section.tsx +0 -207
- package/blocks/marketing/faq.tsx +0 -159
- package/blocks/marketing/features-grid.tsx +0 -156
- package/blocks/marketing/hero-section.tsx +0 -192
- package/blocks/marketing/index.ts +0 -6
- package/blocks/marketing/pricing-table.tsx +0 -121
- package/blocks/marketing/testimonials.tsx +0 -196
- package/components/index.ts +0 -9
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/tailwind.js +0 -2025
- package/dist/tailwind.js.map +0 -1
- package/dist/tailwind.mjs +0 -2013
- package/dist/tailwind.mjs.map +0 -1
- package/dist/types.js +0 -59
- package/dist/types.js.map +0 -1
- package/dist/types.mjs +0 -53
- package/dist/types.mjs.map +0 -1
- package/dist/utils.js +0 -30
- package/dist/utils.js.map +0 -1
- package/dist/utils.mjs +0 -26
- package/dist/utils.mjs.map +0 -1
- package/frameworks/core/index.ts +0 -6
- package/frameworks/core/utils/index.ts +0 -64
- package/frameworks/react/components/button.tsx +0 -26
- package/frameworks/react/components/index.ts +0 -5
- package/frameworks/react/hooks/index.ts +0 -5
- package/frameworks/react/index.ts +0 -9
- package/frameworks/react/package.json +0 -8
- package/frameworks/react/utils/index.ts +0 -2
- package/frameworks/react-native/index.ts +0 -9
- package/frameworks/react-native/package.json +0 -8
- package/frameworks/registry.json +0 -371
- package/frameworks/setup.sh +0 -69
- package/frameworks/svelte/index.ts +0 -9
- package/frameworks/svelte/package.json +0 -8
- package/frameworks/tracker.json +0 -1854
- package/frameworks/vue/index.ts +0 -9
- package/frameworks/vue/package.json +0 -8
- package/helpers/file.ts +0 -33
- package/helpers/memoization.ts +0 -40
- package/primitives/accordion.tsx +0 -74
- package/primitives/action-button.tsx +0 -42
- package/primitives/alert-dialog.tsx +0 -185
- package/primitives/alert.tsx +0 -74
- package/primitives/apply-typography.tsx +0 -55
- package/primitives/aspect-ratio.tsx +0 -5
- package/primitives/avatar.tsx +0 -57
- package/primitives/background-beams.tsx +0 -142
- package/primitives/badge.tsx +0 -45
- package/primitives/breadcrumb.tsx +0 -130
- package/primitives/breakpoint-indicator.tsx +0 -19
- package/primitives/button.tsx +0 -72
- package/primitives/calendar.tsx +0 -72
- package/primitives/card.tsx +0 -97
- package/primitives/carousel.tsx +0 -238
- package/primitives/chat/chat-input-area.tsx +0 -88
- package/primitives/chat/chat-input.tsx +0 -71
- package/primitives/chat/files-preview.tsx +0 -331
- package/primitives/chat/index.ts +0 -6
- package/primitives/chat/json-form.tsx +0 -8
- package/primitives/chat/message-list.tsx +0 -308
- package/primitives/chat/message.tsx +0 -569
- package/primitives/chat/sqlite-preview.tsx +0 -215
- package/primitives/checkbox.tsx +0 -32
- package/primitives/collapsible.tsx +0 -9
- package/primitives/combobox.tsx +0 -239
- package/primitives/command.tsx +0 -151
- package/primitives/context-menu.tsx +0 -206
- package/primitives/copy-to-clipboard-icon.tsx +0 -60
- package/primitives/dialog-video-controller.tsx +0 -38
- package/primitives/dialog.tsx +0 -128
- package/primitives/dot-pattern.tsx +0 -57
- package/primitives/dots-loader.tsx +0 -13
- package/primitives/drawer.tsx +0 -113
- package/primitives/dropdown-menu.tsx +0 -199
- package/primitives/error-message.tsx +0 -19
- package/primitives/file-uploader.tsx +0 -203
- package/primitives/form.tsx +0 -185
- package/primitives/hover-card.tsx +0 -28
- package/primitives/icons/github.tsx +0 -14
- package/primitives/icons/index.ts +0 -18
- package/primitives/icons/youtube-logo.tsx +0 -59
- package/primitives/index-client.ts +0 -4
- package/primitives/index-common.ts +0 -304
- package/primitives/index-next.ts +0 -4
- package/primitives/input-otp.tsx +0 -65
- package/primitives/input.tsx +0 -128
- package/primitives/label.tsx +0 -21
- package/primitives/list-adaptor.ts +0 -12
- package/primitives/list-box.tsx +0 -74
- package/primitives/loading-spinner.tsx +0 -33
- package/primitives/markdown-preview.tsx +0 -612
- package/primitives/mermaid.tsx +0 -196
- package/primitives/navigation-menu.tsx +0 -147
- package/primitives/next/image.tsx +0 -91
- package/primitives/next/index.ts +0 -7
- package/primitives/next/inline-icon.tsx +0 -36
- package/primitives/next/link-element.tsx +0 -109
- package/primitives/next/mdx-link.tsx +0 -22
- package/primitives/next/media-stack.tsx +0 -52
- package/primitives/next/nav-items.tsx +0 -45
- package/primitives/next/youtube-embed.tsx +0 -83
- package/primitives/pagination.tsx +0 -117
- package/primitives/popover.tsx +0 -34
- package/primitives/pretty-json-print.tsx +0 -28
- package/primitives/progress.tsx +0 -27
- package/primitives/prompt-textarea.tsx +0 -72
- package/primitives/qr-code.tsx +0 -112
- package/primitives/radio-group.tsx +0 -42
- package/primitives/resizable.tsx +0 -47
- package/primitives/scroll-area.tsx +0 -57
- package/primitives/search-input.tsx +0 -66
- package/primitives/select.tsx +0 -122
- package/primitives/separator.tsx +0 -26
- package/primitives/sheet.tsx +0 -139
- package/primitives/skeleton.tsx +0 -18
- package/primitives/slider.tsx +0 -63
- package/primitives/sonner.tsx +0 -35
- package/primitives/step-indicator.tsx +0 -69
- package/primitives/stepper.tsx +0 -272
- package/primitives/switch.tsx +0 -27
- package/primitives/table.tsx +0 -105
- package/primitives/tabs.tsx +0 -50
- package/primitives/text-area.tsx +0 -26
- package/primitives/text-link.tsx +0 -27
- package/primitives/textarea.tsx +0 -64
- package/primitives/textfield.tsx +0 -78
- package/primitives/toast.tsx +0 -30
- package/primitives/toggle-group.tsx +0 -63
- package/primitives/toggle.tsx +0 -44
- package/primitives/tooltip.tsx +0 -47
- package/primitives/video-player.tsx +0 -23
- package/src/button.ts +0 -1
- package/src/hooks/index.ts +0 -7
- package/src/hooks/use-click-away.ts +0 -31
- package/src/hooks/use-combined-refs.ts +0 -22
- package/src/hooks/use-copy-clipboard.ts +0 -30
- package/src/hooks/use-debounce.ts +0 -17
- package/src/hooks/use-fill-ids.ts +0 -25
- package/src/hooks/use-map.ts +0 -26
- package/src/hooks/use-measure.ts +0 -42
- package/src/hooks/use-reverse-video-playback.ts +0 -43
- package/src/hooks/use-scroll-restoration.ts +0 -50
- package/src/index-lean.ts +0 -87
- package/src/index.ts +0 -54
- package/src/mcp/README.md +0 -141
- package/src/mcp/enhanced-server.ts +0 -1208
- package/src/mcp/index.ts +0 -518
- package/src/mcp/package.json +0 -10
- package/src/registry/api.ts +0 -164
- package/src/registry/index.ts +0 -60
- package/src/registry/package.json +0 -10
- package/src/utils.ts +0 -19
- package/tailwind/colors.tailwind.js +0 -53
- package/tailwind/fontFamily.tailwind.ts +0 -7
- package/tailwind/fontSize.tailwind.ts +0 -13
- package/tailwind/index.ts +0 -7
- package/tailwind/safelist.tailwind.js +0 -26
- package/tailwind/screens.tailwind.js +0 -8
- package/tailwind/spacing.tailwind.js +0 -65
- package/tailwind/tailwind.config.hanzo-preset.d.ts +0 -5
- package/tailwind/tailwind.config.hanzo-preset.js +0 -915
- package/tailwind/tw-font-desc.ts +0 -15
- package/tailwind/typo-plugin/get-plugin-styles.js +0 -679
- package/tailwind/typo-plugin/index.d.ts +0 -9
- package/tailwind/typo-plugin/index.js +0 -141
- package/tailwind/typo-plugin/utils.js +0 -60
- package/tailwind/typography-test.mdx +0 -35
- package/tailwind/z-index.tailwind.js +0 -71
- package/types/animation-def.ts +0 -3
- package/types/breakpoints.ts +0 -11
- package/types/bullet-item.ts +0 -10
- package/types/button-def.ts +0 -39
- package/types/dimensions.ts +0 -8
- package/types/grid-def.ts +0 -56
- package/types/image-def.ts +0 -32
- package/types/index.ts +0 -30
- package/types/link-def.ts +0 -56
- package/types/media-stack-def.ts +0 -31
- package/types/t-shirt-size.ts +0 -5
- package/types/tshirt-dimensions.ts +0 -20
- package/types/video-def.ts +0 -25
- package/util/blob.ts +0 -33
- package/util/copy-to-clipboard.ts +0 -17
- package/util/create-shadow-root.ts +0 -22
- package/util/date.ts +0 -84
- package/util/debounce.ts +0 -11
- package/util/file.ts +0 -15
- package/util/format-and-abbreviate-as-currency.ts +0 -125
- package/util/format-text.ts +0 -34
- package/util/format-to-max-char.ts +0 -68
- package/util/index-client.ts +0 -3
- package/util/index.ts +0 -112
- package/util/number-abbreviate.ts +0 -49
- package/util/specifier.ts +0 -43
- package/util/spread-to-transform.ts +0 -25
- package/util/step-animation.ts +0 -90
- package/util/timing.ts +0 -3
- package/util/toasts.tsx +0 -17
- package/util/two-way-map.ts +0 -19
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import { cn } from '@hanzo/ui/util'
|
|
4
|
-
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@hanzo/ui/primitives'
|
|
5
|
-
import type { LucideIcon } from 'lucide-react'
|
|
6
|
-
import { ArrowUp, ArrowDown, Minus } from 'lucide-react'
|
|
7
|
-
|
|
8
|
-
interface Stat {
|
|
9
|
-
title: string
|
|
10
|
-
value: string | number
|
|
11
|
-
description?: string
|
|
12
|
-
change?: number
|
|
13
|
-
changeLabel?: string
|
|
14
|
-
icon?: LucideIcon
|
|
15
|
-
trend?: 'up' | 'down' | 'neutral'
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
interface StatsGridProps extends React.ComponentPropsWithoutRef<'div'> {
|
|
19
|
-
stats: Stat[]
|
|
20
|
-
columns?: 2 | 3 | 4
|
|
21
|
-
variant?: 'default' | 'compact' | 'detailed'
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function StatsGrid({
|
|
25
|
-
className,
|
|
26
|
-
stats,
|
|
27
|
-
columns = 4,
|
|
28
|
-
variant = 'default',
|
|
29
|
-
...props
|
|
30
|
-
}: StatsGridProps) {
|
|
31
|
-
const gridCols = {
|
|
32
|
-
2: 'sm:grid-cols-2',
|
|
33
|
-
3: 'sm:grid-cols-2 lg:grid-cols-3',
|
|
34
|
-
4: 'sm:grid-cols-2 lg:grid-cols-4',
|
|
35
|
-
}[columns]
|
|
36
|
-
|
|
37
|
-
const getTrendIcon = (trend?: 'up' | 'down' | 'neutral') => {
|
|
38
|
-
switch (trend) {
|
|
39
|
-
case 'up':
|
|
40
|
-
return <ArrowUp className="h-4 w-4 text-green-500" />
|
|
41
|
-
case 'down':
|
|
42
|
-
return <ArrowDown className="h-4 w-4 text-red-500" />
|
|
43
|
-
case 'neutral':
|
|
44
|
-
return <Minus className="h-4 w-4 text-muted-foreground" />
|
|
45
|
-
default:
|
|
46
|
-
return null
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const getTrendColor = (change?: number) => {
|
|
51
|
-
if (!change) return 'text-muted-foreground'
|
|
52
|
-
return change > 0 ? 'text-green-500' : 'text-red-500'
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (variant === 'compact') {
|
|
56
|
-
return (
|
|
57
|
-
<div className={cn('grid gap-4', gridCols, className)} {...props}>
|
|
58
|
-
{stats.map((stat, i) => {
|
|
59
|
-
const Icon = stat.icon
|
|
60
|
-
return (
|
|
61
|
-
<Card key={i}>
|
|
62
|
-
<CardHeader className="pb-2">
|
|
63
|
-
<CardDescription className="flex items-center justify-between">
|
|
64
|
-
{stat.title}
|
|
65
|
-
{Icon && <Icon className="h-4 w-4 text-muted-foreground" />}
|
|
66
|
-
</CardDescription>
|
|
67
|
-
</CardHeader>
|
|
68
|
-
<CardContent>
|
|
69
|
-
<div className="flex items-baseline justify-between">
|
|
70
|
-
<div className="text-2xl font-bold">{stat.value}</div>
|
|
71
|
-
{(stat.change !== undefined || stat.trend) && (
|
|
72
|
-
<div className="flex items-center gap-1">
|
|
73
|
-
{getTrendIcon(stat.trend)}
|
|
74
|
-
{stat.change !== undefined && (
|
|
75
|
-
<span className={cn('text-xs', getTrendColor(stat.change))}>
|
|
76
|
-
{stat.change > 0 && '+'}
|
|
77
|
-
{stat.change}%
|
|
78
|
-
</span>
|
|
79
|
-
)}
|
|
80
|
-
</div>
|
|
81
|
-
)}
|
|
82
|
-
</div>
|
|
83
|
-
{stat.changeLabel && (
|
|
84
|
-
<p className="mt-1 text-xs text-muted-foreground">
|
|
85
|
-
{stat.changeLabel}
|
|
86
|
-
</p>
|
|
87
|
-
)}
|
|
88
|
-
</CardContent>
|
|
89
|
-
</Card>
|
|
90
|
-
)
|
|
91
|
-
})}
|
|
92
|
-
</div>
|
|
93
|
-
)
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (variant === 'detailed') {
|
|
97
|
-
return (
|
|
98
|
-
<div className={cn('grid gap-6', gridCols, className)} {...props}>
|
|
99
|
-
{stats.map((stat, i) => {
|
|
100
|
-
const Icon = stat.icon
|
|
101
|
-
return (
|
|
102
|
-
<Card key={i}>
|
|
103
|
-
<CardHeader>
|
|
104
|
-
<div className="flex items-center justify-between">
|
|
105
|
-
<CardTitle className="text-sm font-medium">
|
|
106
|
-
{stat.title}
|
|
107
|
-
</CardTitle>
|
|
108
|
-
{Icon && (
|
|
109
|
-
<div className="rounded-lg bg-primary/10 p-2">
|
|
110
|
-
<Icon className="h-5 w-5 text-primary" />
|
|
111
|
-
</div>
|
|
112
|
-
)}
|
|
113
|
-
</div>
|
|
114
|
-
</CardHeader>
|
|
115
|
-
<CardContent>
|
|
116
|
-
<div className="space-y-1">
|
|
117
|
-
<div className="text-3xl font-bold">{stat.value}</div>
|
|
118
|
-
{stat.description && (
|
|
119
|
-
<CardDescription>{stat.description}</CardDescription>
|
|
120
|
-
)}
|
|
121
|
-
{(stat.change !== undefined || stat.trend || stat.changeLabel) && (
|
|
122
|
-
<div className="flex items-center gap-2 pt-2">
|
|
123
|
-
<div className="flex items-center gap-1">
|
|
124
|
-
{getTrendIcon(stat.trend)}
|
|
125
|
-
{stat.change !== undefined && (
|
|
126
|
-
<span
|
|
127
|
-
className={cn(
|
|
128
|
-
'text-sm font-medium',
|
|
129
|
-
getTrendColor(stat.change)
|
|
130
|
-
)}
|
|
131
|
-
>
|
|
132
|
-
{stat.change > 0 && '+'}
|
|
133
|
-
{stat.change}%
|
|
134
|
-
</span>
|
|
135
|
-
)}
|
|
136
|
-
</div>
|
|
137
|
-
{stat.changeLabel && (
|
|
138
|
-
<span className="text-sm text-muted-foreground">
|
|
139
|
-
{stat.changeLabel}
|
|
140
|
-
</span>
|
|
141
|
-
)}
|
|
142
|
-
</div>
|
|
143
|
-
)}
|
|
144
|
-
</div>
|
|
145
|
-
</CardContent>
|
|
146
|
-
</Card>
|
|
147
|
-
)
|
|
148
|
-
})}
|
|
149
|
-
</div>
|
|
150
|
-
)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Default variant
|
|
154
|
-
return (
|
|
155
|
-
<div className={cn('grid gap-4', gridCols, className)} {...props}>
|
|
156
|
-
{stats.map((stat, i) => {
|
|
157
|
-
const Icon = stat.icon
|
|
158
|
-
return (
|
|
159
|
-
<Card key={i}>
|
|
160
|
-
<CardHeader className="flex flex-row items-center justify-between space-y-0 pb-2">
|
|
161
|
-
<CardTitle className="text-sm font-medium">
|
|
162
|
-
{stat.title}
|
|
163
|
-
</CardTitle>
|
|
164
|
-
{Icon && <Icon className="h-4 w-4 text-muted-foreground" />}
|
|
165
|
-
</CardHeader>
|
|
166
|
-
<CardContent>
|
|
167
|
-
<div className="text-2xl font-bold">{stat.value}</div>
|
|
168
|
-
{stat.description && (
|
|
169
|
-
<p className="text-xs text-muted-foreground">
|
|
170
|
-
{stat.description}
|
|
171
|
-
</p>
|
|
172
|
-
)}
|
|
173
|
-
{(stat.change !== undefined || stat.changeLabel) && (
|
|
174
|
-
<div className="mt-2 flex items-center text-xs">
|
|
175
|
-
{stat.change !== undefined && (
|
|
176
|
-
<span className={getTrendColor(stat.change)}>
|
|
177
|
-
{stat.change > 0 && '+'}
|
|
178
|
-
{stat.change}%
|
|
179
|
-
</span>
|
|
180
|
-
)}
|
|
181
|
-
{stat.changeLabel && (
|
|
182
|
-
<span className="ml-1 text-muted-foreground">
|
|
183
|
-
{stat.changeLabel}
|
|
184
|
-
</span>
|
|
185
|
-
)}
|
|
186
|
-
</div>
|
|
187
|
-
)}
|
|
188
|
-
</CardContent>
|
|
189
|
-
</Card>
|
|
190
|
-
)
|
|
191
|
-
})}
|
|
192
|
-
</div>
|
|
193
|
-
)
|
|
194
|
-
}
|
package/blocks/def/block.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type Block from './block'
|
|
2
|
-
|
|
3
|
-
import type { BulletItem, GridDef } from '../../types'
|
|
4
|
-
|
|
5
|
-
interface BulletCardsBlock extends Block {
|
|
6
|
-
blockType: 'bullet-cards'
|
|
7
|
-
/**
|
|
8
|
-
* no-card-border
|
|
9
|
-
* mobile-small-text
|
|
10
|
-
* borders-muted-1 / borders-muted-3
|
|
11
|
-
* default: 2
|
|
12
|
-
*/
|
|
13
|
-
specifiers?: string
|
|
14
|
-
grid: GridDef
|
|
15
|
-
cards: BulletItem[]
|
|
16
|
-
/** in px */
|
|
17
|
-
iconSize?: number
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export {
|
|
21
|
-
type BulletCardsBlock as default
|
|
22
|
-
}
|
package/blocks/def/card-block.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
|
|
3
|
-
import type CTABlock from './cta-block'
|
|
4
|
-
import type Block from './block'
|
|
5
|
-
import type ImageBlock from './image-block'
|
|
6
|
-
import type VideoBlock from './video-block'
|
|
7
|
-
|
|
8
|
-
interface CardBlock extends Block {
|
|
9
|
-
blockType: 'card'
|
|
10
|
-
specifiers?: string // 'media-left' or 'appear-disabled' or 'no-borders', etc... can be combined
|
|
11
|
-
title?: string
|
|
12
|
-
byline?: string
|
|
13
|
-
icon?: React.ReactNode // for title area
|
|
14
|
-
iconAfter?: boolean
|
|
15
|
-
media?: ImageBlock | VideoBlock // TODO: Media Stack
|
|
16
|
-
content?: React.ReactNode
|
|
17
|
-
cta?: CTABlock
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export {
|
|
21
|
-
type CardBlock as default
|
|
22
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import type Block from './block'
|
|
3
|
-
import type CTABlock from './cta-block'
|
|
4
|
-
import type EnhHeadingBlock from './enh-heading-block'
|
|
5
|
-
|
|
6
|
-
interface CarteBlancheBlock extends Block {
|
|
7
|
-
blockType: 'carte-blanche'
|
|
8
|
-
// big-padding
|
|
9
|
-
// no-outer-borders
|
|
10
|
-
// no-internal-borders
|
|
11
|
-
// style-ghost (no-internal-borders, no outer border, no padding)
|
|
12
|
-
specifiers?: string
|
|
13
|
-
topContent?: Block[]
|
|
14
|
-
heading?: EnhHeadingBlock
|
|
15
|
-
content?: Block[]
|
|
16
|
-
cta?: CTABlock
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export {
|
|
20
|
-
type CarteBlancheBlock as default
|
|
21
|
-
}
|
package/blocks/def/cta-block.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { LinkDef, ButtonDef } from '../../types'
|
|
2
|
-
import type Block from './block'
|
|
3
|
-
|
|
4
|
-
interface CTABlock extends Block {
|
|
5
|
-
blockType: 'cta'
|
|
6
|
-
// fill: fills the parent width with the elements
|
|
7
|
-
// left / right: (>= md) left or right justify the elements (default is center)
|
|
8
|
-
// mobile-2-columns: mobile defaults to rendering each element full width,
|
|
9
|
-
// on it's own line. This renders them in two columns instead.
|
|
10
|
-
// mobile-center-first-if-odd: if (mobile-2-columns) and length is odd,
|
|
11
|
-
// default is to center last
|
|
12
|
-
// mobile-odd-full-width: fills the full two columns w the centered element
|
|
13
|
-
specifiers?: string
|
|
14
|
-
elements: (LinkDef | ButtonDef)[]
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export {
|
|
18
|
-
type CTABlock as default
|
|
19
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type Block from './block'
|
|
2
|
-
|
|
3
|
-
// level is heading tag level. 1 renders as <h1>, etc... 0 renders as <p>
|
|
4
|
-
//
|
|
5
|
-
// mb: is bottom margin in tw units. 'mb-1' produces 0.25rem, so a value of 4 would produce 1rem
|
|
6
|
-
// These are dynamically generated from a template string. mb-1 --> mb-12 have been safelisted.
|
|
7
|
-
// Any higher values used would have to explicitly safelisted in tailwind config.
|
|
8
|
-
// The margin will only be applied if the next element down is present.
|
|
9
|
-
// (eg, heading mb applies only if there is a byline.)
|
|
10
|
-
|
|
11
|
-
interface EnhHeadingBlock extends Block {
|
|
12
|
-
blockType: 'enh-heading'
|
|
13
|
-
// tbd: icon-w-heading (if preheading is present),
|
|
14
|
-
// tbd: icon-w-byline (if preheading and heading is present),
|
|
15
|
-
// tbd: icon-above: above first element
|
|
16
|
-
// tbd: icon-to-right: to right of corresponding element or right justified if 'icon-above'
|
|
17
|
-
// mobile-heading-centered
|
|
18
|
-
// left / right / center for preheading and heading (byline stays left)
|
|
19
|
-
// byline-left / byline-right / byline-center
|
|
20
|
-
// preheading-heading-font
|
|
21
|
-
specifiers?: string
|
|
22
|
-
// By default, appears inline to left of first element (preheading or heading)
|
|
23
|
-
// unless indicated otherwise in specifiers
|
|
24
|
-
icon?: React.ReactNode // ReactNode or url string to asset
|
|
25
|
-
iconSize?: number // if url string, this sets the size
|
|
26
|
-
preheading?: {
|
|
27
|
-
text: string
|
|
28
|
-
level?: number // default: 4
|
|
29
|
-
mb?: number // default: 2
|
|
30
|
-
}
|
|
31
|
-
heading: {
|
|
32
|
-
text: string
|
|
33
|
-
level?: number // default: 1
|
|
34
|
-
mb?: number // default: 2
|
|
35
|
-
}
|
|
36
|
-
byline?: {
|
|
37
|
-
text: string
|
|
38
|
-
level?: number // default: 6
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export {
|
|
43
|
-
type EnhHeadingBlock as default
|
|
44
|
-
}
|
package/blocks/def/grid-block.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type Block from "./block"
|
|
2
|
-
import type GridDef from "../../types/grid-def"
|
|
3
|
-
|
|
4
|
-
interface GridBlock {
|
|
5
|
-
blockType: 'grid'
|
|
6
|
-
specifiers?: string
|
|
7
|
-
grid: GridDef
|
|
8
|
-
/**
|
|
9
|
-
* Ignored if children are supplied to the GridBlockComp
|
|
10
|
-
*/
|
|
11
|
-
cells?: Block[]
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export {
|
|
15
|
-
type GridBlock as default
|
|
16
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type Block from './block'
|
|
2
|
-
|
|
3
|
-
interface HeadingBlock extends Block {
|
|
4
|
-
blockType: 'heading'
|
|
5
|
-
heading: string
|
|
6
|
-
byline?: string
|
|
7
|
-
level?: number
|
|
8
|
-
bylineLevel?: number
|
|
9
|
-
spaceBetween?: number
|
|
10
|
-
spaceAfter?: number
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export {
|
|
14
|
-
type HeadingBlock as default
|
|
15
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { ImageDef } from '../../types'
|
|
2
|
-
import type Block from './block'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* See {@link ImageDef}
|
|
6
|
-
* see https://nextjs.org/docs/app/api-reference/components/image
|
|
7
|
-
* as well as React.ImgHTMLAttributes.
|
|
8
|
-
*/
|
|
9
|
-
interface ImageBlock extends Block, ImageDef {
|
|
10
|
-
blockType: 'image'
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Alignement: 'left' (default) / 'right' / 'center' (must be in flex-col parent)
|
|
14
|
-
* 'mobile-no-scale': By default, scales to 3/4 height (mobile and w < 'md')
|
|
15
|
-
* 'mobile-full-width': Overrides dim, etc. and renders full width (maintaining aspect ratio)
|
|
16
|
-
*/
|
|
17
|
-
specifiers?: string
|
|
18
|
-
/** @deprecated Please use 'mobile-full-width' in specifiers */
|
|
19
|
-
fullWidthOnMobile?: boolean
|
|
20
|
-
/** Next props */
|
|
21
|
-
props?: {
|
|
22
|
-
sizes?: string
|
|
23
|
-
/** if true, any alignement specifiers are ignored */
|
|
24
|
-
fill?: boolean
|
|
25
|
-
style?: any
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export {
|
|
30
|
-
type ImageBlock as default,
|
|
31
|
-
}
|
package/blocks/def/index.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import type AccordianBlock from './accordian-block'
|
|
2
|
-
import type Block from './block'
|
|
3
|
-
import type BulletCardsBlock from './bullet-cards-block'
|
|
4
|
-
import type CardBlock from './card-block'
|
|
5
|
-
import type CarteBlancheBlock from './carte-blanche-block'
|
|
6
|
-
import type CTABlock from './cta-block'
|
|
7
|
-
import type ElementBlock from './element-block'
|
|
8
|
-
import type GridBlock from './grid-block'
|
|
9
|
-
import type GroupBlock from './group-block'
|
|
10
|
-
import type EnhHeadingBlock from './enh-heading-block'
|
|
11
|
-
import type HeadingBlock from './heading-block'
|
|
12
|
-
import type ImageBlock from './image-block'
|
|
13
|
-
import type VideoBlock from './video-block'
|
|
14
|
-
import type SpaceBlock from './space-block'
|
|
15
|
-
import { SPACE_DEFAULTS } from './space-block'
|
|
16
|
-
import type ScreenfulBlock from './screenful-block'
|
|
17
|
-
|
|
18
|
-
export {
|
|
19
|
-
type AccordianBlock,
|
|
20
|
-
type Block,
|
|
21
|
-
type BulletCardsBlock,
|
|
22
|
-
type CardBlock,
|
|
23
|
-
type CarteBlancheBlock,
|
|
24
|
-
type CTABlock,
|
|
25
|
-
type ElementBlock,
|
|
26
|
-
type GridBlock,
|
|
27
|
-
type GroupBlock,
|
|
28
|
-
type HeadingBlock,
|
|
29
|
-
type EnhHeadingBlock,
|
|
30
|
-
type ImageBlock,
|
|
31
|
-
type VideoBlock,
|
|
32
|
-
type SpaceBlock,
|
|
33
|
-
type ScreenfulBlock,
|
|
34
|
-
SPACE_DEFAULTS
|
|
35
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import type { ReactNode } from 'react'
|
|
2
|
-
|
|
3
|
-
import type Block from './block'
|
|
4
|
-
import type VideoBlock from './video-block'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* A common screenful of content
|
|
8
|
-
* An optional banner image or video
|
|
9
|
-
* Content can be in columns
|
|
10
|
-
*/
|
|
11
|
-
interface ScreenfulBlock extends Block {
|
|
12
|
-
blockType: 'screenful'
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Either an image URL, or a Video Block
|
|
17
|
-
*
|
|
18
|
-
* If VideoBlock, then it's poster will be rendered server-side
|
|
19
|
-
* and the <video> component will be lazy-loaded client-side.
|
|
20
|
-
*
|
|
21
|
-
* If in a scrolling situation, the video will autoplay when 75% in view
|
|
22
|
-
*/
|
|
23
|
-
banner?: string | VideoBlock // TODO: should be VideoDef
|
|
24
|
-
|
|
25
|
-
/** Specifies rendering and layout hints and variants for block as a whole */
|
|
26
|
-
specifiers?: string
|
|
27
|
-
|
|
28
|
-
/** Specifies rendering and layout hints and variants for corresponding column */
|
|
29
|
-
columnSpecifiers?: string[]
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Mobile: The order in the single column mobile layout in which the columns appear.
|
|
33
|
-
* Overrides column order.
|
|
34
|
-
* eg, if you want the second tile of three at the top: [1, 0, 2]
|
|
35
|
-
*/
|
|
36
|
-
mobileOrder?: number[]
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Content Blocks for 1-3 columns.
|
|
40
|
-
* (More than that is allowed, but impractical at many resolutions!)
|
|
41
|
-
* If > 1, it will be enclosed in a 'grid grid-cols-<x>' div.
|
|
42
|
-
*/
|
|
43
|
-
contentColumns: Block[][]
|
|
44
|
-
|
|
45
|
-
/** optional footer element below the grid */
|
|
46
|
-
footer?: ReactNode
|
|
47
|
-
|
|
48
|
-
/** optional id for linking to this slide / screenful */
|
|
49
|
-
anchorId?: string
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export {
|
|
53
|
-
type ScreenfulBlock as default
|
|
54
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import type { Breakpoint } from '../../types'
|
|
2
|
-
|
|
3
|
-
import type Block from './block'
|
|
4
|
-
|
|
5
|
-
type TWSpaceUnit = number // TODO, pull from tw conf
|
|
6
|
-
type HeadingLevel = 0 | 1 | 2 | 3 | 4 | 5 | 6
|
|
7
|
-
|
|
8
|
-
const SPACE_DEFAULTS = {
|
|
9
|
-
xs: 2,
|
|
10
|
-
sm: 4,
|
|
11
|
-
md: 5,
|
|
12
|
-
lg: 6,
|
|
13
|
-
xl: 8
|
|
14
|
-
} satisfies {
|
|
15
|
-
[key in (Breakpoint)]?: TWSpaceUnit
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
interface SpaceBlock extends Block {
|
|
20
|
-
blockType: 'space'
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* TW units of vertical space, applied at Breakpoints
|
|
24
|
-
* or
|
|
25
|
-
* if just a number, that number at all Breakpoints
|
|
26
|
-
*
|
|
27
|
-
* default {
|
|
28
|
-
* xs: 2,
|
|
29
|
-
* sm: 4,
|
|
30
|
-
* md: 5,
|
|
31
|
-
* lg: 6,
|
|
32
|
-
* xl: 8
|
|
33
|
-
* }
|
|
34
|
-
*
|
|
35
|
-
* Any provided values will be merge w the defaults
|
|
36
|
-
* And applied as if they were tw classes in ascending
|
|
37
|
-
* order.
|
|
38
|
-
*
|
|
39
|
-
* impl: <div className='invisible w-[1px] xs:h-<xsval> sm:h-<smval> etc...' />
|
|
40
|
-
*/
|
|
41
|
-
sizes?: {
|
|
42
|
-
[key in (Breakpoint)]?: TWSpaceUnit
|
|
43
|
-
} | TWSpaceUnit
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Heading levels. Gives the vertical space that the corresponding
|
|
47
|
-
* h tag would give.
|
|
48
|
-
* default: 3 (height of <h3>)
|
|
49
|
-
* 0 = 1rem (plus any gaps),
|
|
50
|
-
* For example, 1 = <h1 style={visibility: hidden}> </h1>
|
|
51
|
-
* As <ApplyTypography> would render it, plus any gap.
|
|
52
|
-
*/
|
|
53
|
-
level?: HeadingLevel
|
|
54
|
-
|
|
55
|
-
test?: boolean
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export {
|
|
60
|
-
type SpaceBlock as default,
|
|
61
|
-
type TWSpaceUnit,
|
|
62
|
-
type HeadingLevel,
|
|
63
|
-
SPACE_DEFAULTS
|
|
64
|
-
}
|