@xenide-io/the-old-ui-theme 0.2.6 → 0.2.9

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 (110) hide show
  1. package/dist/chunk-SHF57J7U.mjs +2910 -0
  2. package/dist/index-CmS6hcUk.d.mts +753 -0
  3. package/dist/index-CmS6hcUk.d.ts +753 -0
  4. package/dist/index.d.mts +5 -755
  5. package/dist/index.d.ts +5 -755
  6. package/dist/index.js +43 -23
  7. package/dist/index.mjs +252 -2846
  8. package/dist/ui.d.mts +3 -0
  9. package/dist/ui.d.ts +3 -0
  10. package/dist/ui.js +2946 -0
  11. package/dist/ui.mjs +139 -0
  12. package/package.json +11 -3
  13. package/src/components/charts/index.ts +8 -0
  14. package/src/components/charts/ph-insight-charts.tsx +162 -0
  15. package/src/components/dashboard/DashboardFiltersBar.tsx +19 -0
  16. package/src/components/dashboard/DashboardGrid.tsx +23 -0
  17. package/src/components/dashboard/DashboardInsightPlaceholder.tsx +37 -0
  18. package/src/components/dashboard/DashboardKpiCard.tsx +25 -0
  19. package/src/components/dashboard/DashboardToolbar.tsx +23 -0
  20. package/src/components/dashboard/DashboardWell.tsx +10 -0
  21. package/src/components/dashboard/InsightMiniCard.tsx +26 -0
  22. package/src/components/dashboard/InsightShell.tsx +37 -0
  23. package/src/components/dashboard/InsightShellHeader.tsx +22 -0
  24. package/src/components/dashboard/MiniTrendBars.tsx +51 -0
  25. package/src/components/dashboard/index.ts +31 -0
  26. package/src/components/dashboard/types.ts +9 -0
  27. package/src/components/icons/IconBase.tsx +39 -0
  28. package/src/components/icons/createIconBase.tsx +27 -0
  29. package/src/components/icons/icons.tsx +367 -0
  30. package/src/components/icons/index.ts +3 -0
  31. package/src/components/sections/AccordionShowcase.tsx +45 -0
  32. package/src/components/sections/AlertShowcase.tsx +39 -0
  33. package/src/components/sections/AvatarShowcase.tsx +80 -0
  34. package/src/components/sections/BadgeShowcase.tsx +65 -0
  35. package/src/components/sections/ButtonShowcase.tsx +312 -0
  36. package/src/components/sections/CalendarShowcase.tsx +35 -0
  37. package/src/components/sections/CardShowcase.tsx +143 -0
  38. package/src/components/sections/ChartShowcase.tsx +190 -0
  39. package/src/components/sections/CodeMockupShowcase.tsx +56 -0
  40. package/src/components/sections/ColorPalette.tsx +117 -0
  41. package/src/components/sections/CommandPaletteShowcase.tsx +48 -0
  42. package/src/components/sections/CountdownShowcase.tsx +43 -0
  43. package/src/components/sections/DashboardShowcase.tsx +191 -0
  44. package/src/components/sections/DiffShowcase.tsx +70 -0
  45. package/src/components/sections/DrawerShowcase.tsx +97 -0
  46. package/src/components/sections/DropdownShowcase.tsx +100 -0
  47. package/src/components/sections/EmptyStateShowcase.tsx +50 -0
  48. package/src/components/sections/FilterChipsShowcase.tsx +50 -0
  49. package/src/components/sections/FormShowcase.tsx +126 -0
  50. package/src/components/sections/HoverCardShowcase.tsx +50 -0
  51. package/src/components/sections/IconShowcase.tsx +247 -0
  52. package/src/components/sections/IndicatorShowcase.tsx +52 -0
  53. package/src/components/sections/KbdShowcase.tsx +31 -0
  54. package/src/components/sections/ModalShowcase.tsx +210 -0
  55. package/src/components/sections/NavigationShowcase.tsx +199 -0
  56. package/src/components/sections/ProgressShowcase.tsx +85 -0
  57. package/src/components/sections/SegmentedControlShowcase.tsx +49 -0
  58. package/src/components/sections/SetupThemeShowcase.tsx +262 -0
  59. package/src/components/sections/StackShowcase.tsx +33 -0
  60. package/src/components/sections/StatShowcase.tsx +129 -0
  61. package/src/components/sections/StepperShowcase.tsx +37 -0
  62. package/src/components/sections/SwapShowcase.tsx +91 -0
  63. package/src/components/sections/TabShowcase.tsx +84 -0
  64. package/src/components/sections/TableShowcase.tsx +140 -0
  65. package/src/components/sections/TimelineShowcase.tsx +83 -0
  66. package/src/components/sections/ToastShowcase.tsx +108 -0
  67. package/src/components/sections/TooltipShowcase.tsx +44 -0
  68. package/src/components/sections/UtilityShowcase.tsx +81 -0
  69. package/src/components/ui/Accordion.tsx +77 -0
  70. package/src/components/ui/Alert.tsx +68 -0
  71. package/src/components/ui/Avatar.tsx +97 -0
  72. package/src/components/ui/Badge.tsx +55 -0
  73. package/src/components/ui/Button.tsx +110 -0
  74. package/src/components/ui/ButtonChrome.tsx +20 -0
  75. package/src/components/ui/Calendar.tsx +116 -0
  76. package/src/components/ui/Card.tsx +60 -0
  77. package/src/components/ui/ChatBubble.tsx +71 -0
  78. package/src/components/ui/CodeBlock.tsx +48 -0
  79. package/src/components/ui/CollapsibleSection.tsx +49 -0
  80. package/src/components/ui/CommandPalette.tsx +137 -0
  81. package/src/components/ui/ComponentDocs.tsx +52 -0
  82. package/src/components/ui/Drawer.tsx +71 -0
  83. package/src/components/ui/DropdownMenu.tsx +138 -0
  84. package/src/components/ui/EmptyState.tsx +33 -0
  85. package/src/components/ui/FilterChips.tsx +50 -0
  86. package/src/components/ui/HoverCard.tsx +36 -0
  87. package/src/components/ui/Indicator.tsx +61 -0
  88. package/src/components/ui/Input.tsx +359 -0
  89. package/src/components/ui/Kbd.tsx +38 -0
  90. package/src/components/ui/Modal.tsx +75 -0
  91. package/src/components/ui/Navigation.tsx +94 -0
  92. package/src/components/ui/Panel.tsx +18 -0
  93. package/src/components/ui/Progress.tsx +59 -0
  94. package/src/components/ui/Rating.tsx +65 -0
  95. package/src/components/ui/SearchInput.tsx +106 -0
  96. package/src/components/ui/SegmentedControl.tsx +44 -0
  97. package/src/components/ui/ShowcaseWrapper.tsx +136 -0
  98. package/src/components/ui/Stat.tsx +39 -0
  99. package/src/components/ui/Stepper.tsx +75 -0
  100. package/src/components/ui/Table.tsx +55 -0
  101. package/src/components/ui/Tabs.tsx +53 -0
  102. package/src/components/ui/Terminal.tsx +54 -0
  103. package/src/components/ui/ThemeDomSync.tsx +17 -0
  104. package/src/components/ui/ThemeManager.tsx +18 -0
  105. package/src/components/ui/ThemeSwitcher.tsx +46 -0
  106. package/src/components/ui/Timeline.tsx +60 -0
  107. package/src/components/ui/Toast.tsx +70 -0
  108. package/src/components/ui/Typography.tsx +129 -0
  109. package/src/components/ui/index.ts +92 -0
  110. package/src/styles/themes.css +118 -0
