@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,262 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useEffect, useMemo, useState } from "react";
|
|
4
|
-
import { CodeBlock, H3, P, Panel, ThemeSwitcher } from "@/components/ui";
|
|
5
|
-
import { THEMES } from "@/themes";
|
|
6
|
-
|
|
7
|
-
const themePairs = [
|
|
8
|
-
{ name: "HedgeHog", light: "hedgehog-light", dark: "hedgehog-dark" },
|
|
9
|
-
{ name: "Sheets", light: "sheets", dark: "sheets-dark" },
|
|
10
|
-
{ name: "Note", light: "note", dark: "note-dark" },
|
|
11
|
-
{ name: "Presentation", light: "presentation", dark: "presentation-dark" },
|
|
12
|
-
{ name: "Socials", light: "socials", dark: "socials-dark" },
|
|
13
|
-
{ name: "Chats", light: "chats-light", dark: "chats-dark" },
|
|
14
|
-
{ name: "Catppuccin", light: "catppuccin-light", dark: "catppuccin-dark" },
|
|
15
|
-
{ name: "Xenide", light: "xenide-light", dark: "xenide-dark" },
|
|
16
|
-
{ name: "GitHub", light: "github-light", dark: "github-dark" },
|
|
17
|
-
{ name: "Rose Pine", light: "rosepine-light", dark: "rosepine-dark" },
|
|
18
|
-
{ name: "TurtleTime", light: "turtletime", dark: "turtletime-dark" },
|
|
19
|
-
{ name: "Bikini Bottom", light: "bikini-bottom", dark: "bikini-bottom-dark" },
|
|
20
|
-
{ name: "Notion", light: "notion", dark: "notion-dark" },
|
|
21
|
-
] as const;
|
|
22
|
-
|
|
23
|
-
const guideTokens = [
|
|
24
|
-
{ label: "canvas", token: "--ph-canvas", text: "text-ph-ink" },
|
|
25
|
-
{ label: "surface", token: "--ph-surface", text: "text-ph-ink" },
|
|
26
|
-
{ label: "muted", token: "--ph-muted", text: "text-ph-ink" },
|
|
27
|
-
{ label: "toolbar", token: "--ph-toolbar", text: "text-ph-ink" },
|
|
28
|
-
{ label: "border", token: "--ph-border", text: "text-ph-ink" },
|
|
29
|
-
{ label: "accent", token: "--ph-accent", text: "text-white" },
|
|
30
|
-
{ label: "blue", token: "--ph-blue", text: "text-white" },
|
|
31
|
-
{ label: "purple", token: "--ph-purple", text: "text-white" },
|
|
32
|
-
{ label: "success", token: "--ph-success", text: "text-white" },
|
|
33
|
-
{ label: "warning", token: "--ph-warning", text: "text-white" },
|
|
34
|
-
{ label: "danger", token: "--ph-danger", text: "text-white" },
|
|
35
|
-
{ label: "info", token: "--ph-info", text: "text-white" },
|
|
36
|
-
] as const;
|
|
37
|
-
|
|
38
|
-
const dataTokens = [1, 2, 3, 4, 5, 6, 7].map((item) => ({
|
|
39
|
-
label: `data ${item}`,
|
|
40
|
-
token: `--ph-data-${item}`,
|
|
41
|
-
text: "text-white",
|
|
42
|
-
}));
|
|
43
|
-
|
|
44
|
-
const installCode = `bun add the-old-ui
|
|
45
|
-
# or
|
|
46
|
-
npm install the-old-ui`;
|
|
47
|
-
|
|
48
|
-
const layoutCode = `// app/layout.tsx
|
|
49
|
-
import "the-old-ui/styles.css";
|
|
50
|
-
import { THEME_INIT_SCRIPT, ThemeManager } from "the-old-ui";
|
|
51
|
-
|
|
52
|
-
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
53
|
-
return (
|
|
54
|
-
<html lang="en" data-theme="hedgehog-light" suppressHydrationWarning>
|
|
55
|
-
<head>
|
|
56
|
-
<script dangerouslySetInnerHTML={{ __html: THEME_INIT_SCRIPT }} />
|
|
57
|
-
</head>
|
|
58
|
-
<body>
|
|
59
|
-
<ThemeManager>{children}</ThemeManager>
|
|
60
|
-
</body>
|
|
61
|
-
</html>
|
|
62
|
-
);
|
|
63
|
-
}`;
|
|
64
|
-
|
|
65
|
-
const tailwindCode = `// tailwind.config.ts
|
|
66
|
-
import theOldUiPreset from "the-old-ui/tailwind-preset";
|
|
67
|
-
|
|
68
|
-
export default {
|
|
69
|
-
presets: [theOldUiPreset],
|
|
70
|
-
content: [
|
|
71
|
-
"./src/**/*.{ts,tsx}",
|
|
72
|
-
"./app/**/*.{ts,tsx}",
|
|
73
|
-
"./node_modules/the-old-ui/dist/**/*.{js,mjs}",
|
|
74
|
-
],
|
|
75
|
-
};`;
|
|
76
|
-
|
|
77
|
-
const switchCode = `import { ThemeSwitcher, persistTheme } from "the-old-ui";
|
|
78
|
-
|
|
79
|
-
<ThemeSwitcher />
|
|
80
|
-
|
|
81
|
-
// Or switch manually
|
|
82
|
-
persistTheme("sheets-dark");`;
|
|
83
|
-
|
|
84
|
-
const customThemeCode = `/* app/globals.css */
|
|
85
|
-
@import "the-old-ui/styles.css";
|
|
86
|
-
|
|
87
|
-
[data-theme="my-theme-light"] {
|
|
88
|
-
color-scheme: light;
|
|
89
|
-
|
|
90
|
-
--ph-canvas: #f8f5ef;
|
|
91
|
-
--ph-surface: #ffffff;
|
|
92
|
-
--ph-muted: #eee8dd;
|
|
93
|
-
--ph-toolbar: #e5dccd;
|
|
94
|
-
--ph-border: #d7cbb8;
|
|
95
|
-
--ph-border-strong: #a99b87;
|
|
96
|
-
|
|
97
|
-
--ph-text-primary: #15110c;
|
|
98
|
-
--ph-text-secondary: #4d4337;
|
|
99
|
-
--ph-text-tertiary: #796f63;
|
|
100
|
-
|
|
101
|
-
--ph-accent: #f97316;
|
|
102
|
-
--ph-accent-hover: #ea580c;
|
|
103
|
-
--ph-blue: #2563eb;
|
|
104
|
-
--ph-purple: #7c3aed;
|
|
105
|
-
--ph-success: #15803d;
|
|
106
|
-
--ph-warning: #b45309;
|
|
107
|
-
--ph-danger: #dc2626;
|
|
108
|
-
--ph-info: #2563eb;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
[data-theme="my-theme-dark"] {
|
|
112
|
-
color-scheme: dark;
|
|
113
|
-
|
|
114
|
-
--ph-canvas: #11100e;
|
|
115
|
-
--ph-surface: #191713;
|
|
116
|
-
--ph-muted: #242018;
|
|
117
|
-
--ph-toolbar: #2e281f;
|
|
118
|
-
--ph-border: #443a2b;
|
|
119
|
-
--ph-border-strong: #7a6a54;
|
|
120
|
-
|
|
121
|
-
--ph-text-primary: #fff7ed;
|
|
122
|
-
--ph-text-secondary: #d8c8b6;
|
|
123
|
-
--ph-text-tertiary: #a89985;
|
|
124
|
-
|
|
125
|
-
--ph-accent: #fb923c;
|
|
126
|
-
--ph-accent-hover: #fdba74;
|
|
127
|
-
--ph-blue: #60a5fa;
|
|
128
|
-
--ph-purple: #a78bfa;
|
|
129
|
-
--ph-success: #4ade80;
|
|
130
|
-
--ph-warning: #facc15;
|
|
131
|
-
--ph-danger: #f87171;
|
|
132
|
-
--ph-info: #60a5fa;
|
|
133
|
-
}`;
|
|
134
|
-
|
|
135
|
-
const registryCode = `// Add to src/themes/registry.ts if this repo should show it in ThemeSwitcher
|
|
136
|
-
{
|
|
137
|
-
id: "my-theme-light",
|
|
138
|
-
name: "My Theme Light",
|
|
139
|
-
description: "Custom light palette.",
|
|
140
|
-
colorScheme: "light",
|
|
141
|
-
group: "Custom",
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
id: "my-theme-dark",
|
|
145
|
-
name: "My Theme Dark",
|
|
146
|
-
description: "Custom dark palette.",
|
|
147
|
-
colorScheme: "dark",
|
|
148
|
-
group: "Custom",
|
|
149
|
-
}`;
|
|
150
|
-
|
|
151
|
-
export default function SetupThemeShowcase() {
|
|
152
|
-
const [activeTheme, setActiveTheme] = useState("hedgehog-light");
|
|
153
|
-
|
|
154
|
-
useEffect(() => {
|
|
155
|
-
const root = document.documentElement;
|
|
156
|
-
const update = () => setActiveTheme(root.getAttribute("data-theme") || "hedgehog-light");
|
|
157
|
-
update();
|
|
158
|
-
|
|
159
|
-
const observer = new MutationObserver(update);
|
|
160
|
-
observer.observe(root, { attributes: true, attributeFilter: ["data-theme"] });
|
|
161
|
-
return () => observer.disconnect();
|
|
162
|
-
}, []);
|
|
163
|
-
|
|
164
|
-
const activeThemeCode = useMemo(() => {
|
|
165
|
-
const theme = THEMES.find((item) => item.id === activeTheme);
|
|
166
|
-
return `// Current selected theme in this demo\n${JSON.stringify({
|
|
167
|
-
id: activeTheme,
|
|
168
|
-
name: theme?.name ?? activeTheme,
|
|
169
|
-
colorScheme: theme?.colorScheme ?? "light",
|
|
170
|
-
group: theme?.group ?? "Custom",
|
|
171
|
-
}, null, 2)}`;
|
|
172
|
-
}, [activeTheme]);
|
|
173
|
-
|
|
174
|
-
const themeListCode = useMemo(() => {
|
|
175
|
-
return `export const themePairs = ${JSON.stringify(themePairs, null, 2)} as const;`;
|
|
176
|
-
}, []);
|
|
177
|
-
|
|
178
|
-
return (
|
|
179
|
-
<div className="space-y-8">
|
|
180
|
-
<Panel className="space-y-4">
|
|
181
|
-
<H3>Setup</H3>
|
|
182
|
-
<P tone="subtle">
|
|
183
|
-
This demo is also the docs. A consuming app imports the package CSS once, adds the Tailwind preset, then switches palettes through <code className="ph-kbd">html[data-theme]</code>.
|
|
184
|
-
</P>
|
|
185
|
-
<div className="grid gap-4 lg:grid-cols-2">
|
|
186
|
-
<CodeBlock code={installCode} filename="install.sh" language="bash" />
|
|
187
|
-
<CodeBlock code={tailwindCode} filename="tailwind.config.ts" />
|
|
188
|
-
</div>
|
|
189
|
-
<CodeBlock code={layoutCode} filename="app/layout.tsx" />
|
|
190
|
-
</Panel>
|
|
191
|
-
|
|
192
|
-
<Panel className="space-y-4">
|
|
193
|
-
<div className="flex flex-wrap items-center justify-between gap-4">
|
|
194
|
-
<div>
|
|
195
|
-
<H3>Theme Switching</H3>
|
|
196
|
-
<P tone="subtle">Each default palette is a light/dark pair. Pick one below and copy the active theme ID.</P>
|
|
197
|
-
</div>
|
|
198
|
-
<ThemeSwitcher />
|
|
199
|
-
</div>
|
|
200
|
-
<div className="grid gap-4 lg:grid-cols-2">
|
|
201
|
-
<CodeBlock code={activeThemeCode} filename="current-theme.ts" />
|
|
202
|
-
<CodeBlock code={switchCode} filename="ThemeSwitch.tsx" />
|
|
203
|
-
</div>
|
|
204
|
-
</Panel>
|
|
205
|
-
|
|
206
|
-
<Panel className="space-y-4">
|
|
207
|
-
<H3>Default Theme Pairs</H3>
|
|
208
|
-
<P tone="subtle">Use these IDs with <code className="ph-kbd">data-theme</code> or <code className="ph-kbd">persistTheme()</code>.</P>
|
|
209
|
-
<CodeBlock code={themeListCode} filename="theme-pairs.ts" />
|
|
210
|
-
</Panel>
|
|
211
|
-
|
|
212
|
-
<Panel className="space-y-5">
|
|
213
|
-
<div>
|
|
214
|
-
<H3>Theme Color Guide</H3>
|
|
215
|
-
<P tone="subtle">
|
|
216
|
-
Every built-in theme is rendered below with its own <code className="ph-kbd">data-theme</code> attribute. These swatches are the guide for what each token becomes in that theme.
|
|
217
|
-
</P>
|
|
218
|
-
</div>
|
|
219
|
-
<div className="grid gap-4 lg:grid-cols-2">
|
|
220
|
-
{THEMES.map((theme) => (
|
|
221
|
-
<div
|
|
222
|
-
key={theme.id}
|
|
223
|
-
data-theme={theme.id}
|
|
224
|
-
className="rounded-xl border border-ph-border bg-ph-canvas p-4 shadow-ph"
|
|
225
|
-
>
|
|
226
|
-
<div className="mb-3 flex items-baseline justify-between gap-3">
|
|
227
|
-
<div>
|
|
228
|
-
<h4 className="font-semibold text-ph-ink">{theme.name}</h4>
|
|
229
|
-
<p className="text-xs text-ph-mutedtext">{theme.id}</p>
|
|
230
|
-
</div>
|
|
231
|
-
<span className="rounded-full border border-ph-border bg-ph-surface px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-ph-mutedtext">
|
|
232
|
-
{theme.colorScheme}
|
|
233
|
-
</span>
|
|
234
|
-
</div>
|
|
235
|
-
<div className="grid grid-cols-3 gap-2 sm:grid-cols-4">
|
|
236
|
-
{[...guideTokens, ...dataTokens].map((item) => (
|
|
237
|
-
<div
|
|
238
|
-
key={item.token}
|
|
239
|
-
className={`rounded-lg border border-ph-border p-2 ${item.text}`}
|
|
240
|
-
style={{ background: `var(${item.token})` }}
|
|
241
|
-
>
|
|
242
|
-
<div className="text-[10px] font-bold uppercase tracking-wide">{item.label}</div>
|
|
243
|
-
<div className="mt-1 truncate font-mono text-[9px] opacity-80">{item.token}</div>
|
|
244
|
-
</div>
|
|
245
|
-
))}
|
|
246
|
-
</div>
|
|
247
|
-
</div>
|
|
248
|
-
))}
|
|
249
|
-
</div>
|
|
250
|
-
</Panel>
|
|
251
|
-
|
|
252
|
-
<Panel className="space-y-4">
|
|
253
|
-
<H3>Custom Light & Dark Theme</H3>
|
|
254
|
-
<P tone="subtle">Custom themes are DaisyUI-style: define one light token block and one dark token block. Components read semantic tokens, not hardcoded colours.</P>
|
|
255
|
-
<div className="grid gap-4 lg:grid-cols-2">
|
|
256
|
-
<CodeBlock code={customThemeCode} filename="custom-theme.css" language="css" />
|
|
257
|
-
<CodeBlock code={registryCode} filename="registry.ts" />
|
|
258
|
-
</div>
|
|
259
|
-
</Panel>
|
|
260
|
-
</div>
|
|
261
|
-
);
|
|
262
|
-
}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useState } from "react";
|
|
4
|
-
import { AppLayout, Sidebar, ShowcaseWrapper, Badge, Button } from "@/components/ui";
|
|
5
|
-
import { Home, Bell, TriangleFlag, User, Search, Flash } from "iconoir-react";
|
|
6
|
-
|
|
7
|
-
const sampleGroups = [
|
|
8
|
-
{
|
|
9
|
-
label: "Main",
|
|
10
|
-
items: [
|
|
11
|
-
{ label: "Home", icon: <Home className="h-4 w-4" />, active: true },
|
|
12
|
-
{ label: "Activity", icon: <Bell className="h-4 w-4" />, badge: <Badge variant="danger" size="sm">3</Badge> },
|
|
13
|
-
{ label: "Explore", icon: <Search className="h-4 w-4" /> },
|
|
14
|
-
],
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
label: "Workspace",
|
|
18
|
-
items: [
|
|
19
|
-
{ label: "Projects", icon: <TriangleFlag className="h-4 w-4" /> },
|
|
20
|
-
{ label: "People", icon: <User className="h-4 w-4" /> },
|
|
21
|
-
{ label: "Automations", icon: <Flash className="h-4 w-4" /> },
|
|
22
|
-
],
|
|
23
|
-
},
|
|
24
|
-
];
|
|
25
|
-
|
|
26
|
-
export default function SidebarShowcase() {
|
|
27
|
-
const [collapsed, setCollapsed] = useState(false);
|
|
28
|
-
|
|
29
|
-
return (
|
|
30
|
-
<>
|
|
31
|
-
<ShowcaseWrapper
|
|
32
|
-
id="sidebar-demo"
|
|
33
|
-
title="Sidebar + AppLayout"
|
|
34
|
-
description="Full sidebar and content layout with grouped navigation, icons, badges, and collapse support."
|
|
35
|
-
code={`import { AppLayout, Sidebar } from "@xenide-io/the-old-ui-theme";
|
|
36
|
-
|
|
37
|
-
<AppLayout
|
|
38
|
-
sidebar={
|
|
39
|
-
<Sidebar
|
|
40
|
-
groups={[
|
|
41
|
-
{ label: "Main", items: [
|
|
42
|
-
{ label: "Home", icon: <Home className="h-4 w-4" />, active: true },
|
|
43
|
-
{ label: "Activity", icon: <Bell className="h-4 w-4" />, badge: <Badge>3</Badge> },
|
|
44
|
-
]},
|
|
45
|
-
]}
|
|
46
|
-
header={<div className="font-bold">My App</div>}
|
|
47
|
-
footer={<span className="text-xs text-ph-mutedtext">v1.0</span>}
|
|
48
|
-
/>
|
|
49
|
-
}
|
|
50
|
-
>
|
|
51
|
-
<div className="p-6">
|
|
52
|
-
<h1>Main content area</h1>
|
|
53
|
-
</div>
|
|
54
|
-
</AppLayout>`}
|
|
55
|
-
>
|
|
56
|
-
<div className="space-y-4">
|
|
57
|
-
<Button
|
|
58
|
-
variant="secondary"
|
|
59
|
-
size="sm"
|
|
60
|
-
onClick={() => setCollapsed(!collapsed)}
|
|
61
|
-
>
|
|
62
|
-
{collapsed ? "Expand sidebar" : "Collapse sidebar"}
|
|
63
|
-
</Button>
|
|
64
|
-
<div className="overflow-hidden rounded-lg border border-ph-border" style={{ height: 360 }}>
|
|
65
|
-
<AppLayout
|
|
66
|
-
sidebarWidth={collapsed ? 56 : 220}
|
|
67
|
-
sidebar={
|
|
68
|
-
<Sidebar
|
|
69
|
-
groups={sampleGroups}
|
|
70
|
-
collapsed={collapsed}
|
|
71
|
-
header={
|
|
72
|
-
<div className="flex items-center gap-2">
|
|
73
|
-
<div className="h-6 w-6 rounded bg-ph-brand flex items-center justify-center text-xs font-bold text-[var(--ph-on-accent)]">T</div>
|
|
74
|
-
{!collapsed && <span className="text-sm font-bold text-ph-ink">The Old UI</span>}
|
|
75
|
-
</div>
|
|
76
|
-
}
|
|
77
|
-
footer={
|
|
78
|
-
!collapsed ? <span className="text-xs text-ph-mutedtext px-2">v0.3.2</span> : null
|
|
79
|
-
}
|
|
80
|
-
/>
|
|
81
|
-
}
|
|
82
|
-
>
|
|
83
|
-
<div className="flex h-full items-center justify-center bg-ph-canvas">
|
|
84
|
-
<p className="text-sm text-ph-mutedtext">Content area — click sidebar items</p>
|
|
85
|
-
</div>
|
|
86
|
-
</AppLayout>
|
|
87
|
-
</div>
|
|
88
|
-
</div>
|
|
89
|
-
</ShowcaseWrapper>
|
|
90
|
-
|
|
91
|
-
<ShowcaseWrapper
|
|
92
|
-
id="sidebar-props"
|
|
93
|
-
title="Sidebar Props"
|
|
94
|
-
description="Sidebar component API reference."
|
|
95
|
-
code={`// SidebarGroup
|
|
96
|
-
interface SidebarGroup {
|
|
97
|
-
label: string;
|
|
98
|
-
items: SidebarItemDef[];
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// SidebarItemDef
|
|
102
|
-
interface SidebarItemDef {
|
|
103
|
-
label: string;
|
|
104
|
-
icon?: ReactNode;
|
|
105
|
-
href?: string;
|
|
106
|
-
badge?: ReactNode;
|
|
107
|
-
active?: boolean;
|
|
108
|
-
onClick?: () => void;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// SidebarProps
|
|
112
|
-
interface SidebarProps {
|
|
113
|
-
groups: SidebarGroup[];
|
|
114
|
-
className?: string;
|
|
115
|
-
header?: ReactNode;
|
|
116
|
-
footer?: ReactNode;
|
|
117
|
-
collapsed?: boolean;
|
|
118
|
-
onCollapse?: (collapsed: boolean) => void;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// AppLayoutProps
|
|
122
|
-
interface AppLayoutProps {
|
|
123
|
-
sidebar: ReactNode;
|
|
124
|
-
children: ReactNode;
|
|
125
|
-
sidebarWidth?: number;
|
|
126
|
-
className?: string;
|
|
127
|
-
}`}
|
|
128
|
-
>
|
|
129
|
-
<div className="grid gap-4 sm:grid-cols-2">
|
|
130
|
-
<div className="ph-panel space-y-2">
|
|
131
|
-
<h3 className="text-sm font-semibold text-ph-ink">AppLayout</h3>
|
|
132
|
-
<p className="text-xs text-ph-subtle">CSS grid wrapper with fixed sidebar + fluid content.</p>
|
|
133
|
-
<ul className="space-y-1 text-xs text-ph-subtle">
|
|
134
|
-
<li><span className="font-medium text-ph-ink">sidebar</span> — ReactNode for left column</li>
|
|
135
|
-
<li><span className="font-medium text-ph-ink">sidebarWidth</span> — px width (default 240)</li>
|
|
136
|
-
<li><span className="font-medium text-ph-ink">children</span> — main content area</li>
|
|
137
|
-
</ul>
|
|
138
|
-
</div>
|
|
139
|
-
<div className="ph-panel space-y-2">
|
|
140
|
-
<h3 className="text-sm font-semibold text-ph-ink">Sidebar</h3>
|
|
141
|
-
<p className="text-xs text-ph-subtle">Grouped navigation with icons, badges, collapse.</p>
|
|
142
|
-
<ul className="space-y-1 text-xs text-ph-subtle">
|
|
143
|
-
<li><span className="font-medium text-ph-ink">groups</span> — labeled sections with items</li>
|
|
144
|
-
<li><span className="font-medium text-ph-ink">collapsed</span> — icon-only mode</li>
|
|
145
|
-
<li><span className="font-medium text-ph-ink">header/footer</span> — top/bottom slots</li>
|
|
146
|
-
</ul>
|
|
147
|
-
</div>
|
|
148
|
-
</div>
|
|
149
|
-
</ShowcaseWrapper>
|
|
150
|
-
</>
|
|
151
|
-
);
|
|
152
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { ShowcaseWrapper } from "@/components/ui";
|
|
2
|
-
|
|
3
|
-
export default function StackShowcase() {
|
|
4
|
-
const code = `
|
|
5
|
-
|
|
6
|
-
<div className="rounded-xl border border-ph-border bg-ph-muted p-10">
|
|
7
|
-
<div className="relative mx-auto h-44 w-48">
|
|
8
|
-
<div className="absolute inset-3 translate-x-4 translate-y-4 rounded-xl border border-ph-border bg-ph-toolbar shadow-ph ring-8 ring-ph-muted" />
|
|
9
|
-
<div className="absolute inset-y-7 left-8 right-[-1rem] translate-x-1 rounded-xl border border-ph-border bg-ph-blue text-center text-xs font-semibold uppercase leading-[4.75rem] text-white shadow-ph ring-8 ring-ph-muted">
|
|
10
|
-
Replay
|
|
11
|
-
</div>
|
|
12
|
-
<div className="absolute inset-x-5 top-0 flex h-[5.75rem] items-center justify-center rounded-xl border border-ph-border bg-ph-surface shadow-ph-md ring-8 ring-ph-muted">
|
|
13
|
-
<span className="text-sm font-bold text-ph-brand">Trends insight</span>
|
|
14
|
-
</div>
|
|
15
|
-
</div>
|
|
16
|
-
</div>`;
|
|
17
|
-
|
|
18
|
-
return (
|
|
19
|
-
<ShowcaseWrapper title="Stacked surfaces" code={code} filename="StackExample.tsx">
|
|
20
|
-
<div className="rounded-xl border border-ph-border bg-ph-muted p-10">
|
|
21
|
-
<div className="relative mx-auto h-44 w-48">
|
|
22
|
-
<div className="absolute inset-3 translate-x-4 translate-y-4 rounded-xl border border-ph-border bg-ph-toolbar shadow-ph ring-8 ring-ph-muted" />
|
|
23
|
-
<div className="absolute inset-y-7 left-8 right-[-1rem] translate-x-1 rounded-xl border border-ph-border bg-ph-blue text-center text-xs font-semibold uppercase leading-[4.75rem] text-white shadow-ph ring-8 ring-ph-muted">
|
|
24
|
-
Replay
|
|
25
|
-
</div>
|
|
26
|
-
<div className="absolute inset-x-5 top-0 flex h-[5.75rem] items-center justify-center rounded-xl border border-ph-border bg-ph-surface shadow-ph-md ring-8 ring-ph-muted">
|
|
27
|
-
<span className="text-sm font-bold text-ph-brand">Trends insight</span>
|
|
28
|
-
</div>
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
</ShowcaseWrapper>
|
|
32
|
-
);
|
|
33
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { ComponentDocs, ShowcaseWrapper, Stepper } from "@/components/ui";
|
|
2
|
-
|
|
3
|
-
export default function StepperShowcase() {
|
|
4
|
-
const steps = [
|
|
5
|
-
{ id: "1", label: "Account", description: "Login details" },
|
|
6
|
-
{ id: "2", label: "Profile", description: "Personal info" },
|
|
7
|
-
{ id: "3", label: "Settings", description: "Preferences" },
|
|
8
|
-
{ id: "4", label: "Review", description: "Confirm" },
|
|
9
|
-
];
|
|
10
|
-
|
|
11
|
-
const code = `import { Stepper } from "the-old-ui";
|
|
12
|
-
|
|
13
|
-
<div className="ph-panel">
|
|
14
|
-
<Stepper steps={steps} currentStep={1} />
|
|
15
|
-
</div>`;
|
|
16
|
-
|
|
17
|
-
return (
|
|
18
|
-
<ShowcaseWrapper
|
|
19
|
-
title="Stepper"
|
|
20
|
-
description="Step progress indicator for setup, onboarding, and multi-stage forms."
|
|
21
|
-
code={code}
|
|
22
|
-
filename="StepperExample.tsx"
|
|
23
|
-
docs={
|
|
24
|
-
<ComponentDocs
|
|
25
|
-
rows={[
|
|
26
|
-
{ name: "steps", type: "{ id; label; description? }[]", description: "Steps shown in order." },
|
|
27
|
-
{ name: "currentStep", type: "number", description: "Zero-based active step index." },
|
|
28
|
-
]}
|
|
29
|
-
/>
|
|
30
|
-
}
|
|
31
|
-
>
|
|
32
|
-
<div className="ph-panel">
|
|
33
|
-
<Stepper steps={steps} currentStep={1} />
|
|
34
|
-
</div>
|
|
35
|
-
</ShowcaseWrapper>
|
|
36
|
-
);
|
|
37
|
-
}
|