next 15.4.0-canary.19 → 15.4.0-canary.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) 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-config.js +2 -2
  5. package/dist/client/app-bootstrap.js +1 -1
  6. package/dist/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/dev-tools-indicator.d.ts +2 -2
  7. package/dist/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/dev-tools-indicator.js +30 -21
  8. package/dist/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/dev-tools-indicator.js.map +1 -1
  9. package/dist/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/draggable.d.ts +29 -0
  10. package/dist/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/draggable.js +271 -0
  11. package/dist/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/draggable.js.map +1 -0
  12. package/dist/client/components/react-dev-overlay/ui/components/fader/index.d.ts +1 -1
  13. package/dist/client/components/react-dev-overlay/ui/components/fader/index.js +1 -1
  14. package/dist/client/components/react-dev-overlay/ui/components/fader/index.js.map +1 -1
  15. package/dist/client/components/react-dev-overlay/ui/components/toast/styles.d.ts +1 -1
  16. package/dist/client/components/react-dev-overlay/ui/components/toast/styles.js +1 -1
  17. package/dist/client/components/react-dev-overlay/ui/components/toast/styles.js.map +1 -1
  18. package/dist/client/components/react-dev-overlay/ui/styles/base.js +1 -1
  19. package/dist/client/components/react-dev-overlay/ui/styles/base.js.map +1 -1
  20. package/dist/client/index.js +1 -1
  21. package/dist/compiled/next-server/app-page-experimental.runtime.dev.js +3 -3
  22. package/dist/compiled/next-server/app-page-experimental.runtime.dev.js.map +1 -1
  23. package/dist/compiled/next-server/app-page-turbo-experimental.runtime.dev.js +3 -3
  24. package/dist/compiled/next-server/app-page-turbo-experimental.runtime.dev.js.map +1 -1
  25. package/dist/compiled/next-server/app-page-turbo.runtime.dev.js +3 -3
  26. package/dist/compiled/next-server/app-page-turbo.runtime.dev.js.map +1 -1
  27. package/dist/compiled/next-server/app-page.runtime.dev.js +3 -3
  28. package/dist/compiled/next-server/app-page.runtime.dev.js.map +1 -1
  29. package/dist/esm/build/index.js +2 -2
  30. package/dist/esm/build/swc/index.js +1 -1
  31. package/dist/esm/build/webpack-config.js +2 -2
  32. package/dist/esm/client/app-bootstrap.js +1 -1
  33. package/dist/esm/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/dev-tools-indicator.js +30 -21
  34. package/dist/esm/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/dev-tools-indicator.js.map +1 -1
  35. package/dist/esm/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/draggable.js +243 -0
  36. package/dist/esm/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/draggable.js.map +1 -0
  37. package/dist/esm/client/components/react-dev-overlay/ui/components/fader/index.js +1 -1
  38. package/dist/esm/client/components/react-dev-overlay/ui/components/fader/index.js.map +1 -1
  39. package/dist/esm/client/components/react-dev-overlay/ui/components/toast/styles.js +1 -1
  40. package/dist/esm/client/components/react-dev-overlay/ui/components/toast/styles.js.map +1 -1
  41. package/dist/esm/client/components/react-dev-overlay/ui/styles/base.js +1 -1
  42. package/dist/esm/client/components/react-dev-overlay/ui/styles/base.js.map +1 -1
  43. package/dist/esm/client/index.js +1 -1
  44. package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
  45. package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
  46. package/dist/esm/server/lib/app-info-log.js +1 -1
  47. package/dist/esm/server/lib/start-server.js +1 -1
  48. package/dist/esm/shared/lib/canary-only.js +1 -1
  49. package/dist/server/dev/hot-reloader-turbopack.js +1 -1
  50. package/dist/server/dev/hot-reloader-webpack.js +1 -1
  51. package/dist/server/lib/app-info-log.js +1 -1
  52. package/dist/server/lib/start-server.js +1 -1
  53. package/dist/shared/lib/canary-only.js +1 -1
  54. package/dist/telemetry/anonymous-meta.js +1 -1
  55. package/dist/telemetry/events/session-stopped.js +2 -2
  56. package/dist/telemetry/events/version.js +2 -2
  57. package/package.json +15 -15
