@koine/next 2.0.0-beta.7 → 2.0.0-beta.70

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 (160) hide show
  1. package/12/AnalyticsGoogle.d.ts +1 -2
  2. package/12/DisableErrorOverlay.d.ts +1 -6
  3. package/12/Seo.d.ts +8 -26
  4. package/12/SeoDefaults.d.ts +3 -4
  5. package/12/seoBuildTags.d.ts +1 -16
  6. package/12/types.d.ts +2 -0
  7. package/12.cjs.d.ts +1 -0
  8. package/12.cjs.default.js +1 -0
  9. package/12.cjs.js +28 -0
  10. package/12.cjs.mjs +2 -0
  11. package/12.d.ts +3 -0
  12. package/12.esm.js +18 -0
  13. package/README.md +0 -12
  14. package/config.cjs.d.ts +1 -0
  15. package/config.cjs.default.js +1 -0
  16. package/config.cjs.js +9 -0
  17. package/config.cjs.mjs +2 -0
  18. package/config.d.ts +7 -0
  19. package/config.esm.js +5 -0
  20. package/index.cjs.d.ts +1 -0
  21. package/index.cjs.default.js +1 -0
  22. package/index.cjs.js +25 -0
  23. package/index.cjs.mjs +2 -0
  24. package/index.d.ts +4 -2
  25. package/index.esm.js +14 -0
  26. package/package.json +30 -69
  27. package/theme/ThemeContext.d.ts +11 -0
  28. package/theme/ThemeProvider.d.ts +17 -0
  29. package/theme/useTheme.d.ts +4 -0
  30. package/typings.d.ts +39 -50
  31. package/utils/load.d.ts +1 -0
  32. package/12/AnalyticsGoogle.js +0 -79
  33. package/12/AnalyticsGoogle.mjs +0 -60
  34. package/12/DisableErrorOverlay.js +0 -31
  35. package/12/DisableErrorOverlay.mjs +0 -16
  36. package/12/DynamicNamespaces.d.ts +0 -13
  37. package/12/DynamicNamespaces.js +0 -23
  38. package/12/DynamicNamespaces.mjs +0 -8
  39. package/12/Favicon.d.ts +0 -4
  40. package/12/Favicon.js +0 -29
  41. package/12/Favicon.mjs +0 -10
  42. package/12/Link.d.ts +0 -10
  43. package/12/Link.js +0 -38
  44. package/12/Link.mjs +0 -20
  45. package/12/NextProgress.d.ts +0 -25
  46. package/12/NextProgress.js +0 -69
  47. package/12/NextProgress.mjs +0 -51
  48. package/12/Seo.js +0 -29
  49. package/12/Seo.mjs +0 -30
  50. package/12/SeoDefaults.js +0 -31
  51. package/12/SeoDefaults.mjs +0 -14
  52. package/12/T.d.ts +0 -16
  53. package/12/T.js +0 -43
  54. package/12/T.mjs +0 -27
  55. package/12/ThemeContext.d.ts +0 -17
  56. package/12/ThemeContext.js +0 -25
  57. package/12/ThemeContext.mjs +0 -7
  58. package/12/ThemeProvider.d.ts +0 -35
  59. package/12/ThemeProvider.js +0 -256
  60. package/12/ThemeProvider.mjs +0 -245
  61. package/12/TransText.d.ts +0 -3
  62. package/12/TransText.js +0 -23
  63. package/12/TransText.mjs +0 -4
  64. package/12/app/AppHead.d.ts +0 -3
  65. package/12/app/AppHead.js +0 -31
  66. package/12/app/AppHead.mjs +0 -12
  67. package/12/app/AppMain.d.ts +0 -35
  68. package/12/app/AppMain.js +0 -6
  69. package/12/app/AppMain.mjs +0 -1
  70. package/12/app/css/AppMain.d.ts +0 -9
  71. package/12/app/css/AppMain.js +0 -39
  72. package/12/app/css/AppMain.mjs +0 -24
  73. package/12/app/css/AppTheme.d.ts +0 -11
  74. package/12/app/css/AppTheme.js +0 -33
  75. package/12/app/css/AppTheme.mjs +0 -17
  76. package/12/app/css/auth/index.d.ts +0 -11
  77. package/12/app/css/auth/index.js +0 -40
  78. package/12/app/css/auth/index.mjs +0 -24
  79. package/12/app/css/index.d.ts +0 -54
  80. package/12/app/css/index.js +0 -36
  81. package/12/app/css/index.mjs +0 -65
  82. package/12/app/index.d.ts +0 -2
  83. package/12/app/index.js +0 -7
  84. package/12/app/index.mjs +0 -2
  85. package/12/app/sc/AppMain.d.ts +0 -11
  86. package/12/app/sc/AppMain.js +0 -70
  87. package/12/app/sc/AppMain.mjs +0 -58
  88. package/12/app/sc/AppTheme.d.ts +0 -14
  89. package/12/app/sc/AppTheme.js +0 -33
  90. package/12/app/sc/AppTheme.mjs +0 -16
  91. package/12/app/sc/auth/index.d.ts +0 -11
  92. package/12/app/sc/auth/index.js +0 -40
  93. package/12/app/sc/auth/index.mjs +0 -24
  94. package/12/app/sc/index.d.ts +0 -56
  95. package/12/app/sc/index.js +0 -36
  96. package/12/app/sc/index.mjs +0 -67
  97. package/12/document/Document.d.ts +0 -15
  98. package/12/document/Document.js +0 -49
  99. package/12/document/Document.mjs +0 -38
  100. package/12/document/css/index.d.ts +0 -17
  101. package/12/document/css/index.js +0 -60
  102. package/12/document/css/index.mjs +0 -53
  103. package/12/document/index.d.ts +0 -2
  104. package/12/document/index.js +0 -19
  105. package/12/document/index.mjs +0 -2
  106. package/12/document/sc/index.d.ts +0 -19
  107. package/12/document/sc/index.js +0 -73
  108. package/12/document/sc/index.mjs +0 -65
  109. package/12/getT.d.ts +0 -9
  110. package/12/getT.js +0 -23
  111. package/12/getT.mjs +0 -8
  112. package/12/index.d.ts +0 -24
  113. package/12/index.js +0 -100
  114. package/12/index.mjs +0 -27
  115. package/12/seoBuildTags.js +0 -126
  116. package/12/seoBuildTags.mjs +0 -121
  117. package/12/to.d.ts +0 -24
  118. package/12/to.js +0 -31
  119. package/12/to.mjs +0 -19
  120. package/12/translationAsOptions.d.ts +0 -3
  121. package/12/translationAsOptions.js +0 -19
  122. package/12/translationAsOptions.mjs +0 -9
  123. package/12/types-i18n.d.ts +0 -118
  124. package/12/types-i18n.js +0 -15
  125. package/12/types-i18n.mjs +0 -12
  126. package/12/types-seo.d.ts +0 -7
  127. package/12/types-seo.js +0 -4
  128. package/12/types-seo.mjs +0 -1
  129. package/12/useBackUrl.d.ts +0 -2
  130. package/12/useBackUrl.js +0 -47
  131. package/12/useBackUrl.mjs +0 -28
  132. package/12/useDateFormat.d.ts +0 -7
  133. package/12/useDateFormat.js +0 -42
  134. package/12/useDateFormat.mjs +0 -26
  135. package/12/useForm.d.ts +0 -27
  136. package/12/useForm.js +0 -65
  137. package/12/useForm.mjs +0 -47
  138. package/12/useLocale.d.ts +0 -2
  139. package/12/useLocale.js +0 -25
  140. package/12/useLocale.mjs +0 -6
  141. package/12/useT.d.ts +0 -4
  142. package/12/useT.js +0 -58
  143. package/12/useT.mjs +0 -39
  144. package/12/useTheme.d.ts +0 -7
  145. package/12/useTheme.js +0 -23
  146. package/12/useTheme.mjs +0 -7
  147. package/12/useTo.d.ts +0 -3
  148. package/12/useTo.js +0 -26
  149. package/12/useTo.mjs +0 -8
  150. package/config/index.d.ts +0 -160
  151. package/config/index.js +0 -317
  152. package/config/index.mjs +0 -315
  153. package/getSiteUrl.d.ts +0 -8
  154. package/getSiteUrl.js +0 -24
  155. package/getSiteUrl.mjs +0 -10
  156. package/index.js +0 -20
  157. package/index.mjs +0 -2
  158. package/load.d.ts +0 -10
  159. package/load.js +0 -31
  160. package/load.mjs +0 -13
