create-plasmic-app 0.0.143 → 0.0.145
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/gatsby-config.js +25 -21
- package/cpa-out/gatsby-loader-js/gatsby-node.js +58 -0
- package/cpa-out/gatsby-loader-js/package.json +1 -1
- package/cpa-out/gatsby-loader-js/src/plasmic-init.js +4 -4
- package/cpa-out/gatsby-loader-js/src/templates/defaultPlasmicPage.jsx +2 -1
- package/cpa-out/gatsby-loader-ts/gatsby-config.ts +20 -22
- package/cpa-out/gatsby-loader-ts/gatsby-node.ts +61 -0
- package/cpa-out/gatsby-loader-ts/package.json +1 -1
- package/cpa-out/gatsby-loader-ts/src/templates/defaultPlasmicPage.tsx +6 -2
- 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 +0 -1
- 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 +1 -1
- 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.js +5 -0
- package/cpa-out/nextjs-app-loader-ts/package.json +1 -1
- 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/gatsby/gatsby.js +4 -67
- package/dist/gatsby/template.d.ts +2 -1
- package/dist/gatsby/template.js +122 -25
- package/dist/nextjs/nextjs.js +2 -0
- package/dist/nextjs/templates/app-codegen/plasmic-init-client.js +1 -2
- package/dist/tanstack/tanstack.js +11 -1
- package/package.json +2 -2
- package/src/gatsby/gatsby.ts +16 -28
- package/src/gatsby/template.ts +139 -29
- package/src/nextjs/nextjs.ts +3 -0
- package/src/nextjs/templates/app-codegen/plasmic-init-client.ts +4 -2
- 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
package/src/nextjs/nextjs.ts
CHANGED
|
@@ -118,6 +118,9 @@ async function generateFilesAppDir(args: GenerateFilesArgs) {
|
|
|
118
118
|
makeCatchallPage_app_loader(jsOrTs)
|
|
119
119
|
);
|
|
120
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
|
+
|
|
121
124
|
// ./app/layout.tsx
|
|
122
125
|
await fs.writeFile(
|
|
123
126
|
path.join(projectPath, "app", `layout.${jsOrTs}x`),
|
|
@@ -4,8 +4,10 @@ import { JsOrTs } from "../../../utils/types";
|
|
|
4
4
|
export function makePlasmicInitClient_app_codegen(jsOrTs: JsOrTs): string {
|
|
5
5
|
return `"use client";
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
${ifTs(
|
|
8
|
+
jsOrTs,
|
|
9
|
+
'import type * as React from "react";\n'
|
|
10
|
+
)}import { PlasmicRootProvider } from "@plasmicapp/react-web";
|
|
9
11
|
import Link from "next/link";
|
|
10
12
|
|
|
11
13
|
/**
|
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
|