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.

Files changed (144) hide show
  1. package/dist/bin/next +1 -1
  2. package/dist/build/index.js +2 -2
  3. package/dist/build/swc/index.js +1 -1
  4. package/dist/build/webpack/plugins/define-env-plugin.js +2 -1
  5. package/dist/build/webpack/plugins/define-env-plugin.js.map +1 -1
  6. package/dist/build/webpack/plugins/slow-module-detection-plugin.d.ts +12 -0
  7. package/dist/build/webpack/plugins/slow-module-detection-plugin.js +187 -0
  8. package/dist/build/webpack/plugins/slow-module-detection-plugin.js.map +1 -0
  9. package/dist/build/webpack-config.js +19 -4
  10. package/dist/build/webpack-config.js.map +1 -1
  11. package/dist/client/app-bootstrap.js +1 -1
  12. package/dist/client/components/errors/stitched-error.js +3 -3
  13. package/dist/client/components/errors/stitched-error.js.map +1 -1
  14. package/dist/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js +3 -3
  15. package/dist/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js.map +1 -1
  16. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.d.ts +2 -2
  17. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js +273 -144
  18. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js.map +1 -1
  19. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js +4 -4
  20. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js.map +1 -1
  21. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.d.ts +3 -3
  22. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js +9 -14
  23. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js.map +1 -1
  24. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js +1 -1
  25. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js.map +1 -1
  26. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js +1 -3
  27. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js.map +1 -1
  28. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.d.ts +2 -1
  29. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js +2 -2
  30. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js.map +1 -1
  31. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js +2 -1
  32. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js.map +1 -1
  33. package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.d.ts +1 -4
  34. package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.js +2 -3
  35. package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.js.map +1 -1
  36. package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js +111 -86
  37. package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js.map +1 -1
  38. package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.d.ts +4 -3
  39. package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js +8 -2
  40. package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js.map +1 -1
  41. package/dist/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.d.ts +14 -0
  42. package/dist/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js +49 -0
  43. package/dist/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js.map +1 -0
  44. package/dist/client/components/react-dev-overlay/_experimental/internal/styles/base.js +8 -2
  45. package/dist/client/components/react-dev-overlay/_experimental/internal/styles/base.js.map +1 -1
  46. package/dist/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js +3 -3
  47. package/dist/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js.map +1 -1
  48. package/dist/client/components/react-dev-overlay/internal/styles/Base.js +8 -2
  49. package/dist/client/components/react-dev-overlay/internal/styles/Base.js.map +1 -1
  50. package/dist/client/index.js +1 -1
  51. package/dist/compiled/next-server/app-page-experimental.runtime.dev.js +2 -2
  52. package/dist/compiled/next-server/app-page-experimental.runtime.dev.js.map +1 -1
  53. package/dist/compiled/next-server/app-page.runtime.dev.js +2 -2
  54. package/dist/compiled/next-server/app-page.runtime.dev.js.map +1 -1
  55. package/dist/compiled/next-server/pages-turbo.runtime.prod.js +2 -2
  56. package/dist/compiled/next-server/pages-turbo.runtime.prod.js.map +1 -1
  57. package/dist/compiled/next-server/server.runtime.prod.js +1 -1
  58. package/dist/compiled/next-server/server.runtime.prod.js.map +1 -1
  59. package/dist/esm/build/index.js +2 -2
  60. package/dist/esm/build/swc/index.js +1 -1
  61. package/dist/esm/build/webpack/plugins/define-env-plugin.js +2 -1
  62. package/dist/esm/build/webpack/plugins/define-env-plugin.js.map +1 -1
  63. package/dist/esm/build/webpack/plugins/slow-module-detection-plugin.js +177 -0
  64. package/dist/esm/build/webpack/plugins/slow-module-detection-plugin.js.map +1 -0
  65. package/dist/esm/build/webpack-config.js +19 -4
  66. package/dist/esm/build/webpack-config.js.map +1 -1
  67. package/dist/esm/client/app-bootstrap.js +1 -1
  68. package/dist/esm/client/components/errors/stitched-error.js +3 -3
  69. package/dist/esm/client/components/errors/stitched-error.js.map +1 -1
  70. package/dist/esm/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js +3 -3
  71. package/dist/esm/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js.map +1 -1
  72. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js +274 -146
  73. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js.map +1 -1
  74. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js +4 -4
  75. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js.map +1 -1
  76. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js +9 -15
  77. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js.map +1 -1
  78. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js +1 -1
  79. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js.map +1 -1
  80. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js +1 -3
  81. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js.map +1 -1
  82. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js +2 -2
  83. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js.map +1 -1
  84. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js +2 -1
  85. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js.map +1 -1
  86. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.js +2 -3
  87. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.js.map +1 -1
  88. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js +111 -86
  89. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js.map +1 -1
  90. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js +8 -2
  91. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js.map +1 -1
  92. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js +33 -0
  93. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js.map +1 -0
  94. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/styles/base.js +8 -2
  95. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/styles/base.js.map +1 -1
  96. package/dist/esm/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js +3 -3
  97. package/dist/esm/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js.map +1 -1
  98. package/dist/esm/client/components/react-dev-overlay/internal/styles/Base.js +8 -2
  99. package/dist/esm/client/components/react-dev-overlay/internal/styles/Base.js.map +1 -1
  100. package/dist/esm/client/index.js +1 -1
  101. package/dist/esm/export/worker.js +9 -1
  102. package/dist/esm/export/worker.js.map +1 -1
  103. package/dist/esm/lib/turbopack-warning.js +2 -1
  104. package/dist/esm/lib/turbopack-warning.js.map +1 -1
  105. package/dist/esm/server/base-server.js +4 -4
  106. package/dist/esm/server/base-server.js.map +1 -1
  107. package/dist/esm/server/config-schema.js +4 -1
  108. package/dist/esm/server/config-schema.js.map +1 -1
  109. package/dist/esm/server/config-shared.js +2 -1
  110. package/dist/esm/server/config-shared.js.map +1 -1
  111. package/dist/esm/server/config.js +1 -1
  112. package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
  113. package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
  114. package/dist/esm/server/lib/app-info-log.js +1 -1
  115. package/dist/esm/server/lib/start-server.js +1 -1
  116. package/dist/esm/server/server-utils.js +22 -19
  117. package/dist/esm/server/server-utils.js.map +1 -1
  118. package/dist/esm/server/web-server.js +2 -2
  119. package/dist/esm/server/web-server.js.map +1 -1
  120. package/dist/export/worker.js +9 -1
  121. package/dist/export/worker.js.map +1 -1
  122. package/dist/lib/turbopack-warning.js +2 -1
  123. package/dist/lib/turbopack-warning.js.map +1 -1
  124. package/dist/server/base-server.js +4 -4
  125. package/dist/server/base-server.js.map +1 -1
  126. package/dist/server/config-schema.js +4 -1
  127. package/dist/server/config-schema.js.map +1 -1
  128. package/dist/server/config-shared.d.ts +11 -0
  129. package/dist/server/config-shared.js +2 -1
  130. package/dist/server/config-shared.js.map +1 -1
  131. package/dist/server/config.js +1 -1
  132. package/dist/server/dev/hot-reloader-turbopack.js +1 -1
  133. package/dist/server/dev/hot-reloader-webpack.js +1 -1
  134. package/dist/server/lib/app-info-log.js +1 -1
  135. package/dist/server/lib/start-server.js +1 -1
  136. package/dist/server/server-utils.d.ts +4 -4
  137. package/dist/server/server-utils.js +22 -19
  138. package/dist/server/server-utils.js.map +1 -1
  139. package/dist/server/web-server.js +2 -2
  140. package/dist/server/web-server.js.map +1 -1
  141. package/dist/telemetry/anonymous-meta.js +1 -1
  142. package/dist/telemetry/events/session-stopped.js +2 -2
  143. package/dist/telemetry/events/version.js +2 -2
  144. package/package.json +15 -15
