Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/early-insects-brake.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"nextjs-darkmode": patch
---

Fix Next.js pages router by upgrading useRGS
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ $ yarn add nextjs-darkmode

### Import Styles

> PLease make sure you set `"moduleResolution"` to `"Bundler"`, `"Node16"` or `"NodeNext"` in your tsconfig file for export field in package.json to work properly. (Ref)[https://stackoverflow.com/a/74462490/23175171]

> You may need to import styles from `nextjs-darkmode/dist/index.css` depending on your bundler configuration.

Import styles globally or within layout component.

```css
Expand Down
8 changes: 8 additions & 0 deletions examples/nextjs-pages/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/** @type {import("eslint").Linter.Config} */
module.exports = {
extends: ["@repo/eslint-config/next.js"],
parser: "@typescript-eslint/parser",
parserOptions: {
project: true,
},
};
6 changes: 6 additions & 0 deletions examples/nextjs-pages/cache/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"telemetry": {
"notifiedAt": "1715050199607",
"enabled": false
}
}
5 changes: 5 additions & 0 deletions examples/nextjs-pages/next-env.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/// <reference types="next" />
/// <reference types="next/image-types/global" />

// NOTE: This file should not be edited
// see https://nextjs.org/docs/basic-features/typescript for more information.
3 changes: 3 additions & 0 deletions examples/nextjs-pages/next.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
reactStrictMode: true,
};
29 changes: 29 additions & 0 deletions examples/nextjs-pages/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"name": "@example/pages",
"version": "0.0.0",
"private": true,
"scripts": {
"build": "next build",
"clean": "rm -rf .next",
"dev": "next dev",
"lint": "next lint",
"typecheck": "tsc --noEmit",
"start": "next start"
},
"dependencies": {
"next": "14.2.4",
"nextjs-darkmode": "workspace:*",
"@repo/shared": "workspace:*",
"react": "^18",
"react-dom": "^18"
},
"devDependencies": {
"@next/eslint-plugin-next": "^14.2.4",
"@repo/eslint-config": "workspace:*",
"@repo/typescript-config": "workspace:*",
"@types/node": "^20",
"@types/react": "^18",
"@types/react-dom": "^18",
"typescript": "^5.4.5"
}
}
Binary file added examples/nextjs-pages/public/favicon.ico
Binary file not shown.
21 changes: 21 additions & 0 deletions examples/nextjs-pages/src/pages/_app.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import "../styles/globals.css";
import type { AppProps } from "next/app";
import { Core } from "nextjs-darkmode";
import { Layout } from "@repo/shared/dist/server";
import { Header } from "@repo/shared";
import { Inter } from "next/font/google";

const inter = Inter({ subsets: ["latin"] });

/** Default app */
export default function App({ Component, pageProps }: AppProps) {
return (
<>
<Core t="all .5s" />
<Layout className={inter.className}>
<Header />
<Component {...pageProps} />;
</Layout>
</>
);
}
14 changes: 14 additions & 0 deletions examples/nextjs-pages/src/pages/_document.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Html, Head, Main, NextScript } from "next/document";

/** Custom document */
export default function Document() {
return (
<Html lang="en">
<Head />
<body>
<Main />
<NextScript />
</body>
</Html>
);
}
20 changes: 20 additions & 0 deletions examples/nextjs-pages/src/pages/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import Head from "next/head";
import { LandingPage } from "@repo/shared/dist/server";
import { Demo } from "@repo/shared";

/** Landing page */
export default function Home() {
return (
<>
<Head>
<title>Next.js Dark Mode | Next.js Pages Router Example</title>
<meta name="description" content="Generated by create next app" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
</Head>
<LandingPage title="Next.js Pages Router Example">
<Demo />
</LandingPage>
</>
);
}
227 changes: 227 additions & 0 deletions examples/nextjs-pages/src/styles/Home.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
.main {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
padding: 6rem;
min-height: 100vh;
}

.description {
display: inherit;
justify-content: inherit;
align-items: inherit;
font-size: 0.85rem;
max-width: var(--max-width);
width: 100%;
z-index: 2;
font-family: var(--font-mono);
}

.description a {
display: flex;
justify-content: center;
align-items: center;
gap: 0.5rem;
}

.description p {
position: relative;
margin: 0;
padding: 1rem;
background-color: rgba(var(--callout-rgb), 0.5);
border: 1px solid rgba(var(--callout-border-rgb), 0.3);
border-radius: var(--border-radius);
}

.code {
font-weight: 700;
font-family: var(--font-mono);
}

.grid {
display: grid;
grid-template-columns: repeat(4, minmax(25%, auto));
max-width: 100%;
width: var(--max-width);
}

.card {
padding: 1rem 1.2rem;
border-radius: var(--border-radius);
background: rgba(var(--card-rgb), 0);
border: 1px solid rgba(var(--card-border-rgb), 0);
transition:
background 200ms,
border 200ms;
}

.card span {
display: inline-block;
transition: transform 200ms;
}

.card h2 {
font-weight: 600;
margin-bottom: 0.7rem;
}

.card p {
margin: 0;
opacity: 0.6;
font-size: 0.9rem;
line-height: 1.5;
max-width: 30ch;
}

.center {
display: flex;
justify-content: center;
align-items: center;
position: relative;
padding: 4rem 0;
}

.center::before {
background: var(--secondary-glow);
border-radius: 50%;
width: 480px;
height: 360px;
margin-left: -400px;
}

.center::after {
background: var(--primary-glow);
width: 240px;
height: 180px;
z-index: -1;
}

.center::before,
.center::after {
content: "";
left: 50%;
position: absolute;
filter: blur(45px);
transform: translateZ(0);
}

.logo {
position: relative;
}
/* Enable hover only on non-touch devices */
@media (hover: hover) and (pointer: fine) {
.card:hover {
background: rgba(var(--card-rgb), 0.1);
border: 1px solid rgba(var(--card-border-rgb), 0.15);
}

.card:hover span {
transform: translateX(4px);
}
}

@media (prefers-reduced-motion) {
.card:hover span {
transform: none;
}
}

/* Mobile */
@media (max-width: 700px) {
.content {
padding: 4rem;
}

.grid {
grid-template-columns: 1fr;
margin-bottom: 120px;
max-width: 320px;
text-align: center;
}

.card {
padding: 1rem 2.5rem;
}

.card h2 {
margin-bottom: 0.5rem;
}

.center {
padding: 8rem 0 6rem;
}

.center::before {
transform: none;
height: 300px;
}

.description {
font-size: 0.8rem;
}

.description a {
padding: 1rem;
}

.description p,
.description div {
display: flex;
justify-content: center;
position: fixed;
width: 100%;
}

.description p {
align-items: center;
inset: 0 0 auto;
padding: 2rem 1rem 1.4rem;
border-radius: 0;
border: none;
border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25);
background: linear-gradient(
to bottom,
rgba(var(--background-start-rgb), 1),
rgba(var(--callout-rgb), 0.5)
);
background-clip: padding-box;
backdrop-filter: blur(24px);
}

.description div {
align-items: flex-end;
pointer-events: none;
inset: auto 0 0;
padding: 2rem;
height: 200px;
background: linear-gradient(to bottom, transparent 0%, rgb(var(--background-end-rgb)) 40%);
z-index: 1;
}
}

/* Tablet and Smaller Desktop */
@media (min-width: 701px) and (max-width: 1120px) {
.grid {
grid-template-columns: repeat(2, 50%);
}
}

@media (prefers-color-scheme: dark) {
.vercelLogo {
filter: invert(1);
}

.logo {
filter: invert(1) drop-shadow(0 0 0.3rem #ffffff70);
}
}

@keyframes rotate {
from {
transform: rotate(360deg);
}
to {
transform: rotate(0deg);
}
}
Loading