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
@@ -3,7 +3,7 @@
3
3
  * sure the following scripts are executed in the correct order:
4
4
  * - Polyfills
5
5
  * - next/script with `beforeInteractive` strategy
6
- */ const version = "15.2.0-canary.28";
6
+ */ const version = "15.2.0-canary.29";
7
7
  window.next = {
8
8
  version,
9
9
  appDir: true
@@ -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 (typeof React.captureOwnerStack !== 'function') {
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\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":["React","isError","REACT_ERROR_STACK_BOTTOM_FRAME","REACT_ERROR_STACK_BOTTOM_FRAME_REGEX","RegExp","captureOwnerStack","getReactStitchedError","err","isErrorInstance","originStack","stack","originMessage","message","stackLines","split","indexOfSplit","findIndex","line","test","isOriginalReactError","newStack","slice","join","newError","Error","Object","assign","appendOwnerStack","error","ownerStack","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,MAAMG,oBAAoBL,MAAMK,iBAAiB,GAC7CL,MAAMK,iBAAiB,GACvB,IAAM;AAEV,OAAO,SAASC,sBAAmCC,GAAM;IACvD,IAAI,OAAOP,MAAMK,iBAAiB,KAAK,YAAY;QACjD,OAAOE;IACT;IACA,MAAMC,kBAAkBP,QAAQM;IAChC,MAAME,cAAcD,kBAAkBD,IAAIG,KAAK,IAAI,KAAK;IACxD,MAAMC,gBAAgBH,kBAAkBD,IAAIK,OAAO,GAAG;IACtD,MAAMC,aAAaJ,YAAYK,KAAK,CAAC;IACrC,MAAMC,eAAeF,WAAWG,SAAS,CAAC,CAACC,OACzCd,qCAAqCe,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,UAAUhB;IACxBgB,SAASb,KAAK,GAAGU;IAEjB,0CAA0C;IAC1CO,iBAAiBJ;IAEjB,OAAOA;AACT;AAEA,SAASI,iBAAiBC,KAAY;IACpC,IAAIlB,QAAQkB,MAAMlB,KAAK,IAAI;IAC3B,0CAA0C;IAC1C,MAAMmB,aAAaxB;IACnB,IAAIwB,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":["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
- errors: state.errors,
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
- readyErrorsLength: readyErrors.length,
27
+ errorCount: totalErrorCount,
28
28
  setIsErrorOverlayOpen: setIsErrorOverlayOpen
29
29
  }),
