@naeil/ui 0.1.0 → 0.3.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/CHANGELOG.md +18 -0
- package/DESIGN.md +186 -0
- package/LICENSE +21 -0
- package/README.md +85 -22
- package/THIRD_PARTY_NOTICES.md +49 -0
- package/dist/chunk-JBTDRVZ7.js +46 -0
- package/dist/chunk-QKVN6Q6C.js +438 -0
- package/dist/components/index.d.ts +87 -0
- package/dist/components/index.js +832 -0
- package/dist/components/ui/index.d.ts +105 -0
- package/dist/components/ui/index.js +736 -0
- package/dist/lib/utils.d.ts +5 -0
- package/dist/lib/utils.js +7 -0
- package/dist/source/components/footer.d.ts +15 -0
- package/dist/source/components/footer.js +172 -0
- package/dist/source/components/index.d.ts +11 -0
- package/dist/source/components/index.js +26 -0
- package/dist/source/components/locale-switcher.d.ts +17 -0
- package/dist/source/components/locale-switcher.js +66 -0
- package/dist/source/components/logo.d.ts +9 -0
- package/dist/source/components/logo.js +52 -0
- package/dist/source/components/nav.d.ts +39 -0
- package/dist/source/components/nav.js +412 -0
- package/dist/source/components/theme-provider.d.ts +6 -0
- package/dist/source/components/theme-provider.js +45 -0
- package/dist/source/components/theme-toggle-icon.d.ts +5 -0
- package/dist/source/components/theme-toggle-icon.js +62 -0
- package/dist/source/components/theme-toggle.d.ts +5 -0
- package/dist/source/components/theme-toggle.js +34 -0
- package/dist/source/components/typography.d.ts +12 -0
- package/dist/source/components/typography.js +49 -0
- package/dist/source/components/ui/avatar.d.ts +14 -0
- package/dist/source/components/ui/avatar.js +137 -0
- package/dist/source/components/ui/badge.d.ts +13 -0
- package/dist/source/components/ui/badge.js +76 -0
- package/dist/source/components/ui/button.d.ts +14 -0
- package/dist/source/components/ui/button.js +88 -0
- package/dist/source/components/ui/card.d.ts +13 -0
- package/dist/source/components/ui/card.js +135 -0
- package/dist/source/components/ui/checkbox.d.ts +7 -0
- package/dist/source/components/ui/checkbox.js +58 -0
- package/dist/source/components/ui/dialog.d.ts +20 -0
- package/dist/source/components/ui/dialog.js +182 -0
- package/dist/source/components/ui/dropdown-menu.d.ts +28 -0
- package/dist/source/components/ui/dropdown-menu.js +282 -0
- package/dist/source/components/ui/index.d.ts +19 -0
- package/dist/source/components/ui/index.js +131 -0
- package/dist/source/components/ui/input.d.ts +6 -0
- package/dist/source/components/ui/input.js +49 -0
- package/dist/source/components/ui/select.d.ts +16 -0
- package/dist/source/components/ui/select.js +197 -0
- package/dist/source/components/ui/sonner.d.ts +6 -0
- package/dist/source/components/ui/sonner.js +80 -0
- package/dist/source/components/ui/switch.d.ts +7 -0
- package/dist/source/components/ui/switch.js +54 -0
- package/dist/source/components/ui/tabs.d.ts +10 -0
- package/dist/source/components/ui/tabs.js +57 -0
- package/dist/source/components/ui/textarea.d.ts +6 -0
- package/dist/source/components/ui/textarea.js +46 -0
- package/dist/source/i18n/config.d.ts +6 -0
- package/dist/source/i18n/config.js +12 -0
- package/dist/source/i18n/routing.d.ts +371 -0
- package/dist/source/i18n/routing.js +17 -0
- package/dist/source/lib/design/modal-inert.d.ts +6 -0
- package/dist/source/lib/design/modal-inert.js +73 -0
- package/dist/source/lib/utils.d.ts +5 -0
- package/dist/source/lib/utils.js +8 -0
- package/dist/tokens.ts +217 -0
- package/docs/components/README.md +21 -0
- package/docs/components/avatar.md +47 -0
- package/docs/components/badge.md +29 -0
- package/docs/components/button.md +39 -0
- package/docs/components/card.md +32 -0
- package/docs/components/checkbox.md +35 -0
- package/docs/components/common.md +31 -0
- package/docs/components/composition.md +68 -0
- package/docs/components/dialog.md +41 -0
- package/docs/components/dropdown-menu.md +38 -0
- package/docs/components/input.md +32 -0
- package/docs/components/select.md +39 -0
- package/docs/components/sonner.md +37 -0
- package/docs/components/switch.md +33 -0
- package/docs/components/tabs.md +40 -0
- package/docs/components/textarea.md +35 -0
- package/docs/design/component-demand.md +30 -0
- package/docs/design/public-ui-final-verification.md +96 -0
- package/docs/design/public-ui-release-validation.md +86 -0
- package/docs/design/public-ui-stage3-verification.md +98 -0
- package/docs/design/public-ui-stage4-verification.md +129 -0
- package/docs/design/public-ui-support.md +40 -0
- package/docs/design/v2-migration.md +199 -0
- package/docs/package-release.md +89 -0
- package/licenses/Noto-Sans-JP-OFL.txt +93 -0
- package/licenses/Nunito-Sans-OFL.txt +93 -0
- package/licenses/Pretendard-OFL.txt +94 -0
- package/licenses/React-MIT.txt +21 -0
- package/licenses/Storybook-MIT.txt +21 -0
- package/licenses/popper-MIT.txt +25 -0
- package/licenses/react-remove-scroll-bar-MIT.txt +21 -0
- package/licenses/store2-MIT.txt +22 -0
- package/licenses/toggle-selection-MIT.txt +21 -0
- package/package.json +215 -26
- package/src/styles/components.css +276 -0
- package/src/styles/globals.css +18 -0
- package/src/styles/theme.css +293 -0
- package/messages/en.json +0 -221
- package/messages/ja.json +0 -221
- package/messages/ko.json +0 -221
- package/postcss.config.mjs +0 -7
- package/src/app/[locale]/(content)/baby-agent/page.tsx +0 -30
- package/src/app/[locale]/(content)/blog/page.tsx +0 -68
- package/src/app/[locale]/(content)/cc/page.tsx +0 -216
- package/src/app/[locale]/(content)/design/page.tsx +0 -703
- package/src/app/[locale]/(content)/layout.tsx +0 -7
- package/src/app/[locale]/(content)/pkm/page.tsx +0 -31
- package/src/app/[locale]/(content)/projects/page.tsx +0 -100
- package/src/app/[locale]/(content)/sa/page.tsx +0 -179
- package/src/app/[locale]/(landing)/page.tsx +0 -157
- package/src/app/[locale]/layout.tsx +0 -72
- package/src/app/[locale]/login/actions.ts +0 -10
- package/src/app/[locale]/login/oauth-buttons.tsx +0 -78
- package/src/app/[locale]/login/page.tsx +0 -85
- package/src/app/auth/callback/route.ts +0 -78
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +0 -32
- package/src/app/layout.tsx +0 -22
- package/src/app/sitemap.ts +0 -26
- package/src/components/accent-picker.tsx +0 -62
- package/src/components/auth-slot.tsx +0 -96
- package/src/components/footer-wrapper.tsx +0 -8
- package/src/components/footer.tsx +0 -193
- package/src/components/hero-scene.tsx +0 -948
- package/src/components/hero-section.tsx +0 -57
- package/src/components/locale-switcher.tsx +0 -74
- package/src/components/logo.tsx +0 -51
- package/src/components/nav-server-wrapper.tsx +0 -22
- package/src/components/nav-wrapper.tsx +0 -45
- package/src/components/nav.tsx +0 -550
- package/src/components/paraglider-cursor.tsx +0 -112
- package/src/components/project-layout.tsx +0 -194
- package/src/components/theme-provider.tsx +0 -10
- package/src/components/theme-toggle-icon.tsx +0 -62
- package/src/components/theme-toggle.tsx +0 -39
- package/src/components/typography.tsx +0 -27
- package/src/components/ui/avatar.tsx +0 -109
- package/src/components/ui/badge.tsx +0 -47
- package/src/components/ui/button.tsx +0 -65
- package/src/components/ui/card.tsx +0 -106
- package/src/components/ui/dialog.tsx +0 -158
- package/src/components/ui/dropdown-menu.tsx +0 -257
- package/src/components/ui/input.tsx +0 -21
- package/src/components/ui/sonner.tsx +0 -54
- package/src/components/workflow-diagram.tsx +0 -414
- package/src/i18n/config.ts +0 -8
- package/src/i18n/request.ts +0 -16
- package/src/i18n/routing.ts +0 -12
- package/src/lib/supabase/client.ts +0 -18
- package/src/lib/supabase/middleware.ts +0 -42
- package/src/lib/supabase/server.ts +0 -37
- package/src/lib/utils.ts +0 -6
- package/src/proxy.ts +0 -62
- package/src/tokens/.gitkeep +0 -0
- package/src/tokens/color.json +0 -56
- package/src/tokens/radius.json +0 -9
- package/src/tokens/semantic.json +0 -81
- package/src/tokens/shadow.json +0 -7
- package/src/tokens/spacing.json +0 -16
- package/src/tokens/typography.json +0 -34
- package/src/types/i18n.d.ts +0 -6
- package/src/utils/.gitkeep +0 -0
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { useRef, useState, useEffect } from "react";
|
|
4
|
-
import { HeroScene } from "@/components/hero-scene";
|
|
5
|
-
import { ParagliderCursor } from "@/components/paraglider-cursor";
|
|
6
|
-
|
|
7
|
-
export function HeroSection() {
|
|
8
|
-
const heroRef = useRef<HTMLElement>(null);
|
|
9
|
-
const [inView, setInView] = useState(true);
|
|
10
|
-
|
|
11
|
-
useEffect(() => {
|
|
12
|
-
const el = heroRef.current;
|
|
13
|
-
if (!el || typeof IntersectionObserver === "undefined") return;
|
|
14
|
-
|
|
15
|
-
const observer = new IntersectionObserver(
|
|
16
|
-
([entry]) => setInView(entry.isIntersecting),
|
|
17
|
-
{ rootMargin: "200px 0px", threshold: 0 },
|
|
18
|
-
);
|
|
19
|
-
observer.observe(el);
|
|
20
|
-
return () => observer.disconnect();
|
|
21
|
-
}, []);
|
|
22
|
-
|
|
23
|
-
return (
|
|
24
|
-
<section
|
|
25
|
-
ref={heroRef}
|
|
26
|
-
className="relative flex min-h-screen flex-col items-center justify-center overflow-hidden px-6"
|
|
27
|
-
>
|
|
28
|
-
{/* 3D Scene — background */}
|
|
29
|
-
<div className="pointer-events-none absolute inset-0 flex items-center justify-center opacity-60">
|
|
30
|
-
<HeroScene active={inView} />
|
|
31
|
-
</div>
|
|
32
|
-
|
|
33
|
-
{/* Paraglider follows mouse — desktop only */}
|
|
34
|
-
<div className="hidden md:block">
|
|
35
|
-
<ParagliderCursor containerRef={heroRef} />
|
|
36
|
-
</div>
|
|
37
|
-
|
|
38
|
-
{/* Scroll hint */}
|
|
39
|
-
<div className="absolute bottom-8 left-1/2 z-10 -translate-x-1/2 animate-bounce">
|
|
40
|
-
<svg
|
|
41
|
-
width="20"
|
|
42
|
-
height="20"
|
|
43
|
-
viewBox="0 0 24 24"
|
|
44
|
-
fill="none"
|
|
45
|
-
stroke="currentColor"
|
|
46
|
-
strokeWidth="1.5"
|
|
47
|
-
strokeLinecap="round"
|
|
48
|
-
strokeLinejoin="round"
|
|
49
|
-
className="text-muted-foreground/50"
|
|
50
|
-
>
|
|
51
|
-
<path d="M7 13l5 5 5-5" />
|
|
52
|
-
<path d="M7 6l5 5 5-5" />
|
|
53
|
-
</svg>
|
|
54
|
-
</div>
|
|
55
|
-
</section>
|
|
56
|
-
);
|
|
57
|
-
}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
DropdownMenu,
|
|
5
|
-
DropdownMenuTrigger,
|
|
6
|
-
DropdownMenuContent,
|
|
7
|
-
DropdownMenuItem,
|
|
8
|
-
} from "./ui/dropdown-menu";
|
|
9
|
-
|
|
10
|
-
interface LocaleSwitcherProps {
|
|
11
|
-
/** Available locales */
|
|
12
|
-
locales: Array<{ code: string; short: string; full: string }>;
|
|
13
|
-
/** Current locale */
|
|
14
|
-
currentLocale: string;
|
|
15
|
-
/** Called when user selects a new locale */
|
|
16
|
-
onLocaleChange: (locale: string) => void;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function LocaleSwitcher({
|
|
20
|
-
locales,
|
|
21
|
-
currentLocale,
|
|
22
|
-
onLocaleChange,
|
|
23
|
-
}: LocaleSwitcherProps) {
|
|
24
|
-
const current = locales.find((l) => l.code === currentLocale);
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<DropdownMenu>
|
|
28
|
-
<DropdownMenuTrigger asChild>
|
|
29
|
-
<button
|
|
30
|
-
className="text-muted-foreground hover:text-foreground flex items-center gap-1.5 text-sm transition-colors focus:outline-none"
|
|
31
|
-
aria-label={`Change language — current: ${current?.short ?? currentLocale}`}
|
|
32
|
-
>
|
|
33
|
-
<GlobeIcon />
|
|
34
|
-
{current?.short ?? currentLocale.toUpperCase()}
|
|
35
|
-
</button>
|
|
36
|
-
</DropdownMenuTrigger>
|
|
37
|
-
<DropdownMenuContent align="end" className="min-w-[120px]">
|
|
38
|
-
{locales.map((l) => (
|
|
39
|
-
<DropdownMenuItem
|
|
40
|
-
key={l.code}
|
|
41
|
-
onClick={() => onLocaleChange(l.code)}
|
|
42
|
-
className={l.code === currentLocale ? "font-medium" : ""}
|
|
43
|
-
>
|
|
44
|
-
<span className="text-muted-foreground mr-2 w-5 text-xs">
|
|
45
|
-
{l.short}
|
|
46
|
-
</span>
|
|
47
|
-
{l.full}
|
|
48
|
-
</DropdownMenuItem>
|
|
49
|
-
))}
|
|
50
|
-
</DropdownMenuContent>
|
|
51
|
-
</DropdownMenu>
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function GlobeIcon() {
|
|
56
|
-
return (
|
|
57
|
-
<svg
|
|
58
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
59
|
-
width="14"
|
|
60
|
-
height="14"
|
|
61
|
-
viewBox="0 0 24 24"
|
|
62
|
-
fill="none"
|
|
63
|
-
stroke="currentColor"
|
|
64
|
-
strokeWidth="1.5"
|
|
65
|
-
strokeLinecap="round"
|
|
66
|
-
strokeLinejoin="round"
|
|
67
|
-
className="shrink-0"
|
|
68
|
-
>
|
|
69
|
-
<circle cx="12" cy="12" r="10" />
|
|
70
|
-
<path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" />
|
|
71
|
-
<path d="M2 12h20" />
|
|
72
|
-
</svg>
|
|
73
|
-
);
|
|
74
|
-
}
|
package/src/components/logo.tsx
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
export function Logo({
|
|
2
|
-
size = 20,
|
|
3
|
-
mono = false,
|
|
4
|
-
className,
|
|
5
|
-
}: {
|
|
6
|
-
size?: number;
|
|
7
|
-
mono?: boolean;
|
|
8
|
-
className?: string;
|
|
9
|
-
}) {
|
|
10
|
-
const id = `naeil-logo-${size}`;
|
|
11
|
-
return (
|
|
12
|
-
<svg
|
|
13
|
-
width={size}
|
|
14
|
-
height={size}
|
|
15
|
-
viewBox="0 0 24 24"
|
|
16
|
-
fill="none"
|
|
17
|
-
aria-label="naeil"
|
|
18
|
-
className={className}
|
|
19
|
-
>
|
|
20
|
-
<path
|
|
21
|
-
d="M6 4 L6 16 L20 16"
|
|
22
|
-
stroke="currentColor"
|
|
23
|
-
strokeWidth="2"
|
|
24
|
-
strokeLinecap="square"
|
|
25
|
-
strokeLinejoin="miter"
|
|
26
|
-
/>
|
|
27
|
-
{mono ? (
|
|
28
|
-
<circle cx="15" cy="16" r="3.5" fill="currentColor" mask={`url(#${id})`} />
|
|
29
|
-
) : (
|
|
30
|
-
<circle cx="15" cy="16" r="3.5" fill={`url(#${id}-grad)`} mask={`url(#${id})`} />
|
|
31
|
-
)}
|
|
32
|
-
<defs>
|
|
33
|
-
{!mono && (
|
|
34
|
-
<linearGradient
|
|
35
|
-
id={`${id}-grad`}
|
|
36
|
-
x1="15"
|
|
37
|
-
y1="12.5"
|
|
38
|
-
x2="15"
|
|
39
|
-
y2="16"
|
|
40
|
-
>
|
|
41
|
-
<stop stopColor="#eab308" />
|
|
42
|
-
<stop offset="1" stopColor="#dc2626" />
|
|
43
|
-
</linearGradient>
|
|
44
|
-
)}
|
|
45
|
-
<mask id={id}>
|
|
46
|
-
<rect x="0" y="0" width="24" height="16" fill="white" />
|
|
47
|
-
</mask>
|
|
48
|
-
</defs>
|
|
49
|
-
</svg>
|
|
50
|
-
);
|
|
51
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { createClient } from "@/lib/supabase/server";
|
|
2
|
-
import { NavWrapper } from "./nav-wrapper";
|
|
3
|
-
|
|
4
|
-
export async function NavServerWrapper() {
|
|
5
|
-
const supabase = await createClient();
|
|
6
|
-
const {
|
|
7
|
-
data: { user },
|
|
8
|
-
} = await supabase.auth.getUser();
|
|
9
|
-
|
|
10
|
-
const authUser = user
|
|
11
|
-
? {
|
|
12
|
-
id: user.id,
|
|
13
|
-
name:
|
|
14
|
-
(user.user_metadata?.full_name as string) ||
|
|
15
|
-
(user.user_metadata?.name as string) ||
|
|
16
|
-
undefined,
|
|
17
|
-
email: user.email,
|
|
18
|
-
}
|
|
19
|
-
: null;
|
|
20
|
-
|
|
21
|
-
return <NavWrapper user={authUser} />;
|
|
22
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import { Nav } from "./nav";
|
|
4
|
-
import { ThemeToggleIcon } from "./theme-toggle-icon";
|
|
5
|
-
import { LocaleSwitcher } from "./locale-switcher";
|
|
6
|
-
import { AuthSlot } from "./auth-slot";
|
|
7
|
-
import { Link, usePathname, useRouter } from "@/i18n/routing";
|
|
8
|
-
import { useLocale } from "next-intl";
|
|
9
|
-
import { type Locale } from "@/i18n/config";
|
|
10
|
-
|
|
11
|
-
const LOCALE_LIST = [
|
|
12
|
-
{ code: "en", short: "EN", full: "English" },
|
|
13
|
-
{ code: "ko", short: "KO", full: "한국어" },
|
|
14
|
-
{ code: "ja", short: "JA", full: "日本語" },
|
|
15
|
-
];
|
|
16
|
-
|
|
17
|
-
interface NavWrapperProps {
|
|
18
|
-
user: { id: string; name?: string; email?: string } | null;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function NavWrapper({ user }: NavWrapperProps) {
|
|
22
|
-
const pathname = usePathname();
|
|
23
|
-
const locale = useLocale();
|
|
24
|
-
const router = useRouter();
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<Nav
|
|
28
|
-
Link={Link}
|
|
29
|
-
usePathname={() => pathname}
|
|
30
|
-
showBlog={true}
|
|
31
|
-
toolbarSlot={
|
|
32
|
-
<>
|
|
33
|
-
<ThemeToggleIcon />
|
|
34
|
-
<LocaleSwitcher
|
|
35
|
-
locales={LOCALE_LIST}
|
|
36
|
-
currentLocale={locale}
|
|
37
|
-
onLocaleChange={(l) => router.replace(pathname, { locale: l as Locale })}
|
|
38
|
-
/>
|
|
39
|
-
<div className="h-4 w-px bg-border/40" />
|
|
40
|
-
<AuthSlot user={user} />
|
|
41
|
-
</>
|
|
42
|
-
}
|
|
43
|
-
/>
|
|
44
|
-
);
|
|
45
|
-
}
|