@@ -13,7 +13,7 @@ Object.defineProperty(exports, "appBootstrap", {
13
13
  return appBootstrap;
14
14
  }
15
15
  });
16
- const version = "15.2.0-canary.28";
16
+ const version = "15.2.0-canary.29";
17
17
  window.next = {
18
18
  version,
19
19
  appDir: true
@@ -13,9 +13,8 @@ const _react = /*#__PURE__*/ _interop_require_default._(require("react"));
13
13
  const _iserror = /*#__PURE__*/ _interop_require_default._(require("../../../lib/is-error"));
14
14
  const REACT_ERROR_STACK_BOTTOM_FRAME = 'react-stack-bottom-frame';
15
15
  const REACT_ERROR_STACK_BOTTOM_FRAME_REGEX = new RegExp("(at " + REACT_ERROR_STACK_BOTTOM_FRAME + " )|(" + REACT_ERROR_STACK_BOTTOM_FRAME + "\\@)");
16
- const captureOwnerStack = _react.default.captureOwnerStack ? _react.default.captureOwnerStack : ()=>'';
17
16
  function getReactStitchedError(err) {
18
- if (typeof _react.default.captureOwnerStack !== 'function') {
17
+ if (!process.env.__NEXT_REACT_OWNER_STACK) {
19
18
  return err;
20
19
  }
21
20
  const isErrorInstance = (0, _iserror.default)(err);
@@ -39,8 +38,9 @@ function getReactStitchedError(err) {
39
38
  }
40
39
  function appendOwnerStack(error) {
41
40
  let stack = error.stack || '';
41
+ // This module is only bundled in development mode so this is safe.
42
+ const ownerStack = _react.default.captureOwnerStack();
42
43
  // Avoid duplicate overriding stack frames
43
- const ownerStack = captureOwnerStack();
44
44
  if (ownerStack && stack.endsWith(ownerStack) === false) {
45
45
  stack += ownerStack;
46
46
  // 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\nconst captureOwnerStack = React.captureOwnerStack\n ? React.captureOwnerStack\n : () => ''\n\nexport function getReactStitchedError<T = unknown>(err: T): Error | T {\n if (typeof React.captureOwnerStack !== 'function') {\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 // Avoid duplicate overriding stack frames\n const ownerStack = captureOwnerStack()\n if (ownerStack && stack.endsWith(ownerStack) === false) {\n stack += ownerStack\n // Override stack\n error.stack = stack\n }\n}\n"],"names":["getReactStitchedError","REACT_ERROR_STACK_BOTTOM_FRAME","REACT_ERROR_STACK_BOTTOM_FRAME_REGEX","RegExp","captureOwnerStack","React","err","isErrorInstance","isError","originStack","stack","originMessage","message","stackLines","split","indexOfSplit","findIndex","line","test","isOriginalReactError","newStack","slice","join","newError","Error","Object","assign","appendOwnerStack","error","ownerStack","endsWith"],"mappings":";;;;+BAYgBA;;;eAAAA;;;;gEAZE;kEACE;AAEpB,MAAMC,iCAAiC;AACvC,MAAMC,uCAAuC,IAAIC,OAC/C,AAAC,SAAMF,iCAA+B,SAAMA,iCAA+B;AAG7E,MAAMG,oBAAoBC,cAAK,CAACD,iBAAiB,GAC7CC,cAAK,CAACD,iBAAiB,GACvB,IAAM;AAEH,SAASJ,sBAAmCM,GAAM;IACvD,IAAI,OAAOD,cAAK,CAACD,iBAAiB,KAAK,YAAY;QACjD,OAAOE;IACT;IACA,MAAMC,kBAAkBC,IAAAA,gBAAO,EAACF;IAChC,MAAMG,cAAcF,kBAAkBD,IAAII,KAAK,IAAI,KAAK;IACxD,MAAMC,gBAAgBJ,kBAAkBD,IAAIM,OAAO,GAAG;IACtD,MAAMC,aAAaJ,YAAYK,KAAK,CAAC;IACrC,MAAMC,eAAeF,WAAWG,SAAS,CAAC,CAACC,OACzCf,qCAAqCgB,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,UAAUjB;IACxBiB,SAASb,KAAK,GAAGU;IAEjB,0CAA0C;IAC1CO,iBAAiBJ;IAEjB,OAAOA;AACT;AAEA,SAASI,iBAAiBC,KAAY;IACpC,IAAIlB,QAAQkB,MAAMlB,KAAK,IAAI;IAC3B,0CAA0C;IAC1C,MAAMmB,aAAazB;IACnB,IAAIyB,cAAcnB,MAAMoB,QAAQ,CAACD,gBAAgB,OAAO;QACtDnB,SAASmB;QACT,iBAAiB;QACjBD,MAAMlB,KAAK,GAAGA;IAChB;AACF"}
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":["getReactStitchedError","REACT_ERROR_STACK_BOTTOM_FRAME","REACT_ERROR_STACK_BOTTOM_FRAME_REGEX","RegExp","err","process","env","__NEXT_REACT_OWNER_STACK","isErrorInstance","isError","originStack","stack","originMessage","message","stackLines","split","indexOfSplit","findIndex","line","test","isOriginalReactError","newStack","slice","join","newError","Error","Object","assign","appendOwnerStack","error","ownerStack","React","captureOwnerStack","endsWith"],"mappings":";;;;+BAQgBA;;;eAAAA;;;;gEARE;kEACE;AAEpB,MAAMC,iCAAiC;AACvC,MAAMC,uCAAuC,IAAIC,OAC/C,AAAC,SAAMF,iCAA+B,SAAMA,iCAA+B;AAGtE,SAASD,sBAAmCI,GAAM;IACvD,IAAI,CAACC,QAAQC,GAAG,CAACC,wBAAwB,EAAE;QACzC,OAAOH;IACT;IACA,MAAMI,kBAAkBC,IAAAA,gBAAO,EAACL;IAChC,MAAMM,cAAcF,kBAAkBJ,IAAIO,KAAK,IAAI,KAAK;IACxD,MAAMC,gBAAgBJ,kBAAkBJ,IAAIS,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,UAAUpB;IACxBoB,SAASb,KAAK,GAAGU;IAEjB,0CAA0C;IAC1CO,iBAAiBJ;IAEjB,OAAOA;AACT;AAEA,SAASI,iBAAiBC,KAAY;IACpC,IAAIlB,QAAQkB,MAAMlB,KAAK,IAAI;IAC3B,mEAAmE;IACnE,MAAMmB,aAAaC,cAAK,CAACC,iBAAiB;IAC1C,0CAA0C;IAC1C,IAAIF,cAAcnB,MAAMsB,QAAQ,CAACH,gBAAgB,OAAO;QACtDnB,SAASmB;QACT,iBAAiB;QACjBD,MAAMlB,KAAK,GAAGA;IAChB;AACF"}
@@ -22,8 +22,8 @@ const _useerrorhook = require("../internal/container/runtime-error/use-error-hoo
22
22
  function ReactDevOverlay(param) {
23
23
  let { state, globalError, children } = param;
24
24
  const [isErrorOverlayOpen, setIsErrorOverlayOpen] = (0, _react.useState)(false);
25
- const { readyErrors } = (0, _useerrorhook.useErrorHook)({
26
- errors: state.errors,
25
+ const { readyErrors, totalErrorCount } = (0, _useerrorhook.useErrorHook)({
26
+ state,
27
27
  isAppDir: true
28
28
  });
29
29
  const devOverlay = /*#__PURE__*/ (0, _jsxruntime.jsxs)(_shadowportal.ShadowPortal, {
@@ -34,7 +34,7 @@ function ReactDevOverlay(param) {
34
34
  /*#__PURE__*/ (0, _jsxruntime.jsx)(_componentstyles.ComponentStyles, {}),
35
35
  /*#__PURE__*/ (0, _jsxruntime.jsx)(_devtoolsindicator.DevToolsIndicator, {
36
36
  state: state,
37
- readyErrorsLength: readyErrors.length,
37
+ errorCount: totalErrorCount,
38
38
  setIsErrorOverlayOpen: setIsErrorOverlayOpen
39
39
  }),
40
40
  /*#__PURE__*/ (0, _jsxruntime.jsx)(_erroroverlay.ErrorOverlay, {
@@ -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({ errors: state.errors, isAppDir: true })\n\n const devOverlay = (\n <ShadowPortal>\n <CssReset />\n <Base />\n <Colors />\n <ComponentStyles />\n\n <DevToolsIndicator\n state={state}\n readyErrorsLength={readyErrors.length}\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":["ReactDevOverlay","state","globalError","children","isErrorOverlayOpen","setIsErrorOverlayOpen","useState","readyErrors","useErrorHook","errors","isAppDir","devOverlay","ShadowPortal","CssReset","Base","Colors","ComponentStyles","DevToolsIndicator","readyErrorsLength","length","ErrorOverlay","DevOverlayErrorBoundary","onError"],"mappings":";;;;+BAcA;;;eAAwBA;;;;uBAXC;+BACe;8BACX;sBACR;iCACW;0BACP;wBACF;8BACM;mCACK;8BACL;AAEd,SAASA,gBAAgB,KAQvC;IARuC,IAAA,EACtCC,KAAK,EACLC,WAAW,EACXC,QAAQ,EAKT,GARuC;IAStC,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGC,IAAAA,eAAQ,EAAC;IAC7D,MAAM,EAAEC,WAAW,EAAE,GAAGC,IAAAA,0BAAY,EAAC;QAAEC,QAAQR,MAAMQ,MAAM;QAAEC,UAAU;IAAK;IAE5E,MAAMC,2BACJ,sBAACC,0BAAY;;0BACX,qBAACC,kBAAQ;0BACT,qBAACC,UAAI;0BACL,qBAACC,cAAM;0BACP,qBAACC,gCAAe;0BAEhB,qBAACC,oCAAiB;gBAChBhB,OAAOA;gBACPiB,mBAAmBX,YAAYY,MAAM;gBACrCd,uBAAuBA;;0BAGzB,qBAACe,0BAAY;gBACXnB,OAAOA;gBACPM,aAAaA;gBACbH,oBAAoBA;gBACpBC,uBAAuBA;;;;IAK7B,qBACE,qBAACgB,sCAAuB;QACtBV,YAAYA;QACZT,aAAaA;QACboB,SAASjB;kBAERF;;AAGP"}
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":["ReactDevOverlay","state","globalError","children","isErrorOverlayOpen","setIsErrorOverlayOpen","useState","readyErrors","totalErrorCount","useErrorHook","isAppDir","devOverlay","ShadowPortal","CssReset","Base","Colors","ComponentStyles","DevToolsIndicator","errorCount","ErrorOverlay","DevOverlayErrorBoundary","onError"],"mappings":";;;;+BAcA;;;eAAwBA;;;;uBAXC;+BACe;8BACX;sBACR;iCACW;0BACP;wBACF;8BACM;mCACK;8BACL;AAEd,SAASA,gBAAgB,KAQvC;IARuC,IAAA,EACtCC,KAAK,EACLC,WAAW,EACXC,QAAQ,EAKT,GARuC;IAStC,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGC,IAAAA,eAAQ,EAAC;IAC7D,MAAM,EAAEC,WAAW,EAAEC,eAAe,EAAE,GAAGC,IAAAA,0BAAY,EAAC;QACpDR;QACAS,UAAU;IACZ;IAEA,MAAMC,2BACJ,sBAACC,0BAAY;;0BACX,qBAACC,kBAAQ;0BACT,qBAACC,UAAI;0BACL,qBAACC,cAAM;0BACP,qBAACC,gCAAe;0BAEhB,qBAACC,oCAAiB;gBAChBhB,OAAOA;gBACPiB,YAAYV;gBACZH,uBAAuBA;;0BAGzB,qBAACc,0BAAY;gBACXlB,OAAOA;gBACPM,aAAaA;gBACbH,oBAAoBA;gBACpBC,uBAAuBA;;;;IAK7B,qBACE,qBAACe,sCAAuB;QACtBT,YAAYA;QACZT,aAAaA;QACbmB,SAAShB;kBAERF;;AAGP"}
@@ -1,7 +1,7 @@
1
1
  import type { Dispatch, SetStateAction } from 'react';
2
2
  import type { OverlayState } from '../../../../../shared';
3
- export declare function DevToolsIndicator({ state, readyErrorsLength, setIsErrorOverlayOpen, }: {
3
+ export declare function DevToolsIndicator({ state, errorCount, setIsErrorOverlayOpen, }: {
4
4
  state: OverlayState;
5
- readyErrorsLength: number;
5
+ errorCount: number;
6
6
  setIsErrorOverlayOpen: Dispatch<SetStateAction<boolean>>;
7
7
  }): false | import("react/jsx-runtime").JSX.Element;
@@ -17,7 +17,7 @@ const _devrenderindicator = require("./internal/dev-render-indicator");
17
17
  const _usedelayedrender = require("./internal/use-delayed-render");
18
18
  const _usekeyboardshortcut = require("../../../hooks/use-keyboard-shortcut");
19
19
  function DevToolsIndicator(param) {
20
- let { state, readyErrorsLength, setIsErrorOverlayOpen } = param;
20
+ let { state, errorCount, setIsErrorOverlayOpen } = param;
21
21
  const [isDevToolsIndicatorOpen, setIsDevToolsIndicatorOpen] = (0, _react.useState)(true);
22
22
  // Register `(cmd|ctrl) + .` to show/hide the error indicator.
23
23
  (0, _usekeyboardshortcut.useKeyboardShortcut)({
@@ -32,7 +32,7 @@ function DevToolsIndicator(param) {
32
32
  });
33
33
  return isDevToolsIndicatorOpen && /*#__PURE__*/ (0, _jsxruntime.jsx)(DevToolsPopover, {
34
34
  semver: state.versionInfo.installed,
35
- issueCount: readyErrorsLength,
35
+ issueCount: errorCount,
36
36
  isStaticRoute: state.staticIndicator,
37
37
  hide: ()=>{
38
38
  setIsDevToolsIndicatorOpen(false);
@@ -41,46 +41,99 @@ function DevToolsIndicator(param) {
41
41
  isTurbopack: !!process.env.TURBOPACK
42
42
  });
43
43
  }
44
+ //////////////////////////////////////////////////////////////////////////////////////
44
45
  const ANIMATE_OUT_DURATION_MS = 200;
45
46
  const ANIMATE_OUT_TIMING_FUNCTION = 'cubic-bezier(0.175, 0.885, 0.32, 1.1)';
46
- const DevToolsPopover = (param)=>{
47
- let { issueCount, isStaticRoute, semver, isTurbopack, hide, setIsErrorOverlayOpen } = param;
48
- const popoverRef = (0, _react.useRef)(null);
49
- const buttonRef = (0, _react.useRef)(null);
50
- const [isPopoverOpen, setIsPopoverOpen] = (0, _react.useState)(false);
51
- const { mounted, rendered } = (0, _usedelayedrender.useDelayedRender)(isPopoverOpen, {
47
+ const Context = /*#__PURE__*/ (0, _react.createContext)({});
48
+ function DevToolsPopover(param) {
49
+ let { issueCount, isStaticRoute, isTurbopack, hide, setIsErrorOverlayOpen } = param;
50
+ const menuRef = (0, _react.useRef)(null);
51
+ const triggerRef = (0, _react.useRef)(null);
52
+ const [isMenuOpen, setIsMenuOpen] = (0, _react.useState)(false);
53
+ const [selectedIndex, setSelectedIndex] = (0, _react.useState)(-1);
54
+ const { mounted, rendered } = (0, _usedelayedrender.useDelayedRender)(isMenuOpen, {
52
55
  // Intentionally no fade in, makes the UI feel more immediate
53
56
  enterDelay: 0,
54
57
  // Graceful fade out to confirm that the UI did not break
55
58
  exitDelay: ANIMATE_OUT_DURATION_MS
56
59
  });
57
- (0, _react.useEffect)(()=>{
58
- // Close popover when clicking outside of it or its button
59
- const handleClickOutside = (event)=>{
60
- var _popoverRef_current, _buttonRef_current;
61
- if (!(((_popoverRef_current = popoverRef.current) == null ? void 0 : _popoverRef_current.getBoundingClientRect()) ? event.clientX >= popoverRef.current.getBoundingClientRect().left && event.clientX <= popoverRef.current.getBoundingClientRect().right && event.clientY >= popoverRef.current.getBoundingClientRect().top && event.clientY <= popoverRef.current.getBoundingClientRect().bottom : false) && !(((_buttonRef_current = buttonRef.current) == null ? void 0 : _buttonRef_current.getBoundingClientRect()) ? event.clientX >= buttonRef.current.getBoundingClientRect().left && event.clientX <= buttonRef.current.getBoundingClientRect().right && event.clientY >= buttonRef.current.getBoundingClientRect().top && event.clientY <= buttonRef.current.getBoundingClientRect().bottom : false)) {
62
- setIsPopoverOpen(false);
60
+ // Features to make the menu accessible
61
+ useFocusTrap(menuRef, triggerRef, isMenuOpen);
62
+ useClickOutside(menuRef, triggerRef, isMenuOpen, closeMenu);
63
+ function select(index) {
64
+ var _menuRef_current;
65
+ if (index === 'last') {
66
+ var _menuRef_current1;
67
+ const all = (_menuRef_current1 = menuRef.current) == null ? void 0 : _menuRef_current1.querySelectorAll('[role="menuitem"]');
68
+ if (all) {
69
+ const lastIndex = all.length - 1;
70
+ select(lastIndex);
63
71
  }
64
- };
65
- // Close popover when pressing escape
66
- const handleKeyDown = (event)=>{
67
- if (event.key === 'Escape') {
68
- setIsPopoverOpen(false);
69
- }
70
- };
71
- document.addEventListener('mousedown', handleClickOutside);
72
- document.addEventListener('keydown', handleKeyDown);
73
- return ()=>{
74
- document.removeEventListener('mousedown', handleClickOutside);
75
- document.removeEventListener('keydown', handleKeyDown);
76
- };
77
- }, []);
78
- const togglePopover = ()=>setIsPopoverOpen((prev)=>!prev);
79
- const onIssuesClick = ()=>issueCount > 0 ? setIsErrorOverlayOpen(true) : null;
80
- const onLogoClick = ()=>{
81
- togglePopover();
82
- onIssuesClick();
83
- };
72
+ return;
73
+ }
74
+ const el = (_menuRef_current = menuRef.current) == null ? void 0 : _menuRef_current.querySelector('[data-index="' + index + '"]');
75
+ if (el) {
76
+ setSelectedIndex(index);
77
+ el == null ? void 0 : el.focus();
78
+ }
79
+ }
80
+ function onMenuKeydown(e) {
81
+ e.preventDefault();
82
+ switch(e.key){
83
+ case 'ArrowDown':
84
+ const next = selectedIndex + 1;
85
+ select(next);
86
+ break;
87
+ case 'ArrowUp':
88
+ const prev = selectedIndex - 1;
89
+ select(prev);
90
+ break;
91
+ case 'Home':
92
+ select(0);
93
+ break;
94
+ case 'End':
95
+ select('last');
96
+ break;
97
+ default:
98
+ break;
99
+ }
100
+ }
101
+ function onTriggerKeydown(e) {
102
+ if (isMenuOpen) {
103
+ return;
104
+ }
105
+ // Open with first item focused
106
+ if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {
107
+ setIsMenuOpen(true);
108
+ // Run on next tick because querying DOM after state change
109
+ setTimeout(()=>{
110
+ select(0);
111
+ });
112
+ }
113
+ // Open with last item focused
114
+ if (e.key === 'ArrowUp') {
115
+ setIsMenuOpen(true);
116
+ // Run on next tick because querying DOM after state change
117
+ setTimeout(()=>{
118
+ select('last');
119
+ });
120
+ }
121
+ }
122
+ function openErrorOverlay() {
123
+ if (issueCount > 0) {
124
+ setIsErrorOverlayOpen(true);
125
+ }
126
+ }
127
+ function onTriggerClick() {
128
+ setIsMenuOpen((prev)=>!prev);
129
+ }
130
+ function closeMenu() {
131
+ setIsMenuOpen(false);
132
+ // Avoid flashing selected state
133
+ setTimeout(()=>{
134
+ setSelectedIndex(-1);
135
+ }, ANIMATE_OUT_DURATION_MS);
136
+ }
84
137
  return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_toast.Toast, {
85
138
  "data-nextjs-toast": true,
86
139
  style: {
@@ -88,153 +141,229 @@ const DevToolsPopover = (param)=>{
88
141
  zIndex: 2147483647
89
142
  },
90
143
  children: [
91
- /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
92
- ref: buttonRef,
93
- children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_nextlogo.NextLogo, {
94
- issueCount: issueCount,
95
- onLogoClick: onLogoClick,
96
- onIssuesClick: onIssuesClick,
97
- isDevBuilding: (0, _initializefornewoverlay.useIsDevBuilding)(),
98
- isDevRendering: (0, _devrenderindicator.useIsDevRendering)(),
99
- "aria-haspopup": "true",
100
- "aria-expanded": isPopoverOpen,
101
- "aria-controls": "dev-tools-popover",
102
- "data-nextjs-dev-tools-button": true
103
- }, issueCount)
104
- }),
105
- mounted && /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
106
- ref: popoverRef,
107
- id: "dev-tools-popover",
108
- role: "dialog",
109
- "aria-labelledby": "dev-tools-title",
110
- "data-nextjs-dev-tools-popover": true,
144
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_nextlogo.NextLogo, {
145
+ ref: triggerRef,
146
+ "aria-haspopup": "menu",
147
+ "aria-expanded": isMenuOpen,
148
+ "aria-controls": "nextjs-dev-tools-menu",
149
+ "aria-label": "" + (isMenuOpen ? 'Close' : 'Open') + " Next.js Dev Tools",
150
+ "data-nextjs-dev-tools-button": true,
151
+ issueCount: issueCount,
152
+ onTriggerClick: onTriggerClick,
153
+ onKeyDown: onTriggerKeydown,
154
+ openErrorOverlay: openErrorOverlay,
155
+ isDevBuilding: (0, _initializefornewoverlay.useIsDevBuilding)(),
156
+ isDevRendering: (0, _devrenderindicator.useIsDevRendering)()
157
+ }, issueCount),
158
+ mounted && /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
159
+ ref: menuRef,
160
+ id: "nextjs-dev-tools-menu",
161
+ role: "menu",
162
+ dir: "ltr",
163
+ "aria-orientation": "vertical",
164
+ "aria-label": "Next.js Dev Tools Items",
165
+ tabIndex: -1,
166
+ className: "menu",
167
+ onKeyDown: onMenuKeydown,
111
168
  "data-rendered": rendered,
112
169
  style: {
113
170
  '--animate-out-duration-ms': "" + ANIMATE_OUT_DURATION_MS + "ms",
114
171
  '--animate-out-timing-function': ANIMATE_OUT_TIMING_FUNCTION
115
172
  },
116
- tabIndex: -1,
117
- children: [
118
- /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
119
- "data-nextjs-dev-tools-content": true,
120
- children: /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
121
- "data-nextjs-dev-tools-container": true,
173
+ children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(Context.Provider, {
174
+ value: {
175
+ closeMenu,
176
+ selectedIndex,
177
+ setSelectedIndex
178
+ },
179
+ children: [
180
+ /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
181
+ className: "inner",
122
182
  children: [
123
- /*#__PURE__*/ (0, _jsxruntime.jsx)("h2", {
124
- id: "dev-tools-title",
125
- style: {
126
- display: 'none'
127
- },
128
- children: "Dev Tools Options"
129
- }),
130
- /*#__PURE__*/ (0, _jsxruntime.jsx)(IndicatorRow, {
131
- label: "Hide Dev Tools",
132
- value: /*#__PURE__*/ (0, _jsxruntime.jsx)(DevToolsShortcutGroup, {}),
133
- onClick: hide
134
- }),
135
- /*#__PURE__*/ (0, _jsxruntime.jsx)(IndicatorRow, {
136
- "data-nextjs-route-type": isStaticRoute ? 'static' : 'dynamic',
137
- label: "Route",
138
- value: isStaticRoute ? 'Static' : 'Dynamic'
139
- }),
140
- /*#__PURE__*/ (0, _jsxruntime.jsx)(IndicatorRow, {
183
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(MenuItem, {
184
+ index: 0,
141
185
  label: "Issues",
142
186
  value: /*#__PURE__*/ (0, _jsxruntime.jsx)(IssueCount, {
143
- count: issueCount
187
+ children: issueCount
144
188
  }),
145
- onClick: onIssuesClick
146
- })
147
- ]
148
- })
149
- }),
150
- /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
151
- "data-nextjs-dev-tools-footer": true,
152
- children: /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
153
- "data-nextjs-dev-tools-footer-text": true,
154
- children: [
155
- semver ? /*#__PURE__*/ (0, _jsxruntime.jsxs)("p", {
156
- "data-nextjs-dev-tools-version": true,
157
- children: [
158
- "Next.js ",
159
- semver
160
- ]
161
- }) : null,
162
- /*#__PURE__*/ (0, _jsxruntime.jsxs)("p", {
163
- "data-nextjs-dev-tools-version": true,
164
- children: [
165
- "Turbopack ",
166
- isTurbopack ? 'enabled' : 'not enabled'
167
- ]
189
+ onClick: openErrorOverlay
190
+ }),
191
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(MenuItem, {
192
+ label: "Route",
193
+ value: isStaticRoute ? 'Static' : 'Dynamic',
194
+ "data-nextjs-route-type": isStaticRoute ? 'static' : 'dynamic'
195
+ }),
196
+ isTurbopack ? /*#__PURE__*/ (0, _jsxruntime.jsx)(MenuItem, {
197
+ label: "Turbopack",
198
+ value: "Enabled"
199
+ }) : /*#__PURE__*/ (0, _jsxruntime.jsx)(MenuItem, {
200
+ index: 1,
201
+ label: "Try Turbopack",
202
+ value: /*#__PURE__*/ (0, _jsxruntime.jsx)(ExternalIcon, {}),
203
+ href: "https://nextjs.org/docs/app/api-reference/turbopack"
168
204
  })
169
205
  ]
206
+ }),
207
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("div", {
208
+ className: "footer",
209
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(MenuItem, {
210
+ label: "Hide Dev Tools",
211
+ value: /*#__PURE__*/ (0, _jsxruntime.jsx)(HideShortcut, {}),
212
+ onClick: hide,
213
+ index: isTurbopack ? 1 : 2
214
+ })
170
215
  })
171
- })
172
- ]
216
+ ]
217
+ })
173
218
  })
174
219
  ]
175
220
  });
176
- };
177
- const IndicatorRow = (param)=>{
178
- let { label, value, onClick, ...props } = param;
179
- const Wrapper = onClick ? 'button' : 'div';
180
- return /*#__PURE__*/ (0, _jsxruntime.jsxs)(Wrapper, {
181
- "data-nextjs-dev-tools-row": true,
182
- onClick: onClick,
221
+ }
222
+ function MenuItem(param) {
223
+ let { index, label, value, onClick, href, ...props } = param;
224
+ const isInteractive = typeof onClick === 'function' || typeof href === 'string';
225
+ const { closeMenu, selectedIndex, setSelectedIndex } = (0, _react.useContext)(Context);
226
+ const selected = selectedIndex === index;
227
+ function click() {
228
+ if (isInteractive) {
229
+ onClick == null ? void 0 : onClick();
230
+ closeMenu();
231
+ if (href) {
232
+ window.open(href, '_blank', 'noopener, noreferrer');
233
+ }
234
+ }
235
+ }
236
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)("div", {
237
+ className: "item",
238
+ "data-index": index,
239
+ "data-selected": selected,
240
+ onClick: click,
241
+ // Needs `onMouseMove` instead of enter to work together
242
+ // with keyboard and mouse input
243
+ onMouseMove: ()=>{
244
+ if (isInteractive && index !== undefined && selectedIndex !== index) {
245
+ setSelectedIndex(index);
246
+ }
247
+ },
248
+ onMouseLeave: ()=>setSelectedIndex(-1),
249
+ onKeyDown: (e)=>{
250
+ if (e.key === 'Enter' || e.key === ' ') {
251
+ click();
252
+ }
253
+ },
254
+ role: isInteractive ? 'menuitem' : undefined,
255
+ tabIndex: selected ? 0 : -1,
183
256
  ...props,
184
257
  children: [
185
258
  /*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
186
- "data-nextjs-dev-tools-row-label": true,
259
+ className: "label",
187
260
  children: label
188
261
  }),
189
262
  /*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
190
- "data-nextjs-dev-tools-row-value": true,
263
+ className: "value",
191
264
  children: value
192
265
  })
193
266
  ]
194
267
  });
195
- };
196
- const IssueCount = (param)=>{
197
- let { count } = param;
198
- return /*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
199
- "data-nextjs-dev-tools-issue-count": true,
200
- "data-has-issues": count > 0,
201
- children: /*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
202
- "data-nextjs-dev-tools-issue-text": true,
203
- "data-has-issues": count > 0,
204
- children: count
205
- })
268
+ }
269
+ function IssueCount(param) {
270
+ let { children } = param;
271
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)("span", {
272
+ className: "issueCount",
273
+ "data-has-issues": children > 0,
274
+ children: [
275
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
276
+ className: "indicator"
277
+ }),
278
+ children
279
+ ]
206
280
  });
207
- };
208
- function DevToolsShortcutGroup() {
281
+ }
282
+ function HideShortcut() {
209
283
  const isMac = // Feature detect for `navigator.userAgentData` which is experimental:
210
284
  // https://developer.mozilla.org/en-US/docs/Web/API/NavigatorUAData/platform
211
285
  'userAgentData' in navigator ? navigator.userAgentData.platform === 'macOS' : // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/platform#examples
212
286
  navigator.platform.indexOf('Mac') === 0 || navigator.platform === 'iPhone';
213
287
  return /*#__PURE__*/ (0, _jsxruntime.jsxs)("span", {
214
- "data-nextjs-dev-tools-shortcut-group": true,
288
+ className: "shortcut",
215
289
  children: [
216
- isMac ? /*#__PURE__*/ (0, _jsxruntime.jsx)(CmdIcon, {}) : /*#__PURE__*/ (0, _jsxruntime.jsx)(CtrlIcon, {}),
217
- /*#__PURE__*/ (0, _jsxruntime.jsx)(DotIcon, {})
290
+ isMac ? /*#__PURE__*/ (0, _jsxruntime.jsx)("kbd", {
291
+ "aria-label": "Command",
292
+ children: "⌘"
293
+ }) : /*#__PURE__*/ (0, _jsxruntime.jsx)("kbd", {
294
+ "aria-label": "Control",
295
+ style: {
296
+ width: 'fit-content',
297
+ padding: '0 4px'
298
+ },
299
+ children: "Ctrl"
300
+ }),
301
+ /*#__PURE__*/ (0, _jsxruntime.jsx)("kbd", {
302
+ children: "."
303
+ })
218
304
  ]
219
305
  });
220
306
  }
221
- function CmdIcon() {
222
- return /*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
223
- "data-nextjs-dev-tools-icon": true,
224
- children: "⌘"
225
- });
307
+ //////////////////////////////////////////////////////////////////////////////////////
308
+ function useFocusTrap(menuRef, triggerRef, isMenuOpen) {
309
+ (0, _react.useEffect)(()=>{
310
+ if (isMenuOpen) {
311
+ var _menuRef_current;
312
+ (_menuRef_current = menuRef.current) == null ? void 0 : _menuRef_current.focus();
313
+ } else {
314
+ var _triggerRef_current;
315
+ (_triggerRef_current = triggerRef.current) == null ? void 0 : _triggerRef_current.focus();
316
+ }
317
+ // eslint-disable-next-line react-hooks/exhaustive-deps
318
+ }, [
319
+ isMenuOpen
320
+ ]);
226
321
  }
227
- function CtrlIcon() {
228
- return /*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
229
- "data-nextjs-dev-tools-icon": true,
230
- "data-nextjs-dev-tools-ctrl-icon": true,
231
- children: "ctrl"
232
- });
322
+ //////////////////////////////////////////////////////////////////////////////////////
323
+ function useClickOutside(menuRef, triggerRef, isMenuOpen, closeMenu) {
324
+ (0, _react.useEffect)(()=>{
325
+ if (!isMenuOpen) {
326
+ return;
327
+ }
328
+ // Close menu when clicking outside of it or its button
329
+ const handleClickOutside = (event)=>{
330
+ var _menuRef_current, _triggerRef_current;
331
+ 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)) {
332
+ closeMenu();
333
+ }
334
+ };
335
+ // Close popover when pressing escape
336
+ const handleKeyDown = (event)=>{
337
+ if (event.key === 'Escape') {
338
+ closeMenu();
339
+ }
340
+ };
341
+ document.addEventListener('mousedown', handleClickOutside);
342
+ document.addEventListener('keydown', handleKeyDown);
343
+ return ()=>{
344
+ document.removeEventListener('mousedown', handleClickOutside);
345
+ document.removeEventListener('keydown', handleKeyDown);
346
+ };
347
+ // eslint-disable-next-line react-hooks/exhaustive-deps
348
+ }, [
349
+ isMenuOpen
350
+ ]);
233
351
  }
234
- function DotIcon() {
235
- return /*#__PURE__*/ (0, _jsxruntime.jsx)("span", {
236
- "data-nextjs-dev-tools-icon": true,
237
- children: "."
352
+ //////////////////////////////////////////////////////////////////////////////////////
353
+ function ExternalIcon() {
354
+ return /*#__PURE__*/ (0, _jsxruntime.jsx)("svg", {
355
+ width: "16",
356
+ height: "16",
357
+ viewBox: "0 0 16 16",
358
+ fill: "none",
359
+ role: "img",
360
+ "aria-label": "External link",
361
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)("path", {
362
+ fillRule: "evenodd",
363
+ clipRule: "evenodd",
364
+ 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",
365
+ fill: "currentColor"
366
+ })
238
367
  });
239
368
  }
240
369