@@ -308,7 +308,7 @@ export default async function build(dir, reactProductionProfiling = false, debug
308
308
  const nextBuildSpan = trace('next-build', undefined, {
309
309
  buildMode: experimentalBuildMode,
310
310
  isTurboBuild: String(isTurbopack),
311
- version: "15.4.0-canary.19"
311
+ version: "15.4.0-canary.20"
312
312
  });
313
313
  NextBuildContext.nextBuildSpan = nextBuildSpan;
314
314
  NextBuildContext.dir = dir;
@@ -690,7 +690,7 @@ export default async function build(dir, reactProductionProfiling = false, debug
690
690
  // Files outside of the distDir can be "type": "module"
691
691
  await writeFileUtf8(path.join(distDir, 'package.json'), '{"type": "commonjs"}');
692
692
  // These are written to distDir, so they need to come after creating and cleaning distDr.
693
- await recordFrameworkVersion("15.4.0-canary.19");
693
+ await recordFrameworkVersion("15.4.0-canary.20");
694
694
  await updateBuildDiagnostics({
695
695
  buildStage: 'start'
696
696
  });
@@ -11,7 +11,7 @@ import { isDeepStrictEqual } from 'util';
11
11
  import { getDefineEnv } from '../webpack/plugins/define-env-plugin';
12
12
  import { getReactCompilerLoader } from '../get-babel-loader-config';
13
13
  import { TurbopackInternalError } from '../../shared/lib/turbopack/utils';
14
- const nextVersion = "15.4.0-canary.19";
14
+ const nextVersion = "15.4.0-canary.20";
15
15
  const ArchName = arch();
16
16
  const PlatformName = platform();
17
17
  function infoLog(...args) {
@@ -1554,7 +1554,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
1554
1554
  isClient && new CopyFilePlugin({
1555
1555
  // file path to build output of `@next/polyfill-nomodule`
1556
1556
  filePath: require.resolve('./polyfills/polyfill-nomodule'),
1557
- cacheKey: "15.4.0-canary.19",
1557
+ cacheKey: "15.4.0-canary.20",
1558
1558
  name: `static/chunks/polyfills${dev ? '' : '-[hash]'}.js`,
1559
1559
  minimize: false,
1560
1560
  info: {
@@ -1731,7 +1731,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
1731
1731
  // - Next.js location on disk (some loaders use absolute paths and some resolve options depend on absolute paths)
1732
1732
  // - Next.js version
1733
1733
  // - next.config.js keys that affect compilation
1734
- version: `${__dirname}|${"15.4.0-canary.19"}|${configVars}`,
1734
+ version: `${__dirname}|${"15.4.0-canary.20"}|${configVars}`,
1735
1735
  cacheDirectory: path.join(distDir, 'cache', 'webpack'),
1736
1736
  // For production builds, it's more efficient to compress all cache files together instead of compression each one individually.
1737
1737
  // So we disable compression here and allow the build runner to take care of compressing the cache as a whole.
@@ -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.4.0-canary.19";
6
+ */ const version = "15.4.0-canary.20";
7
7
  window.next = {
8
8
  version,
9
9
  appDir: true
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { STORAGE_KEY_POSITION } from '../../../../shared';
2
3
  import { useState, useEffect, useRef, createContext, useContext } from 'react';
3
4
  import { Toast } from '../../toast';
4
5
  import { NextLogo } from './next-logo';
@@ -11,6 +12,7 @@ import GearIcon from '../../../icons/gear-icon';
11
12
  import { UserPreferences } from './dev-tools-info/user-preferences';
12
13
  import { MENU_CURVE, MENU_DURATION_MS, useClickOutside, useFocusTrap } from './utils';
13
14
  import { getInitialPosition } from './dev-tools-info/preferences';
15
+ import { Draggable } from './draggable';
14
16
  // TODO: add E2E tests to cover different scenarios
15
17
  export function DevToolsIndicator(param) {
16
18
  let { state, errorCount, isBuildError, setIsErrorOverlayOpen, ...props } = param;
@@ -40,6 +42,7 @@ const OVERLAYS = {
40
42
  Route: 'route',
41
43
  Preferences: 'preferences'
42
44
  };
45
+ const INDICATOR_PADDING = 20;
43
46
  function DevToolsPopover(param) {
44
47
  let { routerType, disabled, issueCount, isStaticRoute, isTurbopack, isBuildError, hide, setIsErrorOverlayOpen, scale, setScale } = param;
45
48
  const menuRef = useRef(null);
@@ -173,28 +176,34 @@ function DevToolsPopover(param) {
173
176
  '--animate-out-timing-function': MENU_CURVE,
174
177
  boxShadow: 'none',
175
178
  zIndex: 2147483647,
176
- // Reset the toast component's default positions.
177
- bottom: 'initial',
178
- left: 'initial',
179
- [vertical]: '20px',
180
- [horizontal]: '20px'
179
+ [vertical]: "" + INDICATOR_PADDING + "px",
180
+ [horizontal]: "" + INDICATOR_PADDING + "px"
181
181
  },
182
182
  children: [
183
- /*#__PURE__*/ _jsx(NextLogo, {
184
- ref: triggerRef,
185
- "aria-haspopup": "menu",
186
- "aria-expanded": isMenuOpen,
187
- "aria-controls": "nextjs-dev-tools-menu",
188
- "aria-label": "" + (isMenuOpen ? 'Close' : 'Open') + " Next.js Dev Tools",
189
- "data-nextjs-dev-tools-button": true,
190
- disabled: disabled,
191
- issueCount: issueCount,
192
- onTriggerClick: onTriggerClick,
193
- toggleErrorOverlay: toggleErrorOverlay,
194
- isDevBuilding: useIsDevBuilding(),
195
- isDevRendering: useIsDevRendering(),
196
- isBuildError: isBuildError,
197
- scale: scale
183
+ /*#__PURE__*/ _jsx(Draggable, {
184
+ padding: INDICATOR_PADDING,
185
+ onDragStart: ()=>setOpen(null),
186
+ position: position,
187
+ setPosition: (p)=>{
188
+ localStorage.setItem(STORAGE_KEY_POSITION, p);
189
+ setPosition(p);
190
+ },
191
+ children: /*#__PURE__*/ _jsx(NextLogo, {
192
+ ref: triggerRef,
193
+ "aria-haspopup": "menu",
194
+ "aria-expanded": isMenuOpen,
195
+ "aria-controls": "nextjs-dev-tools-menu",
196
+ "aria-label": "" + (isMenuOpen ? 'Close' : 'Open') + " Next.js Dev Tools",
197
+ "data-nextjs-dev-tools-button": true,
198
+ disabled: disabled,
199
+ issueCount: issueCount,
200
+ onTriggerClick: onTriggerClick,
201
+ toggleErrorOverlay: toggleErrorOverlay,
202
+ isDevBuilding: useIsDevBuilding(),
203
+ isDevRendering: useIsDevRendering(),
204
+ isBuildError: isBuildError,
205
+ scale: scale
206
+ })
198
207
  }),
199
208
  /*#__PURE__*/ _jsx(RouteInfo, {
200
209
  isOpen: isRouteInfoOpen,
@@ -365,6 +374,6 @@ function IssueCount(param) {
365
374
  });
366
375
  }
367
376
  //////////////////////////////////////////////////////////////////////////////////////
368
- export const DEV_TOOLS_INDICATOR_STYLES = "\n .dev-tools-indicator-menu {\n -webkit-font-smoothing: antialiased;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n background: var(--color-background-100);\n border: 1px solid var(--color-gray-alpha-400);\n background-clip: padding-box;\n box-shadow: var(--shadow-menu);\n border-radius: var(--rounded-xl);\n position: absolute;\n font-family: var(--font-stack-sans);\n z-index: 1000;\n overflow: hidden;\n opacity: 0;\n outline: 0;\n min-width: 248px;\n transition: opacity var(--animate-out-duration-ms)\n var(--animate-out-timing-function);\n\n &[data-rendered='true'] {\n opacity: 1;\n scale: 1;\n }\n }\n\n .dev-tools-indicator-inner {\n padding: 6px;\n width: 100%;\n }\n\n .dev-tools-indicator-item {\n display: flex;\n align-items: center;\n padding: 8px 6px;\n height: var(--size-36);\n border-radius: 6px;\n text-decoration: none !important;\n user-select: none;\n white-space: nowrap;\n\n svg {\n width: var(--size-16);\n height: var(--size-16);\n }\n\n &:focus-visible {\n outline: 0;\n }\n }\n\n .dev-tools-indicator-footer {\n background: var(--color-background-200);\n padding: 6px;\n border-top: 1px solid var(--color-gray-400);\n width: 100%;\n }\n\n .dev-tools-indicator-item[data-selected='true'] {\n cursor: pointer;\n background-color: var(--color-gray-200);\n }\n\n .dev-tools-indicator-label {\n font-size: var(--size-14);\n line-height: var(--size-20);\n color: var(--color-gray-1000);\n }\n\n .dev-tools-indicator-value {\n font-size: var(--size-14);\n line-height: var(--size-20);\n color: var(--color-gray-900);\n margin-left: auto;\n }\n\n .dev-tools-indicator-issue-count {\n --color-primary: var(--color-gray-800);\n --color-secondary: var(--color-gray-100);\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 8px;\n min-width: var(--size-40);\n height: var(--size-24);\n background: var(--color-background-100);\n border: 1px solid var(--color-gray-alpha-400);\n background-clip: padding-box;\n box-shadow: var(--shadow-small);\n padding: 2px;\n color: var(--color-gray-1000);\n border-radius: 128px;\n font-weight: 500;\n font-size: var(--size-13);\n font-variant-numeric: tabular-nums;\n\n &[data-has-issues='true'] {\n --color-primary: var(--color-red-800);\n --color-secondary: var(--color-red-100);\n }\n\n .dev-tools-indicator-issue-count-indicator {\n width: var(--size-8);\n height: var(--size-8);\n background: var(--color-primary);\n box-shadow: 0 0 0 2px var(--color-secondary);\n border-radius: 50%;\n }\n }\n\n .dev-tools-indicator-shortcut {\n display: flex;\n gap: 4px;\n\n kbd {\n width: var(--size-20);\n height: var(--size-20);\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: var(--rounded-md);\n border: 1px solid var(--color-gray-400);\n font-family: var(--font-stack-sans);\n background: var(--color-background-100);\n color: var(--color-gray-1000);\n text-align: center;\n font-size: var(--size-12);\n line-height: var(--size-16);\n }\n }\n";
377
+ export const DEV_TOOLS_INDICATOR_STYLES = "\n .dev-tools-indicator-menu {\n -webkit-font-smoothing: antialiased;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n background: var(--color-background-100);\n border: 1px solid var(--color-gray-alpha-400);\n background-clip: padding-box;\n box-shadow: var(--shadow-menu);\n border-radius: var(--rounded-xl);\n position: absolute;\n font-family: var(--font-stack-sans);\n z-index: 1000;\n overflow: hidden;\n opacity: 0;\n outline: 0;\n min-width: 248px;\n transition: opacity var(--animate-out-duration-ms)\n var(--animate-out-timing-function);\n\n &[data-rendered='true'] {\n opacity: 1;\n scale: 1;\n }\n }\n\n .dev-tools-indicator-inner {\n padding: 6px;\n width: 100%;\n }\n\n .dev-tools-indicator-item {\n display: flex;\n align-items: center;\n padding: 8px 6px;\n height: var(--size-36);\n border-radius: 6px;\n text-decoration: none !important;\n user-select: none;\n white-space: nowrap;\n\n svg {\n width: var(--size-16);\n height: var(--size-16);\n }\n\n &:focus-visible {\n outline: 0;\n }\n }\n\n .dev-tools-indicator-footer {\n background: var(--color-background-200);\n padding: 6px;\n border-top: 1px solid var(--color-gray-400);\n width: 100%;\n }\n\n .dev-tools-indicator-item[data-selected='true'] {\n cursor: pointer;\n background-color: var(--color-gray-200);\n }\n\n .dev-tools-indicator-label {\n font-size: var(--size-14);\n line-height: var(--size-20);\n color: var(--color-gray-1000);\n }\n\n .dev-tools-indicator-value {\n font-size: var(--size-14);\n line-height: var(--size-20);\n color: var(--color-gray-900);\n margin-left: auto;\n }\n\n .dev-tools-indicator-issue-count {\n --color-primary: var(--color-gray-800);\n --color-secondary: var(--color-gray-100);\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 8px;\n min-width: var(--size-40);\n height: var(--size-24);\n background: var(--color-background-100);\n border: 1px solid var(--color-gray-alpha-400);\n background-clip: padding-box;\n box-shadow: var(--shadow-small);\n padding: 2px;\n color: var(--color-gray-1000);\n border-radius: 128px;\n font-weight: 500;\n font-size: var(--size-13);\n font-variant-numeric: tabular-nums;\n\n &[data-has-issues='true'] {\n --color-primary: var(--color-red-800);\n --color-secondary: var(--color-red-100);\n }\n\n .dev-tools-indicator-issue-count-indicator {\n width: var(--size-8);\n height: var(--size-8);\n background: var(--color-primary);\n box-shadow: 0 0 0 2px var(--color-secondary);\n border-radius: 50%;\n }\n }\n\n .dev-tools-indicator-shortcut {\n display: flex;\n gap: 4px;\n\n kbd {\n width: var(--size-20);\n height: var(--size-20);\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: var(--rounded-md);\n border: 1px solid var(--color-gray-400);\n font-family: var(--font-stack-sans);\n background: var(--color-background-100);\n color: var(--color-gray-1000);\n text-align: center;\n font-size: var(--size-12);\n line-height: var(--size-16);\n }\n }\n\n .dev-tools-grabbing {\n cursor: grabbing;\n\n > * {\n pointer-events: none;\n }\n }\n";
369
378
 
370
379
  //# sourceMappingURL=dev-tools-indicator.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/dev-tools-indicator.tsx"],"sourcesContent":["import type { CSSProperties, Dispatch, SetStateAction } from 'react'\nimport type { OverlayState } from '../../../../shared'\n\nimport { useState, useEffect, useRef, createContext, useContext } from 'react'\nimport { Toast } from '../../toast'\nimport { NextLogo } from './next-logo'\nimport { useIsDevBuilding } from '../../../../../../dev/dev-build-indicator/internal/initialize'\nimport { useIsDevRendering } from '../../../../utils/dev-indicator/dev-render-indicator'\nimport { useDelayedRender } from '../../../hooks/use-delayed-render'\nimport { TurbopackInfo } from './dev-tools-info/turbopack-info'\nimport { RouteInfo } from './dev-tools-info/route-info'\nimport GearIcon from '../../../icons/gear-icon'\nimport { UserPreferences } from './dev-tools-info/user-preferences'\nimport {\n MENU_CURVE,\n MENU_DURATION_MS,\n useClickOutside,\n useFocusTrap,\n} from './utils'\nimport {\n getInitialPosition,\n type DevToolsScale,\n} from './dev-tools-info/preferences'\n\n// TODO: add E2E tests to cover different scenarios\n\nexport function DevToolsIndicator({\n state,\n errorCount,\n isBuildError,\n setIsErrorOverlayOpen,\n ...props\n}: {\n state: OverlayState\n errorCount: number\n isBuildError: boolean\n setIsErrorOverlayOpen: (\n isErrorOverlayOpen: boolean | ((prev: boolean) => boolean)\n ) => void\n scale: DevToolsScale\n setScale: (value: DevToolsScale) => void\n}) {\n const [isDevToolsIndicatorVisible, setIsDevToolsIndicatorVisible] =\n useState(true)\n\n return (\n <DevToolsPopover\n routerType={state.routerType}\n semver={state.versionInfo.installed}\n issueCount={errorCount}\n isStaticRoute={state.staticIndicator}\n hide={() => {\n setIsDevToolsIndicatorVisible(false)\n fetch('/__nextjs_disable_dev_indicator', {\n method: 'POST',\n })\n }}\n setIsErrorOverlayOpen={setIsErrorOverlayOpen}\n isTurbopack={!!process.env.TURBOPACK}\n disabled={state.disableDevIndicator || !isDevToolsIndicatorVisible}\n isBuildError={isBuildError}\n {...props}\n />\n )\n}\n\n//////////////////////////////////////////////////////////////////////////////////////\n\ninterface C {\n closeMenu: () => void\n selectedIndex: number\n setSelectedIndex: Dispatch<SetStateAction<number>>\n}\n\nconst Context = createContext({} as C)\n\nconst OVERLAYS = {\n Root: 'root',\n Turbo: 'turbo',\n Route: 'route',\n Preferences: 'preferences',\n} as const\n\nexport type Overlays = (typeof OVERLAYS)[keyof typeof OVERLAYS]\n\nfunction DevToolsPopover({\n routerType,\n disabled,\n issueCount,\n isStaticRoute,\n isTurbopack,\n isBuildError,\n hide,\n setIsErrorOverlayOpen,\n scale,\n setScale,\n}: {\n routerType: 'pages' | 'app'\n disabled: boolean\n issueCount: number\n isStaticRoute: boolean\n semver: string | undefined\n isTurbopack: boolean\n isBuildError: boolean\n hide: () => void\n setIsErrorOverlayOpen: (\n isOverlayOpen: boolean | ((prev: boolean) => boolean)\n ) => void\n scale: DevToolsScale\n setScale: (value: DevToolsScale) => void\n}) {\n const menuRef = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement | null>(null)\n\n const [open, setOpen] = useState<Overlays | null>(null)\n const [position, setPosition] = useState(getInitialPosition())\n const [selectedIndex, setSelectedIndex] = useState(-1)\n\n const isMenuOpen = open === OVERLAYS.Root\n const isTurbopackInfoOpen = open === OVERLAYS.Turbo\n const isRouteInfoOpen = open === OVERLAYS.Route\n const isPreferencesOpen = open === OVERLAYS.Preferences\n\n const { mounted: menuMounted, rendered: menuRendered } = useDelayedRender(\n isMenuOpen,\n {\n // Intentionally no fade in, makes the UI feel more immediate\n enterDelay: 0,\n // Graceful fade out to confirm that the UI did not break\n exitDelay: MENU_DURATION_MS,\n }\n )\n\n // Features to make the menu accessible\n useFocusTrap(menuRef, triggerRef, isMenuOpen)\n useClickOutside(menuRef, triggerRef, isMenuOpen, closeMenu)\n\n useEffect(() => {\n if (open === null) {\n // Avoid flashing selected state\n const id = setTimeout(() => {\n setSelectedIndex(-1)\n }, MENU_DURATION_MS)\n return () => clearTimeout(id)\n }\n }, [open])\n\n function select(index: number | 'first' | 'last') {\n if (index === 'first') {\n setTimeout(() => {\n const all = menuRef.current?.querySelectorAll('[role=\"menuitem\"]')\n if (all) {\n const firstIndex = all[0].getAttribute('data-index')\n select(Number(firstIndex))\n }\n })\n return\n }\n\n if (index === 'last') {\n setTimeout(() => {\n const all = menuRef.current?.querySelectorAll('[role=\"menuitem\"]')\n if (all) {\n const lastIndex = all.length - 1\n select(lastIndex)\n }\n })\n return\n }\n\n const el = menuRef.current?.querySelector(\n `[data-index=\"${index}\"]`\n ) as HTMLElement\n\n if (el) {\n setSelectedIndex(index)\n el?.focus()\n }\n }\n\n function onMenuKeydown(e: React.KeyboardEvent<HTMLDivElement>) {\n e.preventDefault()\n\n switch (e.key) {\n case 'ArrowDown':\n const next = selectedIndex + 1\n select(next)\n break\n case 'ArrowUp':\n const prev = selectedIndex - 1\n select(prev)\n break\n case 'Home':\n select('first')\n break\n case 'End':\n select('last')\n break\n default:\n break\n }\n }\n\n function openErrorOverlay() {\n setOpen(null)\n if (issueCount > 0) {\n setIsErrorOverlayOpen(true)\n }\n }\n\n function toggleErrorOverlay() {\n setIsErrorOverlayOpen((prev) => !prev)\n }\n\n function openRootMenu() {\n setOpen((prevOpen) => {\n if (prevOpen === null) select('first')\n return OVERLAYS.Root\n })\n }\n\n function onTriggerClick() {\n if (open === OVERLAYS.Root) {\n setOpen(null)\n } else {\n openRootMenu()\n setTimeout(() => {\n select('first')\n })\n }\n }\n\n function closeMenu() {\n // Only close when we were on `Root`,\n // otherwise it will close other overlays\n setOpen((prevOpen) => {\n if (prevOpen === OVERLAYS.Root) {\n return null\n }\n return prevOpen\n })\n }\n\n function handleHideDevtools() {\n setOpen(null)\n hide()\n }\n\n const [vertical, horizontal] = position.split('-', 2)\n const popover = { [vertical]: 'calc(100% + 8px)', [horizontal]: 0 }\n\n return (\n <Toast\n data-nextjs-toast\n style={\n {\n '--animate-out-duration-ms': `${MENU_DURATION_MS}ms`,\n '--animate-out-timing-function': MENU_CURVE,\n boxShadow: 'none',\n zIndex: 2147483647,\n // Reset the toast component's default positions.\n bottom: 'initial',\n left: 'initial',\n [vertical]: '20px',\n [horizontal]: '20px',\n } as CSSProperties\n }\n >\n {/* Trigger */}\n <NextLogo\n ref={triggerRef}\n aria-haspopup=\"menu\"\n aria-expanded={isMenuOpen}\n aria-controls=\"nextjs-dev-tools-menu\"\n aria-label={`${isMenuOpen ? 'Close' : 'Open'} Next.js Dev Tools`}\n data-nextjs-dev-tools-button\n disabled={disabled}\n issueCount={issueCount}\n onTriggerClick={onTriggerClick}\n toggleErrorOverlay={toggleErrorOverlay}\n isDevBuilding={useIsDevBuilding()}\n isDevRendering={useIsDevRendering()}\n isBuildError={isBuildError}\n scale={scale}\n />\n\n {/* Route Info */}\n <RouteInfo\n isOpen={isRouteInfoOpen}\n close={openRootMenu}\n triggerRef={triggerRef}\n style={popover}\n routerType={routerType}\n routeType={isStaticRoute ? 'Static' : 'Dynamic'}\n />\n\n {/* Turbopack Info */}\n <TurbopackInfo\n isOpen={isTurbopackInfoOpen}\n close={openRootMenu}\n triggerRef={triggerRef}\n style={popover}\n />\n\n {/* Preferences */}\n <UserPreferences\n isOpen={isPreferencesOpen}\n close={openRootMenu}\n triggerRef={triggerRef}\n style={popover}\n hide={handleHideDevtools}\n setPosition={setPosition}\n position={position}\n scale={scale}\n setScale={setScale}\n />\n\n {/* Dropdown Menu */}\n {menuMounted && (\n <div\n ref={menuRef}\n id=\"nextjs-dev-tools-menu\"\n role=\"menu\"\n dir=\"ltr\"\n aria-orientation=\"vertical\"\n aria-label=\"Next.js Dev Tools Items\"\n tabIndex={-1}\n className=\"dev-tools-indicator-menu\"\n onKeyDown={onMenuKeydown}\n data-rendered={menuRendered}\n style={popover}\n >\n <Context.Provider\n value={{\n closeMenu,\n selectedIndex,\n setSelectedIndex,\n }}\n >\n <div className=\"dev-tools-indicator-inner\">\n {issueCount > 0 && (\n <MenuItem\n title={`${issueCount} ${issueCount === 1 ? 'issue' : 'issues'} found. Click to view details in the dev overlay.`}\n index={0}\n label=\"Issues\"\n value={<IssueCount>{issueCount}</IssueCount>}\n onClick={openErrorOverlay}\n />\n )}\n <MenuItem\n title={`Current route is ${isStaticRoute ? 'static' : 'dynamic'}.`}\n label=\"Route\"\n index={1}\n value={isStaticRoute ? 'Static' : 'Dynamic'}\n onClick={() => setOpen(OVERLAYS.Route)}\n data-nextjs-route-type={isStaticRoute ? 'static' : 'dynamic'}\n />\n {isTurbopack ? (\n <MenuItem\n title=\"Turbopack is enabled.\"\n label=\"Turbopack\"\n value=\"Enabled\"\n />\n ) : (\n <MenuItem\n index={2}\n title=\"Learn about Turbopack and how to enable it in your application.\"\n label=\"Try Turbopack\"\n value={<ChevronRight />}\n onClick={() => setOpen(OVERLAYS.Turbo)}\n />\n )}\n </div>\n\n <div className=\"dev-tools-indicator-footer\">\n <MenuItem\n data-preferences\n label=\"Preferences\"\n value={<GearIcon />}\n onClick={() => setOpen(OVERLAYS.Preferences)}\n index={isTurbopack ? 2 : 3}\n />\n </div>\n </Context.Provider>\n </div>\n )}\n </Toast>\n )\n}\n\nfunction ChevronRight() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n fill=\"#666\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.50011 1.93945L6.03044 2.46978L10.8537 7.293C11.2442 7.68353 11.2442 8.31669 10.8537 8.70722L6.03044 13.5304L5.50011 14.0608L4.43945 13.0001L4.96978 12.4698L9.43945 8.00011L4.96978 3.53044L4.43945 3.00011L5.50011 1.93945Z\"\n />\n </svg>\n )\n}\n\nfunction MenuItem({\n index,\n label,\n value,\n onClick,\n href,\n ...props\n}: {\n index?: number\n title?: string\n label: string\n value: React.ReactNode\n href?: string\n onClick?: () => void\n}) {\n const isInteractive =\n typeof onClick === 'function' || typeof href === 'string'\n const { closeMenu, selectedIndex, setSelectedIndex } = useContext(Context)\n const selected = selectedIndex === index\n\n function click() {\n if (isInteractive) {\n onClick?.()\n closeMenu()\n if (href) {\n window.open(href, '_blank', 'noopener, noreferrer')\n }\n }\n }\n\n return (\n <div\n className=\"dev-tools-indicator-item\"\n data-index={index}\n data-selected={selected}\n onClick={click}\n // Needs `onMouseMove` instead of enter to work together\n // with keyboard and mouse input\n onMouseMove={() => {\n if (isInteractive && index !== undefined && selectedIndex !== index) {\n setSelectedIndex(index)\n }\n }}\n onMouseLeave={() => setSelectedIndex(-1)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n click()\n }\n }}\n role={isInteractive ? 'menuitem' : undefined}\n tabIndex={selected ? 0 : -1}\n {...props}\n >\n <span className=\"dev-tools-indicator-label\">{label}</span>\n <span className=\"dev-tools-indicator-value\">{value}</span>\n </div>\n )\n}\n\nfunction IssueCount({ children }: { children: number }) {\n return (\n <span\n className=\"dev-tools-indicator-issue-count\"\n data-has-issues={children > 0}\n >\n <span className=\"dev-tools-indicator-issue-count-indicator\" />\n {children}\n </span>\n )\n}\n\n//////////////////////////////////////////////////////////////////////////////////////\n\nexport const DEV_TOOLS_INDICATOR_STYLES = `\n .dev-tools-indicator-menu {\n -webkit-font-smoothing: antialiased;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n background: var(--color-background-100);\n border: 1px solid var(--color-gray-alpha-400);\n background-clip: padding-box;\n box-shadow: var(--shadow-menu);\n border-radius: var(--rounded-xl);\n position: absolute;\n font-family: var(--font-stack-sans);\n z-index: 1000;\n overflow: hidden;\n opacity: 0;\n outline: 0;\n min-width: 248px;\n transition: opacity var(--animate-out-duration-ms)\n var(--animate-out-timing-function);\n\n &[data-rendered='true'] {\n opacity: 1;\n scale: 1;\n }\n }\n\n .dev-tools-indicator-inner {\n padding: 6px;\n width: 100%;\n }\n\n .dev-tools-indicator-item {\n display: flex;\n align-items: center;\n padding: 8px 6px;\n height: var(--size-36);\n border-radius: 6px;\n text-decoration: none !important;\n user-select: none;\n white-space: nowrap;\n\n svg {\n width: var(--size-16);\n height: var(--size-16);\n }\n\n &:focus-visible {\n outline: 0;\n }\n }\n\n .dev-tools-indicator-footer {\n background: var(--color-background-200);\n padding: 6px;\n border-top: 1px solid var(--color-gray-400);\n width: 100%;\n }\n\n .dev-tools-indicator-item[data-selected='true'] {\n cursor: pointer;\n background-color: var(--color-gray-200);\n }\n\n .dev-tools-indicator-label {\n font-size: var(--size-14);\n line-height: var(--size-20);\n color: var(--color-gray-1000);\n }\n\n .dev-tools-indicator-value {\n font-size: var(--size-14);\n line-height: var(--size-20);\n color: var(--color-gray-900);\n margin-left: auto;\n }\n\n .dev-tools-indicator-issue-count {\n --color-primary: var(--color-gray-800);\n --color-secondary: var(--color-gray-100);\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 8px;\n min-width: var(--size-40);\n height: var(--size-24);\n background: var(--color-background-100);\n border: 1px solid var(--color-gray-alpha-400);\n background-clip: padding-box;\n box-shadow: var(--shadow-small);\n padding: 2px;\n color: var(--color-gray-1000);\n border-radius: 128px;\n font-weight: 500;\n font-size: var(--size-13);\n font-variant-numeric: tabular-nums;\n\n &[data-has-issues='true'] {\n --color-primary: var(--color-red-800);\n --color-secondary: var(--color-red-100);\n }\n\n .dev-tools-indicator-issue-count-indicator {\n width: var(--size-8);\n height: var(--size-8);\n background: var(--color-primary);\n box-shadow: 0 0 0 2px var(--color-secondary);\n border-radius: 50%;\n }\n }\n\n .dev-tools-indicator-shortcut {\n display: flex;\n gap: 4px;\n\n kbd {\n width: var(--size-20);\n height: var(--size-20);\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: var(--rounded-md);\n border: 1px solid var(--color-gray-400);\n font-family: var(--font-stack-sans);\n background: var(--color-background-100);\n color: var(--color-gray-1000);\n text-align: center;\n font-size: var(--size-12);\n line-height: var(--size-16);\n }\n }\n`\n"],"names":["useState","useEffect","useRef","createContext","useContext","Toast","NextLogo","useIsDevBuilding","useIsDevRendering","useDelayedRender","TurbopackInfo","RouteInfo","GearIcon","UserPreferences","MENU_CURVE","MENU_DURATION_MS","useClickOutside","useFocusTrap","getInitialPosition","DevToolsIndicator","state","errorCount","isBuildError","setIsErrorOverlayOpen","props","isDevToolsIndicatorVisible","setIsDevToolsIndicatorVisible","DevToolsPopover","routerType","semver","versionInfo","installed","issueCount","isStaticRoute","staticIndicator","hide","fetch","method","isTurbopack","process","env","TURBOPACK","disabled","disableDevIndicator","Context","OVERLAYS","Root","Turbo","Route","Preferences","scale","setScale","menuRef","triggerRef","open","setOpen","position","setPosition","selectedIndex","setSelectedIndex","isMenuOpen","isTurbopackInfoOpen","isRouteInfoOpen","isPreferencesOpen","mounted","menuMounted","rendered","menuRendered","enterDelay","exitDelay","closeMenu","id","setTimeout","clearTimeout","select","index","all","current","querySelectorAll","firstIndex","getAttribute","Number","lastIndex","length","el","querySelector","focus","onMenuKeydown","e","preventDefault","key","next","prev","openErrorOverlay","toggleErrorOverlay","openRootMenu","prevOpen","onTriggerClick","handleHideDevtools","vertical","horizontal","split","popover","data-nextjs-toast","style","boxShadow","zIndex","bottom","left","ref","aria-haspopup","aria-expanded","aria-controls","aria-label","data-nextjs-dev-tools-button","isDevBuilding","isDevRendering","isOpen","close","routeType","div","role","dir","aria-orientation","tabIndex","className","onKeyDown","data-rendered","Provider","value","MenuItem","title","label","IssueCount","onClick","data-nextjs-route-type","ChevronRight","data-preferences","svg","xmlns","width","height","viewBox","fill","path","fillRule","clipRule","d","href","isInteractive","selected","click","window","data-index","data-selected","onMouseMove","undefined","onMouseLeave","span","children","data-has-issues","DEV_TOOLS_INDICATOR_STYLES"],"mappings":";AAGA,SAASA,QAAQ,EAAEC,SAAS,EAAEC,MAAM,EAAEC,aAAa,EAAEC,UAAU,QAAQ,QAAO;AAC9E,SAASC,KAAK,QAAQ,cAAa;AACnC,SAASC,QAAQ,QAAQ,cAAa;AACtC,SAASC,gBAAgB,QAAQ,gEAA+D;AAChG,SAASC,iBAAiB,QAAQ,uDAAsD;AACxF,SAASC,gBAAgB,QAAQ,oCAAmC;AACpE,SAASC,aAAa,QAAQ,kCAAiC;AAC/D,SAASC,SAAS,QAAQ,8BAA6B;AACvD,OAAOC,cAAc,2BAA0B;AAC/C,SAASC,eAAe,QAAQ,oCAAmC;AACnE,SACEC,UAAU,EACVC,gBAAgB,EAChBC,eAAe,EACfC,YAAY,QACP,UAAS;AAChB,SACEC,kBAAkB,QAEb,+BAA8B;AAErC,mDAAmD;AAEnD,OAAO,SAASC,kBAAkB,KAejC;IAfiC,IAAA,EAChCC,KAAK,EACLC,UAAU,EACVC,YAAY,EACZC,qBAAqB,EACrB,GAAGC,OAUJ,GAfiC;IAgBhC,MAAM,CAACC,4BAA4BC,8BAA8B,GAC/D1B,SAAS;IAEX,qBACE,KAAC2B;QACCC,YAAYR,MAAMQ,UAAU;QAC5BC,QAAQT,MAAMU,WAAW,CAACC,SAAS;QACnCC,YAAYX;QACZY,eAAeb,MAAMc,eAAe;QACpCC,MAAM;YACJT,8BAA8B;YAC9BU,MAAM,mCAAmC;gBACvCC,QAAQ;YACV;QACF;QACAd,uBAAuBA;QACvBe,aAAa,CAAC,CAACC,QAAQC,GAAG,CAACC,SAAS;QACpCC,UAAUtB,MAAMuB,mBAAmB,IAAI,CAAClB;QACxCH,cAAcA;QACb,GAAGE,KAAK;;AAGf;AAUA,MAAMoB,wBAAUzC,cAAc,CAAC;AAE/B,MAAM0C,WAAW;IACfC,MAAM;IACNC,OAAO;IACPC,OAAO;IACPC,aAAa;AACf;AAIA,SAAStB,gBAAgB,KAyBxB;IAzBwB,IAAA,EACvBC,UAAU,EACVc,QAAQ,EACRV,UAAU,EACVC,aAAa,EACbK,WAAW,EACXhB,YAAY,EACZa,IAAI,EACJZ,qBAAqB,EACrB2B,KAAK,EACLC,QAAQ,EAeT,GAzBwB;IA0BvB,MAAMC,UAAUlD,OAAuB;IACvC,MAAMmD,aAAanD,OAAiC;IAEpD,MAAM,CAACoD,MAAMC,QAAQ,GAAGvD,SAA0B;IAClD,MAAM,CAACwD,UAAUC,YAAY,GAAGzD,SAASkB;IACzC,MAAM,CAACwC,eAAeC,iBAAiB,GAAG3D,SAAS,CAAC;IAEpD,MAAM4D,aAAaN,SAAST,SAASC,IAAI;IACzC,MAAMe,sBAAsBP,SAAST,SAASE,KAAK;IACnD,MAAMe,kBAAkBR,SAAST,SAASG,KAAK;IAC/C,MAAMe,oBAAoBT,SAAST,SAASI,WAAW;IAEvD,MAAM,EAAEe,SAASC,WAAW,EAAEC,UAAUC,YAAY,EAAE,GAAG1D,iBACvDmD,YACA;QACE,6DAA6D;QAC7DQ,YAAY;QACZ,yDAAyD;QACzDC,WAAWtD;IACb;IAGF,uCAAuC;IACvCE,aAAamC,SAASC,YAAYO;IAClC5C,gBAAgBoC,SAASC,YAAYO,YAAYU;IAEjDrE,UAAU;QACR,IAAIqD,SAAS,MAAM;YACjB,gCAAgC;YAChC,MAAMiB,KAAKC,WAAW;gBACpBb,iBAAiB,CAAC;YACpB,GAAG5C;YACH,OAAO,IAAM0D,aAAaF;QAC5B;IACF,GAAG;QAACjB;KAAK;IAET,SAASoB,OAAOC,KAAgC;YAuBnCvB;QAtBX,IAAIuB,UAAU,SAAS;YACrBH,WAAW;oBACGpB;gBAAZ,MAAMwB,OAAMxB,mBAAAA,QAAQyB,OAAO,qBAAfzB,iBAAiB0B,gBAAgB,CAAC;gBAC9C,IAAIF,KAAK;oBACP,MAAMG,aAAaH,GAAG,CAAC,EAAE,CAACI,YAAY,CAAC;oBACvCN,OAAOO,OAAOF;gBAChB;YACF;YACA;QACF;QAEA,IAAIJ,UAAU,QAAQ;YACpBH,WAAW;oBACGpB;gBAAZ,MAAMwB,OAAMxB,mBAAAA,QAAQyB,OAAO,qBAAfzB,iBAAiB0B,gBAAgB,CAAC;gBAC9C,IAAIF,KAAK;oBACP,MAAMM,YAAYN,IAAIO,MAAM,GAAG;oBAC/BT,OAAOQ;gBACT;YACF;YACA;QACF;QAEA,MAAME,MAAKhC,mBAAAA,QAAQyB,OAAO,qBAAfzB,iBAAiBiC,aAAa,CACvC,AAAC,kBAAeV,QAAM;QAGxB,IAAIS,IAAI;YACNzB,iBAAiBgB;YACjBS,sBAAAA,GAAIE,KAAK;QACX;IACF;IAEA,SAASC,cAAcC,CAAsC;QAC3DA,EAAEC,cAAc;QAEhB,OAAQD,EAAEE,GAAG;YACX,KAAK;gBACH,MAAMC,OAAOjC,gBAAgB;gBAC7BgB,OAAOiB;gBACP;YACF,KAAK;gBACH,MAAMC,OAAOlC,gBAAgB;gBAC7BgB,OAAOkB;gBACP;YACF,KAAK;gBACHlB,OAAO;gBACP;YACF,KAAK;gBACHA,OAAO;gBACP;YACF;gBACE;QACJ;IACF;IAEA,SAASmB;QACPtC,QAAQ;QACR,IAAIvB,aAAa,GAAG;YAClBT,sBAAsB;QACxB;IACF;IAEA,SAASuE;QACPvE,sBAAsB,CAACqE,OAAS,CAACA;IACnC;IAEA,SAASG;QACPxC,QAAQ,CAACyC;YACP,IAAIA,aAAa,MAAMtB,OAAO;YAC9B,OAAO7B,SAASC,IAAI;QACtB;IACF;IAEA,SAASmD;QACP,IAAI3C,SAAST,SAASC,IAAI,EAAE;YAC1BS,QAAQ;QACV,OAAO;YACLwC;YACAvB,WAAW;gBACTE,OAAO;YACT;QACF;IACF;IAEA,SAASJ;QACP,qCAAqC;QACrC,yCAAyC;QACzCf,QAAQ,CAACyC;YACP,IAAIA,aAAanD,SAASC,IAAI,EAAE;gBAC9B,OAAO;YACT;YACA,OAAOkD;QACT;IACF;IAEA,SAASE;QACP3C,QAAQ;QACRpB;IACF;IAEA,MAAM,CAACgE,UAAUC,WAAW,GAAG5C,SAAS6C,KAAK,CAAC,KAAK;IACnD,MAAMC,UAAU;QAAE,CAACH,SAAS,EAAE;QAAoB,CAACC,WAAW,EAAE;IAAE;IAElE,qBACE,MAAC/F;QACCkG,mBAAiB;QACjBC,OACE;YACE,6BAA6B,AAAC,KAAEzF,mBAAiB;YACjD,iCAAiCD;YACjC2F,WAAW;YACXC,QAAQ;YACR,iDAAiD;YACjDC,QAAQ;YACRC,MAAM;YACN,CAACT,SAAS,EAAE;YACZ,CAACC,WAAW,EAAE;QAChB;;0BAIF,KAAC9F;gBACCuG,KAAKxD;gBACLyD,iBAAc;gBACdC,iBAAenD;gBACfoD,iBAAc;gBACdC,cAAY,AAAC,KAAErD,CAAAA,aAAa,UAAU,MAAK,IAAE;gBAC7CsD,8BAA4B;gBAC5BxE,UAAUA;gBACVV,YAAYA;gBACZiE,gBAAgBA;gBAChBH,oBAAoBA;gBACpBqB,eAAe5G;gBACf6G,gBAAgB5G;gBAChBc,cAAcA;gBACd4B,OAAOA;;0BAIT,KAACvC;gBACC0G,QAAQvD;gBACRwD,OAAOvB;gBACP1C,YAAYA;gBACZmD,OAAOF;gBACP1E,YAAYA;gBACZ2F,WAAWtF,gBAAgB,WAAW;;0BAIxC,KAACvB;gBACC2G,QAAQxD;gBACRyD,OAAOvB;gBACP1C,YAAYA;gBACZmD,OAAOF;;0BAIT,KAACzF;gBACCwG,QAAQtD;gBACRuD,OAAOvB;gBACP1C,YAAYA;gBACZmD,OAAOF;gBACPnE,MAAM+D;gBACNzC,aAAaA;gBACbD,UAAUA;gBACVN,OAAOA;gBACPC,UAAUA;;YAIXc,6BACC,KAACuD;gBACCX,KAAKzD;gBACLmB,IAAG;gBACHkD,MAAK;gBACLC,KAAI;gBACJC,oBAAiB;gBACjBV,cAAW;gBACXW,UAAU,CAAC;gBACXC,WAAU;gBACVC,WAAWvC;gBACXwC,iBAAe5D;gBACfqC,OAAOF;0BAEP,cAAA,MAAC1D,QAAQoF,QAAQ;oBACfC,OAAO;wBACL3D;wBACAZ;wBACAC;oBACF;;sCAEA,MAAC6D;4BAAIK,WAAU;;gCACZ7F,aAAa,mBACZ,KAACkG;oCACCC,OAAO,AAAGnG,aAAW,MAAGA,CAAAA,eAAe,IAAI,UAAU,QAAO,IAAE;oCAC9D2C,OAAO;oCACPyD,OAAM;oCACNH,qBAAO,KAACI;kDAAYrG;;oCACpBsG,SAASzC;;8CAGb,KAACqC;oCACCC,OAAO,AAAC,sBAAmBlG,CAAAA,gBAAgB,WAAW,SAAQ,IAAE;oCAChEmG,OAAM;oCACNzD,OAAO;oCACPsD,OAAOhG,gBAAgB,WAAW;oCAClCqG,SAAS,IAAM/E,QAAQV,SAASG,KAAK;oCACrCuF,0BAAwBtG,gBAAgB,WAAW;;gCAEpDK,4BACC,KAAC4F;oCACCC,OAAM;oCACNC,OAAM;oCACNH,OAAM;mDAGR,KAACC;oCACCvD,OAAO;oCACPwD,OAAM;oCACNC,OAAM;oCACNH,qBAAO,KAACO;oCACRF,SAAS,IAAM/E,QAAQV,SAASE,KAAK;;;;sCAK3C,KAACyE;4BAAIK,WAAU;sCACb,cAAA,KAACK;gCACCO,kBAAgB;gCAChBL,OAAM;gCACNH,qBAAO,KAACrH;gCACR0H,SAAS,IAAM/E,QAAQV,SAASI,WAAW;gCAC3C0B,OAAOrC,cAAc,IAAI;;;;;;;;AAQzC;AAEA,SAASkG;IACP,qBACE,KAACE;QACCC,OAAM;QACNC,OAAM;QACNC,QAAO;QACPC,SAAQ;QACRC,MAAK;kBAEL,cAAA,KAACC;YACCD,MAAK;YACLE,UAAS;YACTC,UAAS;YACTC,GAAE;;;AAIV;AAEA,SAASjB,SAAS,KAcjB;IAdiB,IAAA,EAChBvD,KAAK,EACLyD,KAAK,EACLH,KAAK,EACLK,OAAO,EACPc,IAAI,EACJ,GAAG5H,OAQJ,GAdiB;IAehB,MAAM6H,gBACJ,OAAOf,YAAY,cAAc,OAAOc,SAAS;IACnD,MAAM,EAAE9E,SAAS,EAAEZ,aAAa,EAAEC,gBAAgB,EAAE,GAAGvD,WAAWwC;IAClE,MAAM0G,WAAW5F,kBAAkBiB;IAEnC,SAAS4E;QACP,IAAIF,eAAe;YACjBf,2BAAAA;YACAhE;YACA,IAAI8E,MAAM;gBACRI,OAAOlG,IAAI,CAAC8F,MAAM,UAAU;YAC9B;QACF;IACF;IAEA,qBACE,MAAC5B;QACCK,WAAU;QACV4B,cAAY9E;QACZ+E,iBAAeJ;QACfhB,SAASiB;QACT,wDAAwD;QACxD,gCAAgC;QAChCI,aAAa;YACX,IAAIN,iBAAiB1E,UAAUiF,aAAalG,kBAAkBiB,OAAO;gBACnEhB,iBAAiBgB;YACnB;QACF;QACAkF,cAAc,IAAMlG,iBAAiB,CAAC;QACtCmE,WAAW,CAACtC;YACV,IAAIA,EAAEE,GAAG,KAAK,WAAWF,EAAEE,GAAG,KAAK,KAAK;gBACtC6D;YACF;QACF;QACA9B,MAAM4B,gBAAgB,aAAaO;QACnChC,UAAU0B,WAAW,IAAI,CAAC;QACzB,GAAG9H,KAAK;;0BAET,KAACsI;gBAAKjC,WAAU;0BAA6BO;;0BAC7C,KAAC0B;gBAAKjC,WAAU;0BAA6BI;;;;AAGnD;AAEA,SAASI,WAAW,KAAkC;IAAlC,IAAA,EAAE0B,QAAQ,EAAwB,GAAlC;IAClB,qBACE,MAACD;QACCjC,WAAU;QACVmC,mBAAiBD,WAAW;;0BAE5B,KAACD;gBAAKjC,WAAU;;YACfkC;;;AAGP;AAEA,sFAAsF;AAEtF,OAAO,MAAME,6BAA8B,4yGAoI1C","ignoreList":[0]}
1
+ {"version":3,"sources":["../../../../../../../../src/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/dev-tools-indicator.tsx"],"sourcesContent":["import type { CSSProperties, Dispatch, SetStateAction } from 'react'\nimport { STORAGE_KEY_POSITION, type OverlayState } from '../../../../shared'\n\nimport { useState, useEffect, useRef, createContext, useContext } from 'react'\nimport { Toast } from '../../toast'\nimport { NextLogo } from './next-logo'\nimport { useIsDevBuilding } from '../../../../../../dev/dev-build-indicator/internal/initialize'\nimport { useIsDevRendering } from '../../../../utils/dev-indicator/dev-render-indicator'\nimport { useDelayedRender } from '../../../hooks/use-delayed-render'\nimport { TurbopackInfo } from './dev-tools-info/turbopack-info'\nimport { RouteInfo } from './dev-tools-info/route-info'\nimport GearIcon from '../../../icons/gear-icon'\nimport { UserPreferences } from './dev-tools-info/user-preferences'\nimport {\n MENU_CURVE,\n MENU_DURATION_MS,\n useClickOutside,\n useFocusTrap,\n} from './utils'\nimport {\n getInitialPosition,\n type DevToolsScale,\n} from './dev-tools-info/preferences'\nimport { Draggable } from './draggable'\n\n// TODO: add E2E tests to cover different scenarios\n\nexport function DevToolsIndicator({\n state,\n errorCount,\n isBuildError,\n setIsErrorOverlayOpen,\n ...props\n}: {\n state: OverlayState\n errorCount: number\n isBuildError: boolean\n setIsErrorOverlayOpen: (\n isErrorOverlayOpen: boolean | ((prev: boolean) => boolean)\n ) => void\n scale: DevToolsScale\n setScale: (value: DevToolsScale) => void\n}) {\n const [isDevToolsIndicatorVisible, setIsDevToolsIndicatorVisible] =\n useState(true)\n\n return (\n <DevToolsPopover\n routerType={state.routerType}\n semver={state.versionInfo.installed}\n issueCount={errorCount}\n isStaticRoute={state.staticIndicator}\n hide={() => {\n setIsDevToolsIndicatorVisible(false)\n fetch('/__nextjs_disable_dev_indicator', {\n method: 'POST',\n })\n }}\n setIsErrorOverlayOpen={setIsErrorOverlayOpen}\n isTurbopack={!!process.env.TURBOPACK}\n disabled={state.disableDevIndicator || !isDevToolsIndicatorVisible}\n isBuildError={isBuildError}\n {...props}\n />\n )\n}\n\n//////////////////////////////////////////////////////////////////////////////////////\n\ninterface C {\n closeMenu: () => void\n selectedIndex: number\n setSelectedIndex: Dispatch<SetStateAction<number>>\n}\n\nconst Context = createContext({} as C)\n\nconst OVERLAYS = {\n Root: 'root',\n Turbo: 'turbo',\n Route: 'route',\n Preferences: 'preferences',\n} as const\n\nexport type Overlays = (typeof OVERLAYS)[keyof typeof OVERLAYS]\n\nconst INDICATOR_PADDING = 20\n\nfunction DevToolsPopover({\n routerType,\n disabled,\n issueCount,\n isStaticRoute,\n isTurbopack,\n isBuildError,\n hide,\n setIsErrorOverlayOpen,\n scale,\n setScale,\n}: {\n routerType: 'pages' | 'app'\n disabled: boolean\n issueCount: number\n isStaticRoute: boolean\n semver: string | undefined\n isTurbopack: boolean\n isBuildError: boolean\n hide: () => void\n setIsErrorOverlayOpen: (\n isOverlayOpen: boolean | ((prev: boolean) => boolean)\n ) => void\n scale: DevToolsScale\n setScale: (value: DevToolsScale) => void\n}) {\n const menuRef = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement | null>(null)\n\n const [open, setOpen] = useState<Overlays | null>(null)\n const [position, setPosition] = useState(getInitialPosition())\n const [selectedIndex, setSelectedIndex] = useState(-1)\n\n const isMenuOpen = open === OVERLAYS.Root\n const isTurbopackInfoOpen = open === OVERLAYS.Turbo\n const isRouteInfoOpen = open === OVERLAYS.Route\n const isPreferencesOpen = open === OVERLAYS.Preferences\n\n const { mounted: menuMounted, rendered: menuRendered } = useDelayedRender(\n isMenuOpen,\n {\n // Intentionally no fade in, makes the UI feel more immediate\n enterDelay: 0,\n // Graceful fade out to confirm that the UI did not break\n exitDelay: MENU_DURATION_MS,\n }\n )\n\n // Features to make the menu accessible\n useFocusTrap(menuRef, triggerRef, isMenuOpen)\n useClickOutside(menuRef, triggerRef, isMenuOpen, closeMenu)\n\n useEffect(() => {\n if (open === null) {\n // Avoid flashing selected state\n const id = setTimeout(() => {\n setSelectedIndex(-1)\n }, MENU_DURATION_MS)\n return () => clearTimeout(id)\n }\n }, [open])\n\n function select(index: number | 'first' | 'last') {\n if (index === 'first') {\n setTimeout(() => {\n const all = menuRef.current?.querySelectorAll('[role=\"menuitem\"]')\n if (all) {\n const firstIndex = all[0].getAttribute('data-index')\n select(Number(firstIndex))\n }\n })\n return\n }\n\n if (index === 'last') {\n setTimeout(() => {\n const all = menuRef.current?.querySelectorAll('[role=\"menuitem\"]')\n if (all) {\n const lastIndex = all.length - 1\n select(lastIndex)\n }\n })\n return\n }\n\n const el = menuRef.current?.querySelector(\n `[data-index=\"${index}\"]`\n ) as HTMLElement\n\n if (el) {\n setSelectedIndex(index)\n el?.focus()\n }\n }\n\n function onMenuKeydown(e: React.KeyboardEvent<HTMLDivElement>) {\n e.preventDefault()\n\n switch (e.key) {\n case 'ArrowDown':\n const next = selectedIndex + 1\n select(next)\n break\n case 'ArrowUp':\n const prev = selectedIndex - 1\n select(prev)\n break\n case 'Home':\n select('first')\n break\n case 'End':\n select('last')\n break\n default:\n break\n }\n }\n\n function openErrorOverlay() {\n setOpen(null)\n if (issueCount > 0) {\n setIsErrorOverlayOpen(true)\n }\n }\n\n function toggleErrorOverlay() {\n setIsErrorOverlayOpen((prev) => !prev)\n }\n\n function openRootMenu() {\n setOpen((prevOpen) => {\n if (prevOpen === null) select('first')\n return OVERLAYS.Root\n })\n }\n\n function onTriggerClick() {\n if (open === OVERLAYS.Root) {\n setOpen(null)\n } else {\n openRootMenu()\n setTimeout(() => {\n select('first')\n })\n }\n }\n\n function closeMenu() {\n // Only close when we were on `Root`,\n // otherwise it will close other overlays\n setOpen((prevOpen) => {\n if (prevOpen === OVERLAYS.Root) {\n return null\n }\n return prevOpen\n })\n }\n\n function handleHideDevtools() {\n setOpen(null)\n hide()\n }\n\n const [vertical, horizontal] = position.split('-', 2)\n const popover = { [vertical]: 'calc(100% + 8px)', [horizontal]: 0 }\n\n return (\n <Toast\n data-nextjs-toast\n style={\n {\n '--animate-out-duration-ms': `${MENU_DURATION_MS}ms`,\n '--animate-out-timing-function': MENU_CURVE,\n boxShadow: 'none',\n zIndex: 2147483647,\n [vertical]: `${INDICATOR_PADDING}px`,\n [horizontal]: `${INDICATOR_PADDING}px`,\n } as CSSProperties\n }\n >\n <Draggable\n padding={INDICATOR_PADDING}\n onDragStart={() => setOpen(null)}\n position={position}\n setPosition={(p) => {\n localStorage.setItem(STORAGE_KEY_POSITION, p)\n setPosition(p)\n }}\n >\n {/* Trigger */}\n <NextLogo\n ref={triggerRef}\n aria-haspopup=\"menu\"\n aria-expanded={isMenuOpen}\n aria-controls=\"nextjs-dev-tools-menu\"\n aria-label={`${isMenuOpen ? 'Close' : 'Open'} Next.js Dev Tools`}\n data-nextjs-dev-tools-button\n disabled={disabled}\n issueCount={issueCount}\n onTriggerClick={onTriggerClick}\n toggleErrorOverlay={toggleErrorOverlay}\n isDevBuilding={useIsDevBuilding()}\n isDevRendering={useIsDevRendering()}\n isBuildError={isBuildError}\n scale={scale}\n />\n </Draggable>\n\n {/* Route Info */}\n <RouteInfo\n isOpen={isRouteInfoOpen}\n close={openRootMenu}\n triggerRef={triggerRef}\n style={popover}\n routerType={routerType}\n routeType={isStaticRoute ? 'Static' : 'Dynamic'}\n />\n\n {/* Turbopack Info */}\n <TurbopackInfo\n isOpen={isTurbopackInfoOpen}\n close={openRootMenu}\n triggerRef={triggerRef}\n style={popover}\n />\n\n {/* Preferences */}\n <UserPreferences\n isOpen={isPreferencesOpen}\n close={openRootMenu}\n triggerRef={triggerRef}\n style={popover}\n hide={handleHideDevtools}\n setPosition={setPosition}\n position={position}\n scale={scale}\n setScale={setScale}\n />\n\n {/* Dropdown Menu */}\n {menuMounted && (\n <div\n ref={menuRef}\n id=\"nextjs-dev-tools-menu\"\n role=\"menu\"\n dir=\"ltr\"\n aria-orientation=\"vertical\"\n aria-label=\"Next.js Dev Tools Items\"\n tabIndex={-1}\n className=\"dev-tools-indicator-menu\"\n onKeyDown={onMenuKeydown}\n data-rendered={menuRendered}\n style={popover}\n >\n <Context.Provider\n value={{\n closeMenu,\n selectedIndex,\n setSelectedIndex,\n }}\n >\n <div className=\"dev-tools-indicator-inner\">\n {issueCount > 0 && (\n <MenuItem\n title={`${issueCount} ${issueCount === 1 ? 'issue' : 'issues'} found. Click to view details in the dev overlay.`}\n index={0}\n label=\"Issues\"\n value={<IssueCount>{issueCount}</IssueCount>}\n onClick={openErrorOverlay}\n />\n )}\n <MenuItem\n title={`Current route is ${isStaticRoute ? 'static' : 'dynamic'}.`}\n label=\"Route\"\n index={1}\n value={isStaticRoute ? 'Static' : 'Dynamic'}\n onClick={() => setOpen(OVERLAYS.Route)}\n data-nextjs-route-type={isStaticRoute ? 'static' : 'dynamic'}\n />\n {isTurbopack ? (\n <MenuItem\n title=\"Turbopack is enabled.\"\n label=\"Turbopack\"\n value=\"Enabled\"\n />\n ) : (\n <MenuItem\n index={2}\n title=\"Learn about Turbopack and how to enable it in your application.\"\n label=\"Try Turbopack\"\n value={<ChevronRight />}\n onClick={() => setOpen(OVERLAYS.Turbo)}\n />\n )}\n </div>\n\n <div className=\"dev-tools-indicator-footer\">\n <MenuItem\n data-preferences\n label=\"Preferences\"\n value={<GearIcon />}\n onClick={() => setOpen(OVERLAYS.Preferences)}\n index={isTurbopack ? 2 : 3}\n />\n </div>\n </Context.Provider>\n </div>\n )}\n </Toast>\n )\n}\n\nfunction ChevronRight() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n fill=\"#666\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M5.50011 1.93945L6.03044 2.46978L10.8537 7.293C11.2442 7.68353 11.2442 8.31669 10.8537 8.70722L6.03044 13.5304L5.50011 14.0608L4.43945 13.0001L4.96978 12.4698L9.43945 8.00011L4.96978 3.53044L4.43945 3.00011L5.50011 1.93945Z\"\n />\n </svg>\n )\n}\n\nfunction MenuItem({\n index,\n label,\n value,\n onClick,\n href,\n ...props\n}: {\n index?: number\n title?: string\n label: string\n value: React.ReactNode\n href?: string\n onClick?: () => void\n}) {\n const isInteractive =\n typeof onClick === 'function' || typeof href === 'string'\n const { closeMenu, selectedIndex, setSelectedIndex } = useContext(Context)\n const selected = selectedIndex === index\n\n function click() {\n if (isInteractive) {\n onClick?.()\n closeMenu()\n if (href) {\n window.open(href, '_blank', 'noopener, noreferrer')\n }\n }\n }\n\n return (\n <div\n className=\"dev-tools-indicator-item\"\n data-index={index}\n data-selected={selected}\n onClick={click}\n // Needs `onMouseMove` instead of enter to work together\n // with keyboard and mouse input\n onMouseMove={() => {\n if (isInteractive && index !== undefined && selectedIndex !== index) {\n setSelectedIndex(index)\n }\n }}\n onMouseLeave={() => setSelectedIndex(-1)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n click()\n }\n }}\n role={isInteractive ? 'menuitem' : undefined}\n tabIndex={selected ? 0 : -1}\n {...props}\n >\n <span className=\"dev-tools-indicator-label\">{label}</span>\n <span className=\"dev-tools-indicator-value\">{value}</span>\n </div>\n )\n}\n\nfunction IssueCount({ children }: { children: number }) {\n return (\n <span\n className=\"dev-tools-indicator-issue-count\"\n data-has-issues={children > 0}\n >\n <span className=\"dev-tools-indicator-issue-count-indicator\" />\n {children}\n </span>\n )\n}\n\n//////////////////////////////////////////////////////////////////////////////////////\n\nexport const DEV_TOOLS_INDICATOR_STYLES = `\n .dev-tools-indicator-menu {\n -webkit-font-smoothing: antialiased;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n background: var(--color-background-100);\n border: 1px solid var(--color-gray-alpha-400);\n background-clip: padding-box;\n box-shadow: var(--shadow-menu);\n border-radius: var(--rounded-xl);\n position: absolute;\n font-family: var(--font-stack-sans);\n z-index: 1000;\n overflow: hidden;\n opacity: 0;\n outline: 0;\n min-width: 248px;\n transition: opacity var(--animate-out-duration-ms)\n var(--animate-out-timing-function);\n\n &[data-rendered='true'] {\n opacity: 1;\n scale: 1;\n }\n }\n\n .dev-tools-indicator-inner {\n padding: 6px;\n width: 100%;\n }\n\n .dev-tools-indicator-item {\n display: flex;\n align-items: center;\n padding: 8px 6px;\n height: var(--size-36);\n border-radius: 6px;\n text-decoration: none !important;\n user-select: none;\n white-space: nowrap;\n\n svg {\n width: var(--size-16);\n height: var(--size-16);\n }\n\n &:focus-visible {\n outline: 0;\n }\n }\n\n .dev-tools-indicator-footer {\n background: var(--color-background-200);\n padding: 6px;\n border-top: 1px solid var(--color-gray-400);\n width: 100%;\n }\n\n .dev-tools-indicator-item[data-selected='true'] {\n cursor: pointer;\n background-color: var(--color-gray-200);\n }\n\n .dev-tools-indicator-label {\n font-size: var(--size-14);\n line-height: var(--size-20);\n color: var(--color-gray-1000);\n }\n\n .dev-tools-indicator-value {\n font-size: var(--size-14);\n line-height: var(--size-20);\n color: var(--color-gray-900);\n margin-left: auto;\n }\n\n .dev-tools-indicator-issue-count {\n --color-primary: var(--color-gray-800);\n --color-secondary: var(--color-gray-100);\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n gap: 8px;\n min-width: var(--size-40);\n height: var(--size-24);\n background: var(--color-background-100);\n border: 1px solid var(--color-gray-alpha-400);\n background-clip: padding-box;\n box-shadow: var(--shadow-small);\n padding: 2px;\n color: var(--color-gray-1000);\n border-radius: 128px;\n font-weight: 500;\n font-size: var(--size-13);\n font-variant-numeric: tabular-nums;\n\n &[data-has-issues='true'] {\n --color-primary: var(--color-red-800);\n --color-secondary: var(--color-red-100);\n }\n\n .dev-tools-indicator-issue-count-indicator {\n width: var(--size-8);\n height: var(--size-8);\n background: var(--color-primary);\n box-shadow: 0 0 0 2px var(--color-secondary);\n border-radius: 50%;\n }\n }\n\n .dev-tools-indicator-shortcut {\n display: flex;\n gap: 4px;\n\n kbd {\n width: var(--size-20);\n height: var(--size-20);\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: var(--rounded-md);\n border: 1px solid var(--color-gray-400);\n font-family: var(--font-stack-sans);\n background: var(--color-background-100);\n color: var(--color-gray-1000);\n text-align: center;\n font-size: var(--size-12);\n line-height: var(--size-16);\n }\n }\n\n .dev-tools-grabbing {\n cursor: grabbing;\n\n > * {\n pointer-events: none;\n }\n }\n`\n"],"names":["STORAGE_KEY_POSITION","useState","useEffect","useRef","createContext","useContext","Toast","NextLogo","useIsDevBuilding","useIsDevRendering","useDelayedRender","TurbopackInfo","RouteInfo","GearIcon","UserPreferences","MENU_CURVE","MENU_DURATION_MS","useClickOutside","useFocusTrap","getInitialPosition","Draggable","DevToolsIndicator","state","errorCount","isBuildError","setIsErrorOverlayOpen","props","isDevToolsIndicatorVisible","setIsDevToolsIndicatorVisible","DevToolsPopover","routerType","semver","versionInfo","installed","issueCount","isStaticRoute","staticIndicator","hide","fetch","method","isTurbopack","process","env","TURBOPACK","disabled","disableDevIndicator","Context","OVERLAYS","Root","Turbo","Route","Preferences","INDICATOR_PADDING","scale","setScale","menuRef","triggerRef","open","setOpen","position","setPosition","selectedIndex","setSelectedIndex","isMenuOpen","isTurbopackInfoOpen","isRouteInfoOpen","isPreferencesOpen","mounted","menuMounted","rendered","menuRendered","enterDelay","exitDelay","closeMenu","id","setTimeout","clearTimeout","select","index","all","current","querySelectorAll","firstIndex","getAttribute","Number","lastIndex","length","el","querySelector","focus","onMenuKeydown","e","preventDefault","key","next","prev","openErrorOverlay","toggleErrorOverlay","openRootMenu","prevOpen","onTriggerClick","handleHideDevtools","vertical","horizontal","split","popover","data-nextjs-toast","style","boxShadow","zIndex","padding","onDragStart","p","localStorage","setItem","ref","aria-haspopup","aria-expanded","aria-controls","aria-label","data-nextjs-dev-tools-button","isDevBuilding","isDevRendering","isOpen","close","routeType","div","role","dir","aria-orientation","tabIndex","className","onKeyDown","data-rendered","Provider","value","MenuItem","title","label","IssueCount","onClick","data-nextjs-route-type","ChevronRight","data-preferences","svg","xmlns","width","height","viewBox","fill","path","fillRule","clipRule","d","href","isInteractive","selected","click","window","data-index","data-selected","onMouseMove","undefined","onMouseLeave","span","children","data-has-issues","DEV_TOOLS_INDICATOR_STYLES"],"mappings":"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","ignoreList":[0]}
@@ -0,0 +1,243 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useRef } from 'react';
3
+ export function Draggable(param) {
4
+ let { children, padding, position: currentCorner, setPosition: setCurrentCorner, onDragStart } = param;
5
+ const { ref, animate, ...drag } = useDrag({
6
+ threshold: 5,
7
+ onDragStart,
8
+ onDragEnd,
9
+ onAnimationEnd
10
+ });
11
+ function onDragEnd(translation, velocity) {
12
+ const projectedPosition = {
13
+ x: translation.x + project(velocity.x),
14
+ y: translation.y + project(velocity.y)
15
+ };
16
+ const nearestCorner = getNearestCorner(projectedPosition);
17
+ animate(nearestCorner);
18
+ }
19
+ function onAnimationEnd(param) {
20
+ let { corner } = param;
21
+ // Unset drag translation
22
+ setTimeout(()=>{
23
+ var _ref_current;
24
+ (_ref_current = ref.current) == null ? void 0 : _ref_current.style.removeProperty('translate');
25
+ setCurrentCorner(corner);
26
+ });
27
+ }
28
+ function getNearestCorner(param) {
29
+ let { x, y } = param;
30
+ const allCorners = getCorners();
31
+ const distances = Object.entries(allCorners).map((param)=>{
32
+ let [key, translation] = param;
33
+ const distance = Math.sqrt((x - translation.x) ** 2 + (y - translation.y) ** 2);
34
+ return {
35
+ key,
36
+ distance
37
+ };
38
+ });
39
+ const min = Math.min(...distances.map((d)=>d.distance));
40
+ const nearest = distances.find((d)=>d.distance === min);
41
+ if (!nearest) {
42
+ // Safety fallback
43
+ return {
44
+ corner: currentCorner,
45
+ translation: allCorners[currentCorner]
46
+ };
47
+ }
48
+ return {
49
+ translation: allCorners[nearest.key],
50
+ corner: nearest.key
51
+ };
52
+ }
53
+ function getCorners() {
54
+ var _ref_current, _ref_current1;
55
+ const offset = padding * 2;
56
+ const triggerWidth = ((_ref_current = ref.current) == null ? void 0 : _ref_current.offsetWidth) || 0;
57
+ const triggerHeight = ((_ref_current1 = ref.current) == null ? void 0 : _ref_current1.offsetHeight) || 0;
58
+ function getAbsolutePosition(corner) {
59
+ const isRight = corner.includes('right');
60
+ const isBottom = corner.includes('bottom');
61
+ return {
62
+ x: isRight ? window.innerWidth - offset - triggerWidth : 0,
63
+ y: isBottom ? window.innerHeight - offset - triggerHeight : 0
64
+ };
65
+ }
66
+ const basePosition = getAbsolutePosition(currentCorner);
67
+ // Calculate all corner positions relative to the current corner
68
+ return {
69
+ 'top-left': {
70
+ x: 0 - basePosition.x,
71
+ y: 0 - basePosition.y
72
+ },
73
+ 'top-right': {
74
+ x: window.innerWidth - offset - triggerWidth - basePosition.x,
75
+ y: 0 - basePosition.y
76
+ },
77
+ 'bottom-left': {
78
+ x: 0 - basePosition.x,
79
+ y: window.innerHeight - offset - triggerHeight - basePosition.y
80
+ },
81
+ 'bottom-right': {
82
+ x: window.innerWidth - offset - triggerWidth - basePosition.x,
83
+ y: window.innerHeight - offset - triggerHeight - basePosition.y
84
+ }
85
+ };
86
+ }
87
+ return /*#__PURE__*/ _jsx("div", {
88
+ ref: ref,
89
+ ...drag,
90
+ style: {
91
+ touchAction: 'none'
92
+ },
93
+ children: children
94
+ });
95
+ }
96
+ export function useDrag(options) {
97
+ const ref = useRef(null);
98
+ const state = useRef('idle');
99
+ const origin = useRef({
100
+ x: 0,
101
+ y: 0
102
+ });
103
+ const translation = useRef({
104
+ x: 0,
105
+ y: 0
106
+ });
107
+ const lastTimestamp = useRef(0);
108
+ const velocities = useRef([]);
109
+ function set(position) {
110
+ if (ref.current) {
111
+ translation.current = position;
112
+ ref.current.style.translate = position.x + "px " + position.y + "px";
113
+ }
114
+ }
115
+ function animate(corner) {
116
+ const el = ref.current;
117
+ if (el === null) return;
118
+ function listener(e) {
119
+ if (e.propertyName === 'translate') {
120
+ options.onAnimationEnd == null ? void 0 : options.onAnimationEnd.call(options, corner);
121
+ translation.current = {
122
+ x: 0,
123
+ y: 0
124
+ };
125
+ el.style.transition = '';
126
+ el.removeEventListener('transitionend', listener);
127
+ }
128
+ }
129
+ // Generated from https://www.easing.dev/spring
130
+ el.style.transition = 'translate 491.22ms var(--timing-bounce)';
131
+ el.addEventListener('transitionend', listener);
132
+ set(corner.translation);
133
+ }
134
+ function onClick(e) {
135
+ if (state.current === 'drag-end') {
136
+ var _ref_current;
137
+ e.preventDefault();
138
+ e.stopPropagation();
139
+ state.current = 'idle';
140
+ (_ref_current = ref.current) == null ? void 0 : _ref_current.removeEventListener('click', onClick);
141
+ }
142
+ }
143
+ function onPointerDown(e) {
144
+ var _ref_current;
145
+ origin.current = {
146
+ x: e.clientX,
147
+ y: e.clientY
148
+ };
149
+ state.current = 'press';
150
+ window.addEventListener('pointermove', onPointerMove);
151
+ window.addEventListener('pointerup', onPointerUp);
152
+ (_ref_current = ref.current) == null ? void 0 : _ref_current.addEventListener('click', onClick);
153
+ }
154
+ function onPointerMove(e) {
155
+ if (state.current === 'press') {
156
+ const dx = e.clientX - origin.current.x;
157
+ const dy = e.clientY - origin.current.y;
158
+ const distance = Math.sqrt(dx * dx + dy * dy);
159
+ if (distance >= options.threshold) {
160
+ var _ref_current, _ref_current1;
161
+ state.current = 'drag';
162
+ (_ref_current = ref.current) == null ? void 0 : _ref_current.setPointerCapture(e.pointerId);
163
+ (_ref_current1 = ref.current) == null ? void 0 : _ref_current1.classList.add('dev-tools-grabbing');
164
+ options.onDragStart == null ? void 0 : options.onDragStart.call(options);
165
+ }
166
+ }
167
+ if (state.current !== 'drag') return;
168
+ const currentPosition = {
169
+ x: e.clientX,
170
+ y: e.clientY
171
+ };
172
+ const dx = currentPosition.x - origin.current.x;
173
+ const dy = currentPosition.y - origin.current.y;
174
+ origin.current = currentPosition;
175
+ const newTranslation = {
176
+ x: translation.current.x + dx,
177
+ y: translation.current.y + dy
178
+ };
179
+ set(newTranslation);
180
+ // Keep a history of recent positions for velocity calculation
181
+ // Only store points that are at least 10ms apart to avoid too many samples
182
+ const now = Date.now();
183
+ const shouldAddToHistory = now - lastTimestamp.current >= 10;
184
+ if (shouldAddToHistory) {
185
+ velocities.current = [
186
+ ...velocities.current.slice(-5),
187
+ {
188
+ position: currentPosition,
189
+ timestamp: now
190
+ }
191
+ ];
192
+ }
193
+ lastTimestamp.current = now;
194
+ options.onDrag == null ? void 0 : options.onDrag.call(options, translation.current);
195
+ }
196
+ function onPointerUp(e) {
197
+ var _ref_current, _ref_current1;
198
+ state.current = state.current === 'drag' ? 'drag-end' : 'idle';
199
+ window.removeEventListener('pointermove', onPointerMove);
200
+ window.removeEventListener('pointerup', onPointerUp);
201
+ const velocity = calculateVelocity(velocities.current);
202
+ velocities.current = [];
203
+ (_ref_current = ref.current) == null ? void 0 : _ref_current.classList.remove('dev-tools-grabbing');
204
+ (_ref_current1 = ref.current) == null ? void 0 : _ref_current1.releasePointerCapture(e.pointerId);
205
+ options.onDragEnd == null ? void 0 : options.onDragEnd.call(options, translation.current, velocity);
206
+ }
207
+ return {
208
+ ref,
209
+ onPointerDown,
210
+ animate
211
+ };
212
+ }
213
+ function calculateVelocity(history) {
214
+ if (history.length < 2) {
215
+ return {
216
+ x: 0,
217
+ y: 0
218
+ };
219
+ }
220
+ const oldestPoint = history[0];
221
+ const latestPoint = history[history.length - 1];
222
+ const timeDelta = latestPoint.timestamp - oldestPoint.timestamp;
223
+ if (timeDelta === 0) {
224
+ return {
225
+ x: 0,
226
+ y: 0
227
+ };
228
+ }
229
+ // Calculate pixels per millisecond
230
+ const velocityX = (latestPoint.position.x - oldestPoint.position.x) / timeDelta;
231
+ const velocityY = (latestPoint.position.y - oldestPoint.position.y) / timeDelta;
232
+ // Convert to pixels per second for more intuitive values
233
+ return {
234
+ x: velocityX * 1000,
235
+ y: velocityY * 1000
236
+ };
237
+ }
238
+ function project(initialVelocity, decelerationRate) {
239
+ if (decelerationRate === void 0) decelerationRate = 0.999;
240
+ return initialVelocity / 1000 * decelerationRate / (1 - decelerationRate);
241
+ }
242
+
243
+ //# sourceMappingURL=draggable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../src/client/components/react-dev-overlay/ui/components/errors/dev-tools-indicator/draggable.tsx"],"sourcesContent":["import { useRef } from 'react'\n\ninterface Point {\n x: number\n y: number\n}\n\ntype Corners = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\n\ninterface Corner {\n corner: Corners\n translation: Point\n}\n\nexport function Draggable({\n children,\n padding,\n position: currentCorner,\n setPosition: setCurrentCorner,\n onDragStart,\n}: {\n children: React.ReactElement\n position: Corners\n padding: number\n setPosition: (position: Corners) => void\n onDragStart?: () => void\n}) {\n const { ref, animate, ...drag } = useDrag({\n threshold: 5,\n onDragStart,\n onDragEnd,\n onAnimationEnd,\n })\n\n function onDragEnd(translation: Point, velocity: Point) {\n const projectedPosition = {\n x: translation.x + project(velocity.x),\n y: translation.y + project(velocity.y),\n }\n const nearestCorner = getNearestCorner(projectedPosition)\n animate(nearestCorner)\n }\n\n function onAnimationEnd({ corner }: Corner) {\n // Unset drag translation\n setTimeout(() => {\n ref.current?.style.removeProperty('translate')\n setCurrentCorner(corner)\n })\n }\n\n function getNearestCorner({ x, y }: Point): Corner {\n const allCorners = getCorners()\n const distances = Object.entries(allCorners).map(([key, translation]) => {\n const distance = Math.sqrt(\n (x - translation.x) ** 2 + (y - translation.y) ** 2\n )\n return { key, distance }\n })\n const min = Math.min(...distances.map((d) => d.distance))\n const nearest = distances.find((d) => d.distance === min)\n if (!nearest) {\n // Safety fallback\n return { corner: currentCorner, translation: allCorners[currentCorner] }\n }\n return {\n translation: allCorners[nearest.key as Corners],\n corner: nearest.key as Corners,\n }\n }\n\n function getCorners(): Record<Corners, Point> {\n const offset = padding * 2\n const triggerWidth = ref.current?.offsetWidth || 0\n const triggerHeight = ref.current?.offsetHeight || 0\n\n function getAbsolutePosition(corner: Corners) {\n const isRight = corner.includes('right')\n const isBottom = corner.includes('bottom')\n\n return {\n x: isRight ? window.innerWidth - offset - triggerWidth : 0,\n y: isBottom ? window.innerHeight - offset - triggerHeight : 0,\n }\n }\n\n const basePosition = getAbsolutePosition(currentCorner)\n\n // Calculate all corner positions relative to the current corner\n return {\n 'top-left': {\n x: 0 - basePosition.x,\n y: 0 - basePosition.y,\n },\n 'top-right': {\n x: window.innerWidth - offset - triggerWidth - basePosition.x,\n y: 0 - basePosition.y,\n },\n 'bottom-left': {\n x: 0 - basePosition.x,\n y: window.innerHeight - offset - triggerHeight - basePosition.y,\n },\n 'bottom-right': {\n x: window.innerWidth - offset - triggerWidth - basePosition.x,\n y: window.innerHeight - offset - triggerHeight - basePosition.y,\n },\n }\n }\n\n return (\n <div ref={ref} {...drag} style={{ touchAction: 'none' }}>\n {children}\n </div>\n )\n}\n\ninterface UseDragOptions {\n onDragStart?: () => void\n onDrag?: (translation: Point) => void\n onDragEnd?: (translation: Point, velocity: Point) => void\n onAnimationEnd?: (corner: Corner) => void\n threshold: number // Minimum movement before drag starts\n}\n\ninterface Velocity {\n position: Point\n timestamp: number\n}\n\nexport function useDrag(options: UseDragOptions) {\n const ref = useRef<HTMLDivElement>(null)\n const state = useRef<'idle' | 'press' | 'drag' | 'drag-end'>('idle')\n\n const origin = useRef<Point>({ x: 0, y: 0 })\n const translation = useRef<Point>({ x: 0, y: 0 })\n const lastTimestamp = useRef(0)\n const velocities = useRef<Velocity[]>([])\n\n function set(position: Point) {\n if (ref.current) {\n translation.current = position\n ref.current.style.translate = `${position.x}px ${position.y}px`\n }\n }\n\n function animate(corner: Corner) {\n const el = ref.current\n if (el === null) return\n\n function listener(e: TransitionEvent) {\n if (e.propertyName === 'translate') {\n options.onAnimationEnd?.(corner)\n translation.current = { x: 0, y: 0 }\n el!.style.transition = ''\n el!.removeEventListener('transitionend', listener)\n }\n }\n\n // Generated from https://www.easing.dev/spring\n el.style.transition = 'translate 491.22ms var(--timing-bounce)'\n el.addEventListener('transitionend', listener)\n set(corner.translation)\n }\n\n function onClick(e: MouseEvent) {\n if (state.current === 'drag-end') {\n e.preventDefault()\n e.stopPropagation()\n state.current = 'idle'\n ref.current?.removeEventListener('click', onClick)\n }\n }\n\n function onPointerDown(e: React.PointerEvent) {\n origin.current = { x: e.clientX, y: e.clientY }\n state.current = 'press'\n window.addEventListener('pointermove', onPointerMove)\n window.addEventListener('pointerup', onPointerUp)\n ref.current?.addEventListener('click', onClick)\n }\n\n function onPointerMove(e: PointerEvent) {\n if (state.current === 'press') {\n const dx = e.clientX - origin.current.x\n const dy = e.clientY - origin.current.y\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n if (distance >= options.threshold) {\n state.current = 'drag'\n ref.current?.setPointerCapture(e.pointerId)\n ref.current?.classList.add('dev-tools-grabbing')\n options.onDragStart?.()\n }\n }\n\n if (state.current !== 'drag') return\n\n const currentPosition = { x: e.clientX, y: e.clientY }\n\n const dx = currentPosition.x - origin.current.x\n const dy = currentPosition.y - origin.current.y\n origin.current = currentPosition\n\n const newTranslation = {\n x: translation.current.x + dx,\n y: translation.current.y + dy,\n }\n\n set(newTranslation)\n\n // Keep a history of recent positions for velocity calculation\n // Only store points that are at least 10ms apart to avoid too many samples\n const now = Date.now()\n const shouldAddToHistory = now - lastTimestamp.current >= 10\n if (shouldAddToHistory) {\n velocities.current = [\n ...velocities.current.slice(-5),\n { position: currentPosition, timestamp: now },\n ]\n }\n\n lastTimestamp.current = now\n options.onDrag?.(translation.current)\n }\n\n function onPointerUp(e: PointerEvent) {\n state.current = state.current === 'drag' ? 'drag-end' : 'idle'\n\n window.removeEventListener('pointermove', onPointerMove)\n window.removeEventListener('pointerup', onPointerUp)\n\n const velocity = calculateVelocity(velocities.current)\n velocities.current = []\n\n ref.current?.classList.remove('dev-tools-grabbing')\n ref.current?.releasePointerCapture(e.pointerId)\n options.onDragEnd?.(translation.current, velocity)\n }\n\n return {\n ref,\n onPointerDown,\n animate,\n }\n}\n\nfunction calculateVelocity(\n history: Array<{ position: Point; timestamp: number }>\n): Point {\n if (history.length < 2) {\n return { x: 0, y: 0 }\n }\n\n const oldestPoint = history[0]\n const latestPoint = history[history.length - 1]\n\n const timeDelta = latestPoint.timestamp - oldestPoint.timestamp\n\n if (timeDelta === 0) {\n return { x: 0, y: 0 }\n }\n\n // Calculate pixels per millisecond\n const velocityX =\n (latestPoint.position.x - oldestPoint.position.x) / timeDelta\n const velocityY =\n (latestPoint.position.y - oldestPoint.position.y) / timeDelta\n\n // Convert to pixels per second for more intuitive values\n return {\n x: velocityX * 1000,\n y: velocityY * 1000,\n }\n}\n\nfunction project(initialVelocity: number, decelerationRate = 0.999) {\n return ((initialVelocity / 1000) * decelerationRate) / (1 - decelerationRate)\n}\n"],"names":["useRef","Draggable","children","padding","position","currentCorner","setPosition","setCurrentCorner","onDragStart","ref","animate","drag","useDrag","threshold","onDragEnd","onAnimationEnd","translation","velocity","projectedPosition","x","project","y","nearestCorner","getNearestCorner","corner","setTimeout","current","style","removeProperty","allCorners","getCorners","distances","Object","entries","map","key","distance","Math","sqrt","min","d","nearest","find","offset","triggerWidth","offsetWidth","triggerHeight","offsetHeight","getAbsolutePosition","isRight","includes","isBottom","window","innerWidth","innerHeight","basePosition","div","touchAction","options","state","origin","lastTimestamp","velocities","set","translate","el","listener","e","propertyName","transition","removeEventListener","addEventListener","onClick","preventDefault","stopPropagation","onPointerDown","clientX","clientY","onPointerMove","onPointerUp","dx","dy","setPointerCapture","pointerId","classList","add","currentPosition","newTranslation","now","Date","shouldAddToHistory","slice","timestamp","onDrag","calculateVelocity","remove","releasePointerCapture","history","length","oldestPoint","latestPoint","timeDelta","velocityX","velocityY","initialVelocity","decelerationRate"],"mappings":"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","ignoreList":[0]}
@@ -16,6 +16,6 @@ export const Fader = /*#__PURE__*/ forwardRef(function Fader(param, ref) {
16
16
  }
17
17
  });
18
18
  });
19
- export const FADER_STYLES = '\n .nextjs-scroll-fader {\n --blur: 1px;\n --stop: 25%;\n --height: 150px;\n --color-bg: var(--color-background-100);\n position: absolute;\n pointer-events: none;\n user-select: none;\n width: 100%;\n height: var(--height);\n left: 0;\n backdrop-filter: blur(var(--blur));\n\n &[data-side="top"] {\n top: 0;\n background: linear-gradient(to top, transparent, var(--color-bg));\n mask-image: linear-gradient(to bottom, var(--color-bg) var(--stop), transparent);\n }\n }\n\n';
19
+ export const FADER_STYLES = '\n .nextjs-scroll-fader {\n --blur: 1px;\n --stop: 25%;\n --height: 150px;\n --color-bg: var(--color-background-100);\n position: absolute;\n pointer-events: none;\n user-select: none;\n width: 100%;\n height: var(--height);\n left: 0;\n backdrop-filter: blur(var(--blur));\n\n &[data-side="top"] {\n top: 0;\n background: linear-gradient(to top, transparent, var(--color-bg));\n mask-image: linear-gradient(to bottom, var(--color-bg) var(--stop), transparent);\n }\n }\n';
20
20
 
21
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/client/components/react-dev-overlay/ui/components/fader/index.tsx"],"sourcesContent":["import { type CSSProperties, type Ref, forwardRef } from 'react'\n\nexport const Fader = forwardRef(function Fader(\n {\n stop,\n blur,\n side,\n style,\n height,\n }: {\n stop?: string\n blur?: string\n height?: number\n side: 'top' | 'bottom' | 'left' | 'right'\n className?: string\n style?: CSSProperties\n },\n ref: Ref<HTMLDivElement>\n) {\n return (\n <div\n ref={ref}\n aria-hidden\n data-nextjs-scroll-fader\n className=\"nextjs-scroll-fader\"\n data-side={side}\n style={\n {\n '--stop': stop,\n '--blur': blur,\n '--height': `${height}px`,\n ...style,\n } as React.CSSProperties\n }\n />\n )\n})\n\nexport const FADER_STYLES = `\n .nextjs-scroll-fader {\n --blur: 1px;\n --stop: 25%;\n --height: 150px;\n --color-bg: var(--color-background-100);\n position: absolute;\n pointer-events: none;\n user-select: none;\n width: 100%;\n height: var(--height);\n left: 0;\n backdrop-filter: blur(var(--blur));\n\n &[data-side=\"top\"] {\n top: 0;\n background: linear-gradient(to top, transparent, var(--color-bg));\n mask-image: linear-gradient(to bottom, var(--color-bg) var(--stop), transparent);\n }\n }\n\n`\n"],"names":["forwardRef","Fader","ref","stop","blur","side","style","height","div","aria-hidden","data-nextjs-scroll-fader","className","data-side","FADER_STYLES"],"mappings":";AAAA,SAAuCA,UAAU,QAAQ,QAAO;AAEhE,OAAO,MAAMC,sBAAQD,WAAW,SAASC,MACvC,KAaC,EACDC,GAAwB;IAdxB,IAAA,EACEC,IAAI,EACJC,IAAI,EACJC,IAAI,EACJC,KAAK,EACLC,MAAM,EAQP,GAbD;IAgBA,qBACE,KAACC;QACCN,KAAKA;QACLO,aAAW;QACXC,0BAAwB;QACxBC,WAAU;QACVC,aAAWP;QACXC,OACE;YACE,UAAUH;YACV,UAAUC;YACV,YAAY,AAAC,KAAEG,SAAO;YACtB,GAAGD,KAAK;QACV;;AAIR,GAAE;AAEF,OAAO,MAAMO,eAAgB,ohBAqB5B","ignoreList":[0]}
1
+ {"version":3,"sources":["../../../../../../../src/client/components/react-dev-overlay/ui/components/fader/index.tsx"],"sourcesContent":["import { type CSSProperties, type Ref, forwardRef } from 'react'\n\nexport const Fader = forwardRef(function Fader(\n {\n stop,\n blur,\n side,\n style,\n height,\n }: {\n stop?: string\n blur?: string\n height?: number\n side: 'top' | 'bottom' | 'left' | 'right'\n className?: string\n style?: CSSProperties\n },\n ref: Ref<HTMLDivElement>\n) {\n return (\n <div\n ref={ref}\n aria-hidden\n data-nextjs-scroll-fader\n className=\"nextjs-scroll-fader\"\n data-side={side}\n style={\n {\n '--stop': stop,\n '--blur': blur,\n '--height': `${height}px`,\n ...style,\n } as React.CSSProperties\n }\n />\n )\n})\n\nexport const FADER_STYLES = `\n .nextjs-scroll-fader {\n --blur: 1px;\n --stop: 25%;\n --height: 150px;\n --color-bg: var(--color-background-100);\n position: absolute;\n pointer-events: none;\n user-select: none;\n width: 100%;\n height: var(--height);\n left: 0;\n backdrop-filter: blur(var(--blur));\n\n &[data-side=\"top\"] {\n top: 0;\n background: linear-gradient(to top, transparent, var(--color-bg));\n mask-image: linear-gradient(to bottom, var(--color-bg) var(--stop), transparent);\n }\n }\n`\n"],"names":["forwardRef","Fader","ref","stop","blur","side","style","height","div","aria-hidden","data-nextjs-scroll-fader","className","data-side","FADER_STYLES"],"mappings":";AAAA,SAAuCA,UAAU,QAAQ,QAAO;AAEhE,OAAO,MAAMC,sBAAQD,WAAW,SAASC,MACvC,KAaC,EACDC,GAAwB;IAdxB,IAAA,EACEC,IAAI,EACJC,IAAI,EACJC,IAAI,EACJC,KAAK,EACLC,MAAM,EAQP,GAbD;IAgBA,qBACE,KAACC;QACCN,KAAKA;QACLO,aAAW;QACXC,0BAAwB;QACxBC,WAAU;QACVC,aAAWP;QACXC,OACE;YACE,UAAUH;YACV,UAAUC;YACV,YAAY,AAAC,KAAEG,SAAO;YACtB,GAAGD,KAAK;QACV;;AAIR,GAAE;AAEF,OAAO,MAAMO,eAAgB,khBAoB5B","ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- const styles = "\n .nextjs-toast {\n position: fixed;\n bottom: 16px;\n left: 16px;\n max-width: 420px;\n z-index: 9000;\n box-shadow: 0px 16px 32px\n rgba(0, 0, 0, 0.25);\n }\n\n @media (max-width: 440px) {\n .nextjs-toast {\n max-width: 90vw;\n left: 5vw;\n }\n }\n\n .nextjs-toast-errors-parent {\n padding: 16px;\n border-radius: var(--rounded-4xl);\n font-weight: 500;\n color: var(--color-ansi-bright-white);\n background-color: var(--color-ansi-red);\n }\n";
1
+ const styles = "\n .nextjs-toast {\n position: fixed;\n max-width: 420px;\n z-index: 9000;\n box-shadow: 0px 16px 32px\n rgba(0, 0, 0, 0.25);\n }\n\n .nextjs-toast-errors-parent {\n padding: 16px;\n border-radius: var(--rounded-4xl);\n font-weight: 500;\n color: var(--color-ansi-bright-white);\n background-color: var(--color-ansi-red);\n }\n";
2
2
  export { styles };
3
3
 
4
4
  //# sourceMappingURL=styles.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/client/components/react-dev-overlay/ui/components/toast/styles.ts"],"sourcesContent":["const styles = `\n .nextjs-toast {\n position: fixed;\n bottom: 16px;\n left: 16px;\n max-width: 420px;\n z-index: 9000;\n box-shadow: 0px 16px 32px\n rgba(0, 0, 0, 0.25);\n }\n\n @media (max-width: 440px) {\n .nextjs-toast {\n max-width: 90vw;\n left: 5vw;\n }\n }\n\n .nextjs-toast-errors-parent {\n padding: 16px;\n border-radius: var(--rounded-4xl);\n font-weight: 500;\n color: var(--color-ansi-bright-white);\n background-color: var(--color-ansi-red);\n }\n`\n\nexport { styles }\n"],"names":["styles"],"mappings":"AAAA,MAAMA,SAAU;AA2BhB,SAASA,MAAM,GAAE","ignoreList":[0]}
1
+ {"version":3,"sources":["../../../../../../../src/client/components/react-dev-overlay/ui/components/toast/styles.ts"],"sourcesContent":["const styles = `\n .nextjs-toast {\n position: fixed;\n max-width: 420px;\n z-index: 9000;\n box-shadow: 0px 16px 32px\n rgba(0, 0, 0, 0.25);\n }\n\n .nextjs-toast-errors-parent {\n padding: 16px;\n border-radius: var(--rounded-4xl);\n font-weight: 500;\n color: var(--color-ansi-bright-white);\n background-color: var(--color-ansi-red);\n }\n`\n\nexport { styles }\n"],"names":["styles"],"mappings":"AAAA,MAAMA,SAAU;AAkBhB,SAASA,MAAM,GAAE","ignoreList":[0]}