@@ -0,0 +1,53 @@
1
+ import { cn } from "@/lib/cn";
2
+
3
+ export interface TabItem {
4
+ value: string;
5
+ label: string;
6
+ }
7
+
8
+ export type TabsVariant = "pill" | "underline";
9
+
10
+ export interface TabsProps {
11
+ items: TabItem[];
12
+ value: string;
13
+ onChange: (value: string) => void;
14
+ variant?: TabsVariant;
15
+ className?: string;
16
+ }
17
+
18
+ export function Tabs({ items, value, onChange, variant = "pill", className }: TabsProps) {
19
+ if (variant === "underline") {
20
+ return (
21
+ <div className={cn("flex gap-6 border-b border-ph-border", className)}>
22
+ {items.map((item) => (
23
+ <button
24
+ key={item.value}
25
+ type="button"
26
+ onClick={() => onChange(item.value)}
27
+ className={cn(
28
+ "-mb-px border-b-2 pb-2 text-sm font-semibold transition",
29
+ value === item.value ? "border-ph-brand text-ph-ink" : "border-transparent text-ph-mutedtext hover:text-ph-ink"
30
+ )}
31
+ >
32
+ {item.label}
33
+ </button>
34
+ ))}
35
+ </div>
36
+ );
37
+ }
38
+
39
+ return (
40
+ <div className={cn("ph-tabs-row inline-flex", className)}>
41
+ {items.map((item) => (
42
+ <button
43
+ key={item.value}
44
+ type="button"
45
+ onClick={() => onChange(item.value)}
46
+ className={cn("ph-tab", value === item.value && "ph-tab-active")}
47
+ >
48
+ {item.label}
49
+ </button>
50
+ ))}
51
+ </div>
52
+ );
53
+ }
@@ -0,0 +1,54 @@
1
+ import type { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ import { cn } from "@/lib/cn";
3
+
4
+ export interface TerminalProps extends ComponentPropsWithoutRef<"div"> {
5
+ /** Window title */
6
+ title?: string;
7
+ /** Terminal lines — array of { text, color? } or plain strings */
8
+ lines?: Array<{ text: string; color?: string } | string>;
9
+ /** Custom content instead of lines */
10
+ children?: ReactNode;
11
+ }
12
+
13
+ export function Terminal({
14
+ title = "sandbox",
15
+ lines,
16
+ children,
17
+ className,
18
+ ...props
19
+ }: TerminalProps) {
20
+ return (
21
+ <div
22
+ className={cn(
23
+ "overflow-hidden rounded-xl border border-ph-border shadow-ph-md",
24
+ className,
25
+ )}
26
+ {...props}
27
+ >
28
+ <header className="flex items-center gap-2 border-b border-ph-border bg-ph-muted px-4 py-3">
29
+ <div className="h-3 w-3 rounded-full bg-red-400" />
30
+ <div className="h-3 w-3 rounded-full bg-amber-400" />
31
+ <div className="h-3 w-3 rounded-full bg-emerald-400" />
32
+ {title && (
33
+ <span className="text-xs font-medium text-ph-mutedtext">{title}</span>
34
+ )}
35
+ </header>
36
+ <div className="ph-code rounded-none border-x-0 border-b-0 text-[13px] leading-relaxed">
37
+ {children || (
38
+ <>
39
+ {lines?.map((line, i) => {
40
+ const text = typeof line === "string" ? line : line.text;
41
+ const color = typeof line === "string" ? undefined : line.color;
42
+ return (
43
+ <span key={i}>
44
+ <span className={color || "text-neutral-600"}>{text}</span>
45
+ {i < lines.length - 1 && <br />}
46
+ </span>
47
+ );
48
+ })}
49
+ </>
50
+ )}
51
+ </div>
52
+ </div>
53
+ );
54
+ }
@@ -0,0 +1,17 @@
1
+ "use client";
2
+
3
+ import { useLayoutEffect } from "react";
4
+ import { persistTheme, readStoredTheme } from "@/themes";
5
+
6
+ /**
7
+ * Re-applies `html[data-theme]` after React commits. Hydration can clear attributes
8
+ * that were set only by `THEME_INIT_SCRIPT` — without this sync, `:root`-scoped
9
+ * light tokens effectively win visually.
10
+ */
11
+ export function ThemeDomSync() {
12
+ useLayoutEffect(() => {
13
+ persistTheme(readStoredTheme());
14
+ }, []);
15
+
16
+ return null;
17
+ }
@@ -0,0 +1,18 @@
1
+ "use client";
2
+
3
+ import type { ReactNode } from "react";
4
+ import { useLayoutEffect } from "react";
5
+ import { persistTheme, readStoredTheme } from "@/themes";
6
+
7
+ export interface ThemeManagerProps {
8
+ children?: ReactNode;
9
+ }
10
+
11
+ /** Client wrapper that keeps html[data-theme] synced with localStorage. */
12
+ export function ThemeManager({ children }: ThemeManagerProps) {
13
+ useLayoutEffect(() => {
14
+ persistTheme(readStoredTheme());
15
+ }, []);
16
+
17
+ return <>{children}</>;
18
+ }
@@ -0,0 +1,46 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+ import { persistTheme, readStoredTheme, THEME_GROUPS, THEMES, type ThemeId } from "@/themes";
5
+ import { cn } from "@/lib/cn";
6
+
7
+ export interface ThemeSwitcherProps {
8
+ className?: string;
9
+ }
10
+
11
+ /** Colour-only theme picker — persists to localStorage and sets html[data-theme]. */
12
+ export function ThemeSwitcher({ className }: ThemeSwitcherProps) {
13
+ const [themeId, setThemeId] = useState<ThemeId>("hedgehog-light");
14
+
15
+ useEffect(() => {
16
+ const id = readStoredTheme() as ThemeId;
17
+ persistTheme(id);
18
+ setThemeId(id);
19
+ }, []);
20
+
21
+ return (
22
+ <label className={cn("flex min-w-0 items-center gap-2", className)}>
23
+ <span className="shrink-0 text-xs font-medium text-ph-mutedtext sm:text-sm">Theme</span>
24
+ <select
25
+ className="ph-select max-w-[11rem] !min-h-[2rem] py-1 pl-2.5 pr-8 text-xs sm:max-w-[14rem] sm:text-sm"
26
+ value={themeId}
27
+ aria-label="Colour theme"
28
+ onChange={(event) => {
29
+ const next = event.target.value as ThemeId;
30
+ persistTheme(next);
31
+ setThemeId(next);
32
+ }}
33
+ >
34
+ {THEME_GROUPS.map((group) => (
35
+ <optgroup key={group} label={group}>
36
+ {THEMES.filter((theme) => theme.group === group).map((theme) => (
37
+ <option key={theme.id} value={theme.id}>
38
+ {theme.name}
39
+ </option>
40
+ ))}
41
+ </optgroup>
42
+ ))}
43
+ </select>
44
+ </label>
45
+ );
46
+ }
@@ -0,0 +1,60 @@
1
+ import type { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ import { cn } from "@/lib/cn";
3
+
4
+ export interface TimelineEvent {
5
+ id: string;
6
+ title: string;
7
+ description?: string;
8
+ time?: string;
9
+ icon?: ReactNode;
10
+ color?: string;
11
+ }
12
+
13
+ export interface TimelineProps extends ComponentPropsWithoutRef<"ol"> {
14
+ events: TimelineEvent[];
15
+ /** Alternate left/right layout on large screens */
16
+ alternate?: boolean;
17
+ }
18
+
19
+ export function Timeline({
20
+ events,
21
+ alternate = false,
22
+ className,
23
+ ...props
24
+ }: TimelineProps) {
25
+ return (
26
+ <ol
27
+ className={cn("relative space-y-8", className)}
28
+ {...props}
29
+ >
30
+ {events.map((event, idx) => {
31
+ const align = alternate && idx % 2 !== 0 ? "lg:flex-row-reverse" : "";
32
+ return (
33
+ <li key={event.id} className={cn("relative flex gap-6", align)}>
34
+ <div
35
+ className={cn(
36
+ "relative z-10 flex h-12 w-12 shrink-0 items-center justify-center rounded-full ring-8 ring-ph-muted shadow-md",
37
+ event.color || "bg-ph-brand text-white",
38
+ )}
39
+ >
40
+ {event.icon}
41
+ </div>
42
+ <article className="flex-1 rounded-xl border border-ph-border bg-ph-surface p-4 shadow-ph">
43
+ <div className="flex flex-wrap items-baseline gap-3">
44
+ <h4 className="text-base font-semibold text-ph-ink">{event.title}</h4>
45
+ {event.time && (
46
+ <time className="text-[11px] font-semibold uppercase tracking-wide text-ph-mutedtext">
47
+ {event.time}
48
+ </time>
49
+ )}
50
+ </div>
51
+ {event.description && (
52
+ <p className="mt-2 text-sm text-ph-subtle">{event.description}</p>
53
+ )}
54
+ </article>
55
+ </li>
56
+ );
57
+ })}
58
+ </ol>
59
+ );
60
+ }
@@ -0,0 +1,70 @@
1
+ import type { ReactNode } from "react";
2
+ import {
3
+ IconCancel,
4
+ IconCheckCircle,
5
+ IconClose,
6
+ IconErrorOutline,
7
+ IconExclamation,
8
+ } from "@/components/icons";
9
+ import { cn } from "@/lib/cn";
10
+
11
+ export type ToastStatus = "info" | "success" | "warning" | "danger";
12
+
13
+ export interface ToastProps {
14
+ status?: ToastStatus;
15
+ title: string;
16
+ description?: string;
17
+ onDismiss?: () => void;
18
+ className?: string;
19
+ }
20
+
21
+ const statusConfig: Record<ToastStatus, { icon: typeof IconErrorOutline; color: string; bg: string } > = {
22
+ info: { icon: IconErrorOutline, color: "text-ph-info", bg: "ph-toast-info" },
23
+ success: { icon: IconCheckCircle, color: "text-ph-success", bg: "ph-toast-success" },
24
+ warning: { icon: IconExclamation, color: "text-ph-warning", bg: "ph-toast-warning" },
25
+ danger: { icon: IconCancel, color: "text-ph-danger", bg: "ph-toast-danger" },
26
+ };
27
+
28
+ export function Toast({
29
+ status = "info",
30
+ title,
31
+ description,
32
+ onDismiss,
33
+ className,
34
+ }: ToastProps) {
35
+ const config = statusConfig[status];
36
+ const Icon = config.icon;
37
+
38
+ return (
39
+ <div className={cn("ph-toast", config.bg, className)}>
40
+ <Icon className={cn("mt-0.5 h-5 w-5 shrink-0", config.color)} aria-hidden />
41
+ <div className="pr-8">
42
+ <div className="font-semibold">{title}</div>
43
+ {description && <p className="mt-1 text-xs text-ph-subtle">{description}</p>}
44
+ </div>
45
+ {onDismiss && (
46
+ <button
47
+ type="button"
48
+ aria-label={`Dismiss ${title}`}
49
+ className="absolute right-2 top-2 ph-btn ph-btn-ghost ph-btn-xs ph-btn-circle"
50
+ onClick={onDismiss}
51
+ >
52
+ <IconClose className="h-4 w-4" />
53
+ </button>
54
+ )}
55
+ </div>
56
+ );
57
+ }
58
+
59
+ export interface ToastStackProps {
60
+ children?: ReactNode;
61
+ className?: string;
62
+ }
63
+
64
+ export function ToastStack({ children, className }: ToastStackProps) {
65
+ return (
66
+ <div className={cn("ph-toast-stack", className)}>
67
+ {children}
68
+ </div>
69
+ );
70
+ }
@@ -0,0 +1,129 @@
1
+ import type { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ import { cn } from "@/lib/cn";
3
+
4
+ export type TextTone =
5
+ | "default"
6
+ | "muted"
7
+ | "subtle"
8
+ | "brand"
9
+ | "danger"
10
+ | "success"
11
+ | "warning"
12
+ | "info"
13
+ | "inherit";
14
+
15
+ export type TextWeight =
16
+ | "normal"
17
+ | "medium"
18
+ | "semibold"
19
+ | "bold"
20
+ | "extrabold";
21
+
22
+ export interface TextBaseProps {
23
+ tone?: TextTone;
24
+ weight?: TextWeight;
25
+ className?: string;
26
+ children?: ReactNode;
27
+ truncate?: boolean;
28
+ }
29
+
30
+ const toneMap: Record<TextTone, string> = {
31
+ default: "text-ph-ink",
32
+ muted: "text-ph-mutedtext",
33
+ subtle: "text-ph-subtle",
34
+ brand: "text-ph-brand",
35
+ danger: "text-ph-danger",
36
+ success: "text-ph-success",
37
+ warning: "text-ph-warning",
38
+ info: "text-ph-info",
39
+ inherit: "",
40
+ };
41
+
42
+ const weightMap: Record<TextWeight, string> = {
43
+ normal: "font-normal",
44
+ medium: "font-medium",
45
+ semibold: "font-semibold",
46
+ bold: "font-bold",
47
+ extrabold: "font-extrabold",
48
+ };
49
+
50
+ function textClass(
51
+ base: string,
52
+ tone: TextTone,
53
+ weight?: TextWeight,
54
+ truncate?: boolean,
55
+ className?: string
56
+ ) {
57
+ return cn(base, toneMap[tone], weight && weightMap[weight], truncate && "truncate", className);
58
+ }
59
+
60
+ /** Display text — largest heading, use once per page */
61
+ export function Display({
62
+ children,
63
+ tone = "default",
64
+ weight,
65
+ truncate,
66
+ className,
67
+ }: TextBaseProps) {
68
+ return <h1 className={textClass("text-4xl font-extrabold tracking-tight md:text-5xl", tone, weight, truncate, className)}>{children}</h1>;
69
+ }
70
+
71
+ /** H1 — page title */
72
+ export function H1({ children, tone = "default", weight, truncate, className }: TextBaseProps) {
73
+ return <h1 className={textClass("text-3xl font-bold tracking-tight md:text-4xl", tone, weight, truncate, className)}>{children}</h1>;
74
+ }
75
+
76
+ /** H2 — section title */
77
+ export function H2({ children, tone = "default", weight, truncate, className }: TextBaseProps) {
78
+ return <h2 className={textClass("text-2xl font-bold tracking-tight", tone, weight, truncate, className)}>{children}</h2>;
79
+ }
80
+
81
+ /** H3 — subsection title */
82
+ export function H3({ children, tone = "default", weight, truncate, className }: TextBaseProps) {
83
+ return <h3 className={textClass("text-xl font-semibold", tone, weight, truncate, className)}>{children}</h3>;
84
+ }
85
+
86
+ /** H4 — card / panel title */
87
+ export function H4({ children, tone = "default", weight, truncate, className }: TextBaseProps) {
88
+ return <h4 className={textClass("text-lg font-semibold", tone, weight, truncate, className)}>{children}</h4>;
89
+ }
90
+
91
+ /** H5 — small heading */
92
+ export function H5({ children, tone = "default", weight, truncate, className }: TextBaseProps) {
93
+ return <h5 className={textClass("text-base font-semibold", tone, weight, truncate, className)}>{children}</h5>;
94
+ }
95
+
96
+ /** Body — default paragraph text */
97
+ export function P({ children, tone = "default", weight, truncate, className }: TextBaseProps) {
98
+ return <p className={textClass("text-base leading-relaxed", tone, weight, truncate, className)}>{children}</p>;
99
+ }
100
+
101
+ /** Small body text */
102
+ export function Small({ children, tone = "default", weight, truncate, className }: TextBaseProps) {
103
+ return <span className={textClass("text-sm leading-relaxed", tone, weight, truncate, className)}>{children}</span>;
104
+ }
105
+
106
+ /** Extra small text — captions, meta */
107
+ export function Caption({ children, tone = "muted", weight, truncate, className }: TextBaseProps) {
108
+ return <span className={textClass("text-[11px] font-medium uppercase tracking-wider", tone, weight, truncate, className)}>{children}</span>;
109
+ }
110
+
111
+ /** Overline — tiny eyebrow text */
112
+ export function Overline({ children, tone = "muted", weight, truncate, className }: TextBaseProps) {
113
+ return <span className={textClass("text-[10px] font-bold uppercase tracking-[0.15em]", tone, weight, truncate, className)}>{children}</span>;
114
+ }
115
+
116
+ /** Lead — intro paragraph, larger and muted */
117
+ export function Lead({ children, tone = "subtle", weight, truncate, className }: TextBaseProps) {
118
+ return <p className={textClass("text-lg leading-relaxed", tone, weight, truncate, className)}>{children}</p>;
119
+ }
120
+
121
+ /** Mono — code, data, technical text */
122
+ export function Mono({ children, tone = "default", weight, truncate, className }: TextBaseProps) {
123
+ return <code className={textClass("text-sm font-mono leading-relaxed", tone, weight, truncate, className)}>{children}</code>;
124
+ }
125
+
126
+ /** Label — form labels, tags */
127
+ export function Label({ children, tone = "default", weight, truncate, className }: TextBaseProps) {
128
+ return <label className={textClass("text-sm font-medium", tone, weight, truncate, className)}>{children}</label>;
129
+ }
@@ -0,0 +1,92 @@
1
+ export { Button as Button, type ButtonProps as ButtonProps, type ButtonShape as ButtonShape, type ButtonSize as ButtonSize, type ButtonVariant as ButtonVariant } from "@/components/ui/Button";
2
+ export { ButtonChrome as ButtonChrome, type ButtonChromeProps as ButtonChromeProps } from "@/components/ui/ButtonChrome";
3
+ export { Alert as Alert, type AlertProps as AlertProps, type AlertStatus as AlertStatus } from "@/components/ui/Alert";
4
+ export { Badge as Badge, type BadgeProps as BadgeProps, type BadgeSize as BadgeSize, type BadgeVariant as BadgeVariant } from "@/components/ui/Badge";
5
+ export { Card as Card, type CardProps as CardProps, type CardVariant as CardVariant } from "@/components/ui/Card";
6
+ export { Drawer as Drawer, type DrawerProps as DrawerProps, type DrawerSide as DrawerSide, type DrawerSize as DrawerSize } from "@/components/ui/Drawer";
7
+ export { Kbd as Kbd, type KbdProps as KbdProps, type KbdVariant as KbdVariant } from "@/components/ui/Kbd";
8
+ export {
9
+ DropdownButton as DropdownButton,
10
+ DropdownItem as DropdownItem,
11
+ DropdownMenu as DropdownMenu,
12
+ type DropdownAlign as DropdownAlign,
13
+ type DropdownButtonProps as DropdownButtonProps,
14
+ type DropdownMenuProps as DropdownMenuProps,
15
+ } from "@/components/ui/DropdownMenu";
16
+ export {
17
+ Checkbox as Checkbox,
18
+ FileUpload as FileUpload,
19
+ Input as Input,
20
+ Radio as Radio,
21
+ Range as Range,
22
+ Select as Select,
23
+ Textarea as Textarea,
24
+ Toggle as Toggle,
25
+ type CheckboxProps as CheckboxProps,
26
+ type FileUploadProps as FileUploadProps,
27
+ type InputProps as InputProps,
28
+ type InputSize as InputSize,
29
+ type InputVariant as InputVariant,
30
+ type RadioProps as RadioProps,
31
+ type RangeProps as RangeProps,
32
+ type SelectProps as SelectProps,
33
+ type TextareaProps as TextareaProps,
34
+ type ToggleProps as ToggleProps,
35
+ } from "@/components/ui/Input";
36
+ export { Modal as Modal, type ModalProps as ModalProps, type ModalSize as ModalSize } from "@/components/ui/Modal";
37
+ export { Breadcrumbs as Breadcrumbs, Pagination as Pagination, type BreadcrumbItem as BreadcrumbItem, type BreadcrumbsProps as BreadcrumbsProps, type PaginationProps as PaginationProps } from "@/components/ui/Navigation";
38
+ export { Panel as Panel, type PanelProps as PanelProps } from "@/components/ui/Panel";
39
+ export { Rating as Rating, type RatingProps as RatingProps } from "@/components/ui/Rating";
40
+ export { SearchGroup as SearchGroup, SearchInput as SearchInput, type SearchGroupProps as SearchGroupProps, type SearchInputProps as SearchInputProps } from "@/components/ui/SearchInput";
41
+ export { Table as Table, type TableColumn as TableColumn, type TableProps as TableProps } from "@/components/ui/Table";
42
+ export { Stat as Stat, type StatProps as StatProps, type StatTone as StatTone } from "@/components/ui/Stat";
43
+ export { Toast as Toast, ToastStack as ToastStack, type ToastProps as ToastProps, type ToastStackProps as ToastStackProps, type ToastStatus as ToastStatus } from "@/components/ui/Toast";
44
+ export { Tabs as Tabs, type TabItem as TabItem, type TabsProps as TabsProps, type TabsVariant as TabsVariant } from "@/components/ui/Tabs";
45
+ export { ThemeDomSync } from "@/components/ui/ThemeDomSync";
46
+ export { ThemeManager, type ThemeManagerProps } from "@/components/ui/ThemeManager";
47
+ export { ThemeSwitcher, type ThemeSwitcherProps } from "@/components/ui/ThemeSwitcher";
48
+ export { IconBase as Icon, IconByName as IconByName, type IconProps as IconProps, type IconName as IconName } from "@/components/icons";
49
+ export { Accordion } from "@/components/ui/Accordion";
50
+ export { Stepper } from "@/components/ui/Stepper";
51
+ export { SegmentedControl } from "@/components/ui/SegmentedControl";
52
+ export { CommandPalette } from "@/components/ui/CommandPalette";
53
+ export { Calendar } from "@/components/ui/Calendar";
54
+ export { HoverCard } from "@/components/ui/HoverCard";
55
+ export { EmptyState } from "@/components/ui/EmptyState";
56
+ export { FilterChips } from "@/components/ui/FilterChips";
57
+ export { CodeBlock } from "@/components/ui/CodeBlock";
58
+ export { ComponentDocs, type ComponentDocsProps, type ComponentPropRow } from "@/components/ui/ComponentDocs";
59
+ export { ShowcaseWrapper } from "@/components/ui/ShowcaseWrapper";
60
+ export { CollapsibleSection } from "@/components/ui/CollapsibleSection";
61
+ export { Display, H1, H2, H3, H4, H5, P, Small, Caption, Overline, Lead, Mono, Label } from "@/components/ui/Typography";
62
+ export {
63
+ Avatar as Avatar,
64
+ AvatarGroup as AvatarGroup,
65
+ type AvatarProps as AvatarProps,
66
+ type AvatarSize as AvatarSize,
67
+ type AvatarStatus as AvatarStatus,
68
+ type AvatarGroupProps as AvatarGroupProps,
69
+ } from "@/components/ui/Avatar";
70
+ export {
71
+ Progress as Progress,
72
+ type ProgressProps as ProgressProps,
73
+ } from "@/components/ui/Progress";
74
+ export {
75
+ ChatBubble as ChatBubble,
76
+ type ChatBubbleProps as ChatBubbleProps,
77
+ type ChatBubbleVariant as ChatBubbleVariant,
78
+ } from "@/components/ui/ChatBubble";
79
+ export {
80
+ Terminal as Terminal,
81
+ type TerminalProps as TerminalProps,
82
+ } from "@/components/ui/Terminal";
83
+ export {
84
+ Indicator as Indicator,
85
+ type IndicatorProps as IndicatorProps,
86
+ type IndicatorPosition as IndicatorPosition,
87
+ } from "@/components/ui/Indicator";
88
+ export {
89
+ Timeline as Timeline,
90
+ type TimelineProps as TimelineProps,
91
+ type TimelineEvent as TimelineEvent,
92
+ } from "@/components/ui/Timeline";
@@ -1332,3 +1332,121 @@
1332
1332
 
1333
1333
  --ph-select-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='none' stroke='%23908caa' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round' viewBox='0 0 24 24'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
1334
1334
  }
1335
+
1336
+ [data-theme="notion"] {
1337
+ color-scheme: light;
1338
+
1339
+ --ph-canvas: #ffffff;
1340
+ --ph-surface: #f7f6f3;
1341
+ --ph-muted: #f0efeb;
1342
+ --ph-toolbar: #ebe9e4;
1343
+ --ph-border: #e2e1dd;
1344
+ --ph-border-strong: #c4c3bf;
1345
+
1346
+ --ph-text-primary: #37352f;
1347
+ --ph-text-secondary: #6b6b6b;
1348
+ --ph-text-tertiary: #9b9a97;
1349
+
1350
+ --ph-accent: #2f7cf6;
1351
+ --ph-accent-hover: #2160d4;
1352
+ --ph-blue: #2f7cf6;
1353
+ --ph-violet: #6940a5;
1354
+ --ph-purple: #6940a5;
1355
+
1356
+ --ph-success: #0f7b6c;
1357
+ --ph-warning: #dfab00;
1358
+ --ph-danger: #e03e3e;
1359
+ --ph-info: #2f7cf6;
1360
+
1361
+ --ph-text-3000: #37352f;
1362
+ --ph-primary-button-face: #ffffff;
1363
+ --ph-primary-button-border: #2160d4;
1364
+ --ph-primary-button-border-hover: #1a4fa8;
1365
+ --ph-primary-frame-bg: #2f7cf6;
1366
+ --ph-secondary-button-bg: #ffffff;
1367
+ --ph-secondary-frame-bg: #f0efeb;
1368
+ --ph-secondary-button-border: #e2e1dd;
1369
+ --ph-secondary-button-border-hover: #c4c3bf;
1370
+
1371
+ --ph-border-3000: #e2e1dd;
1372
+ --ph-chrome-inset-face-top: inset 0 1px 0 hsl(0deg 0% 100% / 0.95);
1373
+ --ph-chrome-inset-face-bottom: inset 0 -1px 0 hsl(0deg 0% 0% / 0.06);
1374
+ --ph-accent-highlight-secondary: hsla(220deg 100% 56% / 10%);
1375
+
1376
+ --ph-data-1: #2f7cf6;
1377
+ --ph-data-2: #6940a5;
1378
+ --ph-data-3: #dfab00;
1379
+ --ph-data-4: #0f7b6c;
1380
+ --ph-data-5: #e03e3e;
1381
+ --ph-data-6: #d9730d;
1382
+ --ph-data-7: #ad1a72;
1383
+
1384
+ --ph-product-session-replay: #dfab00;
1385
+ --ph-product-product-analytics: #2f7cf6;
1386
+ --ph-product-data-pipeline: #0f7b6c;
1387
+ --ph-product-feature-flags: #6940a5;
1388
+ --ph-product-experiments: #e03e3e;
1389
+ --ph-product-data-warehouse: #d9730d;
1390
+ --ph-product-surveys: #ad1a72;
1391
+
1392
+ --ph-select-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='none' stroke='%239b9a97' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round' viewBox='0 0 24 24'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
1393
+ }
1394
+
1395
+ [data-theme="notion-dark"] {
1396
+ color-scheme: dark;
1397
+
1398
+ --ph-canvas: #191919;
1399
+ --ph-surface: #212121;
1400
+ --ph-muted: #2a2a2a;
1401
+ --ph-toolbar: #333333;
1402
+ --ph-border: #373737;
1403
+ --ph-border-strong: #4a4a4a;
1404
+
1405
+ --ph-text-primary: #ffffff;
1406
+ --ph-text-secondary: #cdcdcd;
1407
+ --ph-text-tertiary: #6b6b6b;
1408
+
1409
+ --ph-accent: #4a9eff;
1410
+ --ph-accent-hover: #3381e6;
1411
+ --ph-blue: #4a9eff;
1412
+ --ph-violet: #a06cd5;
1413
+ --ph-purple: #a06cd5;
1414
+
1415
+ --ph-success: #45c4a0;
1416
+ --ph-warning: #eac54f;
1417
+ --ph-danger: #f15e5e;
1418
+ --ph-info: #4a9eff;
1419
+
1420
+ --ph-text-3000: #ffffff;
1421
+ --ph-primary-button-face: #ffffff;
1422
+ --ph-primary-button-border: #3381e6;
1423
+ --ph-primary-button-border-hover: #2663b8;
1424
+ --ph-primary-frame-bg: #4a9eff;
1425
+ --ph-secondary-button-bg: #2a2a2a;
1426
+ --ph-secondary-frame-bg: #333333;
1427
+ --ph-secondary-button-border: #373737;
1428
+ --ph-secondary-button-border-hover: #4a4a4a;
1429
+
1430
+ --ph-border-3000: #333333;
1431
+ --ph-chrome-inset-face-top: inset 0 1px 0 hsl(0deg 0% 100% / 0.06);
1432
+ --ph-chrome-inset-face-bottom: inset 0 -1px 0 hsl(0deg 0% 0% / 0.4);
1433
+ --ph-accent-highlight-secondary: hsla(215deg 100% 65% / 14%);
1434
+
1435
+ --ph-data-1: #4a9eff;
1436
+ --ph-data-2: #a06cd5;
1437
+ --ph-data-3: #eac54f;
1438
+ --ph-data-4: #45c4a0;
1439
+ --ph-data-5: #f15e5e;
1440
+ --ph-data-6: #f5a623;
1441
+ --ph-data-7: #d355a0;
1442
+
1443
+ --ph-product-session-replay: #eac54f;
1444
+ --ph-product-product-analytics: #4a9eff;
1445
+ --ph-product-data-pipeline: #45c4a0;
1446
+ --ph-product-feature-flags: #a06cd5;
1447
+ --ph-product-experiments: #f15e5e;
1448
+ --ph-product-data-warehouse: #f5a623;
1449
+ --ph-product-surveys: #d355a0;
1450
+
1451
+ --ph-select-chevron: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='none' stroke='%236b6b6b' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round' viewBox='0 0 24 24'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
1452
+ }