next 15.2.0-canary.28 → 15.2.0-canary.29
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.
Potentially problematic release.
This version of next might be problematic. Click here for more details.
- package/dist/bin/next +1 -1
- package/dist/build/index.js +2 -2
- package/dist/build/swc/index.js +1 -1
- package/dist/build/webpack/plugins/define-env-plugin.js +2 -1
- package/dist/build/webpack/plugins/define-env-plugin.js.map +1 -1
- package/dist/build/webpack/plugins/slow-module-detection-plugin.d.ts +12 -0
- package/dist/build/webpack/plugins/slow-module-detection-plugin.js +187 -0
- package/dist/build/webpack/plugins/slow-module-detection-plugin.js.map +1 -0
- package/dist/build/webpack-config.js +19 -4
- package/dist/build/webpack-config.js.map +1 -1
- package/dist/client/app-bootstrap.js +1 -1
- package/dist/client/components/errors/stitched-error.js +3 -3
- package/dist/client/components/errors/stitched-error.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js +3 -3
- package/dist/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.d.ts +2 -2
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js +273 -144
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js +4 -4
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.d.ts +3 -3
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js +9 -14
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js +1 -3
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.d.ts +2 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js +2 -2
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js +2 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.d.ts +1 -4
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.js +2 -3
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js +111 -86
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.d.ts +4 -3
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js +8 -2
- package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.d.ts +14 -0
- package/dist/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js +49 -0
- package/dist/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js.map +1 -0
- package/dist/client/components/react-dev-overlay/_experimental/internal/styles/base.js +8 -2
- package/dist/client/components/react-dev-overlay/_experimental/internal/styles/base.js.map +1 -1
- package/dist/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js +3 -3
- package/dist/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js.map +1 -1
- package/dist/client/components/react-dev-overlay/internal/styles/Base.js +8 -2
- package/dist/client/components/react-dev-overlay/internal/styles/Base.js.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/compiled/next-server/app-page-experimental.runtime.dev.js +2 -2
- package/dist/compiled/next-server/app-page-experimental.runtime.dev.js.map +1 -1
- package/dist/compiled/next-server/app-page.runtime.dev.js +2 -2
- package/dist/compiled/next-server/app-page.runtime.dev.js.map +1 -1
- package/dist/compiled/next-server/pages-turbo.runtime.prod.js +2 -2
- package/dist/compiled/next-server/pages-turbo.runtime.prod.js.map +1 -1
- package/dist/compiled/next-server/server.runtime.prod.js +1 -1
- package/dist/compiled/next-server/server.runtime.prod.js.map +1 -1
- package/dist/esm/build/index.js +2 -2
- package/dist/esm/build/swc/index.js +1 -1
- package/dist/esm/build/webpack/plugins/define-env-plugin.js +2 -1
- package/dist/esm/build/webpack/plugins/define-env-plugin.js.map +1 -1
- package/dist/esm/build/webpack/plugins/slow-module-detection-plugin.js +177 -0
- package/dist/esm/build/webpack/plugins/slow-module-detection-plugin.js.map +1 -0
- package/dist/esm/build/webpack-config.js +19 -4
- package/dist/esm/build/webpack-config.js.map +1 -1
- package/dist/esm/client/app-bootstrap.js +1 -1
- package/dist/esm/client/components/errors/stitched-error.js +3 -3
- package/dist/esm/client/components/errors/stitched-error.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js +3 -3
- package/dist/esm/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js +274 -146
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js +4 -4
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js +9 -15
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js +1 -3
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js +2 -2
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js +2 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.js +2 -3
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js +111 -86
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js +8 -2
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js +33 -0
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js.map +1 -0
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/styles/base.js +8 -2
- package/dist/esm/client/components/react-dev-overlay/_experimental/internal/styles/base.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js +3 -3
- package/dist/esm/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js.map +1 -1
- package/dist/esm/client/components/react-dev-overlay/internal/styles/Base.js +8 -2
- package/dist/esm/client/components/react-dev-overlay/internal/styles/Base.js.map +1 -1
- package/dist/esm/client/index.js +1 -1
- package/dist/esm/export/worker.js +9 -1
- package/dist/esm/export/worker.js.map +1 -1
- package/dist/esm/lib/turbopack-warning.js +2 -1
- package/dist/esm/lib/turbopack-warning.js.map +1 -1
- package/dist/esm/server/base-server.js +4 -4
- package/dist/esm/server/base-server.js.map +1 -1
- package/dist/esm/server/config-schema.js +4 -1
- package/dist/esm/server/config-schema.js.map +1 -1
- package/dist/esm/server/config-shared.js +2 -1
- package/dist/esm/server/config-shared.js.map +1 -1
- package/dist/esm/server/config.js +1 -1
- package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
- package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/esm/server/lib/app-info-log.js +1 -1
- package/dist/esm/server/lib/start-server.js +1 -1
- package/dist/esm/server/server-utils.js +22 -19
- package/dist/esm/server/server-utils.js.map +1 -1
- package/dist/esm/server/web-server.js +2 -2
- package/dist/esm/server/web-server.js.map +1 -1
- package/dist/export/worker.js +9 -1
- package/dist/export/worker.js.map +1 -1
- package/dist/lib/turbopack-warning.js +2 -1
- package/dist/lib/turbopack-warning.js.map +1 -1
- package/dist/server/base-server.js +4 -4
- package/dist/server/base-server.js.map +1 -1
- package/dist/server/config-schema.js +4 -1
- package/dist/server/config-schema.js.map +1 -1
- package/dist/server/config-shared.d.ts +11 -0
- package/dist/server/config-shared.js +2 -1
- package/dist/server/config-shared.js.map +1 -1
- package/dist/server/config.js +1 -1
- package/dist/server/dev/hot-reloader-turbopack.js +1 -1
- package/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/server/lib/app-info-log.js +1 -1
- package/dist/server/lib/start-server.js +1 -1
- package/dist/server/server-utils.d.ts +4 -4
- package/dist/server/server-utils.js +22 -19
- package/dist/server/server-utils.js.map +1 -1
- package/dist/server/web-server.js +2 -2
- package/dist/server/web-server.js.map +1 -1
- package/dist/telemetry/anonymous-meta.js +1 -1
- package/dist/telemetry/events/session-stopped.js +2 -2
- package/dist/telemetry/events/version.js +2 -2
- package/package.json +15 -15
|
@@ -2,9 +2,8 @@ import React from 'react';
|
|
|
2
2
|
import isError from '../../../lib/is-error';
|
|
3
3
|
const REACT_ERROR_STACK_BOTTOM_FRAME = 'react-stack-bottom-frame';
|
|
4
4
|
const REACT_ERROR_STACK_BOTTOM_FRAME_REGEX = new RegExp("(at " + REACT_ERROR_STACK_BOTTOM_FRAME + " )|(" + REACT_ERROR_STACK_BOTTOM_FRAME + "\\@)");
|
|
5
|
-
const captureOwnerStack = React.captureOwnerStack ? React.captureOwnerStack : ()=>'';
|
|
6
5
|
export function getReactStitchedError(err) {
|
|
7
|
-
if (
|
|
6
|
+
if (!process.env.__NEXT_REACT_OWNER_STACK) {
|
|
8
7
|
return err;
|
|
9
8
|
}
|
|
10
9
|
const isErrorInstance = isError(err);
|
|
@@ -28,8 +27,9 @@ export function getReactStitchedError(err) {
|
|
|
28
27
|
}
|
|
29
28
|
function appendOwnerStack(error) {
|
|
30
29
|
let stack = error.stack || '';
|
|
30
|
+
// This module is only bundled in development mode so this is safe.
|
|
31
|
+
const ownerStack = React.captureOwnerStack();
|
|
31
32
|
// Avoid duplicate overriding stack frames
|
|
32
|
-
const ownerStack = captureOwnerStack();
|
|
33
33
|
if (ownerStack && stack.endsWith(ownerStack) === false) {
|
|
34
34
|
stack += ownerStack;
|
|
35
35
|
// Override stack
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/client/components/errors/stitched-error.ts"],"sourcesContent":["import React from 'react'\nimport isError from '../../../lib/is-error'\n\nconst REACT_ERROR_STACK_BOTTOM_FRAME = 'react-stack-bottom-frame'\nconst REACT_ERROR_STACK_BOTTOM_FRAME_REGEX = new RegExp(\n `(at ${REACT_ERROR_STACK_BOTTOM_FRAME} )|(${REACT_ERROR_STACK_BOTTOM_FRAME}\\\\@)`\n)\n\
|
|
1
|
+
{"version":3,"sources":["../../../../src/client/components/errors/stitched-error.ts"],"sourcesContent":["import React from 'react'\nimport isError from '../../../lib/is-error'\n\nconst REACT_ERROR_STACK_BOTTOM_FRAME = 'react-stack-bottom-frame'\nconst REACT_ERROR_STACK_BOTTOM_FRAME_REGEX = new RegExp(\n `(at ${REACT_ERROR_STACK_BOTTOM_FRAME} )|(${REACT_ERROR_STACK_BOTTOM_FRAME}\\\\@)`\n)\n\nexport function getReactStitchedError<T = unknown>(err: T): Error | T {\n if (!process.env.__NEXT_REACT_OWNER_STACK) {\n return err\n }\n const isErrorInstance = isError(err)\n const originStack = isErrorInstance ? err.stack || '' : ''\n const originMessage = isErrorInstance ? err.message : ''\n const stackLines = originStack.split('\\n')\n const indexOfSplit = stackLines.findIndex((line) =>\n REACT_ERROR_STACK_BOTTOM_FRAME_REGEX.test(line)\n )\n const isOriginalReactError = indexOfSplit >= 0 // has the react-stack-bottom-frame\n let newStack = isOriginalReactError\n ? stackLines.slice(0, indexOfSplit).join('\\n')\n : originStack\n\n const newError = new Error(originMessage)\n // Copy all enumerable properties, e.g. digest\n Object.assign(newError, err)\n newError.stack = newStack\n\n // Avoid duplicate overriding stack frames\n appendOwnerStack(newError)\n\n return newError\n}\n\nfunction appendOwnerStack(error: Error) {\n let stack = error.stack || ''\n // This module is only bundled in development mode so this is safe.\n const ownerStack = React.captureOwnerStack()\n // Avoid duplicate overriding stack frames\n if (ownerStack && stack.endsWith(ownerStack) === false) {\n stack += ownerStack\n // Override stack\n error.stack = stack\n }\n}\n"],"names":["React","isError","REACT_ERROR_STACK_BOTTOM_FRAME","REACT_ERROR_STACK_BOTTOM_FRAME_REGEX","RegExp","getReactStitchedError","err","process","env","__NEXT_REACT_OWNER_STACK","isErrorInstance","originStack","stack","originMessage","message","stackLines","split","indexOfSplit","findIndex","line","test","isOriginalReactError","newStack","slice","join","newError","Error","Object","assign","appendOwnerStack","error","ownerStack","captureOwnerStack","endsWith"],"mappings":"AAAA,OAAOA,WAAW,QAAO;AACzB,OAAOC,aAAa,wBAAuB;AAE3C,MAAMC,iCAAiC;AACvC,MAAMC,uCAAuC,IAAIC,OAC/C,AAAC,SAAMF,iCAA+B,SAAMA,iCAA+B;AAG7E,OAAO,SAASG,sBAAmCC,GAAM;IACvD,IAAI,CAACC,QAAQC,GAAG,CAACC,wBAAwB,EAAE;QACzC,OAAOH;IACT;IACA,MAAMI,kBAAkBT,QAAQK;IAChC,MAAMK,cAAcD,kBAAkBJ,IAAIM,KAAK,IAAI,KAAK;IACxD,MAAMC,gBAAgBH,kBAAkBJ,IAAIQ,OAAO,GAAG;IACtD,MAAMC,aAAaJ,YAAYK,KAAK,CAAC;IACrC,MAAMC,eAAeF,WAAWG,SAAS,CAAC,CAACC,OACzChB,qCAAqCiB,IAAI,CAACD;IAE5C,MAAME,uBAAuBJ,gBAAgB,EAAE,mCAAmC;;IAClF,IAAIK,WAAWD,uBACXN,WAAWQ,KAAK,CAAC,GAAGN,cAAcO,IAAI,CAAC,QACvCb;IAEJ,MAAMc,WAAW,qBAAwB,CAAxB,IAAIC,MAAMb,gBAAV,qBAAA;eAAA;oBAAA;IAAuB;IACxC,8CAA8C;IAC9Cc,OAAOC,MAAM,CAACH,UAAUnB;IACxBmB,SAASb,KAAK,GAAGU;IAEjB,0CAA0C;IAC1CO,iBAAiBJ;IAEjB,OAAOA;AACT;AAEA,SAASI,iBAAiBC,KAAY;IACpC,IAAIlB,QAAQkB,MAAMlB,KAAK,IAAI;IAC3B,mEAAmE;IACnE,MAAMmB,aAAa/B,MAAMgC,iBAAiB;IAC1C,0CAA0C;IAC1C,IAAID,cAAcnB,MAAMqB,QAAQ,CAACF,gBAAgB,OAAO;QACtDnB,SAASmB;QACT,iBAAiB;QACjBD,MAAMlB,KAAK,GAAGA;IAChB;AACF"}
|
|
@@ -12,8 +12,8 @@ import { useErrorHook } from '../internal/container/runtime-error/use-error-hook
|
|
|
12
12
|
export default function ReactDevOverlay(param) {
|
|
13
13
|
let { state, globalError, children } = param;
|
|
14
14
|
const [isErrorOverlayOpen, setIsErrorOverlayOpen] = useState(false);
|
|
15
|
-
const { readyErrors } = useErrorHook({
|
|
16
|
-
|
|
15
|
+
const { readyErrors, totalErrorCount } = useErrorHook({
|
|
16
|
+
state,
|
|
17
17
|
isAppDir: true
|
|
18
18
|
});
|
|
19
19
|
const devOverlay = /*#__PURE__*/ _jsxs(ShadowPortal, {
|
|
@@ -24,7 +24,7 @@ export default function ReactDevOverlay(param) {
|
|
|
24
24
|
/*#__PURE__*/ _jsx(ComponentStyles, {}),
|
|
25
25
|
/*#__PURE__*/ _jsx(DevToolsIndicator, {
|
|
26
26
|
state: state,
|
|
27
|
-
|
|
27
|
+
errorCount: totalErrorCount,
|
|
28
28
|
setIsErrorOverlayOpen: setIsErrorOverlayOpen
|
|
29
29
|
}),
|
|
30
30
|
/*#__PURE__*/ _jsx(ErrorOverlay, {
|
package/dist/esm/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.tsx"],"sourcesContent":["import type { OverlayState } from '../../shared'\nimport type { GlobalErrorComponent } from '../../../error-boundary'\n\nimport { useState } from 'react'\nimport { DevOverlayErrorBoundary } from './error-boundary'\nimport { ShadowPortal } from '../internal/components/shadow-portal'\nimport { Base } from '../internal/styles/base'\nimport { ComponentStyles } from '../internal/styles/component-styles'\nimport { CssReset } from '../internal/styles/css-reset'\nimport { Colors } from '../internal/styles/colors'\nimport { ErrorOverlay } from '../internal/components/errors/error-overlay/error-overlay'\nimport { DevToolsIndicator } from '../internal/components/errors/dev-tools-indicator/dev-tools-indicator'\nimport { useErrorHook } from '../internal/container/runtime-error/use-error-hook'\n\nexport default function ReactDevOverlay({\n state,\n globalError,\n children,\n}: {\n state: OverlayState\n globalError: [GlobalErrorComponent, React.ReactNode]\n children: React.ReactNode\n}) {\n const [isErrorOverlayOpen, setIsErrorOverlayOpen] = useState(false)\n const { readyErrors } = useErrorHook({
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.tsx"],"sourcesContent":["import type { OverlayState } from '../../shared'\nimport type { GlobalErrorComponent } from '../../../error-boundary'\n\nimport { useState } from 'react'\nimport { DevOverlayErrorBoundary } from './error-boundary'\nimport { ShadowPortal } from '../internal/components/shadow-portal'\nimport { Base } from '../internal/styles/base'\nimport { ComponentStyles } from '../internal/styles/component-styles'\nimport { CssReset } from '../internal/styles/css-reset'\nimport { Colors } from '../internal/styles/colors'\nimport { ErrorOverlay } from '../internal/components/errors/error-overlay/error-overlay'\nimport { DevToolsIndicator } from '../internal/components/errors/dev-tools-indicator/dev-tools-indicator'\nimport { useErrorHook } from '../internal/container/runtime-error/use-error-hook'\n\nexport default function ReactDevOverlay({\n state,\n globalError,\n children,\n}: {\n state: OverlayState\n globalError: [GlobalErrorComponent, React.ReactNode]\n children: React.ReactNode\n}) {\n const [isErrorOverlayOpen, setIsErrorOverlayOpen] = useState(false)\n const { readyErrors, totalErrorCount } = useErrorHook({\n state,\n isAppDir: true,\n })\n\n const devOverlay = (\n <ShadowPortal>\n <CssReset />\n <Base />\n <Colors />\n <ComponentStyles />\n\n <DevToolsIndicator\n state={state}\n errorCount={totalErrorCount}\n setIsErrorOverlayOpen={setIsErrorOverlayOpen}\n />\n\n <ErrorOverlay\n state={state}\n readyErrors={readyErrors}\n isErrorOverlayOpen={isErrorOverlayOpen}\n setIsErrorOverlayOpen={setIsErrorOverlayOpen}\n />\n </ShadowPortal>\n )\n\n return (\n <DevOverlayErrorBoundary\n devOverlay={devOverlay}\n globalError={globalError}\n onError={setIsErrorOverlayOpen}\n >\n {children}\n </DevOverlayErrorBoundary>\n )\n}\n"],"names":["useState","DevOverlayErrorBoundary","ShadowPortal","Base","ComponentStyles","CssReset","Colors","ErrorOverlay","DevToolsIndicator","useErrorHook","ReactDevOverlay","state","globalError","children","isErrorOverlayOpen","setIsErrorOverlayOpen","readyErrors","totalErrorCount","isAppDir","devOverlay","errorCount","onError"],"mappings":";AAGA,SAASA,QAAQ,QAAQ,QAAO;AAChC,SAASC,uBAAuB,QAAQ,mBAAkB;AAC1D,SAASC,YAAY,QAAQ,uCAAsC;AACnE,SAASC,IAAI,QAAQ,0BAAyB;AAC9C,SAASC,eAAe,QAAQ,sCAAqC;AACrE,SAASC,QAAQ,QAAQ,+BAA8B;AACvD,SAASC,MAAM,QAAQ,4BAA2B;AAClD,SAASC,YAAY,QAAQ,4DAA2D;AACxF,SAASC,iBAAiB,QAAQ,wEAAuE;AACzG,SAASC,YAAY,QAAQ,qDAAoD;AAEjF,eAAe,SAASC,gBAAgB,KAQvC;IARuC,IAAA,EACtCC,KAAK,EACLC,WAAW,EACXC,QAAQ,EAKT,GARuC;IAStC,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGf,SAAS;IAC7D,MAAM,EAAEgB,WAAW,EAAEC,eAAe,EAAE,GAAGR,aAAa;QACpDE;QACAO,UAAU;IACZ;IAEA,MAAMC,2BACJ,MAACjB;;0BACC,KAACG;0BACD,KAACF;0BACD,KAACG;0BACD,KAACF;0BAED,KAACI;gBACCG,OAAOA;gBACPS,YAAYH;gBACZF,uBAAuBA;;0BAGzB,KAACR;gBACCI,OAAOA;gBACPK,aAAaA;gBACbF,oBAAoBA;gBACpBC,uBAAuBA;;;;IAK7B,qBACE,KAACd;QACCkB,YAAYA;QACZP,aAAaA;QACbS,SAASN;kBAERF;;AAGP"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useEffect, useRef } from 'react';
|
|
2
|
+
import { useState, useEffect, useRef, createContext, useContext } from 'react';
|
|
3
3
|
import { Toast } from '../../toast';
|
|
4
4
|
import { NextLogo } from './internal/next-logo';
|
|
5
5
|
import { useIsDevBuilding } from '../../../../../../../dev/dev-build-indicator/internal/initialize-for-new-overlay';
|
|
@@ -7,10 +7,9 @@ import { useIsDevRendering } from './internal/dev-render-indicator';
|
|
|
7
7
|
import { useDelayedRender } from './internal/use-delayed-render';
|
|
8
8
|
import { useKeyboardShortcut } from '../../../hooks/use-keyboard-shortcut';
|
|
9
9
|
import { MODIFIERS } from '../../../hooks/use-keyboard-shortcut';
|
|
10
|
-
// TODO: test a11y
|
|
11
10
|
// TODO: add E2E tests to cover different scenarios
|
|
12
11
|
export function DevToolsIndicator(param) {
|
|
13
|
-
let { state,
|
|
12
|
+
let { state, errorCount, setIsErrorOverlayOpen } = param;
|
|
14
13
|
const [isDevToolsIndicatorOpen, setIsDevToolsIndicatorOpen] = useState(true);
|
|
15
14
|
// Register `(cmd|ctrl) + .` to show/hide the error indicator.
|
|
16
15
|
useKeyboardShortcut({
|
|
@@ -25,7 +24,7 @@ export function DevToolsIndicator(param) {
|
|
|
25
24
|
});
|
|
26
25
|
return isDevToolsIndicatorOpen && /*#__PURE__*/ _jsx(DevToolsPopover, {
|
|
27
26
|
semver: state.versionInfo.installed,
|
|
28
|
-
issueCount:
|
|
27
|
+
issueCount: errorCount,
|
|
29
28
|
isStaticRoute: state.staticIndicator,
|
|
30
29
|
hide: ()=>{
|
|
31
30
|
setIsDevToolsIndicatorOpen(false);
|
|
@@ -34,46 +33,99 @@ export function DevToolsIndicator(param) {
|
|
|
34
33
|
isTurbopack: !!process.env.TURBOPACK
|
|
35
34
|
});
|
|
36
35
|
}
|
|
36
|
+
//////////////////////////////////////////////////////////////////////////////////////
|
|
37
37
|
const ANIMATE_OUT_DURATION_MS = 200;
|
|
38
38
|
const ANIMATE_OUT_TIMING_FUNCTION = 'cubic-bezier(0.175, 0.885, 0.32, 1.1)';
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
const
|
|
39
|
+
const Context = /*#__PURE__*/ createContext({});
|
|
40
|
+
function DevToolsPopover(param) {
|
|
41
|
+
let { issueCount, isStaticRoute, isTurbopack, hide, setIsErrorOverlayOpen } = param;
|
|
42
|
+
const menuRef = useRef(null);
|
|
43
|
+
const triggerRef = useRef(null);
|
|
44
|
+
const [isMenuOpen, setIsMenuOpen] = useState(false);
|
|
45
|
+
const [selectedIndex, setSelectedIndex] = useState(-1);
|
|
46
|
+
const { mounted, rendered } = useDelayedRender(isMenuOpen, {
|
|
45
47
|
// Intentionally no fade in, makes the UI feel more immediate
|
|
46
48
|
enterDelay: 0,
|
|
47
49
|
// Graceful fade out to confirm that the UI did not break
|
|
48
50
|
exitDelay: ANIMATE_OUT_DURATION_MS
|
|
49
51
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
setIsPopoverOpen(false);
|
|
52
|
+
// Features to make the menu accessible
|
|
53
|
+
useFocusTrap(menuRef, triggerRef, isMenuOpen);
|
|
54
|
+
useClickOutside(menuRef, triggerRef, isMenuOpen, closeMenu);
|
|
55
|
+
function select(index) {
|
|
56
|
+
var _menuRef_current;
|
|
57
|
+
if (index === 'last') {
|
|
58
|
+
var _menuRef_current1;
|
|
59
|
+
const all = (_menuRef_current1 = menuRef.current) == null ? void 0 : _menuRef_current1.querySelectorAll('[role="menuitem"]');
|
|
60
|
+
if (all) {
|
|
61
|
+
const lastIndex = all.length - 1;
|
|
62
|
+
select(lastIndex);
|
|
62
63
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const el = (_menuRef_current = menuRef.current) == null ? void 0 : _menuRef_current.querySelector('[data-index="' + index + '"]');
|
|
67
|
+
if (el) {
|
|
68
|
+
setSelectedIndex(index);
|
|
69
|
+
el == null ? void 0 : el.focus();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function onMenuKeydown(e) {
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
switch(e.key){
|
|
75
|
+
case 'ArrowDown':
|
|
76
|
+
const next = selectedIndex + 1;
|
|
77
|
+
select(next);
|
|
78
|
+
break;
|
|
79
|
+
case 'ArrowUp':
|
|
80
|
+
const prev = selectedIndex - 1;
|
|
81
|
+
select(prev);
|
|
82
|
+
break;
|
|
83
|
+
case 'Home':
|
|
84
|
+
select(0);
|
|
85
|
+
break;
|
|
86
|
+
case 'End':
|
|
87
|
+
select('last');
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function onTriggerKeydown(e) {
|
|
94
|
+
if (isMenuOpen) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// Open with first item focused
|
|
98
|
+
if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {
|
|
99
|
+
setIsMenuOpen(true);
|
|
100
|
+
// Run on next tick because querying DOM after state change
|
|
101
|
+
setTimeout(()=>{
|
|
102
|
+
select(0);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// Open with last item focused
|
|
106
|
+
if (e.key === 'ArrowUp') {
|
|
107
|
+
setIsMenuOpen(true);
|
|
108
|
+
// Run on next tick because querying DOM after state change
|
|
109
|
+
setTimeout(()=>{
|
|
110
|
+
select('last');
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function openErrorOverlay() {
|
|
115
|
+
if (issueCount > 0) {
|
|
116
|
+
setIsErrorOverlayOpen(true);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function onTriggerClick() {
|
|
120
|
+
setIsMenuOpen((prev)=>!prev);
|
|
121
|
+
}
|
|
122
|
+
function closeMenu() {
|
|
123
|
+
setIsMenuOpen(false);
|
|
124
|
+
// Avoid flashing selected state
|
|
125
|
+
setTimeout(()=>{
|
|
126
|
+
setSelectedIndex(-1);
|
|
127
|
+
}, ANIMATE_OUT_DURATION_MS);
|
|
128
|
+
}
|
|
77
129
|
return /*#__PURE__*/ _jsxs(Toast, {
|
|
78
130
|
"data-nextjs-toast": true,
|
|
79
131
|
style: {
|
|
@@ -81,153 +133,229 @@ const DevToolsPopover = (param)=>{
|
|
|
81
133
|
zIndex: 2147483647
|
|
82
134
|
},
|
|
83
135
|
children: [
|
|
84
|
-
/*#__PURE__*/ _jsx(
|
|
85
|
-
ref:
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}),
|
|
98
|
-
mounted && /*#__PURE__*/
|
|
99
|
-
ref:
|
|
100
|
-
id: "dev-tools-
|
|
101
|
-
role: "
|
|
102
|
-
|
|
103
|
-
"
|
|
136
|
+
/*#__PURE__*/ _jsx(NextLogo, {
|
|
137
|
+
ref: triggerRef,
|
|
138
|
+
"aria-haspopup": "menu",
|
|
139
|
+
"aria-expanded": isMenuOpen,
|
|
140
|
+
"aria-controls": "nextjs-dev-tools-menu",
|
|
141
|
+
"aria-label": "" + (isMenuOpen ? 'Close' : 'Open') + " Next.js Dev Tools",
|
|
142
|
+
"data-nextjs-dev-tools-button": true,
|
|
143
|
+
issueCount: issueCount,
|
|
144
|
+
onTriggerClick: onTriggerClick,
|
|
145
|
+
onKeyDown: onTriggerKeydown,
|
|
146
|
+
openErrorOverlay: openErrorOverlay,
|
|
147
|
+
isDevBuilding: useIsDevBuilding(),
|
|
148
|
+
isDevRendering: useIsDevRendering()
|
|
149
|
+
}, issueCount),
|
|
150
|
+
mounted && /*#__PURE__*/ _jsx("div", {
|
|
151
|
+
ref: menuRef,
|
|
152
|
+
id: "nextjs-dev-tools-menu",
|
|
153
|
+
role: "menu",
|
|
154
|
+
dir: "ltr",
|
|
155
|
+
"aria-orientation": "vertical",
|
|
156
|
+
"aria-label": "Next.js Dev Tools Items",
|
|
157
|
+
tabIndex: -1,
|
|
158
|
+
className: "menu",
|
|
159
|
+
onKeyDown: onMenuKeydown,
|
|
104
160
|
"data-rendered": rendered,
|
|
105
161
|
style: {
|
|
106
162
|
'--animate-out-duration-ms': "" + ANIMATE_OUT_DURATION_MS + "ms",
|
|
107
163
|
'--animate-out-timing-function': ANIMATE_OUT_TIMING_FUNCTION
|
|
108
164
|
},
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
165
|
+
children: /*#__PURE__*/ _jsxs(Context.Provider, {
|
|
166
|
+
value: {
|
|
167
|
+
closeMenu,
|
|
168
|
+
selectedIndex,
|
|
169
|
+
setSelectedIndex
|
|
170
|
+
},
|
|
171
|
+
children: [
|
|
172
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
173
|
+
className: "inner",
|
|
115
174
|
children: [
|
|
116
|
-
/*#__PURE__*/ _jsx(
|
|
117
|
-
|
|
118
|
-
style: {
|
|
119
|
-
display: 'none'
|
|
120
|
-
},
|
|
121
|
-
children: "Dev Tools Options"
|
|
122
|
-
}),
|
|
123
|
-
/*#__PURE__*/ _jsx(IndicatorRow, {
|
|
124
|
-
label: "Hide Dev Tools",
|
|
125
|
-
value: /*#__PURE__*/ _jsx(DevToolsShortcutGroup, {}),
|
|
126
|
-
onClick: hide
|
|
127
|
-
}),
|
|
128
|
-
/*#__PURE__*/ _jsx(IndicatorRow, {
|
|
129
|
-
"data-nextjs-route-type": isStaticRoute ? 'static' : 'dynamic',
|
|
130
|
-
label: "Route",
|
|
131
|
-
value: isStaticRoute ? 'Static' : 'Dynamic'
|
|
132
|
-
}),
|
|
133
|
-
/*#__PURE__*/ _jsx(IndicatorRow, {
|
|
175
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
176
|
+
index: 0,
|
|
134
177
|
label: "Issues",
|
|
135
178
|
value: /*#__PURE__*/ _jsx(IssueCount, {
|
|
136
|
-
|
|
179
|
+
children: issueCount
|
|
137
180
|
}),
|
|
138
|
-
onClick:
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
]
|
|
154
|
-
}) : null,
|
|
155
|
-
/*#__PURE__*/ _jsxs("p", {
|
|
156
|
-
"data-nextjs-dev-tools-version": true,
|
|
157
|
-
children: [
|
|
158
|
-
"Turbopack ",
|
|
159
|
-
isTurbopack ? 'enabled' : 'not enabled'
|
|
160
|
-
]
|
|
181
|
+
onClick: openErrorOverlay
|
|
182
|
+
}),
|
|
183
|
+
/*#__PURE__*/ _jsx(MenuItem, {
|
|
184
|
+
label: "Route",
|
|
185
|
+
value: isStaticRoute ? 'Static' : 'Dynamic',
|
|
186
|
+
"data-nextjs-route-type": isStaticRoute ? 'static' : 'dynamic'
|
|
187
|
+
}),
|
|
188
|
+
isTurbopack ? /*#__PURE__*/ _jsx(MenuItem, {
|
|
189
|
+
label: "Turbopack",
|
|
190
|
+
value: "Enabled"
|
|
191
|
+
}) : /*#__PURE__*/ _jsx(MenuItem, {
|
|
192
|
+
index: 1,
|
|
193
|
+
label: "Try Turbopack",
|
|
194
|
+
value: /*#__PURE__*/ _jsx(ExternalIcon, {}),
|
|
195
|
+
href: "https://nextjs.org/docs/app/api-reference/turbopack"
|
|
161
196
|
})
|
|
162
197
|
]
|
|
198
|
+
}),
|
|
199
|
+
/*#__PURE__*/ _jsx("div", {
|
|
200
|
+
className: "footer",
|
|
201
|
+
children: /*#__PURE__*/ _jsx(MenuItem, {
|
|
202
|
+
label: "Hide Dev Tools",
|
|
203
|
+
value: /*#__PURE__*/ _jsx(HideShortcut, {}),
|
|
204
|
+
onClick: hide,
|
|
205
|
+
index: isTurbopack ? 1 : 2
|
|
206
|
+
})
|
|
163
207
|
})
|
|
164
|
-
|
|
165
|
-
|
|
208
|
+
]
|
|
209
|
+
})
|
|
166
210
|
})
|
|
167
211
|
]
|
|
168
212
|
});
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
let { label, value, onClick, ...props } = param;
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
213
|
+
}
|
|
214
|
+
function MenuItem(param) {
|
|
215
|
+
let { index, label, value, onClick, href, ...props } = param;
|
|
216
|
+
const isInteractive = typeof onClick === 'function' || typeof href === 'string';
|
|
217
|
+
const { closeMenu, selectedIndex, setSelectedIndex } = useContext(Context);
|
|
218
|
+
const selected = selectedIndex === index;
|
|
219
|
+
function click() {
|
|
220
|
+
if (isInteractive) {
|
|
221
|
+
onClick == null ? void 0 : onClick();
|
|
222
|
+
closeMenu();
|
|
223
|
+
if (href) {
|
|
224
|
+
window.open(href, '_blank', 'noopener, noreferrer');
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
229
|
+
className: "item",
|
|
230
|
+
"data-index": index,
|
|
231
|
+
"data-selected": selected,
|
|
232
|
+
onClick: click,
|
|
233
|
+
// Needs `onMouseMove` instead of enter to work together
|
|
234
|
+
// with keyboard and mouse input
|
|
235
|
+
onMouseMove: ()=>{
|
|
236
|
+
if (isInteractive && index !== undefined && selectedIndex !== index) {
|
|
237
|
+
setSelectedIndex(index);
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
onMouseLeave: ()=>setSelectedIndex(-1),
|
|
241
|
+
onKeyDown: (e)=>{
|
|
242
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
243
|
+
click();
|
|
244
|
+
}
|
|
245
|
+
},
|
|
246
|
+
role: isInteractive ? 'menuitem' : undefined,
|
|
247
|
+
tabIndex: selected ? 0 : -1,
|
|
176
248
|
...props,
|
|
177
249
|
children: [
|
|
178
250
|
/*#__PURE__*/ _jsx("span", {
|
|
179
|
-
"
|
|
251
|
+
className: "label",
|
|
180
252
|
children: label
|
|
181
253
|
}),
|
|
182
254
|
/*#__PURE__*/ _jsx("span", {
|
|
183
|
-
"
|
|
255
|
+
className: "value",
|
|
184
256
|
children: value
|
|
185
257
|
})
|
|
186
258
|
]
|
|
187
259
|
});
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
let {
|
|
191
|
-
return /*#__PURE__*/
|
|
192
|
-
"
|
|
193
|
-
"data-has-issues":
|
|
194
|
-
children:
|
|
195
|
-
"
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
260
|
+
}
|
|
261
|
+
function IssueCount(param) {
|
|
262
|
+
let { children } = param;
|
|
263
|
+
return /*#__PURE__*/ _jsxs("span", {
|
|
264
|
+
className: "issueCount",
|
|
265
|
+
"data-has-issues": children > 0,
|
|
266
|
+
children: [
|
|
267
|
+
/*#__PURE__*/ _jsx("span", {
|
|
268
|
+
className: "indicator"
|
|
269
|
+
}),
|
|
270
|
+
children
|
|
271
|
+
]
|
|
199
272
|
});
|
|
200
|
-
}
|
|
201
|
-
function
|
|
273
|
+
}
|
|
274
|
+
function HideShortcut() {
|
|
202
275
|
const isMac = // Feature detect for `navigator.userAgentData` which is experimental:
|
|
203
276
|
// https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/platform
|
|
204
277
|
'userAgentData' in navigator ? navigator.userAgentData.platform === 'macOS' : // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/platform#examples
|
|
205
278
|
navigator.platform.indexOf('Mac') === 0 || navigator.platform === 'iPhone';
|
|
206
279
|
return /*#__PURE__*/ _jsxs("span", {
|
|
207
|
-
"
|
|
280
|
+
className: "shortcut",
|
|
208
281
|
children: [
|
|
209
|
-
isMac ? /*#__PURE__*/ _jsx(
|
|
210
|
-
|
|
282
|
+
isMac ? /*#__PURE__*/ _jsx("kbd", {
|
|
283
|
+
"aria-label": "Command",
|
|
284
|
+
children: "⌘"
|
|
285
|
+
}) : /*#__PURE__*/ _jsx("kbd", {
|
|
286
|
+
"aria-label": "Control",
|
|
287
|
+
style: {
|
|
288
|
+
width: 'fit-content',
|
|
289
|
+
padding: '0 4px'
|
|
290
|
+
},
|
|
291
|
+
children: "Ctrl"
|
|
292
|
+
}),
|
|
293
|
+
/*#__PURE__*/ _jsx("kbd", {
|
|
294
|
+
children: "."
|
|
295
|
+
})
|
|
211
296
|
]
|
|
212
297
|
});
|
|
213
298
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
299
|
+
//////////////////////////////////////////////////////////////////////////////////////
|
|
300
|
+
function useFocusTrap(menuRef, triggerRef, isMenuOpen) {
|
|
301
|
+
useEffect(()=>{
|
|
302
|
+
if (isMenuOpen) {
|
|
303
|
+
var _menuRef_current;
|
|
304
|
+
(_menuRef_current = menuRef.current) == null ? void 0 : _menuRef_current.focus();
|
|
305
|
+
} else {
|
|
306
|
+
var _triggerRef_current;
|
|
307
|
+
(_triggerRef_current = triggerRef.current) == null ? void 0 : _triggerRef_current.focus();
|
|
308
|
+
}
|
|
309
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
310
|
+
}, [
|
|
311
|
+
isMenuOpen
|
|
312
|
+
]);
|
|
219
313
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
314
|
+
//////////////////////////////////////////////////////////////////////////////////////
|
|
315
|
+
function useClickOutside(menuRef, triggerRef, isMenuOpen, closeMenu) {
|
|
316
|
+
useEffect(()=>{
|
|
317
|
+
if (!isMenuOpen) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
// Close menu when clicking outside of it or its button
|
|
321
|
+
const handleClickOutside = (event)=>{
|
|
322
|
+
var _menuRef_current, _triggerRef_current;
|
|
323
|
+
if (!(((_menuRef_current = menuRef.current) == null ? void 0 : _menuRef_current.getBoundingClientRect()) ? event.clientX >= menuRef.current.getBoundingClientRect().left && event.clientX <= menuRef.current.getBoundingClientRect().right && event.clientY >= menuRef.current.getBoundingClientRect().top && event.clientY <= menuRef.current.getBoundingClientRect().bottom : false) && !(((_triggerRef_current = triggerRef.current) == null ? void 0 : _triggerRef_current.getBoundingClientRect()) ? event.clientX >= triggerRef.current.getBoundingClientRect().left && event.clientX <= triggerRef.current.getBoundingClientRect().right && event.clientY >= triggerRef.current.getBoundingClientRect().top && event.clientY <= triggerRef.current.getBoundingClientRect().bottom : false)) {
|
|
324
|
+
closeMenu();
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
// Close popover when pressing escape
|
|
328
|
+
const handleKeyDown = (event)=>{
|
|
329
|
+
if (event.key === 'Escape') {
|
|
330
|
+
closeMenu();
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
334
|
+
document.addEventListener('keydown', handleKeyDown);
|
|
335
|
+
return ()=>{
|
|
336
|
+
document.removeEventListener('mousedown', handleClickOutside);
|
|
337
|
+
document.removeEventListener('keydown', handleKeyDown);
|
|
338
|
+
};
|
|
339
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
340
|
+
}, [
|
|
341
|
+
isMenuOpen
|
|
342
|
+
]);
|
|
226
343
|
}
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
344
|
+
//////////////////////////////////////////////////////////////////////////////////////
|
|
345
|
+
function ExternalIcon() {
|
|
346
|
+
return /*#__PURE__*/ _jsx("svg", {
|
|
347
|
+
width: "16",
|
|
348
|
+
height: "16",
|
|
349
|
+
viewBox: "0 0 16 16",
|
|
350
|
+
fill: "none",
|
|
351
|
+
role: "img",
|
|
352
|
+
"aria-label": "External link",
|
|
353
|
+
children: /*#__PURE__*/ _jsx("path", {
|
|
354
|
+
fillRule: "evenodd",
|
|
355
|
+
clipRule: "evenodd",
|
|
356
|
+
d: "M13.5 10.25V13.25C13.5 13.3881 13.3881 13.5 13.25 13.5H2.75C2.61193 13.5 2.5 13.3881 2.5 13.25L2.5 2.75C2.5 2.61193 2.61193 2.5 2.75 2.5H5.75H6.5V1H5.75H2.75C1.7835 1 1 1.7835 1 2.75V13.25C1 14.2165 1.7835 15 2.75 15H13.25C14.2165 15 15 14.2165 15 13.25V10.25V9.5H13.5V10.25ZM9 1H9.75H14.2495C14.6637 1 14.9995 1.33579 14.9995 1.75V6.25V7H13.4995V6.25V3.56066L8.53033 8.52978L8 9.06011L6.93934 7.99945L7.46967 7.46912L12.4388 2.5H9.75H9V1Z",
|
|
357
|
+
fill: "currentColor"
|
|
358
|
+
})
|
|
231
359
|
});
|
|
232
360
|
}
|
|
233
361
|
|