30
30
  /*#__PURE__*/ _jsx(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":["useState","DevOverlayErrorBoundary","ShadowPortal","Base","ComponentStyles","CssReset","Colors","ErrorOverlay","DevToolsIndicator","useErrorHook","ReactDevOverlay","state","globalError","children","isErrorOverlayOpen","setIsErrorOverlayOpen","readyErrors","errors","isAppDir","devOverlay","readyErrorsLength","length","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,EAAE,GAAGP,aAAa;QAAEQ,QAAQN,MAAMM,MAAM;QAAEC,UAAU;IAAK;IAE5E,MAAMC,2BACJ,MAACjB;;0BACC,KAACG;0BACD,KAACF;0BACD,KAACG;0BACD,KAACF;0BAED,KAACI;gBACCG,OAAOA;gBACPS,mBAAmBJ,YAAYK,MAAM;gBACrCN,uBAAuBA;;0BAGzB,KAACR;gBACCI,OAAOA;gBACPK,aAAaA;gBACbF,oBAAoBA;gBACpBC,uBAAuBA;;;;IAK7B,qBACE,KAACd;QACCkB,YAAYA;QACZP,aAAaA;QACbU,SAASP;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":["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, readyErrorsLength, setIsErrorOverlayOpen } = param;
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: readyErrorsLength,
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 DevToolsPopover = (param)=>{
40
- let { issueCount, isStaticRoute, semver, isTurbopack, hide, setIsErrorOverlayOpen } = param;
41
- const popoverRef = useRef(null);
42
- const buttonRef = useRef(null);
43
- const [isPopoverOpen, setIsPopoverOpen] = useState(false);
44
- const { mounted, rendered } = useDelayedRender(isPopoverOpen, {
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
- useEffect(()=>{
51
- // Close popover when clicking outside of it or its button
52
- const handleClickOutside = (event)=>{
53
- var _popoverRef_current, _buttonRef_current;
54
- 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)) {
55
- setIsPopoverOpen(false);
56
- }
57
- };
58
- // Close popover when pressing escape
59
- const handleKeyDown = (event)=>{
60
- if (event.key === 'Escape') {
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
- document.addEventListener('mousedown', handleClickOutside);
65
- document.addEventListener('keydown', handleKeyDown);
66
- return ()=>{
67
- document.removeEventListener('mousedown', handleClickOutside);
68
- document.removeEventListener('keydown', handleKeyDown);
69
- };
70
- }, []);
71
- const togglePopover = ()=>setIsPopoverOpen((prev)=>!prev);
72
- const onIssuesClick = ()=>issueCount > 0 ? setIsErrorOverlayOpen(true) : null;
73
- const onLogoClick = ()=>{
74
- togglePopover();
75
- onIssuesClick();
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("div", {
85
- ref: buttonRef,
86
- children: /*#__PURE__*/ _jsx(NextLogo, {
87
- issueCount: issueCount,
88
- onLogoClick: onLogoClick,
89
- onIssuesClick: onIssuesClick,
90
- isDevBuilding: useIsDevBuilding(),
91
- isDevRendering: useIsDevRendering(),
92
- "aria-haspopup": "true",
93
- "aria-expanded": isPopoverOpen,
94
- "aria-controls": "dev-tools-popover",
95
- "data-nextjs-dev-tools-button": true
96
- }, issueCount)
97
- }),
98
- mounted && /*#__PURE__*/ _jsxs("div", {
99
- ref: popoverRef,
100
- id: "dev-tools-popover",
101
- role: "dialog",
102
- "aria-labelledby": "dev-tools-title",
103
- "data-nextjs-dev-tools-popover": true,
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
- tabIndex: -1,
110
- children: [
111
- /*#__PURE__*/ _jsx("div", {
112
- "data-nextjs-dev-tools-content": true,
113
- children: /*#__PURE__*/ _jsxs("div", {
114
- "data-nextjs-dev-tools-container": true,
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("h2", {
117
- id: "dev-tools-title",
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
- count: issueCount
179
+ children: issueCount
137
180
  }),
138
- onClick: onIssuesClick
139
- })
140
- ]
141
- })
142
- }),
143
- /*#__PURE__*/ _jsx("div", {
144
- "data-nextjs-dev-tools-footer": true,
145
- children: /*#__PURE__*/ _jsxs("div", {
146
- "data-nextjs-dev-tools-footer-text": true,
147
- children: [
148
- semver ? /*#__PURE__*/ _jsxs("p", {
149
- "data-nextjs-dev-tools-version": true,
150
- children: [
151
- "Next.js ",
152
- semver
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
- const IndicatorRow = (param)=>{
171
- let { label, value, onClick, ...props } = param;
172
- const Wrapper = onClick ? 'button' : 'div';
173
- return /*#__PURE__*/ _jsxs(Wrapper, {
174
- "data-nextjs-dev-tools-row": true,
175
- onClick: onClick,
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
- "data-nextjs-dev-tools-row-label": true,
251
+ className: "label",
180
252
  children: label
181
253
  }),
182
254
  /*#__PURE__*/ _jsx("span", {
183
- "data-nextjs-dev-tools-row-value": true,
255
+ className: "value",
184
256
  children: value
185
257
  })
186
258
  ]
187
259
  });
188
- };
189
- const IssueCount = (param)=>{
190
- let { count } = param;
191
- return /*#__PURE__*/ _jsx("span", {
192
- "data-nextjs-dev-tools-issue-count": true,
193
- "data-has-issues": count > 0,
194
- children: /*#__PURE__*/ _jsx("span", {
195
- "data-nextjs-dev-tools-issue-text": true,
196
- "data-has-issues": count > 0,
197
- children: count
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 DevToolsShortcutGroup() {
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
- "data-nextjs-dev-tools-shortcut-group": true,
280
+ className: "shortcut",
208
281
  children: [
209
- isMac ? /*#__PURE__*/ _jsx(CmdIcon, {}) : /*#__PURE__*/ _jsx(CtrlIcon, {}),
210
- /*#__PURE__*/ _jsx(DotIcon, {})
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
- function CmdIcon() {
215
- return /*#__PURE__*/ _jsx("span", {
216
- "data-nextjs-dev-tools-icon": true,
217
- children: "⌘"
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
- function CtrlIcon() {
221
- return /*#__PURE__*/ _jsx("span", {
222
- "data-nextjs-dev-tools-icon": true,
223
- "data-nextjs-dev-tools-ctrl-icon": true,
224
- children: "ctrl"
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
- function DotIcon() {
228
- return /*#__PURE__*/ _jsx("span", {
229
- "data-nextjs-dev-tools-icon": true,
230
- children: "."
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