@xenide-io/the-old-ui-theme 0.4.4 → 0.4.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.
- package/dist/{chunk-54ZR4VL5.mjs → chunk-RZXHZWUB.mjs} +44 -17
- package/dist/{index-B5NOyoKS.d.mts → index-Od4pIP4F.d.mts} +7 -1
- package/dist/{index-B5NOyoKS.d.ts → index-Od4pIP4F.d.ts} +7 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +37 -10
- package/dist/index.mjs +1 -1
- package/dist/suite.d.mts +152 -41
- package/dist/suite.d.ts +152 -41
- package/dist/suite.js +1366 -671
- package/dist/suite.mjs +1304 -610
- package/dist/ui.d.mts +1 -1
- package/dist/ui.d.ts +1 -1
- package/dist/ui.js +37 -10
- package/dist/ui.mjs +1 -1
- package/package.json +7 -3
- package/src/components/ui/Modal.tsx +70 -26
- package/src/styles/suite-skin.css +284 -24
- package/src/suite/components/ai-panel.test.ts +20 -0
- package/src/suite/components/ai-panel.tsx +494 -103
- package/src/suite/components/suite-app-layout.tsx +48 -28
- package/src/suite/components/suite-layout.tsx +84 -40
- package/src/suite/components/suite-mobile-drawer.tsx +35 -22
- package/src/suite/components/suite-notification-bell.tsx +9 -3
- package/src/suite/components/suite-settings-layout.tsx +82 -0
- package/src/suite/components/suite-settings-mobile-nav.tsx +18 -17
- package/src/suite/components/suite-skeleton.tsx +3 -3
- package/src/suite/components/today-calibrating.tsx +11 -35
- package/src/suite/components/today-page-frame.tsx +19 -11
- package/src/suite/components/today-ui.tsx +276 -19
- package/src/suite/index.ts +41 -25
- package/src/suite/lib/apps.ts +32 -2
- package/src/suite/lib/use-sidebar-width.ts +114 -0
- package/src/components/sections/AccordionShowcase.tsx +0 -45
- package/src/components/sections/AlertShowcase.tsx +0 -40
- package/src/components/sections/AvatarShowcase.tsx +0 -80
- package/src/components/sections/BadgeShowcase.tsx +0 -65
- package/src/components/sections/ButtonShowcase.tsx +0 -308
- package/src/components/sections/CalendarShowcase.tsx +0 -35
- package/src/components/sections/CardShowcase.tsx +0 -159
- package/src/components/sections/CodeMockupShowcase.tsx +0 -56
- package/src/components/sections/ColorPalette.tsx +0 -117
- package/src/components/sections/CommandPaletteShowcase.tsx +0 -48
- package/src/components/sections/CountdownShowcase.tsx +0 -43
- package/src/components/sections/DiffShowcase.tsx +0 -70
- package/src/components/sections/DrawerShowcase.tsx +0 -97
- package/src/components/sections/DropdownShowcase.tsx +0 -98
- package/src/components/sections/EmptyStateShowcase.tsx +0 -50
- package/src/components/sections/FilterChipsShowcase.tsx +0 -98
- package/src/components/sections/FormShowcase.tsx +0 -127
- package/src/components/sections/HoverCardShowcase.tsx +0 -50
- package/src/components/sections/IconShowcase.tsx +0 -121
- package/src/components/sections/IndicatorShowcase.tsx +0 -52
- package/src/components/sections/KbdShowcase.tsx +0 -57
- package/src/components/sections/ModalShowcase.tsx +0 -211
- package/src/components/sections/NavigationShowcase.tsx +0 -199
- package/src/components/sections/NewComponentsShowcase.tsx +0 -1052
- package/src/components/sections/ProductLayoutsShowcase.tsx +0 -78
- package/src/components/sections/ProgressShowcase.tsx +0 -82
- package/src/components/sections/QuillChartShowcase.tsx +0 -92
- package/src/components/sections/QuillDashboardShowcase.tsx +0 -149
- package/src/components/sections/SegmentedControlShowcase.tsx +0 -49
- package/src/components/sections/SetupThemeShowcase.tsx +0 -262
- package/src/components/sections/SidebarShowcase.tsx +0 -152
- package/src/components/sections/StackShowcase.tsx +0 -33
- package/src/components/sections/StepperShowcase.tsx +0 -37
- package/src/components/sections/SuiteShowcase.tsx +0 -669
- package/src/components/sections/SwapShowcase.tsx +0 -99
- package/src/components/sections/TabShowcase.tsx +0 -84
- package/src/components/sections/TableShowcase.tsx +0 -142
- package/src/components/sections/TimelineShowcase.tsx +0 -83
- package/src/components/sections/ToastShowcase.tsx +0 -108
- package/src/components/sections/TooltipShowcase.tsx +0 -38
- package/src/components/sections/UtilityShowcase.tsx +0 -81
- package/src/styles/excel-themes.css +0 -110
- package/src/styles/lemon-primitives.css +0 -550
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { AuthLayout, AuthCard, SettingsLayout, ShowcaseWrapper, Button } from "@/components/ui";
|
|
4
|
-
|
|
5
|
-
export default function ProductLayoutsShowcase() {
|
|
6
|
-
return (
|
|
7
|
-
<>
|
|
8
|
-
<ShowcaseWrapper
|
|
9
|
-
id="auth"
|
|
10
|
-
title="Auth Layout"
|
|
11
|
-
description="Split-panel authentication shell with brand aside and form column."
|
|
12
|
-
code={`import { AuthLayout, AuthCard } from "@xenide-io/the-old-ui-theme";
|
|
13
|
-
|
|
14
|
-
<AuthLayout>
|
|
15
|
-
<AuthCard title="Sign in" description="Welcome back">
|
|
16
|
-
<input className="ph-input" placeholder="Email" />
|
|
17
|
-
<input className="ph-input" type="password" placeholder="Password" />
|
|
18
|
-
<Button variant="primary">Sign in</Button>
|
|
19
|
-
</AuthCard>
|
|
20
|
-
</AuthLayout>`}
|
|
21
|
-
>
|
|
22
|
-
<div className="max-h-[32rem] overflow-hidden rounded-xl border border-ph-border">
|
|
23
|
-
<AuthLayout>
|
|
24
|
-
<AuthCard title="Sign in" description="Welcome back to your workspace.">
|
|
25
|
-
<div className="space-y-3">
|
|
26
|
-
<input className="ph-input" placeholder="Email" />
|
|
27
|
-
<input className="ph-input" type="password" placeholder="Password" />
|
|
28
|
-
<Button variant="primary" className="w-full">Sign in</Button>
|
|
29
|
-
</div>
|
|
30
|
-
</AuthCard>
|
|
31
|
-
</AuthLayout>
|
|
32
|
-
</div>
|
|
33
|
-
</ShowcaseWrapper>
|
|
34
|
-
|
|
35
|
-
<ShowcaseWrapper
|
|
36
|
-
id="settings"
|
|
37
|
-
title="Settings Layout"
|
|
38
|
-
description="Sidebar navigation and content area for settings pages."
|
|
39
|
-
code={`import { SettingsLayout, SettingsNav } from "@xenide-io/the-old-ui-theme";
|
|
40
|
-
|
|
41
|
-
<SettingsLayout
|
|
42
|
-
title="Settings"
|
|
43
|
-
navigation={<SettingsNav groups={groups} activeId="general" />}
|
|
44
|
-
>
|
|
45
|
-
<p>Settings content</p>
|
|
46
|
-
</SettingsLayout>`}
|
|
47
|
-
>
|
|
48
|
-
<div className="max-h-[28rem] overflow-hidden rounded-xl border border-ph-border">
|
|
49
|
-
<SettingsLayout
|
|
50
|
-
title="Project Settings"
|
|
51
|
-
description="Manage your workspace preferences"
|
|
52
|
-
navigation={
|
|
53
|
-
<div className="ph-settings-nav space-y-5">
|
|
54
|
-
<div>
|
|
55
|
-
<h3 className="mb-1 px-2 text-[10px] font-semibold uppercase tracking-wider text-ph-mutedtext">General</h3>
|
|
56
|
-
<div className="space-y-0.5">
|
|
57
|
-
<a className="ph-settings-nav__item ph-settings-nav__item--active">Overview</a>
|
|
58
|
-
<a className="ph-settings-nav__item">Display</a>
|
|
59
|
-
<a className="ph-settings-nav__item">Notifications</a>
|
|
60
|
-
</div>
|
|
61
|
-
</div>
|
|
62
|
-
<div>
|
|
63
|
-
<h3 className="mb-1 px-2 text-[10px] font-semibold uppercase tracking-wider text-ph-mutedtext">Team</h3>
|
|
64
|
-
<div className="space-y-0.5">
|
|
65
|
-
<a className="ph-settings-nav__item">Members</a>
|
|
66
|
-
<a className="ph-settings-nav__item">Roles</a>
|
|
67
|
-
</div>
|
|
68
|
-
</div>
|
|
69
|
-
</div>
|
|
70
|
-
}
|
|
71
|
-
>
|
|
72
|
-
<p className="text-sm text-ph-subtle">General settings content goes here.</p>
|
|
73
|
-
</SettingsLayout>
|
|
74
|
-
</div>
|
|
75
|
-
</ShowcaseWrapper>
|
|
76
|
-
</>
|
|
77
|
-
);
|
|
78
|
-
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ComponentDocs,
|
|
3
|
-
Loader,
|
|
4
|
-
LoadingState,
|
|
5
|
-
Progress,
|
|
6
|
-
ShowcaseWrapper,
|
|
7
|
-
Skeleton,
|
|
8
|
-
} from "@/components/ui";
|
|
9
|
-
|
|
10
|
-
export default function ProgressShowcase() {
|
|
11
|
-
const code = `import { Loader, LoadingState, Progress, Skeleton } from "@xenide-io/the-old-ui-theme";
|
|
12
|
-
|
|
13
|
-
<Progress label="Ingest backlog" value={72} showPercentage />
|
|
14
|
-
<Loader variant="spinner" label="Refreshing insight" />
|
|
15
|
-
<Loader variant="dots" label="Loading events" />
|
|
16
|
-
<Loader variant="pulse" label="Connecting" />
|
|
17
|
-
<LoadingState title="Loading dashboard" description="Restoring the latest results." />
|
|
18
|
-
<div role="status" aria-label="Loading account">
|
|
19
|
-
<Skeleton shape="title" />
|
|
20
|
-
<Skeleton shape="text" />
|
|
21
|
-
<Skeleton shape="short-text" />
|
|
22
|
-
</div>`;
|
|
23
|
-
|
|
24
|
-
return (
|
|
25
|
-
<ShowcaseWrapper
|
|
26
|
-
title="Progress & loading"
|
|
27
|
-
description="Determinate progress, compact action loaders, full-region loading states, and structure-matching cold-load skeletons."
|
|
28
|
-
code={code}
|
|
29
|
-
filename="LoadingExample.tsx"
|
|
30
|
-
docs={
|
|
31
|
-
<ComponentDocs
|
|
32
|
-
rows={[
|
|
33
|
-
{ name: "Loader.variant", type: "spinner | dots | pulse", defaultValue: "spinner", description: "Indeterminate treatment for compact asynchronous work." },
|
|
34
|
-
{ name: "Loader.size", type: "sm | md | lg", defaultValue: "md", description: "Visual loader size." },
|
|
35
|
-
{ name: "LoadingState", type: "LoadingStateProps", description: "Centered region state with one accessible status message." },
|
|
36
|
-
{ name: "Skeleton.shape", type: "title | text | short-text | avatar | button | block", defaultValue: "text", description: "Decorative skeleton matching expected content geometry." },
|
|
37
|
-
{ name: "Progress.value", type: "number", description: "Real determinate progress value." },
|
|
38
|
-
]}
|
|
39
|
-
/>
|
|
40
|
-
}
|
|
41
|
-
>
|
|
42
|
-
<div className="space-y-6">
|
|
43
|
-
<div className="ph-panel space-y-6">
|
|
44
|
-
<h3 className="text-sm font-semibold uppercase tracking-wider text-ph-mutedtext">Determinate progress</h3>
|
|
45
|
-
<Progress label="Ingest backlog" value={72} color="bg-ph-brand" showPercentage />
|
|
46
|
-
<Progress label="Exports" value={45} color="bg-ph-blue" showPercentage />
|
|
47
|
-
<Progress label="LLM evaluations" value={28} color="bg-ph-purple" showPercentage />
|
|
48
|
-
</div>
|
|
49
|
-
|
|
50
|
-
<div className="grid gap-4 md:grid-cols-3">
|
|
51
|
-
{(["spinner", "dots", "pulse"] as const).map((variant) => (
|
|
52
|
-
<div key={variant} className="ph-panel flex min-h-28 flex-col items-center justify-center gap-3">
|
|
53
|
-
<Loader variant={variant} size="lg" label={`${variant} loader`} />
|
|
54
|
-
<code className="ph-kbd">{variant}</code>
|
|
55
|
-
</div>
|
|
56
|
-
))}
|
|
57
|
-
</div>
|
|
58
|
-
|
|
59
|
-
<div className="grid gap-4 lg:grid-cols-2">
|
|
60
|
-
<div className="ph-panel p-0">
|
|
61
|
-
<LoadingState
|
|
62
|
-
label="Loading dashboard"
|
|
63
|
-
title="Loading dashboard"
|
|
64
|
-
description="Restoring the latest results without pretending progress is measurable."
|
|
65
|
-
/>
|
|
66
|
-
</div>
|
|
67
|
-
<div className="ph-panel" role="status" aria-label="Loading account summary">
|
|
68
|
-
<div className="mb-5 flex items-center gap-3">
|
|
69
|
-
<Skeleton shape="avatar" />
|
|
70
|
-
<div className="min-w-0 flex-1">
|
|
71
|
-
<Skeleton shape="title" className="mb-2 w-1/2" />
|
|
72
|
-
<Skeleton shape="short-text" className="w-2/3" />
|
|
73
|
-
</div>
|
|
74
|
-
</div>
|
|
75
|
-
<Skeleton shape="block" className="mb-4" />
|
|
76
|
-
<div className="flex justify-end"><Skeleton shape="button" /></div>
|
|
77
|
-
</div>
|
|
78
|
-
</div>
|
|
79
|
-
</div>
|
|
80
|
-
</ShowcaseWrapper>
|
|
81
|
-
);
|
|
82
|
-
}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { ShowcaseWrapper } from "@/components/ui";
|
|
4
|
-
import { TimeSeriesLineChart, BarChart, PieChart, Sparkline, MetricCard, FunnelChart, InsightShell } from "@/components/charts/quill";
|
|
5
|
-
|
|
6
|
-
const lineCode = 'import { TimeSeriesLineChart } from "@xenide-io/the-old-ui-theme";\n\n<TimeSeriesLineChart\n labels={["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]}\n series={[\n { key: "views", label: "Pageviews", data: [4200, 5100, 4800, 6200, 5900, 3100, 2800] },\n { key: "signups", label: "Signups", data: [920, 990, 940, 1040, 1012, 540, 510] },\n ]}\n/>';
|
|
7
|
-
|
|
8
|
-
const barCode = 'import { BarChart } from "@xenide-io/the-old-ui-theme";\n\n<BarChart\n labels={["A","B","C","D"]}\n series={[\n { key: "s1", label: "Series 1", data: [30, 45, 25, 60] },\n { key: "s2", label: "Series 2", data: [20, 35, 40, 30] },\n ]}\n/>';
|
|
9
|
-
|
|
10
|
-
const pieCode = 'import { PieChart } from "@xenide-io/the-old-ui-theme";\n\n<PieChart\n slices={[\n { key: "a", label: "Direct", value: 40 },\n { key: "b", label: "Organic", value: 30 },\n { key: "c", label: "Referral", value: 20 },\n { key: "d", label: "Social", value: 10 },\n ]}\n/>';
|
|
11
|
-
|
|
12
|
-
const metricCode = 'import { MetricCard, Sparkline } from "@xenide-io/the-old-ui-theme";\n\n<MetricCard\n value="89.2k"\n label="Page Views"\n change={{ value: 12 }}\n sparklineData={[65, 72, 68, 80, 95, 88, 92]}\n/>';
|
|
13
|
-
|
|
14
|
-
export default function QuillChartShowcase() {
|
|
15
|
-
return (
|
|
16
|
-
<>
|
|
17
|
-
<ShowcaseWrapper
|
|
18
|
-
id="quill-timeline"
|
|
19
|
-
title="Quill TimeSeriesLineChart"
|
|
20
|
-
description="Canvas-based trend line chart with optional grid and crosshair."
|
|
21
|
-
code={lineCode}
|
|
22
|
-
>
|
|
23
|
-
<TimeSeriesLineChart
|
|
24
|
-
labels={["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]}
|
|
25
|
-
series={[
|
|
26
|
-
{ key: "views", label: "Pageviews", data: [4200, 5100, 4800, 6200, 5900, 3100, 2800] },
|
|
27
|
-
{ key: "signups", label: "Signups", data: [920, 990, 940, 1040, 1012, 540, 510] },
|
|
28
|
-
]}
|
|
29
|
-
/>
|
|
30
|
-
</ShowcaseWrapper>
|
|
31
|
-
|
|
32
|
-
<ShowcaseWrapper
|
|
33
|
-
id="quill-barchart"
|
|
34
|
-
title="Quill BarChart"
|
|
35
|
-
description="Vertical bar chart with multi-series support."
|
|
36
|
-
code={barCode}
|
|
37
|
-
>
|
|
38
|
-
<BarChart
|
|
39
|
-
labels={["A","B","C","D"]}
|
|
40
|
-
series={[
|
|
41
|
-
{ key: "s1", label: "Series 1", data: [30, 45, 25, 60] },
|
|
42
|
-
{ key: "s2", label: "Series 2", data: [20, 35, 40, 30] },
|
|
43
|
-
]}
|
|
44
|
-
/>
|
|
45
|
-
</ShowcaseWrapper>
|
|
46
|
-
|
|
47
|
-
<ShowcaseWrapper
|
|
48
|
-
id="quill-piechart"
|
|
49
|
-
title="Quill PieChart"
|
|
50
|
-
description="Donut chart with slice labels and legend."
|
|
51
|
-
code={pieCode}
|
|
52
|
-
>
|
|
53
|
-
<PieChart
|
|
54
|
-
slices={[
|
|
55
|
-
{ key: "a", label: "Direct", value: 40 },
|
|
56
|
-
{ key: "b", label: "Organic", value: 30 },
|
|
57
|
-
{ key: "c", label: "Referral", value: 20 },
|
|
58
|
-
{ key: "d", label: "Social", value: 10 },
|
|
59
|
-
]}
|
|
60
|
-
/>
|
|
61
|
-
</ShowcaseWrapper>
|
|
62
|
-
|
|
63
|
-
<ShowcaseWrapper
|
|
64
|
-
id="quill-metriccard"
|
|
65
|
-
title="Quill MetricCard and Sparkline"
|
|
66
|
-
description="Metric stat card with sparkline trend."
|
|
67
|
-
code={metricCode}
|
|
68
|
-
>
|
|
69
|
-
<div className="grid gap-4 sm:grid-cols-3">
|
|
70
|
-
<MetricCard
|
|
71
|
-
value="89.2k"
|
|
72
|
-
label="Page Views"
|
|
73
|
-
change={{ value: 12 }}
|
|
74
|
-
sparklineData={[65, 72, 68, 80, 95, 88, 92]}
|
|
75
|
-
/>
|
|
76
|
-
<MetricCard
|
|
77
|
-
value="2,847"
|
|
78
|
-
label="Active Users"
|
|
79
|
-
change={{ value: 3 }}
|
|
80
|
-
sparklineData={[42, 48, 45, 52, 50, 48, 55]}
|
|
81
|
-
/>
|
|
82
|
-
<MetricCard
|
|
83
|
-
value="23.1%"
|
|
84
|
-
label="Conversion Rate"
|
|
85
|
-
change={{ value: -1.2, positive: false }}
|
|
86
|
-
sparklineData={[24, 23, 23.5, 22.8, 23.2, 22.5, 23.1]}
|
|
87
|
-
/>
|
|
88
|
-
</div>
|
|
89
|
-
</ShowcaseWrapper>
|
|
90
|
-
</>
|
|
91
|
-
);
|
|
92
|
-
}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { ShowcaseWrapper } from "@/components/ui";
|
|
4
|
-
import { InsightShell, MetricCard } from "@/components/charts/quill";
|
|
5
|
-
import { TimeSeriesLineChart, BarChart, PieChart, FunnelChart, Sparkline } from "@/components/charts/quill";
|
|
6
|
-
|
|
7
|
-
export default function QuillDashboardShowcase() {
|
|
8
|
-
return (
|
|
9
|
-
<>
|
|
10
|
-
<ShowcaseWrapper
|
|
11
|
-
id="quill-dashboard"
|
|
12
|
-
title="Quill Dashboard Shells"
|
|
13
|
-
description="InsightShell panels for wrapping Quill charts."
|
|
14
|
-
code={`import { InsightShell } from "@xenide-io/the-old-ui-theme";
|
|
15
|
-
import { TimeSeriesLineChart } from "@xenide-io/the-old-ui-theme";`}
|
|
16
|
-
>
|
|
17
|
-
<div className="grid gap-4 sm:grid-cols-2">
|
|
18
|
-
<InsightShell title="Weekly Active Users" subtitle="Last 14 days" ribbonColor="var(--ph-data-1)">
|
|
19
|
-
<TimeSeriesLineChart
|
|
20
|
-
labels={["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]}
|
|
21
|
-
series={[{ key: "wau", label: "WAU", data: [4200, 5100, 4800, 6200, 5900, 3100, 2800] }]}
|
|
22
|
-
height={180}
|
|
23
|
-
/>
|
|
24
|
-
</InsightShell>
|
|
25
|
-
<InsightShell title="Conversion Funnel" subtitle="Step-by-step dropoff" ribbonColor="var(--ph-data-2)">
|
|
26
|
-
<FunnelChart
|
|
27
|
-
steps={[
|
|
28
|
-
{ label: "Page Visit", count: 12000 },
|
|
29
|
-
{ label: "Sign Up", count: 5400 },
|
|
30
|
-
{ label: "Onboarding", count: 3200 },
|
|
31
|
-
{ label: "Active Use", count: 1800 },
|
|
32
|
-
]}
|
|
33
|
-
/>
|
|
34
|
-
</InsightShell>
|
|
35
|
-
</div>
|
|
36
|
-
</ShowcaseWrapper>
|
|
37
|
-
|
|
38
|
-
<ShowcaseWrapper
|
|
39
|
-
id="quill-funnel"
|
|
40
|
-
title="Quill Funnel Chart"
|
|
41
|
-
description="Conversion funnel with dropoff percentages."
|
|
42
|
-
code={`import { FunnelChart } from "@xenide-io/the-old-ui-theme";
|
|
43
|
-
|
|
44
|
-
<FunnelChart
|
|
45
|
-
steps={[
|
|
46
|
-
{ label: "Visitors", count: 12000 },
|
|
47
|
-
{ label: "Signups", count: 5400 },
|
|
48
|
-
{ label: "Activated", count: 1800 },
|
|
49
|
-
]}
|
|
50
|
-
/>`}
|
|
51
|
-
>
|
|
52
|
-
<div className="max-w-md">
|
|
53
|
-
<FunnelChart
|
|
54
|
-
steps={[
|
|
55
|
-
{ label: "Website Visits", count: 45000 },
|
|
56
|
-
{ label: "Product Page", count: 28000 },
|
|
57
|
-
{ label: "Added to Cart", count: 12000 },
|
|
58
|
-
{ label: "Checkout Started", count: 6500 },
|
|
59
|
-
{ label: "Purchase Complete", count: 4200 },
|
|
60
|
-
]}
|
|
61
|
-
/>
|
|
62
|
-
</div>
|
|
63
|
-
</ShowcaseWrapper>
|
|
64
|
-
|
|
65
|
-
<ShowcaseWrapper
|
|
66
|
-
id="quill-metrics-grid"
|
|
67
|
-
title="Quill Metrics Grid"
|
|
68
|
-
description="Metric cards with sparklines for dashboard KPIs."
|
|
69
|
-
code={`import { MetricCard } from "@xenide-io/the-old-ui-theme";`}
|
|
70
|
-
>
|
|
71
|
-
<div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
|
72
|
-
<MetricCard
|
|
73
|
-
value="$128.4k"
|
|
74
|
-
label="Revenue"
|
|
75
|
-
change={{ value: 12.5 }}
|
|
76
|
-
sparklineData={[80, 95, 88, 102, 110, 108, 128]}
|
|
77
|
-
/>
|
|
78
|
-
<MetricCard
|
|
79
|
-
value="4,847"
|
|
80
|
-
label="Active Users"
|
|
81
|
-
change={{ value: 8.3 }}
|
|
82
|
-
sparklineData={[42, 48, 45, 52, 50, 48, 55]}
|
|
83
|
-
/>
|
|
84
|
-
<MetricCard
|
|
85
|
-
value="32.1%"
|
|
86
|
-
label="Conversion"
|
|
87
|
-
change={{ value: -2.1, positive: false }}
|
|
88
|
-
sparklineData={[34, 33, 33.5, 32.8, 32.2, 31.5, 32.1]}
|
|
89
|
-
/>
|
|
90
|
-
<MetricCard
|
|
91
|
-
value="2.4s"
|
|
92
|
-
label="Avg. Load Time"
|
|
93
|
-
change={{ value: -15, positive: true }}
|
|
94
|
-
sparklineData={[3.2, 2.8, 2.9, 2.6, 2.5, 2.4, 2.4]}
|
|
95
|
-
/>
|
|
96
|
-
</div>
|
|
97
|
-
</ShowcaseWrapper>
|
|
98
|
-
|
|
99
|
-
<ShowcaseWrapper
|
|
100
|
-
id="quill-charts-overview"
|
|
101
|
-
title="Quill Charts Overview"
|
|
102
|
-
description="All Quill chart types in one place."
|
|
103
|
-
code={`import { BarChart, PieChart, Sparkline } from "@xenide-io/the-old-ui-theme";`}
|
|
104
|
-
>
|
|
105
|
-
<div className="grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
|
|
106
|
-
<InsightShell title="Bar Chart" subtitle="Multi-series bars">
|
|
107
|
-
<BarChart
|
|
108
|
-
labels={["A","B","C","D"]}
|
|
109
|
-
series={[
|
|
110
|
-
{ key: "s1", label: "S1", data: [30, 45, 25, 60] },
|
|
111
|
-
{ key: "s2", label: "S2", data: [20, 35, 40, 30] },
|
|
112
|
-
]}
|
|
113
|
-
height={180}
|
|
114
|
-
/>
|
|
115
|
-
</InsightShell>
|
|
116
|
-
<InsightShell title="Pie Chart" subtitle="Distribution">
|
|
117
|
-
<div className="flex justify-center">
|
|
118
|
-
<PieChart
|
|
119
|
-
slices={[
|
|
120
|
-
{ key: "a", label: "Direct", value: 40 },
|
|
121
|
-
{ key: "b", label: "Organic", value: 30 },
|
|
122
|
-
{ key: "c", label: "Referral", value: 20 },
|
|
123
|
-
{ key: "d", label: "Social", value: 10 },
|
|
124
|
-
]}
|
|
125
|
-
size={180}
|
|
126
|
-
/>
|
|
127
|
-
</div>
|
|
128
|
-
</InsightShell>
|
|
129
|
-
<InsightShell title="Sparklines" subtitle="Inline mini-trends">
|
|
130
|
-
<div className="space-y-4">
|
|
131
|
-
{[
|
|
132
|
-
{ label: "Page Views", data: [65, 72, 68, 80, 95, 88, 92], color: "var(--ph-data-1)" },
|
|
133
|
-
{ label: "Signups", data: [20, 25, 22, 30, 28, 35, 40], color: "var(--ph-data-2)" },
|
|
134
|
-
{ label: "Revenue", data: [80, 95, 88, 102, 110, 108, 128], color: "var(--ph-data-3)" },
|
|
135
|
-
].map((s) => (
|
|
136
|
-
<div key={s.label} className="flex items-center gap-3">
|
|
137
|
-
<Sparkline data={s.data} color={s.color} width={80} height={24} />
|
|
138
|
-
<div className="min-w-0">
|
|
139
|
-
<p className="text-xs font-medium text-ph-ink">{s.label}</p>
|
|
140
|
-
</div>
|
|
141
|
-
</div>
|
|
142
|
-
))}
|
|
143
|
-
</div>
|
|
144
|
-
</InsightShell>
|
|
145
|
-
</div>
|
|
146
|
-
</ShowcaseWrapper>
|
|
147
|
-
</>
|
|
148
|
-
);
|
|
149
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useState } from "react";
|
|
4
|
-
import { ComponentDocs, SegmentedControl, ShowcaseWrapper } from "@/components/ui";
|
|
5
|
-
import { IconGridView, IconListView } from "@/components/icons";
|
|
6
|
-
|
|
7
|
-
export default function SegmentedControlShowcase() {
|
|
8
|
-
const [view, setView] = useState("grid");
|
|
9
|
-
|
|
10
|
-
const options = [
|
|
11
|
-
{ value: "grid", label: "Grid", icon: <IconGridView className="h-4 w-4" /> },
|
|
12
|
-
{ value: "list", label: "List", icon: <IconListView className="h-4 w-4" /> },
|
|
13
|
-
];
|
|
14
|
-
|
|
15
|
-
const code = `import { SegmentedControl } from "the-old-ui";
|
|
16
|
-
import { IconGridView, IconListView } from "the-old-ui";
|
|
17
|
-
|
|
18
|
-
<div className="ph-panel">
|
|
19
|
-
<SegmentedControl options={options} value={view} onChange={setView} />
|
|
20
|
-
<div className="mt-4 rounded-lg bg-ph-muted p-4 text-sm text-ph-subtle">
|
|
21
|
-
Selected: <span className="font-semibold text-ph-ink">{view}</span>
|
|
22
|
-
</div>
|
|
23
|
-
</div>`;
|
|
24
|
-
|
|
25
|
-
return (
|
|
26
|
-
<ShowcaseWrapper
|
|
27
|
-
title="Segmented Control"
|
|
28
|
-
description="Compact controlled switch for mutually exclusive display modes."
|
|
29
|
-
code={code}
|
|
30
|
-
filename="SegmentedControlExample.tsx"
|
|
31
|
-
docs={
|
|
32
|
-
<ComponentDocs
|
|
33
|
-
rows={[
|
|
34
|
-
{ name: "options", type: "{ value; label; icon? }[]", description: "Segments to render." },
|
|
35
|
-
{ name: "value", type: "string", description: "Currently selected value." },
|
|
36
|
-
{ name: "onChange", type: "(value: string) => void", description: "Called when a segment is selected." },
|
|
37
|
-
]}
|
|
38
|
-
/>
|
|
39
|
-
}
|
|
40
|
-
>
|
|
41
|
-
<div className="ph-panel">
|
|
42
|
-
<SegmentedControl options={options} value={view} onChange={setView} />
|
|
43
|
-
<div className="mt-4 rounded-lg bg-ph-muted p-4 text-sm text-ph-subtle">
|
|
44
|
-
Selected: <span className="font-semibold text-ph-ink">{view}</span>
|
|
45
|
-
</div>
|
|
46
|
-
</div>
|
|
47
|
-
</ShowcaseWrapper>
|
|
48
|
-
);
|
|
49
|
-
}
|