@koine/next 2.0.0-beta.8 → 2.0.0-beta.80
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/12/AnalyticsGoogle.d.ts +1 -2
- package/12/DisableErrorOverlay.d.ts +1 -6
- package/12/Seo.d.ts +8 -26
- package/12/SeoDefaults.d.ts +3 -4
- package/12/seoBuildTags.d.ts +2 -17
- package/12/types.d.ts +2 -0
- package/12.cjs.d.ts +1 -0
- package/12.cjs.default.js +1 -0
- package/12.cjs.js +53 -0
- package/12.cjs.mjs +2 -0
- package/12.d.ts +3 -0
- package/12.esm.js +43 -0
- package/README.md +0 -12
- package/ThemeContext.cjs.d.ts +2 -0
- package/ThemeContext.cjs.default.js +1 -0
- package/ThemeContext.cjs.js +13 -0
- package/ThemeContext.cjs.mjs +2 -0
- package/ThemeContext.d.ts +11 -0
- package/ThemeContext.esm.js +8 -0
- package/ThemeProvider.cjs.d.ts +2 -0
- package/ThemeProvider.cjs.default.js +1 -0
- package/ThemeProvider.cjs.js +214 -0
- package/ThemeProvider.cjs.mjs +2 -0
- package/ThemeProvider.d.ts +17 -0
- package/ThemeProvider.esm.js +205 -0
- package/config.cjs.d.ts +1 -0
- package/config.cjs.default.js +1 -0
- package/config.cjs.js +84 -0
- package/config.cjs.mjs +2 -0
- package/config.d.ts +7 -0
- package/config.esm.js +80 -0
- package/index.cjs.d.ts +1 -0
- package/index.cjs.default.js +1 -0
- package/index.cjs.js +19 -0
- package/index.cjs.mjs +2 -0
- package/index.d.ts +3 -1
- package/index.esm.js +8 -0
- package/load.cjs.d.ts +2 -0
- package/load.cjs.default.js +1 -0
- package/load.cjs.js +12 -0
- package/load.cjs.mjs +2 -0
- package/load.d.ts +0 -8
- package/load.esm.js +7 -0
- package/package.json +49 -89
- package/typings.d.ts +39 -50
- package/useTheme.cjs.d.ts +2 -0
- package/useTheme.cjs.default.js +1 -0
- package/useTheme.cjs.js +11 -0
- package/useTheme.cjs.mjs +2 -0
- package/useTheme.d.ts +4 -0
- package/useTheme.esm.js +6 -0
- package/12/AnalyticsGoogle.js +0 -79
- package/12/AnalyticsGoogle.mjs +0 -60
- package/12/DisableErrorOverlay.js +0 -31
- package/12/DisableErrorOverlay.mjs +0 -16
- package/12/DynamicNamespaces.d.ts +0 -13
- package/12/DynamicNamespaces.js +0 -23
- package/12/DynamicNamespaces.mjs +0 -8
- package/12/Favicon.d.ts +0 -4
- package/12/Favicon.js +0 -29
- package/12/Favicon.mjs +0 -10
- package/12/Link.d.ts +0 -10
- package/12/Link.js +0 -38
- package/12/Link.mjs +0 -20
- package/12/NextProgress.d.ts +0 -25
- package/12/NextProgress.js +0 -69
- package/12/NextProgress.mjs +0 -51
- package/12/Seo.js +0 -29
- package/12/Seo.mjs +0 -30
- package/12/SeoDefaults.js +0 -31
- package/12/SeoDefaults.mjs +0 -14
- package/12/T.d.ts +0 -16
- package/12/T.js +0 -43
- package/12/T.mjs +0 -27
- package/12/ThemeContext.d.ts +0 -17
- package/12/ThemeContext.js +0 -25
- package/12/ThemeContext.mjs +0 -7
- package/12/ThemeProvider.d.ts +0 -35
- package/12/ThemeProvider.js +0 -256
- package/12/ThemeProvider.mjs +0 -245
- package/12/TransText.d.ts +0 -3
- package/12/TransText.js +0 -23
- package/12/TransText.mjs +0 -4
- package/12/app/AppHead.d.ts +0 -3
- package/12/app/AppHead.js +0 -31
- package/12/app/AppHead.mjs +0 -12
- package/12/app/AppMain.d.ts +0 -35
- package/12/app/AppMain.js +0 -6
- package/12/app/AppMain.mjs +0 -1
- package/12/app/css/AppMain.d.ts +0 -9
- package/12/app/css/AppMain.js +0 -39
- package/12/app/css/AppMain.mjs +0 -24
- package/12/app/css/AppTheme.d.ts +0 -11
- package/12/app/css/AppTheme.js +0 -33
- package/12/app/css/AppTheme.mjs +0 -17
- package/12/app/css/auth/index.d.ts +0 -11
- package/12/app/css/auth/index.js +0 -40
- package/12/app/css/auth/index.mjs +0 -24
- package/12/app/css/index.d.ts +0 -54
- package/12/app/css/index.js +0 -36
- package/12/app/css/index.mjs +0 -65
- package/12/app/index.d.ts +0 -2
- package/12/app/index.js +0 -7
- package/12/app/index.mjs +0 -2
- package/12/app/sc/AppMain.d.ts +0 -11
- package/12/app/sc/AppMain.js +0 -70
- package/12/app/sc/AppMain.mjs +0 -58
- package/12/app/sc/AppTheme.d.ts +0 -14
- package/12/app/sc/AppTheme.js +0 -33
- package/12/app/sc/AppTheme.mjs +0 -16
- package/12/app/sc/auth/index.d.ts +0 -11
- package/12/app/sc/auth/index.js +0 -40
- package/12/app/sc/auth/index.mjs +0 -24
- package/12/app/sc/index.d.ts +0 -56
- package/12/app/sc/index.js +0 -36
- package/12/app/sc/index.mjs +0 -67
- package/12/document/Document.d.ts +0 -15
- package/12/document/Document.js +0 -49
- package/12/document/Document.mjs +0 -38
- package/12/document/css/index.d.ts +0 -17
- package/12/document/css/index.js +0 -60
- package/12/document/css/index.mjs +0 -53
- package/12/document/index.d.ts +0 -2
- package/12/document/index.js +0 -19
- package/12/document/index.mjs +0 -2
- package/12/document/sc/index.d.ts +0 -19
- package/12/document/sc/index.js +0 -73
- package/12/document/sc/index.mjs +0 -65
- package/12/getT.d.ts +0 -9
- package/12/getT.js +0 -23
- package/12/getT.mjs +0 -8
- package/12/index.d.ts +0 -24
- package/12/index.js +0 -100
- package/12/index.mjs +0 -27
- package/12/seoBuildTags.js +0 -126
- package/12/seoBuildTags.mjs +0 -121
- package/12/to.d.ts +0 -24
- package/12/to.js +0 -31
- package/12/to.mjs +0 -19
- package/12/translationAsOptions.d.ts +0 -3
- package/12/translationAsOptions.js +0 -19
- package/12/translationAsOptions.mjs +0 -9
- package/12/types-i18n.d.ts +0 -118
- package/12/types-i18n.js +0 -15
- package/12/types-i18n.mjs +0 -12
- package/12/types-seo.d.ts +0 -7
- package/12/types-seo.js +0 -4
- package/12/types-seo.mjs +0 -1
- package/12/useBackUrl.d.ts +0 -2
- package/12/useBackUrl.js +0 -47
- package/12/useBackUrl.mjs +0 -28
- package/12/useDateFormat.d.ts +0 -7
- package/12/useDateFormat.js +0 -42
- package/12/useDateFormat.mjs +0 -26
- package/12/useForm.d.ts +0 -27
- package/12/useForm.js +0 -65
- package/12/useForm.mjs +0 -47
- package/12/useLocale.d.ts +0 -2
- package/12/useLocale.js +0 -25
- package/12/useLocale.mjs +0 -6
- package/12/useT.d.ts +0 -4
- package/12/useT.js +0 -58
- package/12/useT.mjs +0 -39
- package/12/useTheme.d.ts +0 -7
- package/12/useTheme.js +0 -23
- package/12/useTheme.mjs +0 -7
- package/12/useTo.d.ts +0 -3
- package/12/useTo.js +0 -26
- package/12/useTo.mjs +0 -8
- package/config/index.d.ts +0 -160
- package/config/index.js +0 -317
- package/config/index.mjs +0 -315
- package/getSiteUrl.d.ts +0 -8
- package/getSiteUrl.js +0 -24
- package/getSiteUrl.mjs +0 -10
- package/index.js +0 -20
- package/index.mjs +0 -2
- package/load.js +0 -31
- package/load.mjs +0 -13
package/12/AnalyticsGoogle.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export type AnalyticsGoogleProps = {
|
|
2
|
-
/** Falls back to `.env` variable `NEXT_PUBLIC_GTM_ID` */
|
|
3
2
|
id?: string;
|
|
4
3
|
};
|
|
5
|
-
export declare
|
|
4
|
+
export declare let AnalyticsGoogle: ({ id }: AnalyticsGoogleProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
6
5
|
export default AnalyticsGoogle;
|
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Disable error overlay during `dev`
|
|
3
|
-
*
|
|
4
|
-
* @see https://github.com/vercel/next.js/discussions/13387#discussioncomment-101564
|
|
5
|
-
*/
|
|
6
|
-
export declare const DisableErrorOverlay: () => import("react/jsx-runtime").JSX.Element;
|
|
1
|
+
export declare let DisableErrorOverlay: () => import("react/jsx-runtime").JSX.Element;
|
|
7
2
|
export default DisableErrorOverlay;
|
package/12/Seo.d.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import type { NextSeoProps } from "next-seo/lib/types";
|
|
2
2
|
import { type LinkTag, type MetaTag } from "./seoBuildTags";
|
|
3
|
-
|
|
3
|
+
export type SeoData = {
|
|
4
|
+
hidden?: boolean;
|
|
5
|
+
title?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
keywords?: string | string[];
|
|
8
|
+
ogimage?: string;
|
|
9
|
+
};
|
|
4
10
|
type SeoPropsOpenGraph = NextSeoProps["openGraph"] & {
|
|
5
11
|
image?: string;
|
|
6
12
|
};
|
|
7
|
-
/**
|
|
8
|
-
* @see https://github.com/garmeeh/next-seo/blob/master/src/types.ts#L395
|
|
9
|
-
*/
|
|
10
13
|
export type SeoProps = Omit<NextSeoProps, "additionalMetaTags" | "additionalLinkTags" | "mobileAlternate" | "robotsProps"> & {
|
|
11
14
|
metaTags?: ReadonlyArray<MetaTag>;
|
|
12
15
|
linkTags?: ReadonlyArray<LinkTag>;
|
|
@@ -16,26 +19,5 @@ export type SeoProps = Omit<NextSeoProps, "additionalMetaTags" | "additionalLink
|
|
|
16
19
|
openGraph?: SeoPropsOpenGraph;
|
|
17
20
|
og?: SeoPropsOpenGraph;
|
|
18
21
|
};
|
|
19
|
-
|
|
20
|
-
* Adapted from [garmeeh/next-seo](https://github.com/garmeeh/next-seo)
|
|
21
|
-
*
|
|
22
|
-
* See also:
|
|
23
|
-
* - https://github.com/catnose99/next-head-seo
|
|
24
|
-
* - https://nextjs.org/docs/api-reference/next/head
|
|
25
|
-
*
|
|
26
|
-
* NB: on the homepage you usually want to customize the `titleTemplate` to avoid
|
|
27
|
-
* doubled app name. Assuming your default seo configuration is something like:
|
|
28
|
-
*
|
|
29
|
-
* ```js
|
|
30
|
-
* {
|
|
31
|
-
* titleTemplate: "%s | MyApp"
|
|
32
|
-
* }
|
|
33
|
-
* ```
|
|
34
|
-
*
|
|
35
|
-
* On the homepage you migh want to override it, e.g.:
|
|
36
|
-
* ```js
|
|
37
|
-
* <Seo title="MyApp | Some description" titleTemplate="%s" />
|
|
38
|
-
* ```
|
|
39
|
-
*/
|
|
40
|
-
export declare const Seo: (props: SeoProps) => import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare let Seo: (props: SeoProps) => import("react/jsx-runtime").JSX.Element;
|
|
41
23
|
export default Seo;
|
package/12/SeoDefaults.d.ts
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import type { DefaultSeoProps } from "next-seo/lib/types";
|
|
2
|
+
import type { JsonObject } from "@koine/utils";
|
|
2
3
|
import { type LinkTag, type MetaTag } from "./seoBuildTags";
|
|
3
|
-
/**
|
|
4
|
-
* @see https://github.com/garmeeh/next-seo/blob/master/src/types.ts#L413
|
|
5
|
-
*/
|
|
6
4
|
export type SeoDefaultsProps = Omit<DefaultSeoProps, "additionalMetaTags" | "additionalLinkTags" | "dangerouslySetAllPagesToNoIndex" | "dangerouslySetAllPagesToNoFollow" | "defaultOpenGraphImageWidth" | "defaultOpenGraphImageHeight" | "defaultOpenGraphVideoWidth" | "defaultOpenGraphVideoHeight" | "mobileAlternate" | "robotsProps"> & {
|
|
7
5
|
metaTags?: ReadonlyArray<MetaTag>;
|
|
8
6
|
linkTags?: ReadonlyArray<LinkTag>;
|
|
7
|
+
schema?: JsonObject;
|
|
9
8
|
};
|
|
10
|
-
export declare
|
|
9
|
+
export declare let SeoDefaults: (props: SeoDefaultsProps) => import("react/jsx-runtime").JSX.Element;
|
|
11
10
|
export default SeoDefaults;
|
package/12/seoBuildTags.d.ts
CHANGED
|
@@ -1,23 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="react" />
|
|
2
2
|
import type { SeoProps } from "./Seo";
|
|
3
3
|
import type { SeoDefaultsProps } from "./SeoDefaults";
|
|
4
4
|
export type MetaTag = React.DetailedHTMLProps<React.MetaHTMLAttributes<HTMLMetaElement>, HTMLMetaElement>;
|
|
5
5
|
export type LinkTag = React.DetailedHTMLProps<React.LinkHTMLAttributes<HTMLLinkElement>, HTMLLinkElement>;
|
|
6
6
|
type BuildTagsParams = SeoProps & SeoDefaultsProps;
|
|
7
|
-
|
|
8
|
-
* Comparing to `next-seo` we do a couple of things in addition while many
|
|
9
|
-
* others are removed.
|
|
10
|
-
*
|
|
11
|
-
* - Add `seo` meta object coming from a CMS probably
|
|
12
|
-
* - Add `ogimage` and `openGraph.image` as single image source
|
|
13
|
-
* - Add `og` alias to define `openGraph`
|
|
14
|
-
* - Add check for `title` equal to `templateTitle` to avoid meta titles like
|
|
15
|
-
* "My site | My site" often happening in homepages
|
|
16
|
-
* - Remove the open graph videos and images
|
|
17
|
-
*
|
|
18
|
-
* - Shorter code
|
|
19
|
-
*
|
|
20
|
-
* @returns
|
|
21
|
-
*/
|
|
22
|
-
export declare const seoBuildTags: ({ seo, hidden, keywords, title, titleTemplate, defaultTitle, noindex, nofollow, description, languageAlternates, twitter, facebook, openGraph, og: ogAlias, canonical, metaTags, linkTags, }?: BuildTagsParams) => React.ReactNode[];
|
|
7
|
+
export declare const seoBuildTags: ({ seo, hidden, keywords, title, titleTemplate, defaultTitle, noindex, nofollow, description, languageAlternates, twitter, facebook, openGraph, og: ogAlias, canonical, metaTags, linkTags, schema, }?: BuildTagsParams) => import("react").ReactNode[];
|
|
23
8
|
export default seoBuildTags;
|
package/12/types.d.ts
ADDED
package/12.cjs.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./12";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
exports._default = require('./12.cjs.js').default;
|
package/12.cjs.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var router = require('next/router');
|
|
7
|
+
var Script = require('next/script');
|
|
8
|
+
var react = require('react');
|
|
9
|
+
var browser = require('@koine/browser');
|
|
10
|
+
var Head = require('next/head');
|
|
11
|
+
|
|
12
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
13
|
+
|
|
14
|
+
var Script__default = /*#__PURE__*/_interopDefaultLegacy(Script);
|
|
15
|
+
var Head__default = /*#__PURE__*/_interopDefaultLegacy(Head);
|
|
16
|
+
|
|
17
|
+
let AnalyticsGoogle = ({ id }) => {
|
|
18
|
+
const uid = id || process.env["NEXT_PUBLIC_GTM_ID"];
|
|
19
|
+
const { events, asPath, query } = router.useRouter();
|
|
20
|
+
const [ready, setReady] = react.useState(false);
|
|
21
|
+
const [routed, setRouted] = react.useState(false);
|
|
22
|
+
react.useEffect(() => {
|
|
23
|
+
const handleRouteChange = () => {
|
|
24
|
+
setRouted(true);
|
|
25
|
+
};
|
|
26
|
+
events.on("routeChangeComplete", handleRouteChange);
|
|
27
|
+
return () => {
|
|
28
|
+
events.off("routeChangeComplete", handleRouteChange);
|
|
29
|
+
};
|
|
30
|
+
}, [events]);
|
|
31
|
+
react.useEffect(() => {
|
|
32
|
+
if (routed && ready && asPath) {
|
|
33
|
+
browser.gtagPageview(asPath);
|
|
34
|
+
}
|
|
35
|
+
}, [asPath, query, routed, ready]);
|
|
36
|
+
if (!uid) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Script__default["default"], { id: "google-tagmanager", src: `https://www.googletagmanager.com/gtag/js?id=${id}`, strategy: "afterInteractive", onLoad: () => setReady(true) }), jsxRuntime.jsx(Script__default["default"], { id: "google-analytics", strategy: "afterInteractive", children: `
|
|
40
|
+
window.dataLayer = window.dataLayer || [];
|
|
41
|
+
function gtag(){window.dataLayer.push(arguments);}
|
|
42
|
+
gtag('js', new Date());
|
|
43
|
+
|
|
44
|
+
gtag('config', '${id}', { 'send_page_view': false });
|
|
45
|
+
` })] }));
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
let DisableErrorOverlay = () => (jsxRuntime.jsx(Head__default["default"], { children: process.env["NODE_ENV"] === "development" && (jsxRuntime.jsx("script", { dangerouslySetInnerHTML: {
|
|
49
|
+
__html: `window.addEventListener('error',event =>{event.stopImmediatePropagation()});window.addEventListener('unhandledrejection',event =>{event.stopImmediatePropagation()});`,
|
|
50
|
+
} })) }));
|
|
51
|
+
|
|
52
|
+
exports.AnalyticsGoogle = AnalyticsGoogle;
|
|
53
|
+
exports.DisableErrorOverlay = DisableErrorOverlay;
|
package/12.cjs.mjs
ADDED
package/12.d.ts
ADDED
package/12.esm.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useRouter } from 'next/router';
|
|
3
|
+
import Script from 'next/script';
|
|
4
|
+
import { useState, useEffect } from 'react';
|
|
5
|
+
import { gtagPageview } from '@koine/browser';
|
|
6
|
+
import Head from 'next/head';
|
|
7
|
+
|
|
8
|
+
let AnalyticsGoogle = ({ id }) => {
|
|
9
|
+
const uid = id || process.env["NEXT_PUBLIC_GTM_ID"];
|
|
10
|
+
const { events, asPath, query } = useRouter();
|
|
11
|
+
const [ready, setReady] = useState(false);
|
|
12
|
+
const [routed, setRouted] = useState(false);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
const handleRouteChange = () => {
|
|
15
|
+
setRouted(true);
|
|
16
|
+
};
|
|
17
|
+
events.on("routeChangeComplete", handleRouteChange);
|
|
18
|
+
return () => {
|
|
19
|
+
events.off("routeChangeComplete", handleRouteChange);
|
|
20
|
+
};
|
|
21
|
+
}, [events]);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (routed && ready && asPath) {
|
|
24
|
+
gtagPageview(asPath);
|
|
25
|
+
}
|
|
26
|
+
}, [asPath, query, routed, ready]);
|
|
27
|
+
if (!uid) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return (jsxs(Fragment, { children: [jsx(Script, { id: "google-tagmanager", src: `https://www.googletagmanager.com/gtag/js?id=${id}`, strategy: "afterInteractive", onLoad: () => setReady(true) }), jsx(Script, { id: "google-analytics", strategy: "afterInteractive", children: `
|
|
31
|
+
window.dataLayer = window.dataLayer || [];
|
|
32
|
+
function gtag(){window.dataLayer.push(arguments);}
|
|
33
|
+
gtag('js', new Date());
|
|
34
|
+
|
|
35
|
+
gtag('config', '${id}', { 'send_page_view': false });
|
|
36
|
+
` })] }));
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
let DisableErrorOverlay = () => (jsx(Head, { children: process.env["NODE_ENV"] === "development" && (jsx("script", { dangerouslySetInnerHTML: {
|
|
40
|
+
__html: `window.addEventListener('error',event =>{event.stopImmediatePropagation()});window.addEventListener('unhandledrejection',event =>{event.stopImmediatePropagation()});`,
|
|
41
|
+
} })) }));
|
|
42
|
+
|
|
43
|
+
export { AnalyticsGoogle, DisableErrorOverlay };
|
package/README.md
CHANGED
|
@@ -1,13 +1 @@
|
|
|
1
1
|
# @koine/next
|
|
2
|
-
|
|
3
|
-
## i18n
|
|
4
|
-
|
|
5
|
-
To make typescript work nicely with `useT`, `getT` and `T` make sure to enable [`resolveJsonModule`](https://www.typescriptlang.org/tsconfig#resolveJsonModule) in your `tsconfig.json` file:
|
|
6
|
-
|
|
7
|
-
```json
|
|
8
|
-
{
|
|
9
|
-
"compilerOptions": {
|
|
10
|
-
"resolveJsonModule": true
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
exports._default = require('./ThemeContext.cjs.js').default;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var react = require('react');
|
|
6
|
+
|
|
7
|
+
const ThemeContext = react.createContext({
|
|
8
|
+
setTheme: (_) => { },
|
|
9
|
+
themes: [],
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
exports.ThemeContext = ThemeContext;
|
|
13
|
+
exports["default"] = ThemeContext;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export type ThemeContextProps = {
|
|
3
|
+
themes: string[];
|
|
4
|
+
forcedTheme?: string;
|
|
5
|
+
setTheme: (theme: string) => void;
|
|
6
|
+
theme?: string;
|
|
7
|
+
resolvedTheme?: string;
|
|
8
|
+
systemTheme?: "dark" | "light";
|
|
9
|
+
};
|
|
10
|
+
export declare const ThemeContext: import("react").Context<ThemeContextProps>;
|
|
11
|
+
export default ThemeContext;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
exports._default = require('./ThemeProvider.cjs.js').default;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var Script = require('next/script');
|
|
7
|
+
var react = require('react');
|
|
8
|
+
var utils = require('@koine/utils');
|
|
9
|
+
var ThemeContext = require('./ThemeContext.cjs.js');
|
|
10
|
+
|
|
11
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
12
|
+
|
|
13
|
+
var Script__default = /*#__PURE__*/_interopDefaultLegacy(Script);
|
|
14
|
+
|
|
15
|
+
const colorSchemes = ["light", "dark"];
|
|
16
|
+
const MEDIA = "(prefers-color-scheme: dark)";
|
|
17
|
+
const THEME_STORAGE_KEY = "theme";
|
|
18
|
+
const ThemeProvider = ({ forcedTheme, disableTransitionOnChange = false, enableSystem = true, enableColorScheme, themes = ["light", "dark"], defaultTheme = enableSystem ? "system" : "light", attribute = "data-theme", value, children, nonce, }) => {
|
|
19
|
+
const [theme, setThemeState] = react.useState(() => getTheme(THEME_STORAGE_KEY, defaultTheme));
|
|
20
|
+
const [resolvedTheme, setResolvedTheme] = react.useState(() => getTheme(THEME_STORAGE_KEY));
|
|
21
|
+
const attrs = !value ? themes : Object.values(value);
|
|
22
|
+
const applyTheme = react.useCallback((theme) => {
|
|
23
|
+
let resolved = theme;
|
|
24
|
+
if (utils.isServer || !resolved)
|
|
25
|
+
return;
|
|
26
|
+
if (theme === "system" && enableSystem) {
|
|
27
|
+
resolved = getSystemTheme();
|
|
28
|
+
}
|
|
29
|
+
const name = value ? value[resolved] : resolved;
|
|
30
|
+
const enable = disableTransitionOnChange ? disableAnimation() : null;
|
|
31
|
+
const d = document.documentElement;
|
|
32
|
+
if (attribute === "class") {
|
|
33
|
+
d.classList.remove(...attrs);
|
|
34
|
+
if (name)
|
|
35
|
+
d.classList.add(name);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
if (name) {
|
|
39
|
+
d.setAttribute(attribute, name);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
d.removeAttribute(attribute);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (enableColorScheme) {
|
|
46
|
+
const fallback = colorSchemes.includes(defaultTheme)
|
|
47
|
+
? defaultTheme
|
|
48
|
+
: "";
|
|
49
|
+
const colorScheme = colorSchemes.includes(resolved)
|
|
50
|
+
? resolved
|
|
51
|
+
: fallback;
|
|
52
|
+
d.style.colorScheme = colorScheme;
|
|
53
|
+
}
|
|
54
|
+
enable?.();
|
|
55
|
+
}, [
|
|
56
|
+
attribute,
|
|
57
|
+
attrs,
|
|
58
|
+
defaultTheme,
|
|
59
|
+
disableTransitionOnChange,
|
|
60
|
+
enableColorScheme,
|
|
61
|
+
enableSystem,
|
|
62
|
+
value,
|
|
63
|
+
]);
|
|
64
|
+
const setTheme = react.useCallback((theme) => {
|
|
65
|
+
setThemeState(theme);
|
|
66
|
+
try {
|
|
67
|
+
localStorage.setItem(THEME_STORAGE_KEY, theme);
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
}
|
|
71
|
+
}, []);
|
|
72
|
+
const handleMediaQuery = react.useCallback((e) => {
|
|
73
|
+
const resolved = getSystemTheme(e);
|
|
74
|
+
setResolvedTheme(resolved);
|
|
75
|
+
if (theme === "system" && enableSystem && !forcedTheme) {
|
|
76
|
+
applyTheme("system");
|
|
77
|
+
}
|
|
78
|
+
}, [theme, enableSystem, forcedTheme, applyTheme]);
|
|
79
|
+
react.useEffect(() => {
|
|
80
|
+
const media = window.matchMedia(MEDIA);
|
|
81
|
+
media.addListener(handleMediaQuery);
|
|
82
|
+
handleMediaQuery(media);
|
|
83
|
+
return () => media.removeListener(handleMediaQuery);
|
|
84
|
+
}, [handleMediaQuery]);
|
|
85
|
+
react.useEffect(() => {
|
|
86
|
+
const handleStorage = (e) => {
|
|
87
|
+
if (e.key !== THEME_STORAGE_KEY) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const theme = e.newValue || defaultTheme;
|
|
91
|
+
setTheme(theme);
|
|
92
|
+
};
|
|
93
|
+
window.addEventListener("storage", handleStorage);
|
|
94
|
+
return () => window.removeEventListener("storage", handleStorage);
|
|
95
|
+
}, [defaultTheme, setTheme]);
|
|
96
|
+
react.useEffect(() => {
|
|
97
|
+
applyTheme(forcedTheme ?? theme);
|
|
98
|
+
}, [applyTheme, forcedTheme, theme]);
|
|
99
|
+
return (jsxRuntime.jsxs(ThemeContext.ThemeContext.Provider, { value: {
|
|
100
|
+
theme,
|
|
101
|
+
setTheme,
|
|
102
|
+
forcedTheme,
|
|
103
|
+
resolvedTheme: theme === "system" ? resolvedTheme : theme,
|
|
104
|
+
themes: enableSystem ? [...themes, "system"] : themes,
|
|
105
|
+
systemTheme: (enableSystem ? resolvedTheme : undefined),
|
|
106
|
+
}, children: [jsxRuntime.jsx(ThemeScript, { forcedTheme,
|
|
107
|
+
disableTransitionOnChange,
|
|
108
|
+
enableSystem,
|
|
109
|
+
enableColorScheme,
|
|
110
|
+
themes,
|
|
111
|
+
defaultTheme,
|
|
112
|
+
attribute,
|
|
113
|
+
value,
|
|
114
|
+
children,
|
|
115
|
+
attrs,
|
|
116
|
+
nonce }), children] }));
|
|
117
|
+
};
|
|
118
|
+
const ThemeScript = react.memo(({ forcedTheme, attribute, enableSystem, enableColorScheme, defaultTheme, value, attrs, nonce, }) => {
|
|
119
|
+
const defaultSystem = defaultTheme === "system";
|
|
120
|
+
const optimization = (() => {
|
|
121
|
+
const removeClasses = `d.remove(${attrs
|
|
122
|
+
.map((t) => `'${t}'`)
|
|
123
|
+
.join(",")})`;
|
|
124
|
+
return `var d=document.documentElement.classList;${removeClasses};`;
|
|
125
|
+
})();
|
|
126
|
+
const fallbackColorScheme = (() => {
|
|
127
|
+
if (!enableColorScheme) {
|
|
128
|
+
return "";
|
|
129
|
+
}
|
|
130
|
+
const fallback = colorSchemes.includes(defaultTheme)
|
|
131
|
+
? defaultTheme
|
|
132
|
+
: null;
|
|
133
|
+
if (fallback) {
|
|
134
|
+
return `if(e==='light'||e==='dark'||!e)d.style.colorScheme=e||'${defaultTheme}'`;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
return `if(e==='light'||e==='dark')d.style.colorScheme=e`;
|
|
138
|
+
}
|
|
139
|
+
})();
|
|
140
|
+
const updateDOM = (name, literal = false, setColorScheme = true) => {
|
|
141
|
+
const resolvedName = value ? value[name] : name;
|
|
142
|
+
const val = literal ? name + `|| ''` : `'${resolvedName}'`;
|
|
143
|
+
let text = "";
|
|
144
|
+
if (enableColorScheme &&
|
|
145
|
+
setColorScheme &&
|
|
146
|
+
!literal &&
|
|
147
|
+
colorSchemes.includes(name)) {
|
|
148
|
+
text += `d.style.colorScheme = '${name}';`;
|
|
149
|
+
}
|
|
150
|
+
if (attribute === "class") {
|
|
151
|
+
if (literal || resolvedName) {
|
|
152
|
+
text += `d.add(${val})`;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
text += `null`;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
if (resolvedName) {
|
|
160
|
+
text += `d[s](n, ${val})`;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return text;
|
|
164
|
+
};
|
|
165
|
+
const scriptSrc = (() => {
|
|
166
|
+
if (forcedTheme) {
|
|
167
|
+
return `!function(){${optimization}${updateDOM(forcedTheme)}}()`;
|
|
168
|
+
}
|
|
169
|
+
if (enableSystem) {
|
|
170
|
+
return `!function(){try {${optimization}var e=localStorage.getItem('${THEME_STORAGE_KEY}');if("system"===e||(!e&&${defaultSystem})){var t="${MEDIA}",m=window.matchMedia(t);if(m.media!==t||m.matches){${updateDOM("dark")}}else{${updateDOM("light")}}}else if(e){${value ? `var x=${JSON.stringify(value)};` : ""}${updateDOM(value ? `x[e]` : "e", true)}}${!defaultSystem
|
|
171
|
+
? `else{` + updateDOM(defaultTheme, false, false) + "}"
|
|
172
|
+
: ""}${fallbackColorScheme}}catch(e){}}()`;
|
|
173
|
+
}
|
|
174
|
+
return `!function(){try{${optimization}var e=localStorage.getItem("${THEME_STORAGE_KEY}");if(e){${value ? `var x=${JSON.stringify(value)};` : ""}${updateDOM(value ? `x[e]` : "e", true)}}else{${updateDOM(defaultTheme, false, false)};}${fallbackColorScheme}}catch(t){}}();`;
|
|
175
|
+
})();
|
|
176
|
+
const encodedScript = `data:text/javascript;base64,${encodeBase64(scriptSrc)}`;
|
|
177
|
+
return (jsxRuntime.jsx(Script__default["default"], { id: "next-theme-script", strategy: "beforeInteractive", src: encodedScript, nonce: nonce }));
|
|
178
|
+
}, () => true);
|
|
179
|
+
const getTheme = (key, fallback) => {
|
|
180
|
+
if (utils.isServer)
|
|
181
|
+
return undefined;
|
|
182
|
+
let theme;
|
|
183
|
+
try {
|
|
184
|
+
theme = localStorage.getItem(key) || undefined;
|
|
185
|
+
}
|
|
186
|
+
catch (e) {
|
|
187
|
+
}
|
|
188
|
+
return theme || fallback;
|
|
189
|
+
};
|
|
190
|
+
const disableAnimation = () => {
|
|
191
|
+
const d = document;
|
|
192
|
+
const css = d.createElement("style");
|
|
193
|
+
css.appendChild(d.createTextNode(`*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}`));
|
|
194
|
+
d.head.appendChild(css);
|
|
195
|
+
return () => {
|
|
196
|
+
(() => window.getComputedStyle(d.body))();
|
|
197
|
+
setTimeout(() => {
|
|
198
|
+
d.head.removeChild(css);
|
|
199
|
+
}, 1);
|
|
200
|
+
};
|
|
201
|
+
};
|
|
202
|
+
const getSystemTheme = (e) => {
|
|
203
|
+
if (!e)
|
|
204
|
+
e = window.matchMedia(MEDIA);
|
|
205
|
+
const isDark = e.matches;
|
|
206
|
+
const systemTheme = isDark ? "dark" : "light";
|
|
207
|
+
return systemTheme;
|
|
208
|
+
};
|
|
209
|
+
const encodeBase64 = (str) => {
|
|
210
|
+
return utils.isServer ? Buffer.from(str).toString("base64") : btoa(str);
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
exports.ThemeProvider = ThemeProvider;
|
|
214
|
+
exports["default"] = ThemeProvider;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
type ValueObject = {
|
|
3
|
+
[themeName: string]: string;
|
|
4
|
+
};
|
|
5
|
+
export type ThemeProviderProps = React.PropsWithChildren<{
|
|
6
|
+
themes?: string[];
|
|
7
|
+
forcedTheme?: string;
|
|
8
|
+
enableSystem?: boolean;
|
|
9
|
+
disableTransitionOnChange?: boolean;
|
|
10
|
+
enableColorScheme?: boolean;
|
|
11
|
+
defaultTheme?: string;
|
|
12
|
+
attribute?: string | "class";
|
|
13
|
+
value?: ValueObject;
|
|
14
|
+
nonce?: string;
|
|
15
|
+
}>;
|
|
16
|
+
export declare const ThemeProvider: ({ forcedTheme, disableTransitionOnChange, enableSystem, enableColorScheme, themes, defaultTheme, attribute, value, children, nonce, }: ThemeProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export default ThemeProvider;
|