@@ -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 const AnalyticsGoogle: ({ id }: AnalyticsGoogleProps) => import("react/jsx-runtime").JSX.Element | null;
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
- import type { SeoData } from "./types-seo";
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;
@@ -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 const SeoDefaults: (props: SeoDefaultsProps) => import("react/jsx-runtime").JSX.Element;
9
+ export declare let SeoDefaults: (props: SeoDefaultsProps) => import("react/jsx-runtime").JSX.Element;
11
10
  export default SeoDefaults;
@@ -4,20 +4,5 @@ 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) => React.ReactNode[];
23
8
  export default seoBuildTags;
package/12/types.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export type { SeoData } from "./Seo";
2
+ export type { SeoDefaultsProps } from "./SeoDefaults";
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,28 @@
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 o = require('next/script');
8
+ var react = require('react');
9
+ var browser = require('@koine/browser');
10
+ var r = require('next/head');
11
+
12
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
+
14
+ var o__default = /*#__PURE__*/_interopDefaultLegacy(o);
15
+ var r__default = /*#__PURE__*/_interopDefaultLegacy(r);
16
+
17
+ let AnalyticsGoogle=({id:s})=>{let l=s||process.env.NEXT_PUBLIC_GTM_ID,{events:m,asPath:c,query:d}=router.useRouter(),[p,f]=react.useState(!1),[w,u]=react.useState(!1);return (react.useEffect(()=>{let e=()=>{u(!0);};return m.on("routeChangeComplete",e),()=>{m.off("routeChangeComplete",e);}},[m]),react.useEffect(()=>{w&&p&&c&&browser.gtagPageview(c);},[c,d,w,p]),l)?jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(o__default["default"],{id:"google-tagmanager",src:`https://www.googletagmanager.com/gtag/js?id=${s}`,strategy:"afterInteractive",onLoad:()=>f(!0)}),jsxRuntime.jsx(o__default["default"],{id:"google-analytics",strategy:"afterInteractive",children:`
18
+ window.dataLayer = window.dataLayer || [];
19
+ function gtag(){window.dataLayer.push(arguments);}
20
+ gtag('js', new Date());
21
+
22
+ gtag('config', '${s}', { 'send_page_view': false });
23
+ `})]}):null};
24
+
25
+ let DisableErrorOverlay=()=>jsxRuntime.jsx(r__default["default"],{children:"development"===process.env.NODE_ENV&&jsxRuntime.jsx("script",{dangerouslySetInnerHTML:{__html:"window.addEventListener('error',event =>{event.stopImmediatePropagation()});window.addEventListener('unhandledrejection',event =>{event.stopImmediatePropagation()});"}})});
26
+
27
+ exports.AnalyticsGoogle = AnalyticsGoogle;
28
+ exports.DisableErrorOverlay = DisableErrorOverlay;
package/12.cjs.mjs ADDED
@@ -0,0 +1,2 @@
1
+ export * from './12.cjs.js';
2
+ export { _default as default } from './12.cjs.default.js';
package/12.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { AnalyticsGoogle, type AnalyticsGoogleProps, } from "./12/AnalyticsGoogle";
2
+ export { DisableErrorOverlay } from "./12/DisableErrorOverlay";
3
+ export * from "./12/types";
package/12.esm.js ADDED
@@ -0,0 +1,18 @@
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
+ import { useRouter } from 'next/router';
3
+ import o from 'next/script';
4
+ import { useState, useEffect } from 'react';
5
+ import { gtagPageview } from '@koine/browser';
6
+ import r from 'next/head';
7
+
8
+ let AnalyticsGoogle=({id:s})=>{let l=s||process.env.NEXT_PUBLIC_GTM_ID,{events:m,asPath:c,query:d}=useRouter(),[p,f]=useState(!1),[w,u]=useState(!1);return (useEffect(()=>{let e=()=>{u(!0);};return m.on("routeChangeComplete",e),()=>{m.off("routeChangeComplete",e);}},[m]),useEffect(()=>{w&&p&&c&&gtagPageview(c);},[c,d,w,p]),l)?jsxs(Fragment,{children:[jsx(o,{id:"google-tagmanager",src:`https://www.googletagmanager.com/gtag/js?id=${s}`,strategy:"afterInteractive",onLoad:()=>f(!0)}),jsx(o,{id:"google-analytics",strategy:"afterInteractive",children:`
9
+ window.dataLayer = window.dataLayer || [];
10
+ function gtag(){window.dataLayer.push(arguments);}
11
+ gtag('js', new Date());
12
+
13
+ gtag('config', '${s}', { 'send_page_view': false });
14
+ `})]}):null};
15
+
16
+ let DisableErrorOverlay=()=>jsx(r,{children:"development"===process.env.NODE_ENV&&jsx("script",{dangerouslySetInnerHTML:{__html:"window.addEventListener('error',event =>{event.stopImmediatePropagation()});window.addEventListener('unhandledrejection',event =>{event.stopImmediatePropagation()});"}})});
17
+
18
+ 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
+ export * from "./config";
@@ -0,0 +1 @@
1
+ exports._default = require('./config.cjs.js').default;
package/config.cjs.js ADDED
@@ -0,0 +1,9 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var next = require('@koine/i18n/next');
6
+
7
+ let withKoine=(o={})=>{let{nx:i,svg:n,i18nRoutes:s,i18nCompiler:l,...p}=o,a={eslint:{ignoreDuringBuilds:!0},typescript:{ignoreBuildErrors:!0},poweredByHeader:!1,experimental:{scrollRestoration:!0,...p.experimental||{}},...p};return (n&&(i?a.nx={svgr:!0}:(delete a.nx,a.webpack=(e,r)=>{let t="function"==typeof a.webpack?a.webpack(e,r):e;return t.module.rules.push({test:/\.svg$/,use:[{loader:"@svgr/webpack",options:{svgoConfig:{plugins:[{name:"removeViewBox",active:!1}]}}}]}),t})),s)?next.withI18nLegacy({...a,i18nRoutes:s}):l?i?next.withI18nAsync({...a,i18nCompiler:l}):next.withI18n({...a,i18nCompiler:l}):a};
8
+
9
+ exports.withKoine = withKoine;
package/config.cjs.mjs ADDED
@@ -0,0 +1,2 @@
1
+ export * from './config.cjs.js';
2
+ export { _default as default } from './config.cjs.default.js';
package/config.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import type { NextConfig } from "next";
2
+ import { type WithI18nAsyncOptions, type WithI18nLegacyOptions } from "@koine/i18n/next";
3
+ export type WithKoineOptions = NextConfig & {
4
+ nx?: boolean;
5
+ svg?: boolean;
6
+ } & WithI18nLegacyOptions & WithI18nAsyncOptions;
7
+ export declare let withKoine: (options?: WithKoineOptions) => NextConfig;
package/config.esm.js ADDED
@@ -0,0 +1,5 @@
1
+ import { withI18nLegacy, withI18nAsync, withI18n } from '@koine/i18n/next';
2
+
3
+ let withKoine=(o={})=>{let{nx:i,svg:n,i18nRoutes:s,i18nCompiler:l,...p}=o,a={eslint:{ignoreDuringBuilds:!0},typescript:{ignoreBuildErrors:!0},poweredByHeader:!1,experimental:{scrollRestoration:!0,...p.experimental||{}},...p};return (n&&(i?a.nx={svgr:!0}:(delete a.nx,a.webpack=(e,r)=>{let t="function"==typeof a.webpack?a.webpack(e,r):e;return t.module.rules.push({test:/\.svg$/,use:[{loader:"@svgr/webpack",options:{svgoConfig:{plugins:[{name:"removeViewBox",active:!1}]}}}]}),t})),s)?withI18nLegacy({...a,i18nRoutes:s}):l?i?withI18nAsync({...a,i18nCompiler:l}):withI18n({...a,i18nCompiler:l}):a};
4
+
5
+ export { withKoine };
package/index.cjs.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./index";
@@ -0,0 +1 @@
1
+ exports._default = require('./index.cjs.js').default;
package/index.cjs.js ADDED
@@ -0,0 +1,25 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var react = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+ var o = require('next/script');
8
+ var utils = require('@koine/utils');
9
+
10
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
11
+
12
+ var o__default = /*#__PURE__*/_interopDefaultLegacy(o);
13
+
14
+ function load(e,o){return new Promise(t=>{setTimeout(()=>t(e),o);})}
15
+
16
+ const ThemeContext=react.createContext({setTheme:e=>{},themes:[]});
17
+
18
+ let l=["light","dark"],d="(prefers-color-scheme: dark)",c="theme";const ThemeProvider=({forcedTheme:r,disableTransitionOnChange:o=!1,enableSystem:v=!0,enableColorScheme:y,themes:p=["light","dark"],defaultTheme:g=v?"system":"light",attribute:w="data-theme",value:x,children:S,nonce:k})=>{let[b,L]=react.useState(()=>u(c,g)),[T,j]=react.useState(()=>u(c)),C=x?Object.values(x):p,E=react.useCallback(e=>{let t=e;if(utils.isServer||!t)return;"system"===e&&v&&(t=f());let r=x?x[t]:t,i=o?$():null,n=document.documentElement;if("class"===w?(n.classList.remove(...C),r&&n.classList.add(r)):r?n.setAttribute(w,r):n.removeAttribute(w),y){let e=l.includes(g)?g:"",r=l.includes(t)?t:e;n.style.colorScheme=r;}i?.();},[w,C,g,o,y,v,x]),I=react.useCallback(e=>{L(e);try{localStorage.setItem(c,e);}catch(e){}},[]),M=react.useCallback(e=>{j(f(e)),"system"===b&&v&&!r&&E("system");},[b,v,r,E]);return react.useEffect(()=>{let e=window.matchMedia(d);return e.addListener(M),M(e),()=>e.removeListener(M)},[M]),react.useEffect(()=>{let e=e=>{e.key===c&&I(e.newValue||g);};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[g,I]),react.useEffect(()=>{E(r??b);},[E,r,b]),jsxRuntime.jsxs(ThemeContext.Provider,{value:{theme:b,setTheme:I,forcedTheme:r,resolvedTheme:"system"===b?T:b,themes:v?[...p,"system"]:p,systemTheme:v?T:void 0},children:[jsxRuntime.jsx(h,{forcedTheme:r,disableTransitionOnChange:o,enableSystem:v,enableColorScheme:y,themes:p,defaultTheme:g,attribute:w,value:x,children:S,attrs:C,nonce:k}),S]})};let h=react.memo(({forcedTheme:t,attribute:o,enableSystem:i,enableColorScheme:n,defaultTheme:s,value:a,attrs:m,nonce:h})=>{let u="system"===s,$=(()=>{let e=`d.remove(${m.map(e=>`'${e}'`).join(",")})`;return `var d=document.documentElement.classList;${e};`})(),f=n?(l.includes(s)?s:null)?`if(e==='light'||e==='dark'||!e)d.style.colorScheme=e||'${s}'`:"if(e==='light'||e==='dark')d.style.colorScheme=e":"",y=(e,t=!1,r=!0)=>{let i=a?a[e]:e,s=t?e+"|| ''":`'${i}'`,m="";return n&&r&&!t&&l.includes(e)&&(m+=`d.style.colorScheme = '${e}';`),"class"===o?t||i?m+=`d.add(${s})`:m+="null":i&&(m+=`d[s](n, ${s})`),m},p=t?`!function(){${$}${y(t)}}()`:i?`!function(){try {${$}var e=localStorage.getItem('${c}');if("system"===e||(!e&&${u})){var t="${d}",m=window.matchMedia(t);if(m.media!==t||m.matches){${y("dark")}}else{${y("light")}}}else if(e){${a?`var x=${JSON.stringify(a)};`:""}${y(a?"x[e]":"e",!0)}}${u?"":"else{"+y(s,!1,!1)+"}"}${f}}catch(e){}}()`:`!function(){try{${$}var e=localStorage.getItem("${c}");if(e){${a?`var x=${JSON.stringify(a)};`:""}${y(a?"x[e]":"e",!0)}}else{${y(s,!1,!1)};}${f}}catch(t){}}();`;return jsxRuntime.jsx(o__default["default"],{id:"next-theme-script",strategy:"beforeInteractive",src:`data:text/javascript;base64,${v(p)}`,nonce:h})},()=>!0),u=(e,t)=>{let r;if(!utils.isServer){try{r=localStorage.getItem(e)||void 0;}catch(e){}return r||t}},$=()=>{let e=document,t=e.createElement("style");return t.appendChild(e.createTextNode("*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),e.head.appendChild(t),()=>{window.getComputedStyle(e.body),setTimeout(()=>{e.head.removeChild(t);},1);}},f=e=>(e||(e=window.matchMedia(d)),e.matches?"dark":"light"),v=e=>utils.isServer?Buffer.from(e).toString("base64"):btoa(e);
19
+
20
+ const useTheme=()=>react.useContext(ThemeContext);
21
+
22
+ exports.ThemeContext = ThemeContext;
23
+ exports.ThemeProvider = ThemeProvider;
24
+ exports.load = load;
25
+ exports.useTheme = useTheme;
package/index.cjs.mjs ADDED
@@ -0,0 +1,2 @@
1
+ export * from './index.cjs.js';
2
+ export { _default as default } from './index.cjs.default.js';
package/index.d.ts CHANGED
@@ -1,2 +1,4 @@
1
- export { getSiteUrl } from "./getSiteUrl";
2
- export { load } from "./load";
1
+ export { load } from "./utils/load";
2
+ export { ThemeContext, type ThemeContextProps } from "./theme/ThemeContext";
3
+ export { ThemeProvider, type ThemeProviderProps } from "./theme/ThemeProvider";
4
+ export { useTheme, type UseThemeProps } from "./theme/useTheme";
package/index.esm.js ADDED
@@ -0,0 +1,14 @@
1
+ import { createContext, useState, useCallback, useEffect, memo, useContext } from 'react';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import o from 'next/script';
4
+ import { isServer } from '@koine/utils';
5
+
6
+ function load(e,o){return new Promise(t=>{setTimeout(()=>t(e),o);})}
7
+
8
+ const ThemeContext=createContext({setTheme:e=>{},themes:[]});
9
+
10
+ let l=["light","dark"],d="(prefers-color-scheme: dark)",c="theme";const ThemeProvider=({forcedTheme:r,disableTransitionOnChange:o=!1,enableSystem:v=!0,enableColorScheme:y,themes:p=["light","dark"],defaultTheme:g=v?"system":"light",attribute:w="data-theme",value:x,children:S,nonce:k})=>{let[b,L]=useState(()=>u(c,g)),[T,j]=useState(()=>u(c)),C=x?Object.values(x):p,E=useCallback(e=>{let t=e;if(isServer||!t)return;"system"===e&&v&&(t=f());let r=x?x[t]:t,i=o?$():null,n=document.documentElement;if("class"===w?(n.classList.remove(...C),r&&n.classList.add(r)):r?n.setAttribute(w,r):n.removeAttribute(w),y){let e=l.includes(g)?g:"",r=l.includes(t)?t:e;n.style.colorScheme=r;}i?.();},[w,C,g,o,y,v,x]),I=useCallback(e=>{L(e);try{localStorage.setItem(c,e);}catch(e){}},[]),M=useCallback(e=>{j(f(e)),"system"===b&&v&&!r&&E("system");},[b,v,r,E]);return useEffect(()=>{let e=window.matchMedia(d);return e.addListener(M),M(e),()=>e.removeListener(M)},[M]),useEffect(()=>{let e=e=>{e.key===c&&I(e.newValue||g);};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[g,I]),useEffect(()=>{E(r??b);},[E,r,b]),jsxs(ThemeContext.Provider,{value:{theme:b,setTheme:I,forcedTheme:r,resolvedTheme:"system"===b?T:b,themes:v?[...p,"system"]:p,systemTheme:v?T:void 0},children:[jsx(h,{forcedTheme:r,disableTransitionOnChange:o,enableSystem:v,enableColorScheme:y,themes:p,defaultTheme:g,attribute:w,value:x,children:S,attrs:C,nonce:k}),S]})};let h=memo(({forcedTheme:t,attribute:o$1,enableSystem:i,enableColorScheme:n,defaultTheme:s,value:a,attrs:m,nonce:h})=>{let u="system"===s,$=(()=>{let e=`d.remove(${m.map(e=>`'${e}'`).join(",")})`;return `var d=document.documentElement.classList;${e};`})(),f=n?(l.includes(s)?s:null)?`if(e==='light'||e==='dark'||!e)d.style.colorScheme=e||'${s}'`:"if(e==='light'||e==='dark')d.style.colorScheme=e":"",y=(e,t=!1,r=!0)=>{let i=a?a[e]:e,s=t?e+"|| ''":`'${i}'`,m="";return n&&r&&!t&&l.includes(e)&&(m+=`d.style.colorScheme = '${e}';`),"class"===o$1?t||i?m+=`d.add(${s})`:m+="null":i&&(m+=`d[s](n, ${s})`),m},p=t?`!function(){${$}${y(t)}}()`:i?`!function(){try {${$}var e=localStorage.getItem('${c}');if("system"===e||(!e&&${u})){var t="${d}",m=window.matchMedia(t);if(m.media!==t||m.matches){${y("dark")}}else{${y("light")}}}else if(e){${a?`var x=${JSON.stringify(a)};`:""}${y(a?"x[e]":"e",!0)}}${u?"":"else{"+y(s,!1,!1)+"}"}${f}}catch(e){}}()`:`!function(){try{${$}var e=localStorage.getItem("${c}");if(e){${a?`var x=${JSON.stringify(a)};`:""}${y(a?"x[e]":"e",!0)}}else{${y(s,!1,!1)};}${f}}catch(t){}}();`;return jsx(o,{id:"next-theme-script",strategy:"beforeInteractive",src:`data:text/javascript;base64,${v(p)}`,nonce:h})},()=>!0),u=(e,t)=>{let r;if(!isServer){try{r=localStorage.getItem(e)||void 0;}catch(e){}return r||t}},$=()=>{let e=document,t=e.createElement("style");return t.appendChild(e.createTextNode("*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),e.head.appendChild(t),()=>{window.getComputedStyle(e.body),setTimeout(()=>{e.head.removeChild(t);},1);}},f=e=>(e||(e=window.matchMedia(d)),e.matches?"dark":"light"),v=e=>isServer?Buffer.from(e).toString("base64"):btoa(e);
11
+
12
+ const useTheme=()=>useContext(ThemeContext);
13
+
14
+ export { ThemeContext, ThemeProvider, load, useTheme };
package/package.json CHANGED
@@ -2,78 +2,39 @@
2
2
  "name": "@koine/next",
3
3
  "sideEffects": false,
4
4
  "dependencies": {
5
- "@koine/browser": "2.0.0-beta.7",
6
- "@koine/react": "2.0.0-beta.7",
7
- "@koine/utils": "2.0.0-beta.7"
5
+ "@koine/browser": "2.0.0-beta.70",
6
+ "@koine/utils": "2.0.0-beta.70",
7
+ "@koine/i18n": "2.0.0-beta.70"
8
+ },
9
+ "peerDependencies": {
10
+ "next": "^14.0.4",
11
+ "next-seo": "^6.4.0",
12
+ "react": "^18.2.0"
8
13
  },
9
14
  "peerDependenciesMeta": {
10
- "@emotion/react": {
11
- "optional": true
12
- },
13
- "@emotion/server": {
14
- "optional": true
15
- },
16
- "@emotion/styled": {
17
- "optional": true
18
- },
19
- "@hookform/resolvers": {
20
- "optional": true
21
- },
22
- "@kuus/yup": {
23
- "optional": true
24
- },
25
- "@mui/base": {
26
- "optional": true
27
- },
28
- "@mui/material": {
29
- "optional": true
30
- },
31
- "@tiptap/react": {
32
- "optional": true
33
- },
34
- "@tiptap/starter-kit": {
35
- "optional": true
36
- },
37
- "date-fns": {
38
- "optional": true
39
- },
40
- "framer-motion": {
41
- "optional": true
42
- },
43
- "next-auth": {
44
- "optional": true
45
- },
46
15
  "next-seo": {
47
16
  "optional": true
48
- },
49
- "next-translate": {
50
- "optional": true
51
- },
52
- "react-hook-form": {
53
- "optional": true
54
- },
55
- "react-icons": {
56
- "optional": true
57
- },
58
- "react-is": {
59
- "optional": true
60
- },
61
- "react-popper": {
62
- "optional": true
63
- },
64
- "react-swipeable": {
65
- "optional": true
66
- },
67
- "styled-components": {
68
- "optional": true
69
- },
70
- "tailwindcss": {
71
- "optional": true
72
17
  }
73
18
  },
74
- "peerDependencies": {},
75
- "module": "./index.mjs",
76
- "main": "./index.js",
77
- "types": "./index.d.ts",
78
- "version": "2.0.0-beta.7"
79
- }
19
+ "exports": {
20
+ "./package.json": "./package.json",
21
+ ".": {
22
+ "module": "./index.esm.js",
23
+ "import": "./index.cjs.mjs",
24
+ "default": "./index.cjs.js"
25
+ },
26
+ "./12": {
27
+ "module": "./12.esm.js",
28
+ "import": "./12.cjs.mjs",
29
+ "default": "./12.cjs.js"
30
+ },
31
+ "./config": {
32
+ "module": "./config.esm.js",
33
+ "import": "./config.cjs.mjs",
34
+ "default": "./config.cjs.js"
35
+ }
36
+ },
37
+ "module": "./index.esm.js",
38
+ "main": "./index.cjs.js",
39
+ "version": "2.0.0-beta.70"
40
+ }
@@ -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,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;
@@ -0,0 +1,4 @@
1
+ import { type ThemeContextProps } from "./ThemeContext";
2
+ export type UseThemeProps = ThemeContextProps;
3
+ export declare const useTheme: () => ThemeContextProps;
4
+ export default useTheme;
package/typings.d.ts CHANGED
@@ -12,61 +12,50 @@ declare module "*.svg" {
12
12
  }
13
13
 
14
14
  /**
15
- * Extend NodeJS `process.env` with variables used by @koine
15
+ * [`next.js` pages router](https://nextjs.org/docs/pages) utility type
16
16
  */
17
- declare namespace NodeJS {
18
- interface ProcessEnv {
19
- NEXT_PUBLIC_APP_URL: string;
20
- }
21
- }
17
+ type NextGetStaticPathsResult<Params extends { [key: string]: any }> = Omit<
18
+ import("next").GetStaticPathsResult,
19
+ "paths"
20
+ > & {
21
+ paths: Array<string | { params: Params; locale?: string }>;
22
+ };
22
23
 
23
24
  /**
24
- * Types specifically related to `@koine/next` exposed on the global unique
25
- * namespace `Koine`. Most of the types here should be prefixed by `Next`, e.g.
26
- * `NextSomeFeature` accessible anywhere from `Koine.NextSomeFeature`
25
+ * [`next.js` pages router](https://nextjs.org/docs/pages) utility type
27
26
  */
28
- declare namespace Koine {
29
- /**
30
- * Default SEO data structure expected by the `<Seo>` component's prop `seo`
31
- */
32
- type NextSeo = import("./12/types-seo").SeoData;
27
+ declare type NextPageDataStaticPaths<Params extends { [key: string]: any }> = (
28
+ context: import("next").GetStaticPathsContext,
29
+ ) =>
30
+ | Promise<NextGetStaticPathsResult<Params>>
31
+ | NextGetStaticPathsResult<Params>;
33
32
 
34
- /**
35
- * Translations dictionary extracted from JSON files.
36
- * You need to augment this type with something like:
37
- *
38
- * ```ts
39
- * declare namespace Koine {
40
- * interface Translations {
41
- * "~": typeof import("./locales/en/~.json");
42
- * "_": typeof import("./locales/en/_.json");
43
- * "$team": typeof import("./locales/en/$team.json");
44
- * "home": typeof import("./locales/en/home.json");
45
- * "Header": typeof import("./locales/en/Header.json");
46
- * }
47
- * }
48
- * ```
49
- *
50
- * Best to follow a convention to name the files which become the namespaces:
51
- *
52
- * - `~`: for app wide **urls** translated definitions
53
- * - `_`: for app wide **common** translations
54
- * - `${data}`: dollar prefix for static **data** like arrays, objects, .etc
55
- * - `{route-name}`: lower cased for **route** specific data
56
- * - `{ComponentName}`: pascal cased for **components** specific data
57
- *
58
- * This works through using [type augmentation](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation)
59
- * and [merging interfaces](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#merging-interfaces).
60
- */
61
- // eslint-disable-next-line @typescript-eslint/no-empty-interface
62
- interface Translations {}
63
- }
33
+ /**
34
+ * [`next.js` pages router](https://nextjs.org/docs/pages) utility type
35
+ */
36
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ declare type NextPageDataStatic<P extends { [key: string]: any }> =
38
+ import("next").GetStaticProps<P, import("querystring").ParsedUrlQuery>;
64
39
 
65
40
  /**
66
- * List here the global variables used by third party scripts supported within
67
- * the `koine` ecosystem. For instance Google Analytics globally available
68
- * variables.
41
+ * [`next.js` pages router](https://nextjs.org/docs/pages) utility type
69
42
  */
70
- declare interface Window {
71
- gtag: (...args: Record<string, unknown>[]) => Record<string, unknown>;
72
- }
43
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
+ declare type NextPageDataServer<P extends { [key: string]: any }> =
45
+ import("next").GetServerSideProps<P, import("querystring").ParsedUrlQuery>;
46
+
47
+ /**
48
+ * Workaround to re-create the type `RouteProperties` that is not exported by
49
+ * `next.js`
50
+ */
51
+ declare type NextRouteProperties = Parameters<
52
+ import("next/router").Router["getRouteInfo"]
53
+ >[0]["routeProps"];
54
+
55
+ /**
56
+ * Extend NodeJS `process.env` with variables used by @koine
57
+ */
58
+ // declare namespace NodeJS {
59
+ // interface ProcessEnv {
60
+ // }
61
+ // }
@@ -0,0 +1 @@
1
+ export declare function load<T>(component: T, milliseconds: number): Promise<T>;
@@ -1,79 +0,0 @@
1
- "use client";
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- function _export(target, all) {
7
- for(var name in all)Object.defineProperty(target, name, {
8
- enumerable: true,
9
- get: all[name]
10
- });
11
- }
12
- _export(exports, {
13
- AnalyticsGoogle: function() {
14
- return AnalyticsGoogle;
15
- },
16
- default: function() {
17
- return _default;
18
- }
19
- });
20
- const _interop_require_default = require("@swc/helpers/_/_interop_require_default");
21
- const _jsxruntime = require("react/jsx-runtime");
22
- const _router = require("next/router");
23
- const _script = /*#__PURE__*/ _interop_require_default._(require("next/script"));
24
- const _react = require("react");
25
- const _gtagPageview = /*#__PURE__*/ _interop_require_default._(require("@koine/browser/gtagPageview"));
26
- const AnalyticsGoogle = ({ id })=>{
27
- const uid = id || process.env["NEXT_PUBLIC_GTM_ID"];
28
- const { events, asPath, query } = (0, _router.useRouter)();
29
- const [ready, setReady] = (0, _react.useState)(false);
30
- const [routed, setRouted] = (0, _react.useState)(false);
31
- // const [url, setUrl] = useState("");
32
- (0, _react.useEffect)(()=>{
33
- const handleRouteChange = ()=>{
34
- setRouted(true);
35
- };
36
- events.on("routeChangeComplete", handleRouteChange);
37
- return ()=>{
38
- events.off("routeChangeComplete", handleRouteChange);
39
- };
40
- }, [
41
- events
42
- ]);
43
- (0, _react.useEffect)(()=>{
44
- if (routed && ready && asPath) {
45
- // const search = query;
46
- (0, _gtagPageview.default)(asPath);
47
- }
48
- }, [
49
- asPath,
50
- query,
51
- routed,
52
- ready
53
- ]);
54
- if (!uid) {
55
- return null;
56
- }
57
- return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {
58
- children: [
59
- /*#__PURE__*/ (0, _jsxruntime.jsx)(_script.default, {
60
- id: "google-tagmanager",
61
- src: `https://www.googletagmanager.com/gtag/js?id=${id}`,
62
- strategy: "afterInteractive",
63
- onLoad: ()=>setReady(true)
64
- }),
65
- /*#__PURE__*/ (0, _jsxruntime.jsx)(_script.default, {
66
- id: "google-analytics",
67
- strategy: "afterInteractive",
68
- children: `
69
- window.dataLayer = window.dataLayer || [];
70
- function gtag(){window.dataLayer.push(arguments);}
71
- gtag('js', new Date());
72
-
73
- gtag('config', '${id}', { 'send_page_view': false });
74
- `
75
- })
76
- ]
77
- });
78
- };
79
- const _default = AnalyticsGoogle;