create-plasmic-app 0.0.142 → 0.0.144
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/cpa-out/gatsby-codegen-js/package.json +2 -2
- package/cpa-out/gatsby-codegen-js/plasmic.json +2 -2
- package/cpa-out/gatsby-codegen-js/src/components/plasmic/create_plasmic_app/PlasmicButton.jsx +1 -0
- package/cpa-out/gatsby-codegen-js/src/components/plasmic/create_plasmic_app/PlasmicDynamicPage.jsx +1 -0
- package/cpa-out/gatsby-codegen-js/src/components/plasmic/create_plasmic_app/PlasmicHomepage.jsx +7 -2
- package/cpa-out/gatsby-codegen-ts/package.json +2 -2
- package/cpa-out/gatsby-codegen-ts/plasmic.json +2 -2
- package/cpa-out/gatsby-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicButton.tsx +1 -0
- package/cpa-out/gatsby-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicDynamicPage.tsx +1 -0
- package/cpa-out/gatsby-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicHomepage.tsx +7 -2
- package/cpa-out/gatsby-loader-js/package.json +1 -1
- package/cpa-out/gatsby-loader-ts/package.json +1 -1
- package/cpa-out/nextjs-app-codegen-js/app/dynamic/[slug]/page.jsx +11 -3
- package/cpa-out/nextjs-app-codegen-js/app/layout.jsx +3 -4
- package/cpa-out/nextjs-app-codegen-js/app/page.jsx +4 -3
- package/cpa-out/nextjs-app-codegen-js/components/plasmic/create_plasmic_app/PlasmicButton.jsx +1 -0
- package/cpa-out/nextjs-app-codegen-js/components/plasmic/create_plasmic_app/PlasmicDynamicPage.jsx +1 -0
- package/cpa-out/nextjs-app-codegen-js/components/plasmic/create_plasmic_app/PlasmicDynamicPageServer.jsx +1 -1
- package/cpa-out/nextjs-app-codegen-js/components/plasmic/create_plasmic_app/PlasmicHomepage.jsx +7 -2
- package/cpa-out/nextjs-app-codegen-js/components/plasmic/create_plasmic_app/PlasmicHomepageServer.jsx +1 -1
- package/cpa-out/nextjs-app-codegen-js/package.json +2 -2
- package/cpa-out/nextjs-app-codegen-js/plasmic-init-client.jsx +16 -0
- package/cpa-out/nextjs-app-codegen-js/plasmic.json +2 -2
- package/cpa-out/nextjs-app-codegen-ts/app/dynamic/[slug]/page.tsx +12 -4
- package/cpa-out/nextjs-app-codegen-ts/app/layout.tsx +3 -4
- package/cpa-out/nextjs-app-codegen-ts/app/page.tsx +4 -4
- package/cpa-out/nextjs-app-codegen-ts/components/plasmic/create_plasmic_app/PlasmicButton.tsx +1 -0
- package/cpa-out/nextjs-app-codegen-ts/components/plasmic/create_plasmic_app/PlasmicDynamicPage.tsx +1 -0
- package/cpa-out/nextjs-app-codegen-ts/components/plasmic/create_plasmic_app/PlasmicDynamicPageServer.tsx +1 -1
- package/cpa-out/nextjs-app-codegen-ts/components/plasmic/create_plasmic_app/PlasmicHomepage.tsx +7 -2
- package/cpa-out/nextjs-app-codegen-ts/components/plasmic/create_plasmic_app/PlasmicHomepageServer.tsx +1 -1
- package/cpa-out/nextjs-app-codegen-ts/package.json +2 -2
- package/cpa-out/nextjs-app-codegen-ts/plasmic-init-client.tsx +17 -0
- package/cpa-out/nextjs-app-codegen-ts/plasmic.json +2 -2
- package/cpa-out/nextjs-app-loader-js/package.json +1 -1
- package/cpa-out/nextjs-app-loader-js/plasmic-init-client.jsx +2 -40
- package/cpa-out/nextjs-app-loader-js/plasmic-init.js +5 -0
- package/cpa-out/nextjs-app-loader-ts/package.json +1 -1
- package/cpa-out/nextjs-app-loader-ts/plasmic-init-client.tsx +2 -40
- package/cpa-out/nextjs-app-loader-ts/plasmic-init.ts +5 -0
- package/cpa-out/nextjs-pages-codegen-js/components/plasmic/create_plasmic_app/PlasmicButton.jsx +1 -0
- package/cpa-out/nextjs-pages-codegen-js/components/plasmic/create_plasmic_app/PlasmicDynamicPage.jsx +1 -0
- package/cpa-out/nextjs-pages-codegen-js/components/plasmic/create_plasmic_app/PlasmicHomepage.jsx +7 -2
- package/cpa-out/nextjs-pages-codegen-js/package.json +2 -2
- package/cpa-out/nextjs-pages-codegen-js/plasmic.json +2 -2
- package/cpa-out/nextjs-pages-codegen-ts/components/plasmic/create_plasmic_app/PlasmicButton.tsx +1 -0
- package/cpa-out/nextjs-pages-codegen-ts/components/plasmic/create_plasmic_app/PlasmicDynamicPage.tsx +1 -0
- package/cpa-out/nextjs-pages-codegen-ts/components/plasmic/create_plasmic_app/PlasmicHomepage.tsx +7 -2
- package/cpa-out/nextjs-pages-codegen-ts/package.json +2 -2
- package/cpa-out/nextjs-pages-codegen-ts/plasmic.json +2 -2
- package/cpa-out/nextjs-pages-loader-js/package.json +1 -1
- package/cpa-out/nextjs-pages-loader-ts/package.json +1 -1
- package/cpa-out/react-codegen-js/package.json +2 -2
- package/cpa-out/react-codegen-js/plasmic.json +2 -2
- package/cpa-out/react-codegen-ts/package.json +2 -2
- package/cpa-out/react-codegen-ts/plasmic.json +2 -2
- package/cpa-out/tanstack-codegen-ts/package.json +7 -8
- package/cpa-out/tanstack-codegen-ts/plasmic.json +2 -2
- package/cpa-out/tanstack-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicButton.tsx +1 -5
- package/cpa-out/tanstack-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicDynamicPage.tsx +1 -2
- package/cpa-out/tanstack-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicHomepage.tsx +7 -5
- package/cpa-out/tanstack-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicStyleTokensProvider.tsx +2 -0
- package/cpa-out/tanstack-codegen-ts/src/router.tsx +0 -1
- package/cpa-out/tanstack-codegen-ts/tsconfig.json +0 -1
- package/cpa-out/tanstack-codegen-ts/vite.config.ts +1 -2
- package/dist/nextjs/nextjs.js +7 -2
- package/dist/nextjs/templates/app-codegen/layout.js +3 -4
- package/dist/nextjs/templates/app-codegen/plasmic-init-client.d.ts +2 -0
- package/dist/nextjs/templates/app-codegen/plasmic-init-client.js +24 -0
- package/dist/nextjs/templates/app-loader/plasmic-init-client.js +2 -40
- package/dist/nextjs/templates/app-loader/plasmic-init.js +0 -5
- package/dist/tanstack/tanstack.js +11 -1
- package/package.json +2 -2
- package/src/nextjs/nextjs.ts +10 -0
- package/src/nextjs/templates/app-codegen/layout.ts +3 -4
- package/src/nextjs/templates/app-codegen/plasmic-init-client.ts +28 -0
- package/src/nextjs/templates/app-loader/plasmic-init-client.ts +2 -40
- package/src/nextjs/templates/app-loader/plasmic-init.ts +0 -5
- package/src/tanstack/tanstack.ts +11 -1
- package/cpa-out/nextjs-app-codegen-js/app/layout.js +0 -28
- package/cpa-out/tanstack-codegen-ts/src/components/Footer.tsx +0 -44
- package/cpa-out/tanstack-codegen-ts/src/components/Header.tsx +0 -78
- package/cpa-out/tanstack-codegen-ts/src/components/ThemeToggle.tsx +0 -81
- /package/cpa-out/gatsby-codegen-js/src/components/plasmic/create_plasmic_app/icons/{PlasmicIcon__Checksvg.jsx → PlasmicIcon__CheckSvg.jsx} +0 -0
- /package/cpa-out/gatsby-codegen-ts/src/components/plasmic/create_plasmic_app/icons/{PlasmicIcon__Checksvg.tsx → PlasmicIcon__CheckSvg.tsx} +0 -0
- /package/cpa-out/nextjs-pages-codegen-js/components/plasmic/create_plasmic_app/icons/{PlasmicIcon__Checksvg.jsx → PlasmicIcon__CheckSvg.jsx} +0 -0
- /package/cpa-out/nextjs-pages-codegen-ts/components/plasmic/create_plasmic_app/icons/{PlasmicIcon__Checksvg.tsx → PlasmicIcon__CheckSvg.tsx} +0 -0
|
@@ -38,7 +38,17 @@ exports.tanstackStrategy = {
|
|
|
38
38
|
const projectName = path_1.default.basename(fullProjectPath);
|
|
39
39
|
const parentDir = path_1.default.dirname(fullProjectPath);
|
|
40
40
|
process.chdir(parentDir);
|
|
41
|
-
const createCommand =
|
|
41
|
+
const createCommand = [
|
|
42
|
+
`npx create-tsrouter-app@latest ${projectName}`,
|
|
43
|
+
"--framework React",
|
|
44
|
+
"--router-only",
|
|
45
|
+
"--no-toolchain",
|
|
46
|
+
"--package-manager yarn",
|
|
47
|
+
"--git",
|
|
48
|
+
"--no-intent",
|
|
49
|
+
"--no-examples",
|
|
50
|
+
"--yes",
|
|
51
|
+
].join(" ");
|
|
42
52
|
yield (0, cmd_utils_1.spawnOrFail)(createCommand);
|
|
43
53
|
// Install peer-dep of @tanstack/react-router-with-query
|
|
44
54
|
yield (0, npm_utils_1.installUpgrade)("@tanstack/react-query", {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-plasmic-app",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.144",
|
|
4
4
|
"description": "Create Plasmic-powered React apps",
|
|
5
5
|
"main": "./dist/lib.js",
|
|
6
6
|
"types": "./dist/lib.d.ts",
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"validate-npm-package-name": "^3.0.0",
|
|
48
48
|
"yargs": "^16.2.0"
|
|
49
49
|
},
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "94026327bd519c5a334ca974ef9d6d3d12855f25"
|
|
51
51
|
}
|
package/src/nextjs/nextjs.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { ensure } from "../utils/lang-utils";
|
|
|
12
12
|
import { installUpgrade } from "../utils/npm-utils";
|
|
13
13
|
import { CPAStrategy, GenerateFilesArgs } from "../utils/strategy";
|
|
14
14
|
import { makeLayout_app_codegen } from "./templates/app-codegen/layout";
|
|
15
|
+
import { makePlasmicInitClient_app_codegen } from "./templates/app-codegen/plasmic-init-client";
|
|
15
16
|
import { makeCatchallPage_app_loader } from "./templates/app-loader/catchall-page";
|
|
16
17
|
import { makePlasmicHostPage_app_loader } from "./templates/app-loader/plasmic-host";
|
|
17
18
|
import { makePlasmicInit_app_loader } from "./templates/app-loader/plasmic-init";
|
|
@@ -117,12 +118,21 @@ async function generateFilesAppDir(args: GenerateFilesArgs) {
|
|
|
117
118
|
makeCatchallPage_app_loader(jsOrTs)
|
|
118
119
|
);
|
|
119
120
|
} else {
|
|
121
|
+
// Replace starter layout. Removes app/layout.js in JS projects before writing layout.jsx.
|
|
122
|
+
deleteGlob(path.join(projectPath, "app", "layout.*"));
|
|
123
|
+
|
|
120
124
|
// ./app/layout.tsx
|
|
121
125
|
await fs.writeFile(
|
|
122
126
|
path.join(projectPath, "app", `layout.${jsOrTs}x`),
|
|
123
127
|
makeLayout_app_codegen(jsOrTs)
|
|
124
128
|
);
|
|
125
129
|
|
|
130
|
+
// ./plasmic-init-client.tsx
|
|
131
|
+
await fs.writeFile(
|
|
132
|
+
path.join(projectPath, `plasmic-init-client.${jsOrTs}x`),
|
|
133
|
+
makePlasmicInitClient_app_codegen(jsOrTs)
|
|
134
|
+
);
|
|
135
|
+
|
|
126
136
|
// ./app/plasmic-host/page.tsx
|
|
127
137
|
await fs.mkdir(path.join(projectPath, "app", "plasmic-host"));
|
|
128
138
|
await fs.writeFile(
|
|
@@ -3,8 +3,7 @@ import { JsOrTs } from "../../../utils/types";
|
|
|
3
3
|
|
|
4
4
|
export function makeLayout_app_codegen(jsOrTs: JsOrTs): string {
|
|
5
5
|
return `import '@/app/globals.css'
|
|
6
|
-
import {
|
|
7
|
-
import Link from "next/link";
|
|
6
|
+
import { ClientPlasmicRootProvider } from "@/plasmic-init-client";
|
|
8
7
|
|
|
9
8
|
export default function RootLayout({
|
|
10
9
|
children,
|
|
@@ -17,9 +16,9 @@ export default function RootLayout({
|
|
|
17
16
|
return (
|
|
18
17
|
<html lang="en">
|
|
19
18
|
<body>
|
|
20
|
-
<
|
|
19
|
+
<ClientPlasmicRootProvider>
|
|
21
20
|
{children}
|
|
22
|
-
</
|
|
21
|
+
</ClientPlasmicRootProvider>
|
|
23
22
|
</body>
|
|
24
23
|
</html>
|
|
25
24
|
);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ifTs } from "../../../utils/file-utils";
|
|
2
|
+
import { JsOrTs } from "../../../utils/types";
|
|
3
|
+
|
|
4
|
+
export function makePlasmicInitClient_app_codegen(jsOrTs: JsOrTs): string {
|
|
5
|
+
return `"use client";
|
|
6
|
+
|
|
7
|
+
${ifTs(
|
|
8
|
+
jsOrTs,
|
|
9
|
+
'import type * as React from "react";\n'
|
|
10
|
+
)}import { PlasmicRootProvider } from "@plasmicapp/react-web";
|
|
11
|
+
import Link from "next/link";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* ClientPlasmicRootProvider is a Client Component that passes Next's Link to PlasmicRootProvider.
|
|
15
|
+
*
|
|
16
|
+
* Props passed from a Server Component to a Client Component must be serializable.
|
|
17
|
+
* https://nextjs.org/docs/app/getting-started/server-and-client-components#passing-data-from-server-to-client-components
|
|
18
|
+
*/
|
|
19
|
+
export function ClientPlasmicRootProvider(
|
|
20
|
+
props${ifTs(
|
|
21
|
+
jsOrTs,
|
|
22
|
+
': Omit<React.ComponentProps<typeof PlasmicRootProvider>, "Link">'
|
|
23
|
+
)}
|
|
24
|
+
) {
|
|
25
|
+
return <PlasmicRootProvider Link={Link} {...props} />;
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
}
|
|
@@ -17,48 +17,10 @@ import { PLASMIC } from "@/plasmic-init";
|
|
|
17
17
|
// PLASMIC.registerComponent(...);
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
* ClientPlasmicRootProvider is a Client Component that passes
|
|
20
|
+
* ClientPlasmicRootProvider is a Client Component that passes the loader to PlasmicRootProvider.
|
|
21
21
|
*
|
|
22
|
-
*
|
|
22
|
+
* Props passed from a Server Component to a Client Component must be serializable.
|
|
23
23
|
* https://nextjs.org/docs/app/getting-started/server-and-client-components#passing-data-from-server-to-client-components
|
|
24
|
-
* However, PlasmicRootProvider requires a loader, but the loader is NOT serializable.
|
|
25
|
-
*
|
|
26
|
-
* In a Server Component like app/<your-path>/path.tsx, rendering the following would not work:
|
|
27
|
-
*
|
|
28
|
-
* \`\`\`tsx
|
|
29
|
-
* import { PLASMIC } from "@/plasmic-init";
|
|
30
|
-
* import { PlasmicRootProvider } from "plasmicapp/loader-nextjs";
|
|
31
|
-
* export default function MyPage() {
|
|
32
|
-
* const prefetchedData = await PLASMIC.fetchComponentData("YourPage");
|
|
33
|
-
* return (
|
|
34
|
-
* <PlasmicRootProvider
|
|
35
|
-
* loader={PLASMIC} // ERROR: loader is not serializable
|
|
36
|
-
* prefetchedData={prefetchedData}
|
|
37
|
-
* >
|
|
38
|
-
* {yourContent()}
|
|
39
|
-
* </PlasmicRootProvider>;
|
|
40
|
-
* );
|
|
41
|
-
* }
|
|
42
|
-
* \`\`\`
|
|
43
|
-
*
|
|
44
|
-
* Therefore, we define ClientPlasmicRootProvider as a Client Component (this file is marked "use client").
|
|
45
|
-
* ClientPlasmicRootProvider wraps the PlasmicRootProvider and passes in the loader for you,
|
|
46
|
-
* while allowing your Server Component to pass in prefetched data and other serializable props:
|
|
47
|
-
*
|
|
48
|
-
* \`\`\`tsx
|
|
49
|
-
* import { PLASMIC } from "@/plasmic-init";
|
|
50
|
-
* import { ClientPlasmicRootProvider } from "@/plasmic-init-client"; // changed
|
|
51
|
-
* export default function MyPage() {
|
|
52
|
-
* const prefetchedData = await PLASMIC.fetchComponentData("YourPage");
|
|
53
|
-
* return (
|
|
54
|
-
* <ClientPlasmicRootProvider // don't pass in loader
|
|
55
|
-
* prefetchedData={prefetchedData}
|
|
56
|
-
* >
|
|
57
|
-
* {yourContent()}
|
|
58
|
-
* </ClientPlasmicRootProvider>;
|
|
59
|
-
* );
|
|
60
|
-
* }
|
|
61
|
-
* \`\`\`
|
|
62
24
|
*/
|
|
63
25
|
export function ClientPlasmicRootProvider(
|
|
64
26
|
props${ifTs(
|
|
@@ -27,11 +27,6 @@ export const PLASMIC = initPlasmicLoader({
|
|
|
27
27
|
// Register custom functions here so they are available during SSR.
|
|
28
28
|
// See https://docs.plasmic.app/learn/registering-custom-functions/
|
|
29
29
|
//
|
|
30
|
-
// IMPORTANT for app-router projects: any custom function used by a server
|
|
31
|
-
// query must be registered here, which runs on the server. Registrations in
|
|
32
|
-
// plasmic-init-client.tsx are only available in the browser and will cause
|
|
33
|
-
// a runtime error if referenced by a server query during SSR.
|
|
34
|
-
//
|
|
35
30
|
// PLASMIC.registerFunction(...);
|
|
36
31
|
`;
|
|
37
32
|
}
|
package/src/tanstack/tanstack.ts
CHANGED
|
@@ -29,7 +29,17 @@ export const tanstackStrategy: CPAStrategy = {
|
|
|
29
29
|
const parentDir = path.dirname(fullProjectPath);
|
|
30
30
|
process.chdir(parentDir);
|
|
31
31
|
|
|
32
|
-
const createCommand =
|
|
32
|
+
const createCommand = [
|
|
33
|
+
`npx create-tsrouter-app@latest ${projectName}`,
|
|
34
|
+
"--framework React",
|
|
35
|
+
"--router-only",
|
|
36
|
+
"--no-toolchain",
|
|
37
|
+
"--package-manager yarn",
|
|
38
|
+
"--git",
|
|
39
|
+
"--no-intent",
|
|
40
|
+
"--no-examples",
|
|
41
|
+
"--yes",
|
|
42
|
+
].join(" ");
|
|
33
43
|
|
|
34
44
|
await spawnOrFail(createCommand);
|
|
35
45
|
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import localFont from "next/font/local";
|
|
2
|
-
import "./globals.css";
|
|
3
|
-
|
|
4
|
-
const geistSans = localFont({
|
|
5
|
-
src: "./fonts/GeistVF.woff",
|
|
6
|
-
variable: "--font-geist-sans",
|
|
7
|
-
weight: "100 900",
|
|
8
|
-
});
|
|
9
|
-
const geistMono = localFont({
|
|
10
|
-
src: "./fonts/GeistMonoVF.woff",
|
|
11
|
-
variable: "--font-geist-mono",
|
|
12
|
-
weight: "100 900",
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
export const metadata = {
|
|
16
|
-
title: "Create Next App",
|
|
17
|
-
description: "Generated by create next app",
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
export default function RootLayout({ children }) {
|
|
21
|
-
return (
|
|
22
|
-
<html lang="en">
|
|
23
|
-
<body className={`${geistSans.variable} ${geistMono.variable}`}>
|
|
24
|
-
{children}
|
|
25
|
-
</body>
|
|
26
|
-
</html>
|
|
27
|
-
);
|
|
28
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
export default function Footer() {
|
|
2
|
-
const year = new Date().getFullYear()
|
|
3
|
-
|
|
4
|
-
return (
|
|
5
|
-
<footer className="mt-20 border-t border-[var(--line)] px-4 pb-14 pt-10 text-[var(--sea-ink-soft)]">
|
|
6
|
-
<div className="page-wrap flex flex-col items-center justify-between gap-4 text-center sm:flex-row sm:text-left">
|
|
7
|
-
<p className="m-0 text-sm">
|
|
8
|
-
© {year} Your name here. All rights reserved.
|
|
9
|
-
</p>
|
|
10
|
-
<p className="island-kicker m-0">Built with TanStack Start</p>
|
|
11
|
-
</div>
|
|
12
|
-
<div className="mt-4 flex justify-center gap-4">
|
|
13
|
-
<a
|
|
14
|
-
href="https://x.com/tan_stack"
|
|
15
|
-
target="_blank"
|
|
16
|
-
rel="noreferrer"
|
|
17
|
-
className="rounded-xl p-2 text-[var(--sea-ink-soft)] transition hover:bg-[var(--link-bg-hover)] hover:text-[var(--sea-ink)]"
|
|
18
|
-
>
|
|
19
|
-
<span className="sr-only">Follow TanStack on X</span>
|
|
20
|
-
<svg viewBox="0 0 16 16" aria-hidden="true" width="32" height="32">
|
|
21
|
-
<path
|
|
22
|
-
fill="currentColor"
|
|
23
|
-
d="M12.6 1h2.2L10 6.48 15.64 15h-4.41L7.78 9.82 3.23 15H1l5.14-5.84L.72 1h4.52l3.12 4.73L12.6 1zm-.77 12.67h1.22L4.57 2.26H3.26l8.57 11.41z"
|
|
24
|
-
/>
|
|
25
|
-
</svg>
|
|
26
|
-
</a>
|
|
27
|
-
<a
|
|
28
|
-
href="https://github.com/TanStack"
|
|
29
|
-
target="_blank"
|
|
30
|
-
rel="noreferrer"
|
|
31
|
-
className="rounded-xl p-2 text-[var(--sea-ink-soft)] transition hover:bg-[var(--link-bg-hover)] hover:text-[var(--sea-ink)]"
|
|
32
|
-
>
|
|
33
|
-
<span className="sr-only">Go to TanStack GitHub</span>
|
|
34
|
-
<svg viewBox="0 0 16 16" aria-hidden="true" width="32" height="32">
|
|
35
|
-
<path
|
|
36
|
-
fill="currentColor"
|
|
37
|
-
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"
|
|
38
|
-
/>
|
|
39
|
-
</svg>
|
|
40
|
-
</a>
|
|
41
|
-
</div>
|
|
42
|
-
</footer>
|
|
43
|
-
)
|
|
44
|
-
}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { Link } from '@tanstack/react-router'
|
|
2
|
-
import ThemeToggle from './ThemeToggle'
|
|
3
|
-
|
|
4
|
-
export default function Header() {
|
|
5
|
-
return (
|
|
6
|
-
<header className="sticky top-0 z-50 border-b border-[var(--line)] bg-[var(--header-bg)] px-4 backdrop-blur-lg">
|
|
7
|
-
<nav className="page-wrap flex flex-wrap items-center gap-x-3 gap-y-2 py-3 sm:py-4">
|
|
8
|
-
<h2 className="m-0 flex-shrink-0 text-base font-semibold tracking-tight">
|
|
9
|
-
<Link
|
|
10
|
-
to="/"
|
|
11
|
-
className="inline-flex items-center gap-2 rounded-full border border-[var(--chip-line)] bg-[var(--chip-bg)] px-3 py-1.5 text-sm text-[var(--sea-ink)] no-underline shadow-[0_8px_24px_rgba(30,90,72,0.08)] sm:px-4 sm:py-2"
|
|
12
|
-
>
|
|
13
|
-
<span className="h-2 w-2 rounded-full bg-[linear-gradient(90deg,#56c6be,#7ed3bf)]" />
|
|
14
|
-
TanStack Start
|
|
15
|
-
</Link>
|
|
16
|
-
</h2>
|
|
17
|
-
|
|
18
|
-
<div className="ml-auto flex items-center gap-1.5 sm:ml-0 sm:gap-2">
|
|
19
|
-
<a
|
|
20
|
-
href="https://x.com/tan_stack"
|
|
21
|
-
target="_blank"
|
|
22
|
-
rel="noreferrer"
|
|
23
|
-
className="hidden rounded-xl p-2 text-[var(--sea-ink-soft)] transition hover:bg-[var(--link-bg-hover)] hover:text-[var(--sea-ink)] sm:block"
|
|
24
|
-
>
|
|
25
|
-
<span className="sr-only">Follow TanStack on X</span>
|
|
26
|
-
<svg viewBox="0 0 16 16" aria-hidden="true" width="24" height="24">
|
|
27
|
-
<path
|
|
28
|
-
fill="currentColor"
|
|
29
|
-
d="M12.6 1h2.2L10 6.48 15.64 15h-4.41L7.78 9.82 3.23 15H1l5.14-5.84L.72 1h4.52l3.12 4.73L12.6 1zm-.77 12.67h1.22L4.57 2.26H3.26l8.57 11.41z"
|
|
30
|
-
/>
|
|
31
|
-
</svg>
|
|
32
|
-
</a>
|
|
33
|
-
<a
|
|
34
|
-
href="https://github.com/TanStack"
|
|
35
|
-
target="_blank"
|
|
36
|
-
rel="noreferrer"
|
|
37
|
-
className="hidden rounded-xl p-2 text-[var(--sea-ink-soft)] transition hover:bg-[var(--link-bg-hover)] hover:text-[var(--sea-ink)] sm:block"
|
|
38
|
-
>
|
|
39
|
-
<span className="sr-only">Go to TanStack GitHub</span>
|
|
40
|
-
<svg viewBox="0 0 16 16" aria-hidden="true" width="24" height="24">
|
|
41
|
-
<path
|
|
42
|
-
fill="currentColor"
|
|
43
|
-
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"
|
|
44
|
-
/>
|
|
45
|
-
</svg>
|
|
46
|
-
</a>
|
|
47
|
-
|
|
48
|
-
<ThemeToggle />
|
|
49
|
-
</div>
|
|
50
|
-
|
|
51
|
-
<div className="order-3 flex w-full flex-wrap items-center gap-x-4 gap-y-1 pb-1 text-sm font-semibold sm:order-2 sm:w-auto sm:flex-nowrap sm:pb-0">
|
|
52
|
-
<Link
|
|
53
|
-
to="/"
|
|
54
|
-
className="nav-link"
|
|
55
|
-
activeProps={{ className: 'nav-link is-active' }}
|
|
56
|
-
>
|
|
57
|
-
Home
|
|
58
|
-
</Link>
|
|
59
|
-
<Link
|
|
60
|
-
to="/about"
|
|
61
|
-
className="nav-link"
|
|
62
|
-
activeProps={{ className: 'nav-link is-active' }}
|
|
63
|
-
>
|
|
64
|
-
About
|
|
65
|
-
</Link>
|
|
66
|
-
<a
|
|
67
|
-
href="https://tanstack.com/start/latest/docs/framework/react/overview"
|
|
68
|
-
className="nav-link"
|
|
69
|
-
target="_blank"
|
|
70
|
-
rel="noreferrer"
|
|
71
|
-
>
|
|
72
|
-
Docs
|
|
73
|
-
</a>
|
|
74
|
-
</div>
|
|
75
|
-
</nav>
|
|
76
|
-
</header>
|
|
77
|
-
)
|
|
78
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { useEffect, useState } from 'react'
|
|
2
|
-
|
|
3
|
-
type ThemeMode = 'light' | 'dark' | 'auto'
|
|
4
|
-
|
|
5
|
-
function getInitialMode(): ThemeMode {
|
|
6
|
-
if (typeof window === 'undefined') {
|
|
7
|
-
return 'auto'
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const stored = window.localStorage.getItem('theme')
|
|
11
|
-
if (stored === 'light' || stored === 'dark' || stored === 'auto') {
|
|
12
|
-
return stored
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
return 'auto'
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function applyThemeMode(mode: ThemeMode) {
|
|
19
|
-
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
20
|
-
const resolved = mode === 'auto' ? (prefersDark ? 'dark' : 'light') : mode
|
|
21
|
-
|
|
22
|
-
document.documentElement.classList.remove('light', 'dark')
|
|
23
|
-
document.documentElement.classList.add(resolved)
|
|
24
|
-
|
|
25
|
-
if (mode === 'auto') {
|
|
26
|
-
document.documentElement.removeAttribute('data-theme')
|
|
27
|
-
} else {
|
|
28
|
-
document.documentElement.setAttribute('data-theme', mode)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
document.documentElement.style.colorScheme = resolved
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export default function ThemeToggle() {
|
|
35
|
-
const [mode, setMode] = useState<ThemeMode>('auto')
|
|
36
|
-
|
|
37
|
-
useEffect(() => {
|
|
38
|
-
const initialMode = getInitialMode()
|
|
39
|
-
setMode(initialMode)
|
|
40
|
-
applyThemeMode(initialMode)
|
|
41
|
-
}, [])
|
|
42
|
-
|
|
43
|
-
useEffect(() => {
|
|
44
|
-
if (mode !== 'auto') {
|
|
45
|
-
return
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const media = window.matchMedia('(prefers-color-scheme: dark)')
|
|
49
|
-
const onChange = () => applyThemeMode('auto')
|
|
50
|
-
|
|
51
|
-
media.addEventListener('change', onChange)
|
|
52
|
-
return () => {
|
|
53
|
-
media.removeEventListener('change', onChange)
|
|
54
|
-
}
|
|
55
|
-
}, [mode])
|
|
56
|
-
|
|
57
|
-
function toggleMode() {
|
|
58
|
-
const nextMode: ThemeMode =
|
|
59
|
-
mode === 'light' ? 'dark' : mode === 'dark' ? 'auto' : 'light'
|
|
60
|
-
setMode(nextMode)
|
|
61
|
-
applyThemeMode(nextMode)
|
|
62
|
-
window.localStorage.setItem('theme', nextMode)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const label =
|
|
66
|
-
mode === 'auto'
|
|
67
|
-
? 'Theme mode: auto (system). Click to switch to light mode.'
|
|
68
|
-
: `Theme mode: ${mode}. Click to switch mode.`
|
|
69
|
-
|
|
70
|
-
return (
|
|
71
|
-
<button
|
|
72
|
-
type="button"
|
|
73
|
-
onClick={toggleMode}
|
|
74
|
-
aria-label={label}
|
|
75
|
-
title={label}
|
|
76
|
-
className="rounded-full border border-[var(--chip-line)] bg-[var(--chip-bg)] px-3 py-1.5 text-sm font-semibold text-[var(--sea-ink)] shadow-[0_8px_22px_rgba(30,90,72,0.08)] transition hover:-translate-y-0.5"
|
|
77
|
-
>
|
|
78
|
-
{mode === 'auto' ? 'Auto' : mode === 'dark' ? 'Dark' : 'Light'}
|
|
79
|
-
</button>
|
|
80
|
-
)
|
|
81
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|