create-stitchkit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/LICENSE +21 -0
  3. package/README.md +35 -0
  4. package/dist/cli.js +230 -0
  5. package/package.json +50 -0
  6. package/template/README.md +69 -0
  7. package/template/_env +11 -0
  8. package/template/_env.example +12 -0
  9. package/template/_gitignore +10 -0
  10. package/template/biome.json +43 -0
  11. package/template/bun.lock +1372 -0
  12. package/template/e2e/starter.spec.ts +237 -0
  13. package/template/ecosystem.config.cjs +28 -0
  14. package/template/ecosystem.dev.config.cjs +29 -0
  15. package/template/package.json +55 -0
  16. package/template/packages/backend/package.json +31 -0
  17. package/template/packages/backend/src/cli.ts +12 -0
  18. package/template/packages/backend/src/domain/errors.ts +9 -0
  19. package/template/packages/backend/src/domain/repository/github-cache.test.ts +72 -0
  20. package/template/packages/backend/src/domain/repository/github-cache.ts +205 -0
  21. package/template/packages/backend/src/index.ts +56 -0
  22. package/template/packages/backend/src/lib/db.ts +7 -0
  23. package/template/packages/backend/src/surface.ts +13 -0
  24. package/template/packages/backend/src/tools.ts +21 -0
  25. package/template/packages/backend/src/transport/errors.ts +28 -0
  26. package/template/packages/backend/src/transport/repository-service.ts +18 -0
  27. package/template/packages/backend/tsconfig.json +8 -0
  28. package/template/packages/config/package.json +22 -0
  29. package/template/packages/config/src/server.ts +24 -0
  30. package/template/packages/config/tsconfig.json +5 -0
  31. package/template/packages/db/migrations/20260808000000_init/migration.sql +16 -0
  32. package/template/packages/db/migrations/20260808170000_repository_visibility/migration.sql +4 -0
  33. package/template/packages/db/migrations/migration_lock.toml +1 -0
  34. package/template/packages/db/package.json +29 -0
  35. package/template/packages/db/prisma.config.ts +8 -0
  36. package/template/packages/db/schema.prisma +31 -0
  37. package/template/packages/db/tsconfig.json +5 -0
  38. package/template/packages/frontend/messages/en.json +15 -0
  39. package/template/packages/frontend/messages/ru.json +15 -0
  40. package/template/packages/frontend/next.config.ts +18 -0
  41. package/template/packages/frontend/package.json +62 -0
  42. package/template/packages/frontend/postcss.config.mjs +1 -0
  43. package/template/packages/frontend/public/ASSETS.md +6 -0
  44. package/template/packages/frontend/public/favicon/mascot-stitch.png +0 -0
  45. package/template/packages/frontend/public/icons/biome.svg +1 -0
  46. package/template/packages/frontend/public/icons/bun.svg +19 -0
  47. package/template/packages/frontend/public/icons/next.svg +1 -0
  48. package/template/packages/frontend/public/icons/postgresql.svg +1 -0
  49. package/template/packages/frontend/public/icons/prisma.svg +6 -0
  50. package/template/packages/frontend/public/icons/react-query.svg +9 -0
  51. package/template/packages/frontend/public/icons/react.svg +1 -0
  52. package/template/packages/frontend/public/icons/tailwind.svg +12 -0
  53. package/template/packages/frontend/public/icons/tsconfig.svg +1 -0
  54. package/template/packages/frontend/public/icons/typescript.svg +7 -0
  55. package/template/packages/frontend/public/icons/zod.svg +1 -0
  56. package/template/packages/frontend/public/mascot-stitch.png +0 -0
  57. package/template/packages/frontend/public/theme-dark.svg +8 -0
  58. package/template/packages/frontend/public/theme-light.svg +8 -0
  59. package/template/packages/frontend/src/app/[locale]/error.tsx +19 -0
  60. package/template/packages/frontend/src/app/[locale]/layout.tsx +59 -0
  61. package/template/packages/frontend/src/app/[locale]/loading.tsx +14 -0
  62. package/template/packages/frontend/src/app/[locale]/page.tsx +44 -0
  63. package/template/packages/frontend/src/app/[locale]/starter-page.tsx +151 -0
  64. package/template/packages/frontend/src/app/[locale]/ui/[story]/page.tsx +40 -0
  65. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/account-showcase.tsx +112 -0
  66. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/admin-showcase.tsx +101 -0
  67. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/catalogue-navigation.tsx +56 -0
  68. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/catalogue-shell.tsx +51 -0
  69. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/code-foundation.tsx +35 -0
  70. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/components-story.tsx +54 -0
  71. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/data-story.tsx +126 -0
  72. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/image-preloader.tsx +8 -0
  73. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/index.ts +3 -0
  74. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/landing-sections.tsx +269 -0
  75. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/landing-showcase.tsx +159 -0
  76. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/motion-story.tsx +78 -0
  77. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/overlays-story.tsx +134 -0
  78. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/payment-showcase.tsx +82 -0
  79. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/presentation-story.tsx +68 -0
  80. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/primitives-story.tsx +267 -0
  81. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/story-page.tsx +14 -0
  82. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/theme-story-client.tsx +208 -0
  83. package/template/packages/frontend/src/app/[locale]/ui/_catalogue/theme-story.tsx +13 -0
  84. package/template/packages/frontend/src/app/[locale]/ui/layout.tsx +6 -0
  85. package/template/packages/frontend/src/app/[locale]/ui/page.tsx +10 -0
  86. package/template/packages/frontend/src/app/api/og/[locale]/[page]/route.tsx +53 -0
  87. package/template/packages/frontend/src/app/globals.css +210 -0
  88. package/template/packages/frontend/src/app/robots.ts +9 -0
  89. package/template/packages/frontend/src/app/sitemap.ts +22 -0
  90. package/template/packages/frontend/src/components/brand-mark.tsx +22 -0
  91. package/template/packages/frontend/src/components/repository-summary.tsx +107 -0
  92. package/template/packages/frontend/src/components/system-controls.tsx +92 -0
  93. package/template/packages/frontend/src/components/ui/adaptive-modal.tsx +382 -0
  94. package/template/packages/frontend/src/components/ui/animated-counter.tsx +80 -0
  95. package/template/packages/frontend/src/components/ui/avatar.tsx +46 -0
  96. package/template/packages/frontend/src/components/ui/badge.tsx +94 -0
  97. package/template/packages/frontend/src/components/ui/button-variants.ts +24 -0
  98. package/template/packages/frontend/src/components/ui/button.tsx +81 -0
  99. package/template/packages/frontend/src/components/ui/card-deck.tsx +73 -0
  100. package/template/packages/frontend/src/components/ui/card.tsx +81 -0
  101. package/template/packages/frontend/src/components/ui/charts/area-chart.tsx +167 -0
  102. package/template/packages/frontend/src/components/ui/charts/index.ts +7 -0
  103. package/template/packages/frontend/src/components/ui/checkbox.tsx +133 -0
  104. package/template/packages/frontend/src/components/ui/confirmation-modal.tsx +129 -0
  105. package/template/packages/frontend/src/components/ui/copyable-text.tsx +85 -0
  106. package/template/packages/frontend/src/components/ui/drawer.tsx +136 -0
  107. package/template/packages/frontend/src/components/ui/dropdown-menu.tsx +185 -0
  108. package/template/packages/frontend/src/components/ui/field.tsx +28 -0
  109. package/template/packages/frontend/src/components/ui/hand-drawn-icons.tsx +41 -0
  110. package/template/packages/frontend/src/components/ui/index.ts +36 -0
  111. package/template/packages/frontend/src/components/ui/input.tsx +24 -0
  112. package/template/packages/frontend/src/components/ui/label.tsx +18 -0
  113. package/template/packages/frontend/src/components/ui/otp-input.tsx +140 -0
  114. package/template/packages/frontend/src/components/ui/select.tsx +240 -0
  115. package/template/packages/frontend/src/components/ui/sidebar.tsx +343 -0
  116. package/template/packages/frontend/src/components/ui/skeleton.tsx +8 -0
  117. package/template/packages/frontend/src/components/ui/slider.tsx +31 -0
  118. package/template/packages/frontend/src/components/ui/slot-drum.tsx +50 -0
  119. package/template/packages/frontend/src/components/ui/spinner.tsx +30 -0
  120. package/template/packages/frontend/src/components/ui/switch.tsx +31 -0
  121. package/template/packages/frontend/src/components/ui/table.tsx +106 -0
  122. package/template/packages/frontend/src/components/ui/tabs.tsx +196 -0
  123. package/template/packages/frontend/src/components/ui/textarea.tsx +21 -0
  124. package/template/packages/frontend/src/components/ui/toaster.tsx +72 -0
  125. package/template/packages/frontend/src/components/ui/tooltip.tsx +31 -0
  126. package/template/packages/frontend/src/env.ts +21 -0
  127. package/template/packages/frontend/src/features/data-table/components/column-helpers.tsx +136 -0
  128. package/template/packages/frontend/src/features/data-table/components/data-table.tsx +303 -0
  129. package/template/packages/frontend/src/features/data-table/components/inline-stat.tsx +113 -0
  130. package/template/packages/frontend/src/features/data-table/components/sortable-header.tsx +33 -0
  131. package/template/packages/frontend/src/features/data-table/components/table-error.tsx +24 -0
  132. package/template/packages/frontend/src/features/data-table/components/table-filters.tsx +82 -0
  133. package/template/packages/frontend/src/features/data-table/hooks/useTableState.ts +111 -0
  134. package/template/packages/frontend/src/features/data-table/index.ts +26 -0
  135. package/template/packages/frontend/src/features/data-table/table-features.ts +26 -0
  136. package/template/packages/frontend/src/hooks/index.ts +3 -0
  137. package/template/packages/frontend/src/hooks/useInfiniteScroll.ts +67 -0
  138. package/template/packages/frontend/src/hooks/useIsTouchDevice.ts +25 -0
  139. package/template/packages/frontend/src/hooks/useMediaQuery.ts +30 -0
  140. package/template/packages/frontend/src/i18n/locales.ts +6 -0
  141. package/template/packages/frontend/src/i18n/navigation.ts +4 -0
  142. package/template/packages/frontend/src/i18n/request.ts +9 -0
  143. package/template/packages/frontend/src/i18n/routing.ts +8 -0
  144. package/template/packages/frontend/src/lib/api/client.ts +20 -0
  145. package/template/packages/frontend/src/lib/api/queries.ts +11 -0
  146. package/template/packages/frontend/src/lib/query-client.ts +20 -0
  147. package/template/packages/frontend/src/lib/realtime/repository.ts +21 -0
  148. package/template/packages/frontend/src/lib/seo/metadata.ts +50 -0
  149. package/template/packages/frontend/src/lib/seo/pages.test.ts +25 -0
  150. package/template/packages/frontend/src/lib/seo/pages.ts +107 -0
  151. package/template/packages/frontend/src/lib/utils/cn.ts +6 -0
  152. package/template/packages/frontend/src/lib/utils/format.ts +25 -0
  153. package/template/packages/frontend/src/lib/utils/index.ts +2 -0
  154. package/template/packages/frontend/src/providers/index.tsx +18 -0
  155. package/template/packages/frontend/src/providers/react-query.tsx +9 -0
  156. package/template/packages/frontend/src/providers/realtime.tsx +16 -0
  157. package/template/packages/frontend/src/proxy.ts +6 -0
  158. package/template/packages/frontend/src/theme/config.ts +20 -0
  159. package/template/packages/frontend/src/theme/transition.ts +54 -0
  160. package/template/packages/frontend/tsconfig.json +13 -0
  161. package/template/packages/shared/package.json +23 -0
  162. package/template/packages/shared/src/contracts/repository.ts +28 -0
  163. package/template/packages/shared/src/events/repository.ts +9 -0
  164. package/template/packages/shared/src/index.ts +3 -0
  165. package/template/packages/shared/src/schemas/repository.test.ts +36 -0
  166. package/template/packages/shared/src/schemas/repository.ts +28 -0
  167. package/template/packages/shared/tsconfig.json +5 -0
  168. package/template/playwright.config.ts +15 -0
  169. package/template/scripts/check-authored.ts +81 -0
  170. package/template/scripts/dev.ts +23 -0
  171. package/template/scripts/local-env.ts +12 -0
  172. package/template/scripts/runtime-smoke.ts +67 -0
  173. package/template/scripts/tooling-env.ts +15 -0
  174. package/template/tsconfig.json +13 -0
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 1309 1075" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><g id="zod-new-logo"><path d="M258.188,0.987c-51.217,0 -96.967,32.03 -114.488,80.159l-132.717,364.517c-17.279,47.47 -3.479,100.679 34.7,133.762l536.4,464.825c46.192,40.029 114.892,39.638 160.625,-0.912l520.988,-461.934c37.296,-33.071 50.687,-85.525 33.808,-132.425l-132.241,-367.412c-17.4,-48.346 -63.259,-80.58 -114.638,-80.58l-792.438,0.001Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/><g><clipPath id="_clip2"><path d="M302.446,646.246l202.858,176.987l617.229,-391.504c26.467,-17.8 37.442,-51.312 26.642,-81.325l-64.617,-179.533l-782.112,475.375Z" clip-rule="nonzero"/></clipPath><g clip-path="url(#_clip2)"><use xlink:href="#_Image3" x="302.5" y="171.038" width="850.848px" height="652.362px" transform="matrix(0.999821,0,0,0.999024,0,0)"/></g></g><path d="M1081.94,163.608l65.675,182.463l-987.525,-0l66.537,-182.75c11.892,-32.658 42.821,-54.488 77.575,-54.754l698.796,-0c35.329,-0.267 66.979,21.8 78.942,55.041" style="fill:#fff;"/><g><clipPath id="_clip4"><path d="M302.446,646.246l311.121,271.446c24.787,21.625 61.779,21.483 86.4,-0.334l305.912,-271.112l-703.433,-0Z" clip-rule="nonzero"/></clipPath><g clip-path="url(#_clip4)"><use xlink:href="#_Image5" x="302.689" y="647.212" width="703.433px" height="287.57px" transform="matrix(0.999195,0,0,0.998508,0,0)"/></g></g></g><defs><linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-1073.35,1073.35,-0,654.163,1074.34)"><stop offset="0" style="stop-color:#3a6aff;stop-opacity:1"/><stop offset="1" style="stop-color:#45a9ff;stop-opacity:1"/></linearGradient><image id="_Image3" width="851px" height="653px" xlink:href="data:image/png;base64,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"/><image id="_Image5" width="704px" height="288px" xlink:href="data:image/png;base64,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"/></defs></svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 360">
2
+ <rect width="640" height="360" rx="32" fill="#111214"/>
3
+ <rect x="40" y="40" width="560" height="280" rx="24" fill="#18191c" stroke="#3f3f46"/>
4
+ <circle cx="104" cy="104" r="24" fill="#f4f4f5"/>
5
+ <rect x="152" y="88" width="240" height="16" rx="8" fill="#f4f4f5"/>
6
+ <rect x="152" y="116" width="160" height="12" rx="6" fill="#71717a"/>
7
+ <rect x="80" y="176" width="480" height="104" rx="20" fill="#27272a"/>
8
+ </svg>
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 360">
2
+ <rect width="640" height="360" rx="32" fill="#f4f4f5"/>
3
+ <rect x="40" y="40" width="560" height="280" rx="24" fill="#ffffff" stroke="#d4d4d8"/>
4
+ <circle cx="104" cy="104" r="24" fill="#18181b"/>
5
+ <rect x="152" y="88" width="240" height="16" rx="8" fill="#18181b"/>
6
+ <rect x="152" y="116" width="160" height="12" rx="6" fill="#a1a1aa"/>
7
+ <rect x="80" y="176" width="480" height="104" rx="20" fill="#f4f4f5"/>
8
+ </svg>
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+
3
+ import { Button, Card, CardContent } from '@/components/ui';
4
+
5
+ export default function ErrorPage({ reset }: { reset: () => void }) {
6
+ return (
7
+ <main className='grid min-h-dvh place-items-center p-6'>
8
+ <Card className='max-w-lg'>
9
+ <CardContent className='space-y-4 py-10 text-center'>
10
+ <h1 className='text-2xl font-medium'>The project surface could not load</h1>
11
+ <p className='text-sm text-muted-foreground'>
12
+ The error boundary kept the shell alive.
13
+ </p>
14
+ <Button onClick={reset}>Try again</Button>
15
+ </CardContent>
16
+ </Card>
17
+ </main>
18
+ );
19
+ }
@@ -0,0 +1,59 @@
1
+ import { ThemeProvider } from '@wrksz/themes/next';
2
+ import type { Metadata } from 'next';
3
+ import { Montserrat } from 'next/font/google';
4
+ import { notFound } from 'next/navigation';
5
+ import { NextIntlClientProvider } from 'next-intl';
6
+ import { getMessages } from 'next-intl/server';
7
+ import type { ReactNode } from 'react';
8
+ import { env } from '@/env';
9
+ import { LocaleSchema } from '@/i18n/locales';
10
+ import { routing } from '@/i18n/routing';
11
+ import { createPageMetadata } from '@/lib/seo/metadata';
12
+ import { SITE_NAME } from '@/lib/seo/pages';
13
+ import { Providers } from '@/providers';
14
+ import { themeProviderConfig } from '@/theme/config';
15
+ import '../globals.css';
16
+
17
+ const montserrat = Montserrat({
18
+ subsets: ['latin', 'cyrillic'],
19
+ weight: ['300', '400', '500', '600'],
20
+ variable: '--font-montserrat',
21
+ display: 'swap',
22
+ });
23
+
24
+ export const metadata: Metadata = {
25
+ metadataBase: new URL(env.NEXT_PUBLIC_WEB_URL),
26
+ ...createPageMetadata('home', 'en'),
27
+ title: SITE_NAME,
28
+ icons: { icon: [{ url: '/favicon/mascot-stitch.png', type: 'image/png' }] },
29
+ };
30
+
31
+ export function generateStaticParams() {
32
+ return routing.locales.map((locale) => ({ locale }));
33
+ }
34
+
35
+ export default async function LocaleLayout({
36
+ children,
37
+ params,
38
+ }: {
39
+ children: ReactNode;
40
+ params: Promise<{ locale: string }>;
41
+ }) {
42
+ const { locale } = await params;
43
+ if (!LocaleSchema.safeParse(locale).success) notFound();
44
+ const messages = await getMessages();
45
+
46
+ return (
47
+ <html lang={locale} suppressHydrationWarning>
48
+ <body
49
+ className={`${montserrat.variable} min-h-dvh bg-background font-sans text-foreground antialiased`}
50
+ >
51
+ <ThemeProvider {...themeProviderConfig}>
52
+ <NextIntlClientProvider messages={messages}>
53
+ <Providers>{children}</Providers>
54
+ </NextIntlClientProvider>
55
+ </ThemeProvider>
56
+ </body>
57
+ </html>
58
+ );
59
+ }
@@ -0,0 +1,14 @@
1
+ import { Skeleton } from '@/components/ui';
2
+
3
+ export default function Loading() {
4
+ return (
5
+ <main className='mx-auto min-h-dvh w-full max-w-7xl space-y-8 px-5 py-12 lg:px-8'>
6
+ <Skeleton className='h-12 w-64' />
7
+ <Skeleton className='h-72 w-full' />
8
+ <div className='grid gap-3 md:grid-cols-2'>
9
+ <Skeleton className='h-52' />
10
+ <Skeleton className='h-52' />
11
+ </div>
12
+ </main>
13
+ );
14
+ }
@@ -0,0 +1,44 @@
1
+ import { dehydrate, HydrationBoundary } from '@tanstack/react-query';
2
+ import type { Metadata } from 'next';
3
+ import { getTranslations } from 'next-intl/server';
4
+ import { LocaleSchema } from '@/i18n/locales';
5
+ import { createServerRepositoryApi } from '@/lib/api/client';
6
+ import { useRepository } from '@/lib/api/queries';
7
+ import { getQueryClient } from '@/lib/query-client';
8
+ import { createPageMetadata } from '@/lib/seo/metadata';
9
+ import { StarterPage } from './starter-page';
10
+
11
+ export const dynamic = 'force-dynamic';
12
+
13
+ export async function generateMetadata({
14
+ params,
15
+ }: {
16
+ params: Promise<{ locale: string }>;
17
+ }): Promise<Metadata> {
18
+ const { locale } = await params;
19
+ return createPageMetadata('home', LocaleSchema.parse(locale));
20
+ }
21
+
22
+ export default async function Page({ params }: { params: Promise<{ locale: string }> }) {
23
+ const { locale } = await params;
24
+ const appLocale = LocaleSchema.parse(locale);
25
+ const queryClient = getQueryClient();
26
+ const api = createServerRepositoryApi();
27
+ const t = await getTranslations('App');
28
+ await queryClient.prefetchQuery({
29
+ queryKey: useRepository.getKey(),
30
+ queryFn: () => api.read(),
31
+ });
32
+
33
+ return (
34
+ <HydrationBoundary state={dehydrate(queryClient)}>
35
+ <StarterPage
36
+ applicationName={t('title')}
37
+ applicationDescription={t('description')}
38
+ heroTitle={t('heroTitle')}
39
+ catalogueLabel={t('ui')}
40
+ locale={appLocale}
41
+ />
42
+ </HydrationBoundary>
43
+ );
44
+ }
@@ -0,0 +1,151 @@
1
+ import { IconArrowUpRight } from '@tabler/icons-react';
2
+ import Image from 'next/image';
3
+ import { BrandMark } from '@/components/brand-mark';
4
+ import { RepositorySummary } from '@/components/repository-summary';
5
+ import { LanguageSwitcher, ThemeToggle } from '@/components/system-controls';
6
+ import { buttonVariants } from '@/components/ui';
7
+ import type { AppLocale } from '@/i18n/locales';
8
+ import { Link } from '@/i18n/navigation';
9
+ import { absoluteSiteUrl } from '@/lib/seo/metadata';
10
+ import { getSeoPage, SITE_NAME } from '@/lib/seo/pages';
11
+ import { cn } from '@/lib/utils/cn';
12
+
13
+ interface StarterPageProps {
14
+ applicationName: string;
15
+ applicationDescription: string;
16
+ heroTitle: string;
17
+ catalogueLabel: string;
18
+ locale: AppLocale;
19
+ }
20
+
21
+ const architecture = [
22
+ {
23
+ name: 'Frontend',
24
+ detail: 'Web',
25
+ technologies: [
26
+ { name: 'Next.js', icon: '/icons/next.svg' },
27
+ { name: 'React', icon: '/icons/react.svg' },
28
+ { name: 'Tailwind CSS', icon: '/icons/tailwind.svg' },
29
+ { name: 'React Query', icon: '/icons/react-query.svg' },
30
+ ],
31
+ },
32
+ {
33
+ name: 'Backend',
34
+ detail: 'API',
35
+ technologies: [
36
+ { name: 'Stitchkit', icon: '/mascot-stitch.png' },
37
+ { name: 'Bun', icon: '/icons/bun.svg' },
38
+ { name: 'Zod', icon: '/icons/zod.svg' },
39
+ ],
40
+ },
41
+ {
42
+ name: 'Data',
43
+ detail: 'Storage',
44
+ technologies: [
45
+ { name: 'PostgreSQL', icon: '/icons/postgresql.svg' },
46
+ { name: 'Prisma', icon: '/icons/prisma.svg', invertInDark: true },
47
+ ],
48
+ },
49
+ {
50
+ name: 'Tooling',
51
+ detail: 'Quality',
52
+ technologies: [
53
+ { name: 'TypeScript', icon: '/icons/typescript.svg' },
54
+ { name: 'TSConfig', icon: '/icons/tsconfig.svg' },
55
+ { name: 'Biome', icon: '/icons/biome.svg' },
56
+ ],
57
+ },
58
+ ];
59
+
60
+ export function StarterPage({
61
+ applicationName,
62
+ applicationDescription,
63
+ heroTitle,
64
+ catalogueLabel,
65
+ locale,
66
+ }: StarterPageProps) {
67
+ const homeSeo = getSeoPage('home', locale);
68
+ const structuredData = {
69
+ '@context': 'https://schema.org',
70
+ '@type': 'SoftwareApplication',
71
+ name: SITE_NAME,
72
+ applicationCategory: 'DeveloperApplication',
73
+ operatingSystem: 'Web',
74
+ url: absoluteSiteUrl(`/${locale}`),
75
+ description: homeSeo.description,
76
+ };
77
+
78
+ return (
79
+ <main className='h-svh overflow-y-auto bg-background lg:overflow-hidden'>
80
+ <script type='application/ld+json'>{JSON.stringify(structuredData)}</script>
81
+ <div className='mx-auto flex min-h-full w-full max-w-7xl flex-col px-5 lg:h-full lg:px-8'>
82
+ <header className='flex h-16 shrink-0 items-center justify-between'>
83
+ <div className='flex min-w-0 items-center gap-2 font-medium'>
84
+ <BrandMark priority />
85
+ <span className='truncate'>{applicationName}</span>
86
+ </div>
87
+ <div className='flex items-center gap-2'>
88
+ <LanguageSwitcher />
89
+ <ThemeToggle />
90
+ <Link
91
+ aria-label={catalogueLabel}
92
+ className={cn(buttonVariants({ variant: 'outline', size: 'sm' }))}
93
+ href='/ui'
94
+ >
95
+ <span className='hidden sm:inline'>{catalogueLabel}</span>
96
+ <IconArrowUpRight />
97
+ </Link>
98
+ </div>
99
+ </header>
100
+
101
+ <div className='flex flex-1 flex-col items-center justify-center py-8 text-center lg:min-h-0 lg:py-5'>
102
+ <section className='flex w-full min-w-0 flex-col items-center'>
103
+ <h1 className='max-w-4xl font-display text-5xl font-medium tracking-tight sm:text-6xl lg:text-7xl lg:leading-[0.96]'>
104
+ {heroTitle}
105
+ </h1>
106
+ <p className='mt-5 max-w-3xl text-base leading-7 text-muted-foreground lg:text-lg'>
107
+ {applicationDescription}
108
+ </p>
109
+
110
+ <div className='mt-8 w-full max-w-4xl'>
111
+ <div className='grid grid-cols-2 overflow-hidden rounded-xl border border-border bg-card text-left sm:grid-cols-4'>
112
+ {architecture.map((item) => (
113
+ <div
114
+ className='min-w-0 border-border px-3 py-3 odd:border-r first:border-b second:border-b sm:border-r sm:border-b-0 sm:last:border-r-0 sm:px-4'
115
+ key={item.name}
116
+ >
117
+ <div className='flex min-w-0 items-baseline gap-2'>
118
+ <p className='truncate text-sm font-medium'>{item.name}</p>
119
+ <p className='text-xs text-muted-foreground'>{item.detail}</p>
120
+ </div>
121
+ <div className='mt-2 flex min-h-6 items-center gap-2'>
122
+ {item.technologies.map((technology) => (
123
+ <Image
124
+ alt={technology.name}
125
+ className={
126
+ technology.invertInDark
127
+ ? 'technology-icon-invert-dark size-5 shrink-0 object-contain'
128
+ : 'size-5 shrink-0 object-contain'
129
+ }
130
+ height={20}
131
+ key={technology.icon}
132
+ src={technology.icon}
133
+ title={technology.name}
134
+ width={20}
135
+ />
136
+ ))}
137
+ </div>
138
+ </div>
139
+ ))}
140
+ </div>
141
+ </div>
142
+
143
+ <div className='mt-5 w-full'>
144
+ <RepositorySummary />
145
+ </div>
146
+ </section>
147
+ </div>
148
+ </div>
149
+ </main>
150
+ );
151
+ }
@@ -0,0 +1,40 @@
1
+ import type { Metadata } from 'next';
2
+ import { notFound } from 'next/navigation';
3
+ import { LocaleSchema } from '@/i18n/locales';
4
+ import { createPageMetadata } from '@/lib/seo/metadata';
5
+ import { getSeoPage } from '@/lib/seo/pages';
6
+ import { isStoryId, StoryHeader, StoryPage, storyIds } from '../_catalogue';
7
+
8
+ export function generateStaticParams() {
9
+ return storyIds.map((story) => ({ story }));
10
+ }
11
+
12
+ export async function generateMetadata({
13
+ params,
14
+ }: {
15
+ params: Promise<{ locale: string; story: string }>;
16
+ }): Promise<Metadata> {
17
+ const { locale, story } = await params;
18
+ if (!isStoryId(story)) notFound();
19
+ return createPageMetadata(story, LocaleSchema.parse(locale));
20
+ }
21
+
22
+ export default async function UiStoryPage({
23
+ params,
24
+ }: {
25
+ params: Promise<{ locale: string; story: string }>;
26
+ }) {
27
+ const { locale, story } = await params;
28
+ if (!isStoryId(story)) notFound();
29
+ const metadata = getSeoPage(story, LocaleSchema.parse(locale));
30
+ return (
31
+ <>
32
+ <StoryHeader
33
+ title={metadata.title}
34
+ description={metadata.description}
35
+ eyebrow={metadata.eyebrow}
36
+ />
37
+ <StoryPage story={story} />
38
+ </>
39
+ );
40
+ }
@@ -0,0 +1,112 @@
1
+ 'use client';
2
+
3
+ import { IconBrandGithub, IconDeviceLaptop, IconMail, IconUser } from '@tabler/icons-react';
4
+ import { useState } from 'react';
5
+ import {
6
+ AdaptiveModal,
7
+ Avatar,
8
+ AvatarFallback,
9
+ Badge,
10
+ Button,
11
+ Card,
12
+ CardContent,
13
+ CardHeader,
14
+ CardTitle,
15
+ Field,
16
+ Input,
17
+ OtpInput,
18
+ Tabs,
19
+ TabsContent,
20
+ TabsList,
21
+ TabsTrigger,
22
+ } from '@/components/ui';
23
+
24
+ export function AccountShowcase() {
25
+ const [otp, setOtp] = useState('');
26
+ const [profileOpen, setProfileOpen] = useState(false);
27
+ return (
28
+ <div className='grid gap-4 lg:grid-cols-2'>
29
+ <Card>
30
+ <CardHeader>
31
+ <CardTitle>Sign in</CardTitle>
32
+ </CardHeader>
33
+ <CardContent className='grid gap-4'>
34
+ <Field label='Email' htmlFor='catalogue-email'>
35
+ <Input id='catalogue-email' type='email' placeholder='you@example.com' />
36
+ </Field>
37
+ <Button variant='primary'>
38
+ <IconMail /> Continue with email
39
+ </Button>
40
+ <Button variant='outline'>
41
+ <IconBrandGithub /> Continue with provider
42
+ </Button>
43
+ <OtpInput value={otp} onChange={setOtp} />
44
+ </CardContent>
45
+ </Card>
46
+ <Card>
47
+ <CardHeader>
48
+ <div className='flex items-center gap-3'>
49
+ <Avatar>
50
+ <AvatarFallback>
51
+ <IconUser />
52
+ </AvatarFallback>
53
+ </Avatar>
54
+ <div>
55
+ <CardTitle>Account workspace</CardTitle>
56
+ <p className='text-sm text-muted-foreground'>
57
+ Controlled presentation, no fake authentication
58
+ </p>
59
+ </div>
60
+ </div>
61
+ </CardHeader>
62
+ <CardContent>
63
+ <Tabs defaultValue='profile'>
64
+ <TabsList>
65
+ <TabsTrigger value='profile'>Profile</TabsTrigger>
66
+ <TabsTrigger value='sessions'>Sessions</TabsTrigger>
67
+ </TabsList>
68
+ <TabsContent className='space-y-3 pt-4' value='profile'>
69
+ <Field label='Display name' htmlFor='display-name'>
70
+ <Input id='display-name' defaultValue='Product builder' />
71
+ </Field>
72
+ <Button onClick={() => setProfileOpen(true)}>Edit profile</Button>
73
+ </TabsContent>
74
+ <TabsContent className='pt-4' value='sessions'>
75
+ <div className='flex items-center justify-between rounded-xl border border-border p-3'>
76
+ <div className='flex items-center gap-3'>
77
+ <IconDeviceLaptop />
78
+ <div>
79
+ <p className='text-sm font-medium'>Current browser</p>
80
+ <p className='text-xs text-muted-foreground'>Active now</p>
81
+ </div>
82
+ </div>
83
+ <Badge variant='success'>Current</Badge>
84
+ </div>
85
+ </TabsContent>
86
+ </Tabs>
87
+ </CardContent>
88
+ </Card>
89
+ <AdaptiveModal
90
+ isOpen={profileOpen}
91
+ onClose={() => setProfileOpen(false)}
92
+ title='Edit profile'
93
+ desktopWidth='sm'
94
+ mobileVariant='sheet'
95
+ footer={
96
+ <Button className='w-full' onClick={() => setProfileOpen(false)}>
97
+ Save changes
98
+ </Button>
99
+ }
100
+ >
101
+ <div className='grid gap-4 p-4 pt-1'>
102
+ <Field label='Display name' htmlFor='profile-modal-name'>
103
+ <Input id='profile-modal-name' defaultValue='Product builder' />
104
+ </Field>
105
+ <Field label='Email' htmlFor='profile-modal-email'>
106
+ <Input id='profile-modal-email' type='email' defaultValue='builder@example.com' />
107
+ </Field>
108
+ </div>
109
+ </AdaptiveModal>
110
+ </div>
111
+ );
112
+ }