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.
Files changed (87) hide show
  1. package/cpa-out/gatsby-codegen-js/package.json +2 -2
  2. package/cpa-out/gatsby-codegen-js/plasmic.json +2 -2
  3. package/cpa-out/gatsby-codegen-js/src/components/plasmic/create_plasmic_app/PlasmicButton.jsx +1 -0
  4. package/cpa-out/gatsby-codegen-js/src/components/plasmic/create_plasmic_app/PlasmicDynamicPage.jsx +1 -0
  5. package/cpa-out/gatsby-codegen-js/src/components/plasmic/create_plasmic_app/PlasmicHomepage.jsx +7 -2
  6. package/cpa-out/gatsby-codegen-ts/package.json +2 -2
  7. package/cpa-out/gatsby-codegen-ts/plasmic.json +2 -2
  8. package/cpa-out/gatsby-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicButton.tsx +1 -0
  9. package/cpa-out/gatsby-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicDynamicPage.tsx +1 -0
  10. package/cpa-out/gatsby-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicHomepage.tsx +7 -2
  11. package/cpa-out/gatsby-loader-js/package.json +1 -1
  12. package/cpa-out/gatsby-loader-ts/package.json +1 -1
  13. package/cpa-out/nextjs-app-codegen-js/app/dynamic/[slug]/page.jsx +11 -3
  14. package/cpa-out/nextjs-app-codegen-js/app/layout.jsx +3 -4
  15. package/cpa-out/nextjs-app-codegen-js/app/page.jsx +4 -3
  16. package/cpa-out/nextjs-app-codegen-js/components/plasmic/create_plasmic_app/PlasmicButton.jsx +1 -0
  17. package/cpa-out/nextjs-app-codegen-js/components/plasmic/create_plasmic_app/PlasmicDynamicPage.jsx +1 -0
  18. package/cpa-out/nextjs-app-codegen-js/components/plasmic/create_plasmic_app/PlasmicDynamicPageServer.jsx +1 -1
  19. package/cpa-out/nextjs-app-codegen-js/components/plasmic/create_plasmic_app/PlasmicHomepage.jsx +7 -2
  20. package/cpa-out/nextjs-app-codegen-js/components/plasmic/create_plasmic_app/PlasmicHomepageServer.jsx +1 -1
  21. package/cpa-out/nextjs-app-codegen-js/package.json +2 -2
  22. package/cpa-out/nextjs-app-codegen-js/plasmic-init-client.jsx +16 -0
  23. package/cpa-out/nextjs-app-codegen-js/plasmic.json +2 -2
  24. package/cpa-out/nextjs-app-codegen-ts/app/dynamic/[slug]/page.tsx +12 -4
  25. package/cpa-out/nextjs-app-codegen-ts/app/layout.tsx +3 -4
  26. package/cpa-out/nextjs-app-codegen-ts/app/page.tsx +4 -4
  27. package/cpa-out/nextjs-app-codegen-ts/components/plasmic/create_plasmic_app/PlasmicButton.tsx +1 -0
  28. package/cpa-out/nextjs-app-codegen-ts/components/plasmic/create_plasmic_app/PlasmicDynamicPage.tsx +1 -0
  29. package/cpa-out/nextjs-app-codegen-ts/components/plasmic/create_plasmic_app/PlasmicDynamicPageServer.tsx +1 -1
  30. package/cpa-out/nextjs-app-codegen-ts/components/plasmic/create_plasmic_app/PlasmicHomepage.tsx +7 -2
  31. package/cpa-out/nextjs-app-codegen-ts/components/plasmic/create_plasmic_app/PlasmicHomepageServer.tsx +1 -1
  32. package/cpa-out/nextjs-app-codegen-ts/package.json +2 -2
  33. package/cpa-out/nextjs-app-codegen-ts/plasmic-init-client.tsx +17 -0
  34. package/cpa-out/nextjs-app-codegen-ts/plasmic.json +2 -2
  35. package/cpa-out/nextjs-app-loader-js/package.json +1 -1
  36. package/cpa-out/nextjs-app-loader-js/plasmic-init-client.jsx +2 -40
  37. package/cpa-out/nextjs-app-loader-js/plasmic-init.js +5 -0
  38. package/cpa-out/nextjs-app-loader-ts/package.json +1 -1
  39. package/cpa-out/nextjs-app-loader-ts/plasmic-init-client.tsx +2 -40
  40. package/cpa-out/nextjs-app-loader-ts/plasmic-init.ts +5 -0
  41. package/cpa-out/nextjs-pages-codegen-js/components/plasmic/create_plasmic_app/PlasmicButton.jsx +1 -0
  42. package/cpa-out/nextjs-pages-codegen-js/components/plasmic/create_plasmic_app/PlasmicDynamicPage.jsx +1 -0
  43. package/cpa-out/nextjs-pages-codegen-js/components/plasmic/create_plasmic_app/PlasmicHomepage.jsx +7 -2
  44. package/cpa-out/nextjs-pages-codegen-js/package.json +2 -2
  45. package/cpa-out/nextjs-pages-codegen-js/plasmic.json +2 -2
  46. package/cpa-out/nextjs-pages-codegen-ts/components/plasmic/create_plasmic_app/PlasmicButton.tsx +1 -0
  47. package/cpa-out/nextjs-pages-codegen-ts/components/plasmic/create_plasmic_app/PlasmicDynamicPage.tsx +1 -0
  48. package/cpa-out/nextjs-pages-codegen-ts/components/plasmic/create_plasmic_app/PlasmicHomepage.tsx +7 -2
  49. package/cpa-out/nextjs-pages-codegen-ts/package.json +2 -2
  50. package/cpa-out/nextjs-pages-codegen-ts/plasmic.json +2 -2
  51. package/cpa-out/nextjs-pages-loader-js/package.json +1 -1
  52. package/cpa-out/nextjs-pages-loader-ts/package.json +1 -1
  53. package/cpa-out/react-codegen-js/package.json +2 -2
  54. package/cpa-out/react-codegen-js/plasmic.json +2 -2
  55. package/cpa-out/react-codegen-ts/package.json +2 -2
  56. package/cpa-out/react-codegen-ts/plasmic.json +2 -2
  57. package/cpa-out/tanstack-codegen-ts/package.json +7 -8
  58. package/cpa-out/tanstack-codegen-ts/plasmic.json +2 -2
  59. package/cpa-out/tanstack-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicButton.tsx +1 -5
  60. package/cpa-out/tanstack-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicDynamicPage.tsx +1 -2
  61. package/cpa-out/tanstack-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicHomepage.tsx +7 -5
  62. package/cpa-out/tanstack-codegen-ts/src/components/plasmic/create_plasmic_app/PlasmicStyleTokensProvider.tsx +2 -0
  63. package/cpa-out/tanstack-codegen-ts/src/router.tsx +0 -1
  64. package/cpa-out/tanstack-codegen-ts/tsconfig.json +0 -1
  65. package/cpa-out/tanstack-codegen-ts/vite.config.ts +1 -2
  66. package/dist/nextjs/nextjs.js +7 -2
  67. package/dist/nextjs/templates/app-codegen/layout.js +3 -4
  68. package/dist/nextjs/templates/app-codegen/plasmic-init-client.d.ts +2 -0
  69. package/dist/nextjs/templates/app-codegen/plasmic-init-client.js +24 -0
  70. package/dist/nextjs/templates/app-loader/plasmic-init-client.js +2 -40
  71. package/dist/nextjs/templates/app-loader/plasmic-init.js +0 -5
  72. package/dist/tanstack/tanstack.js +11 -1
  73. package/package.json +2 -2
  74. package/src/nextjs/nextjs.ts +10 -0
  75. package/src/nextjs/templates/app-codegen/layout.ts +3 -4
  76. package/src/nextjs/templates/app-codegen/plasmic-init-client.ts +28 -0
  77. package/src/nextjs/templates/app-loader/plasmic-init-client.ts +2 -40
  78. package/src/nextjs/templates/app-loader/plasmic-init.ts +0 -5
  79. package/src/tanstack/tanstack.ts +11 -1
  80. package/cpa-out/nextjs-app-codegen-js/app/layout.js +0 -28
  81. package/cpa-out/tanstack-codegen-ts/src/components/Footer.tsx +0 -44
  82. package/cpa-out/tanstack-codegen-ts/src/components/Header.tsx +0 -78
  83. package/cpa-out/tanstack-codegen-ts/src/components/ThemeToggle.tsx +0 -81
  84. /package/cpa-out/gatsby-codegen-js/src/components/plasmic/create_plasmic_app/icons/{PlasmicIcon__Checksvg.jsx → PlasmicIcon__CheckSvg.jsx} +0 -0
  85. /package/cpa-out/gatsby-codegen-ts/src/components/plasmic/create_plasmic_app/icons/{PlasmicIcon__Checksvg.tsx → PlasmicIcon__CheckSvg.tsx} +0 -0
  86. /package/cpa-out/nextjs-pages-codegen-js/components/plasmic/create_plasmic_app/icons/{PlasmicIcon__Checksvg.jsx → PlasmicIcon__CheckSvg.jsx} +0 -0
  87. /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 = `npx create-tsrouter-app@latest ${projectName} --template file-router --add-ons start`;
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.142",
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": "f110feb3414bdfdcbd84167e91a951f8dcd4dd60"
50
+ "gitHead": "94026327bd519c5a334ca974ef9d6d3d12855f25"
51
51
  }
@@ -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 { PlasmicRootProvider } from "@plasmicapp/react-web";
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
- <PlasmicRootProvider Link={Link}>
19
+ <ClientPlasmicRootProvider>
21
20
  {children}
22
- </PlasmicRootProvider>
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 in the loader for you.
20
+ * ClientPlasmicRootProvider is a Client Component that passes the loader to PlasmicRootProvider.
21
21
  *
22
- * Why? Props passed from Server to Client Components must be serializable.
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
  }
@@ -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 = `npx create-tsrouter-app@latest ${projectName} --template file-router --add-ons start`;
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
- &copy; {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
- }