create-cogitato 0.0.0-stage → 0.2.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 (51) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +12 -2
  3. package/bin/create-cogitato.js +4 -0
  4. package/dist/create.d.ts +28 -0
  5. package/dist/create.js +100 -0
  6. package/dist/create.js.map +1 -0
  7. package/package.json +38 -3
  8. package/template/.claude/settings.json +16 -0
  9. package/template/CLAUDE.md +45 -0
  10. package/template/README.md +32 -0
  11. package/template/_gitignore +3 -0
  12. package/template/_pnpm-workspace.yaml +4 -0
  13. package/template/design/contract/components/banner.json +22 -0
  14. package/template/design/contract/components/button.json +27 -0
  15. package/template/design/contract/components/card.json +18 -0
  16. package/template/design/contract/components/input.json +27 -0
  17. package/template/design/contract/components/stack.json +16 -0
  18. package/template/design/contract/components/text.json +19 -0
  19. package/template/design/contract/contract.json +12 -0
  20. package/template/design/contract/decisions.json +41 -0
  21. package/template/design/contract/gaps.json +16 -0
  22. package/template/design/contract/rules.md +19 -0
  23. package/template/design/contract/tokens.json +126 -0
  24. package/template/kit/Banner.module.css +48 -0
  25. package/template/kit/Banner.tsx +40 -0
  26. package/template/kit/Button.module.css +86 -0
  27. package/template/kit/Button.tsx +43 -0
  28. package/template/kit/Card.module.css +22 -0
  29. package/template/kit/Card.tsx +18 -0
  30. package/template/kit/Input.module.css +43 -0
  31. package/template/kit/Input.tsx +52 -0
  32. package/template/kit/Stack.tsx +30 -0
  33. package/template/kit/Text.module.css +32 -0
  34. package/template/kit/Text.tsx +19 -0
  35. package/template/package.json +25 -0
  36. package/template/prototypes/checkout/.env.example +2 -0
  37. package/template/prototypes/checkout/design/flows.json +121 -0
  38. package/template/prototypes/checkout/index.html +12 -0
  39. package/template/prototypes/checkout/package.json +28 -0
  40. package/template/prototypes/checkout/src/components/Page.module.css +5 -0
  41. package/template/prototypes/checkout/src/components/Page.tsx +30 -0
  42. package/template/prototypes/checkout/src/flows.ts +18 -0
  43. package/template/prototypes/checkout/src/main.tsx +11 -0
  44. package/template/prototypes/checkout/src/mocks/cart.ts +43 -0
  45. package/template/prototypes/checkout/src/screens/cart/screen.tsx +67 -0
  46. package/template/prototypes/checkout/src/screens/checkout/confirmation/screen.tsx +34 -0
  47. package/template/prototypes/checkout/src/screens/checkout/payment/screen.tsx +77 -0
  48. package/template/prototypes/checkout/src/screens/checkout/shipping/screen.tsx +60 -0
  49. package/template/prototypes/checkout/src/styles/global.css +12 -0
  50. package/template/prototypes/checkout/tsconfig.json +17 -0
  51. package/template/prototypes/checkout/vite.config.ts +7 -0
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "my-design",
3
+ "private": true,
4
+ "version": "0.1.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "kit dev",
8
+ "build": "pnpm -r --filter \"./prototypes/**\" build",
9
+ "validate": "kit validate",
10
+ "kit": "kit"
11
+ },
12
+ "dependencies": {
13
+ "react": "^18.3.1",
14
+ "react-dom": "^18.3.1"
15
+ },
16
+ "devDependencies": {
17
+ "@cogitato/contract": "^0.2.0",
18
+ "@cogitato/kit-cli": "^0.2.0",
19
+ "@cogitato/kit-mcp": "^0.2.0",
20
+ "@types/react": "^18.3.12",
21
+ "@types/react-dom": "^18.3.1",
22
+ "playwright": "^1.64.1",
23
+ "typescript": "^5.7.2"
24
+ }
25
+ }
@@ -0,0 +1,2 @@
1
+ # Environment variables this prototype needs. `kit doctor` checks that each one is set in .env.
2
+ # The Acme Shop prototype needs none.
@@ -0,0 +1,121 @@
1
+ {
2
+ "$schema": "../node_modules/@cogitato/contract/schema/flows.schema.json",
3
+ "schemaVersion": 1,
4
+ "screens": [
5
+ {
6
+ "id": "cart",
7
+ "route": "/cart",
8
+ "title": "Cart",
9
+ "states": [
10
+ {
11
+ "id": "default",
12
+ "fixture": "default",
13
+ "title": "Two items"
14
+ },
15
+ {
16
+ "id": "empty",
17
+ "fixture": "empty",
18
+ "title": "Empty cart"
19
+ }
20
+ ]
21
+ },
22
+ {
23
+ "id": "checkout.shipping",
24
+ "route": "/checkout/shipping",
25
+ "title": "Shipping",
26
+ "states": [
27
+ {
28
+ "id": "default",
29
+ "fixture": "default",
30
+ "title": "Empty form"
31
+ },
32
+ {
33
+ "id": "invalid-address",
34
+ "fixture": "invalid-address",
35
+ "title": "Address not found"
36
+ }
37
+ ]
38
+ },
39
+ {
40
+ "id": "checkout.payment",
41
+ "route": "/checkout/payment",
42
+ "title": "Payment",
43
+ "states": [
44
+ {
45
+ "id": "default",
46
+ "fixture": "default",
47
+ "title": "Empty form"
48
+ },
49
+ {
50
+ "id": "processing",
51
+ "fixture": "processing",
52
+ "title": "Processing"
53
+ },
54
+ {
55
+ "id": "card-declined",
56
+ "fixture": "card-declined",
57
+ "title": "Card declined"
58
+ }
59
+ ]
60
+ },
61
+ {
62
+ "id": "checkout.confirmation",
63
+ "route": "/checkout/confirmation",
64
+ "title": "Order confirmed",
65
+ "states": [
66
+ {
67
+ "id": "default",
68
+ "fixture": "default",
69
+ "title": "Confirmed"
70
+ }
71
+ ]
72
+ }
73
+ ],
74
+ "flows": [
75
+ {
76
+ "id": "checkout",
77
+ "title": "Checkout",
78
+ "nodes": [
79
+ "cart.default",
80
+ "checkout.shipping.default",
81
+ "checkout.shipping.invalid-address",
82
+ "checkout.payment.default",
83
+ "checkout.payment.processing",
84
+ "checkout.payment.card-declined",
85
+ "checkout.confirmation.default"
86
+ ],
87
+ "edges": [
88
+ {
89
+ "from": "cart.default",
90
+ "to": "checkout.shipping.default",
91
+ "label": "Check out"
92
+ },
93
+ {
94
+ "from": "checkout.shipping.default",
95
+ "to": "checkout.shipping.invalid-address",
96
+ "label": "Continue, address not found"
97
+ },
98
+ {
99
+ "from": "checkout.shipping.default",
100
+ "to": "checkout.payment.default",
101
+ "label": "Continue"
102
+ },
103
+ {
104
+ "from": "checkout.payment.default",
105
+ "to": "checkout.payment.processing",
106
+ "label": "Pay now"
107
+ },
108
+ {
109
+ "from": "checkout.payment.processing",
110
+ "to": "checkout.payment.card-declined",
111
+ "label": "Declined"
112
+ },
113
+ {
114
+ "from": "checkout.payment.processing",
115
+ "to": "checkout.confirmation.default",
116
+ "label": "Approved"
117
+ }
118
+ ]
119
+ }
120
+ ]
121
+ }
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Acme Shop prototype</title>
7
+ </head>
8
+ <body>
9
+ <div id="root"></div>
10
+ <script type="module" src="/src/main.tsx"></script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "checkout",
3
+ "private": true,
4
+ "version": "0.1.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "kit export-flows && vite",
8
+ "build": "kit validate && kit export-flows && tsc --noEmit && vite build && kit snapshots",
9
+ "typecheck": "tsc --noEmit",
10
+ "kit": "kit"
11
+ },
12
+ "dependencies": {
13
+ "@cogitato/runtime": "^0.2.0",
14
+ "react": "^18.3.1",
15
+ "react-dom": "^18.3.1",
16
+ "react-router-dom": "^6.28.0"
17
+ },
18
+ "devDependencies": {
19
+ "@cogitato/contract": "^0.2.0",
20
+ "@cogitato/kit-cli": "^0.2.0",
21
+ "@types/react": "^18.3.12",
22
+ "@types/react-dom": "^18.3.1",
23
+ "@vitejs/plugin-react": "^4.3.4",
24
+ "playwright": "^1.64.1",
25
+ "typescript": "^5.7.2",
26
+ "vite": "^6.0.7"
27
+ }
28
+ }
@@ -0,0 +1,5 @@
1
+ .page {
2
+ max-width: 480px;
3
+ margin: 0 auto;
4
+ padding: var(--kit-space-8) var(--kit-space-4);
5
+ }
@@ -0,0 +1,30 @@
1
+ import type { ReactNode } from "react";
2
+ import { Stack } from "@/kit/Stack";
3
+ import { Text } from "@/kit/Text";
4
+ import styles from "./Page.module.css";
5
+
6
+ const STEPS = ["Cart", "Shipping", "Payment"] as const;
7
+
8
+ /** Page frame shared by the checkout screens. `step` highlights the progress row. */
9
+ export function Page({ title, step, children }: { title: string; step?: (typeof STEPS)[number]; children: ReactNode }) {
10
+ return (
11
+ <main className={styles.page}>
12
+ <Stack gap="6">
13
+ {step && (
14
+ // Stand-in for the Stepper component until it exists (gap_stepper).
15
+ <Stack direction="row" gap="3" aria-label="Checkout progress">
16
+ {STEPS.map((s) => (
17
+ <Text key={s} as="span" variant="label" tone={s === step ? "default" : "muted"}>
18
+ {s}
19
+ </Text>
20
+ ))}
21
+ </Stack>
22
+ )}
23
+ <Text as="h1" variant="heading">
24
+ {title}
25
+ </Text>
26
+ {children}
27
+ </Stack>
28
+ </main>
29
+ );
30
+ }
@@ -0,0 +1,18 @@
1
+ import { defineFlows } from "@cogitato/runtime";
2
+
3
+ // How screens connect. Each step is "{screen id}.{state}". `kit export-flows` turns this into
4
+ // design/flows.json for the canvas; steps appear in the order they're first mentioned.
5
+ export default defineFlows([
6
+ {
7
+ id: "checkout",
8
+ title: "Checkout",
9
+ edges: [
10
+ { from: "cart.default", to: "checkout.shipping.default", label: "Check out" },
11
+ { from: "checkout.shipping.default", to: "checkout.shipping.invalid-address", label: "Continue, address not found" },
12
+ { from: "checkout.shipping.default", to: "checkout.payment.default", label: "Continue" },
13
+ { from: "checkout.payment.default", to: "checkout.payment.processing", label: "Pay now" },
14
+ { from: "checkout.payment.processing", to: "checkout.payment.card-declined", label: "Declined" },
15
+ { from: "checkout.payment.processing", to: "checkout.confirmation.default", label: "Approved" },
16
+ ],
17
+ },
18
+ ]);
@@ -0,0 +1,11 @@
1
+ import "virtual:kit/tokens.css";
2
+ import "./styles/global.css";
3
+ import kit from "virtual:kit/kit";
4
+ import { mountPrototype, type ScreenDefinition } from "@cogitato/runtime";
5
+
6
+ // Every src/screens/**/screen.tsx registers one screen with defineScreen.
7
+ const screens = Object.values(
8
+ import.meta.glob<ScreenDefinition>("./screens/**/screen.tsx", { eager: true, import: "default" }),
9
+ );
10
+
11
+ mountPrototype(document.getElementById("root"), { screens, kit });
@@ -0,0 +1,43 @@
1
+ // Mock data for the checkout flow. Prototypes have no backend; fixtures pick from these.
2
+
3
+ export interface CartItem {
4
+ id: string;
5
+ name: string;
6
+ variant: string;
7
+ quantity: number;
8
+ price: number;
9
+ }
10
+
11
+ export interface Cart {
12
+ items: CartItem[];
13
+ shipping: number;
14
+ }
15
+
16
+ export const sampleCart: Cart = {
17
+ items: [
18
+ { id: "tote", name: "Canvas tote", variant: "Natural", quantity: 1, price: 24 },
19
+ { id: "mug", name: "Ceramic mug", variant: "Speckled white", quantity: 2, price: 18 },
20
+ ],
21
+ shipping: 5,
22
+ };
23
+
24
+ export const emptyCart: Cart = { items: [], shipping: 0 };
25
+
26
+ export const subtotal = (cart: Cart) => cart.items.reduce((sum, i) => sum + i.price * i.quantity, 0);
27
+
28
+ export const money = (amount: number) =>
29
+ new Intl.NumberFormat("en-US", { style: "currency", currency: "USD" }).format(amount);
30
+
31
+ export interface Address {
32
+ name: string;
33
+ street: string;
34
+ city: string;
35
+ postcode: string;
36
+ }
37
+
38
+ export const sampleAddress: Address = {
39
+ name: "Sam Rivera",
40
+ street: "12 Harbour Lane",
41
+ city: "Portland",
42
+ postcode: "97201",
43
+ };
@@ -0,0 +1,67 @@
1
+ import { defineScreen, useFixture, useGoToState } from "@cogitato/runtime";
2
+ import { Page } from "@/components/Page";
3
+ import { Button } from "@/kit/Button";
4
+ import { Card } from "@/kit/Card";
5
+ import { Stack } from "@/kit/Stack";
6
+ import { Text } from "@/kit/Text";
7
+ import { emptyCart, money, sampleCart, subtotal, type Cart } from "@/mocks/cart";
8
+
9
+ function CartScreen() {
10
+ const { cart } = useFixture<{ cart: Cart }>();
11
+ const goTo = useGoToState();
12
+
13
+ if (cart.items.length === 0) {
14
+ return (
15
+ <Page title="Your cart" step="Cart">
16
+ <Card padding="lg">
17
+ <Stack gap="3" align="start">
18
+ <Text>Your cart is empty.</Text>
19
+ <Button variant="secondary" data-kit-id="cart.keep-shopping">
20
+ Keep shopping
21
+ </Button>
22
+ </Stack>
23
+ </Card>
24
+ </Page>
25
+ );
26
+ }
27
+
28
+ return (
29
+ <Page title="Your cart" step="Cart">
30
+ <Card>
31
+ <Stack gap="4">
32
+ {cart.items.map((item) => (
33
+ <Stack key={item.id} direction="row" gap="4">
34
+ <Stack gap="1" style={{ flex: 1 }}>
35
+ <Text variant="label">{item.name}</Text>
36
+ <Text tone="muted">
37
+ {item.variant} · Qty {item.quantity}
38
+ </Text>
39
+ </Stack>
40
+ <Text>{money(item.price * item.quantity)}</Text>
41
+ </Stack>
42
+ ))}
43
+ </Stack>
44
+ </Card>
45
+ <Stack direction="row" gap="4">
46
+ <Text variant="label" style={{ flex: 1 }}>
47
+ Subtotal
48
+ </Text>
49
+ <Text variant="label">{money(subtotal(cart))}</Text>
50
+ </Stack>
51
+ <Button fullWidth size="lg" data-kit-id="cart.checkout" onPress={() => goTo("checkout.shipping.default")}>
52
+ Check out
53
+ </Button>
54
+ </Page>
55
+ );
56
+ }
57
+
58
+ export default defineScreen({
59
+ id: "cart",
60
+ route: "/cart",
61
+ title: "Cart",
62
+ fixtures: {
63
+ default: { title: "Two items", data: { cart: sampleCart } },
64
+ empty: { title: "Empty cart", data: { cart: emptyCart } },
65
+ },
66
+ component: CartScreen,
67
+ });
@@ -0,0 +1,34 @@
1
+ import { defineScreen, useFixture, useGoToState } from "@cogitato/runtime";
2
+ import { Page } from "@/components/Page";
3
+ import { Button } from "@/kit/Button";
4
+ import { Card } from "@/kit/Card";
5
+ import { Stack } from "@/kit/Stack";
6
+ import { Text } from "@/kit/Text";
7
+
8
+ function ConfirmationScreen() {
9
+ const { orderNumber, email } = useFixture<{ orderNumber: string; email: string }>();
10
+ const goTo = useGoToState();
11
+ return (
12
+ <Page title="Order confirmed">
13
+ <Card padding="lg" elevation="raised">
14
+ <Stack gap="2">
15
+ <Text variant="label">Order {orderNumber}</Text>
16
+ <Text tone="muted">We've sent a receipt to {email}. Your order ships in 1–2 business days.</Text>
17
+ </Stack>
18
+ </Card>
19
+ <Button variant="secondary" data-kit-id="checkout.confirmation.done" onPress={() => goTo("cart.empty")}>
20
+ Back to the shop
21
+ </Button>
22
+ </Page>
23
+ );
24
+ }
25
+
26
+ export default defineScreen({
27
+ id: "checkout.confirmation",
28
+ route: "/checkout/confirmation",
29
+ title: "Order confirmed",
30
+ fixtures: {
31
+ default: { title: "Confirmed", data: { orderNumber: "#10482", email: "sam@example.com" } },
32
+ },
33
+ component: ConfirmationScreen,
34
+ });
@@ -0,0 +1,77 @@
1
+ import { useEffect } from "react";
2
+ import { defineScreen, useFixture, useFrameMode, useGoToState } from "@cogitato/runtime";
3
+ import { Page } from "@/components/Page";
4
+ import { Banner } from "@/kit/Banner";
5
+ import { Button } from "@/kit/Button";
6
+ import { Card } from "@/kit/Card";
7
+ import { Input } from "@/kit/Input";
8
+ import { Stack } from "@/kit/Stack";
9
+ import { Text } from "@/kit/Text";
10
+ import { money, sampleCart, subtotal } from "@/mocks/cart";
11
+
12
+ interface PaymentData {
13
+ processing?: boolean;
14
+ declined?: boolean;
15
+ }
16
+
17
+ const total = subtotal(sampleCart) + sampleCart.shipping;
18
+
19
+ function PaymentScreen() {
20
+ const { processing = false, declined = false } = useFixture<PaymentData>();
21
+ const goTo = useGoToState();
22
+ const frame = useFrameMode();
23
+
24
+ // The mock payment always succeeds after a moment. Canvas frames hold still.
25
+ useEffect(() => {
26
+ if (!processing || frame) return;
27
+ const timer = setTimeout(() => goTo("checkout.confirmation.default"), 1500);
28
+ return () => clearTimeout(timer);
29
+ }, [processing, frame, goTo]);
30
+
31
+ return (
32
+ <Page title="Payment" step="Payment">
33
+ {declined && (
34
+ <Banner tone="danger" title="Your card was declined" data-kit-id="checkout.payment.error-banner">
35
+ Try another card, or check the details with your bank.
36
+ </Banner>
37
+ )}
38
+ <Card>
39
+ <Stack gap="4">
40
+ <Input label="Card number" placeholder="1234 5678 9012 3456" disabled={processing} data-kit-id="checkout.payment.card-number" />
41
+ <Stack direction="row" gap="3">
42
+ <Input label="Expiry" placeholder="MM / YY" disabled={processing} data-kit-id="checkout.payment.expiry" />
43
+ <Input label="Security code" placeholder="123" disabled={processing} data-kit-id="checkout.payment.cvc" />
44
+ </Stack>
45
+ <Input label="Name on card" disabled={processing} data-kit-id="checkout.payment.cardholder" />
46
+ </Stack>
47
+ </Card>
48
+ <Stack direction="row" gap="4">
49
+ <Text variant="label" style={{ flex: 1 }}>
50
+ Total
51
+ </Text>
52
+ <Text variant="label">{money(total)}</Text>
53
+ </Stack>
54
+ <Button
55
+ fullWidth
56
+ size="lg"
57
+ loading={processing}
58
+ data-kit-id="checkout.payment.submit"
59
+ onPress={() => goTo("checkout.payment.processing")}
60
+ >
61
+ {processing ? "Processing" : `Pay ${money(total)}`}
62
+ </Button>
63
+ </Page>
64
+ );
65
+ }
66
+
67
+ export default defineScreen<PaymentData>({
68
+ id: "checkout.payment",
69
+ route: "/checkout/payment",
70
+ title: "Payment",
71
+ fixtures: {
72
+ default: { title: "Empty form", data: {} },
73
+ processing: { title: "Processing", data: { processing: true } },
74
+ "card-declined": { title: "Card declined", data: { declined: true } },
75
+ },
76
+ component: PaymentScreen,
77
+ });
@@ -0,0 +1,60 @@
1
+ import { defineScreen, useFixture, useGoToState } from "@cogitato/runtime";
2
+ import { Page } from "@/components/Page";
3
+ import { Banner } from "@/kit/Banner";
4
+ import { Button } from "@/kit/Button";
5
+ import { Input } from "@/kit/Input";
6
+ import { Stack } from "@/kit/Stack";
7
+ import { sampleAddress, type Address } from "@/mocks/cart";
8
+
9
+ interface ShippingData {
10
+ address: Partial<Address>;
11
+ addressError?: string;
12
+ }
13
+
14
+ function ShippingScreen() {
15
+ const { address, addressError } = useFixture<ShippingData>();
16
+ const goTo = useGoToState();
17
+
18
+ return (
19
+ <Page title="Where should we send it?" step="Shipping">
20
+ {addressError && (
21
+ <Banner tone="danger" title="We couldn't find that address" data-kit-id="checkout.shipping.address-banner">
22
+ Check the street and postcode, then try again.
23
+ </Banner>
24
+ )}
25
+ <Stack gap="4">
26
+ <Input label="Full name" value={address.name} data-kit-id="checkout.shipping.name" />
27
+ <Input label="Street address" value={address.street} error={addressError} data-kit-id="checkout.shipping.street" />
28
+ <Stack direction="row" gap="3">
29
+ <Input label="City" value={address.city} data-kit-id="checkout.shipping.city" style={{ flex: 1 }} />
30
+ <Input label="Postcode" value={address.postcode} data-kit-id="checkout.shipping.postcode" />
31
+ </Stack>
32
+ </Stack>
33
+ <Stack gap="2">
34
+ <Button fullWidth size="lg" data-kit-id="checkout.shipping.continue" onPress={() => goTo("checkout.payment.default")}>
35
+ Continue to payment
36
+ </Button>
37
+ <Button variant="ghost" data-kit-id="checkout.shipping.back" onPress={() => goTo("cart.default")}>
38
+ Back to cart
39
+ </Button>
40
+ </Stack>
41
+ </Page>
42
+ );
43
+ }
44
+
45
+ export default defineScreen<ShippingData>({
46
+ id: "checkout.shipping",
47
+ route: "/checkout/shipping",
48
+ title: "Shipping",
49
+ fixtures: {
50
+ default: { title: "Empty form", data: { address: {} } },
51
+ "invalid-address": {
52
+ title: "Address not found",
53
+ data: {
54
+ address: { ...sampleAddress, street: "12 Harbor Ln" },
55
+ addressError: "We couldn't match this street to the postcode.",
56
+ },
57
+ },
58
+ },
59
+ component: ShippingScreen,
60
+ });
@@ -0,0 +1,12 @@
1
+ *,
2
+ *::before,
3
+ *::after {
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ margin: 0;
9
+ font: var(--kit-typography-body);
10
+ color: var(--kit-color-text-default);
11
+ background: var(--kit-color-surface-subtle);
12
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
5
+ "module": "ESNext",
6
+ "moduleResolution": "Bundler",
7
+ "jsx": "react-jsx",
8
+ "strict": true,
9
+ "noEmit": true,
10
+ "isolatedModules": true,
11
+ "skipLibCheck": true,
12
+ "resolveJsonModule": true,
13
+ "types": ["vite/client", "@cogitato/runtime/client"],
14
+ "paths": { "@/kit/*": ["../../kit/*"], "@/*": ["./src/*"] }
15
+ },
16
+ "include": ["src", "../../kit", "vite.config.ts"]
17
+ }
@@ -0,0 +1,7 @@
1
+ import react from "@vitejs/plugin-react";
2
+ import { defineConfig } from "vite";
3
+ import { kit } from "@cogitato/runtime/vite";
4
+
5
+ export default defineConfig({
6
+ plugins: [react(), kit()],
7
+ });