@pro-laico/payload-dev-tools 0.1.0 → 0.2.0
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.
- package/dist/components/DevToolbar.d.ts.map +1 -1
- package/dist/components/DevToolbar.js +7 -3
- package/dist/components/DevToolbar.js.map +1 -1
- package/dist/components/DevToolbarClient.d.ts.map +1 -1
- package/dist/components/DevToolbarClient.js +91 -1
- package/dist/components/DevToolbarClient.js.map +1 -1
- package/dist/components/styles.d.ts +1 -1
- package/dist/components/styles.d.ts.map +1 -1
- package/dist/components/styles.js +13 -0
- package/dist/components/styles.js.map +1 -1
- package/dist/endpoints/activateIconSet.d.ts.map +1 -1
- package/dist/endpoints/activateIconSet.js +2 -0
- package/dist/endpoints/activateIconSet.js.map +1 -1
- package/dist/endpoints/draft.d.ts +12 -0
- package/dist/endpoints/draft.d.ts.map +1 -0
- package/dist/endpoints/draft.js +66 -0
- package/dist/endpoints/draft.js.map +1 -0
- package/dist/lib/snapshot.d.ts +15 -0
- package/dist/lib/snapshot.d.ts.map +1 -1
- package/dist/lib/snapshot.js +16 -1
- package/dist/lib/snapshot.js.map +1 -1
- package/dist/next/client.d.ts +5 -0
- package/dist/next/client.d.ts.map +1 -1
- package/dist/next/client.js +80 -0
- package/dist/next/client.js.map +1 -1
- package/dist/next/createDevPage.d.ts.map +1 -1
- package/dist/next/createDevPage.js +10 -1
- package/dist/next/createDevPage.js.map +1 -1
- package/dist/next/pageStyles.d.ts +1 -1
- package/dist/next/pageStyles.d.ts.map +1 -1
- package/dist/next/pageStyles.js +17 -0
- package/dist/next/pageStyles.js.map +1 -1
- package/dist/next/revalidatePanel.d.ts +81 -0
- package/dist/next/revalidatePanel.d.ts.map +1 -0
- package/dist/next/revalidatePanel.js +1094 -0
- package/dist/next/revalidatePanel.js.map +1 -0
- package/dist/next/views.d.ts +6 -0
- package/dist/next/views.d.ts.map +1 -1
- package/dist/next/views.js +16 -0
- package/dist/next/views.js.map +1 -1
- package/dist/plugin.d.ts +1 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +3 -0
- package/dist/plugin.js.map +1 -1
- package/package.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevToolbar.d.ts","sourceRoot":"","sources":["../../src/components/DevToolbar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DevToolbar.d.ts","sourceRoot":"","sources":["../../src/components/DevToolbar.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAc,MAAM,YAAY,CAAA;AAClD,OAAO,EAAE,KAAK,OAAO,EAAoB,MAAM,oBAAoB,CAAA;AAGnE,MAAM,MAAM,eAAe,GAAG;IAC5B;;mCAE+B;IAC/B,KAAK,CAAC,EAAE,IAAI,EAAE,CAAA;IACd;8BAC0B;IAC1B,KAAK,CAAC,EAAE,OAAO,EAAE,CAAA;IACjB;oEACgE;IAChE,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAU,EAAE,KAAU,EAAE,OAAO,EAAE,EAAE,eAAe,sCAe9E"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Suspense } from "react";
|
|
2
3
|
import { toTestMeta } from "../harness.js";
|
|
3
4
|
import { DevToolbarClient } from "./DevToolbarClient.js";
|
|
4
5
|
import { PDT_CSS } from "./styles.js";
|
|
@@ -21,9 +22,12 @@ import { PDT_CSS } from "./styles.js";
|
|
|
21
22
|
__html: PDT_CSS
|
|
22
23
|
}
|
|
23
24
|
}),
|
|
24
|
-
/*#__PURE__*/ _jsx(
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
/*#__PURE__*/ _jsx(Suspense, {
|
|
26
|
+
fallback: null,
|
|
27
|
+
children: /*#__PURE__*/ _jsx(DevToolbarClient, {
|
|
28
|
+
tests: toTestMeta(tests),
|
|
29
|
+
links: links
|
|
30
|
+
})
|
|
27
31
|
})
|
|
28
32
|
]
|
|
29
33
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/DevToolbar.tsx"],"sourcesContent":["import { type Test, toTestMeta } from '../harness'\nimport { type DevLink, DevToolbarClient } from './DevToolbarClient'\nimport { PDT_CSS } from './styles'\n\nexport type DevToolbarProps = {\n /** Component tests (from `defineTest`) — the Tests view opens each test's page\n * (`/dev/tests/<key>`) and toggles which version it shows. Render fns stay server-side; the\n * client only sees labels. */\n tests?: Test[]\n /** Extra rows for the Pages view (your own labs, external dashboards…) — the dev pages and the\n * admin are built in. */\n links?: DevLink[]\n /** Force the toolbar on/off. Defaults to `NODE_ENV === 'development'` — it renders nothing in\n * production, so no conditional is needed at the call site. */\n enabled?: boolean\n}\n\n/**\n * The floating dev toolbar — the one controller for the dev experience, one line of wiring:\n *\n * <DevToolbar /> // in your (frontend) layout, inside <body>\n * <DevToolbar tests={[heroTest]} /> // optionally, with the test harness\n *\n * It injects its own stylesheet (no Tailwind, no CSS import) and feeds itself from\n * `GET /api/dev`. Because it lives in the layout, the panel survives client-side navigation —\n * browse `/dev` → icons → fonts → tests without it closing. The dev pages themselves render\n * content only; navigation and version-switching live here.\n */\nexport function DevToolbar({ tests = [], links = [], enabled }: DevToolbarProps) {\n if (!(enabled ?? process.env.NODE_ENV === 'development')) return null\n\n return (\n <>\n {/* dangerouslySetInnerHTML: our own static CSS — React would escape selector characters as a text child */}\n <style dangerouslySetInnerHTML={{ __html: PDT_CSS }} />\n <DevToolbarClient tests={toTestMeta(tests)} links={links} />\n </>\n )\n}\n"],"names":["toTestMeta","DevToolbarClient","PDT_CSS","DevToolbar","tests","links","enabled","process","env","NODE_ENV","style","dangerouslySetInnerHTML","__html"],"mappings":";AAAA,
|
|
1
|
+
{"version":3,"sources":["../../src/components/DevToolbar.tsx"],"sourcesContent":["import { Suspense } from 'react'\nimport { type Test, toTestMeta } from '../harness'\nimport { type DevLink, DevToolbarClient } from './DevToolbarClient'\nimport { PDT_CSS } from './styles'\n\nexport type DevToolbarProps = {\n /** Component tests (from `defineTest`) — the Tests view opens each test's page\n * (`/dev/tests/<key>`) and toggles which version it shows. Render fns stay server-side; the\n * client only sees labels. */\n tests?: Test[]\n /** Extra rows for the Pages view (your own labs, external dashboards…) — the dev pages and the\n * admin are built in. */\n links?: DevLink[]\n /** Force the toolbar on/off. Defaults to `NODE_ENV === 'development'` — it renders nothing in\n * production, so no conditional is needed at the call site. */\n enabled?: boolean\n}\n\n/**\n * The floating dev toolbar — the one controller for the dev experience, one line of wiring:\n *\n * <DevToolbar /> // in your (frontend) layout, inside <body>\n * <DevToolbar tests={[heroTest]} /> // optionally, with the test harness\n *\n * It injects its own stylesheet (no Tailwind, no CSS import) and feeds itself from\n * `GET /api/dev`. Because it lives in the layout, the panel survives client-side navigation —\n * browse `/dev` → icons → fonts → tests without it closing. The dev pages themselves render\n * content only; navigation and version-switching live here.\n */\nexport function DevToolbar({ tests = [], links = [], enabled }: DevToolbarProps) {\n if (!(enabled ?? process.env.NODE_ENV === 'development')) return null\n\n return (\n <>\n {/* dangerouslySetInnerHTML: our own static CSS — React would escape selector characters as a text child */}\n <style dangerouslySetInnerHTML={{ __html: PDT_CSS }} />\n {/* Suspense: the client panel reads the pathname (request-bound), which under Cache\n Components (cacheComponents: true) must stream inside a boundary — without it every\n page hosting the toolbar errors as a blocking route. */}\n <Suspense fallback={null}>\n <DevToolbarClient tests={toTestMeta(tests)} links={links} />\n </Suspense>\n </>\n )\n}\n"],"names":["Suspense","toTestMeta","DevToolbarClient","PDT_CSS","DevToolbar","tests","links","enabled","process","env","NODE_ENV","style","dangerouslySetInnerHTML","__html","fallback"],"mappings":";AAAA,SAASA,QAAQ,QAAQ,QAAO;AAChC,SAAoBC,UAAU,QAAQ,gBAAY;AAClD,SAAuBC,gBAAgB,QAAQ,wBAAoB;AACnE,SAASC,OAAO,QAAQ,cAAU;AAelC;;;;;;;;;;CAUC,GACD,OAAO,SAASC,WAAW,EAAEC,QAAQ,EAAE,EAAEC,QAAQ,EAAE,EAAEC,OAAO,EAAmB;IAC7E,IAAI,CAAEA,CAAAA,WAAWC,QAAQC,GAAG,CAACC,QAAQ,KAAK,aAAY,GAAI,OAAO;IAEjE,qBACE;;0BAEE,KAACC;gBAAMC,yBAAyB;oBAAEC,QAAQV;gBAAQ;;0BAIlD,KAACH;gBAASc,UAAU;0BAClB,cAAA,KAACZ;oBAAiBG,OAAOJ,WAAWI;oBAAQC,OAAOA;;;;;AAI3D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DevToolbarClient.d.ts","sourceRoot":"","sources":["../../src/components/DevToolbarClient.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAG1C,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAiDrD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"DevToolbarClient.d.ts","sourceRoot":"","sources":["../../src/components/DevToolbarClient.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAG1C,MAAM,MAAM,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAiDrD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE,sCAsjBzF"}
|
|
@@ -93,6 +93,8 @@ const readSettings = ()=>{
|
|
|
93
93
|
});
|
|
94
94
|
const [snapshot, setSnapshot] = useState(null);
|
|
95
95
|
const [snapshotError, setSnapshotError] = useState(false);
|
|
96
|
+
const [draft, setDraft] = useState(null);
|
|
97
|
+
const [draftBusy, setDraftBusy] = useState(false);
|
|
96
98
|
const [seeding, setSeeding] = useState(false);
|
|
97
99
|
const [confirming, setConfirming] = useState(false);
|
|
98
100
|
const [seedError, setSeedError] = useState(null);
|
|
@@ -131,6 +133,36 @@ const readSettings = ()=>{
|
|
|
131
133
|
snapshotError,
|
|
132
134
|
fetchSnapshot
|
|
133
135
|
]);
|
|
136
|
+
// Draft mode is server-held state (`__prerender_bypass` is httpOnly), so re-read it on every
|
|
137
|
+
// open — a preview route or another tab may have flipped it. null = endpoint unavailable, row hidden.
|
|
138
|
+
useEffect(()=>{
|
|
139
|
+
if (!open) return;
|
|
140
|
+
void fetch('/api/dev/draft', {
|
|
141
|
+
credentials: 'include'
|
|
142
|
+
}).then(async (res)=>res.ok ? setDraft((await res.json()).enabled) : setDraft(null)).catch(()=>setDraft(null));
|
|
143
|
+
}, [
|
|
144
|
+
open
|
|
145
|
+
]);
|
|
146
|
+
const toggleDraft = useCallback(async ()=>{
|
|
147
|
+
if (draft === null || draftBusy) return;
|
|
148
|
+
setDraftBusy(true);
|
|
149
|
+
try {
|
|
150
|
+
const res = await fetch(`/api/dev/draft?enable=${draft ? 0 : 1}`, {
|
|
151
|
+
credentials: 'include'
|
|
152
|
+
});
|
|
153
|
+
if (!res.ok) throw new Error(String(res.status));
|
|
154
|
+
setDraft((await res.json()).enabled);
|
|
155
|
+
router.refresh();
|
|
156
|
+
} catch {
|
|
157
|
+
setDraft(null);
|
|
158
|
+
} finally{
|
|
159
|
+
setDraftBusy(false);
|
|
160
|
+
}
|
|
161
|
+
}, [
|
|
162
|
+
draft,
|
|
163
|
+
draftBusy,
|
|
164
|
+
router
|
|
165
|
+
]);
|
|
134
166
|
const base = snapshot?.devRoute ?? '/dev';
|
|
135
167
|
/** Select a version: write the cookie, then show it — refresh if we're already on the test's
|
|
136
168
|
* page, navigate there if not. The panel stays open either way. */ const selectVersion = useCallback((testKey, versionId)=>{
|
|
@@ -253,6 +285,12 @@ const readSettings = ()=>{
|
|
|
253
285
|
title: 'Mux'
|
|
254
286
|
}
|
|
255
287
|
] : [],
|
|
288
|
+
...snapshot?.revalidate ? [
|
|
289
|
+
{
|
|
290
|
+
href: `${base}/revalidate`,
|
|
291
|
+
title: 'Revalidate'
|
|
292
|
+
}
|
|
293
|
+
] : [],
|
|
256
294
|
...links,
|
|
257
295
|
{
|
|
258
296
|
href: snapshot?.adminRoute ?? '/admin',
|
|
@@ -284,7 +322,22 @@ const readSettings = ()=>{
|
|
|
284
322
|
className: "pdt-head-title",
|
|
285
323
|
children: view === 'main' ? 'Dev tools' : VIEW_TITLE[view]
|
|
286
324
|
}),
|
|
287
|
-
/*#__PURE__*/
|
|
325
|
+
draft !== null ? /*#__PURE__*/ _jsxs("button", {
|
|
326
|
+
type: "button",
|
|
327
|
+
title: "Toggle Next.js draft mode",
|
|
328
|
+
className: `pdt-head-draft ${draft ? 'pdt-on' : ''}`,
|
|
329
|
+
disabled: draftBusy,
|
|
330
|
+
onClick: ()=>void toggleDraft(),
|
|
331
|
+
children: [
|
|
332
|
+
/*#__PURE__*/ _jsx("span", {
|
|
333
|
+
children: "draft"
|
|
334
|
+
}),
|
|
335
|
+
/*#__PURE__*/ _jsx("span", {
|
|
336
|
+
className: `pdt-switch ${draft ? 'pdt-active' : ''}`,
|
|
337
|
+
"aria-hidden": true
|
|
338
|
+
})
|
|
339
|
+
]
|
|
340
|
+
}) : /*#__PURE__*/ _jsx("span", {
|
|
288
341
|
className: "pdt-head-badge",
|
|
289
342
|
children: "dev only"
|
|
290
343
|
})
|
|
@@ -521,6 +574,43 @@ const readSettings = ()=>{
|
|
|
521
574
|
children: "MUX_TOKEN_ID / MUX_TOKEN_SECRET not set"
|
|
522
575
|
}) : null
|
|
523
576
|
]
|
|
577
|
+
}) : null,
|
|
578
|
+
snapshot.revalidate ? /*#__PURE__*/ _jsxs("div", {
|
|
579
|
+
className: "pdt-card",
|
|
580
|
+
children: [
|
|
581
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
582
|
+
className: "pdt-card-head",
|
|
583
|
+
children: [
|
|
584
|
+
/*#__PURE__*/ _jsx("span", {
|
|
585
|
+
className: "pdt-card-title",
|
|
586
|
+
children: "Revalidate"
|
|
587
|
+
}),
|
|
588
|
+
/*#__PURE__*/ _jsxs("span", {
|
|
589
|
+
className: "pdt-kind",
|
|
590
|
+
children: [
|
|
591
|
+
snapshot.revalidate.edges,
|
|
592
|
+
" edges"
|
|
593
|
+
]
|
|
594
|
+
})
|
|
595
|
+
]
|
|
596
|
+
}),
|
|
597
|
+
/*#__PURE__*/ _jsxs("p", {
|
|
598
|
+
className: "pdt-small",
|
|
599
|
+
style: {
|
|
600
|
+
margin: 0
|
|
601
|
+
},
|
|
602
|
+
children: [
|
|
603
|
+
snapshot.revalidate.reads,
|
|
604
|
+
" reads · ",
|
|
605
|
+
snapshot.revalidate.events,
|
|
606
|
+
" events",
|
|
607
|
+
!snapshot.revalidate.observing ? /*#__PURE__*/ _jsx("span", {
|
|
608
|
+
className: "pdt-warn",
|
|
609
|
+
children: " · not observing"
|
|
610
|
+
}) : null
|
|
611
|
+
]
|
|
612
|
+
})
|
|
613
|
+
]
|
|
524
614
|
}) : null
|
|
525
615
|
]
|
|
526
616
|
}) : !snapshotError ? /*#__PURE__*/ _jsx("p", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/DevToolbarClient.tsx"],"sourcesContent":["'use client'\n\nimport Link from 'next/link'\nimport { usePathname, useRouter } from 'next/navigation'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { CHROME_COOKIES, type ChromeSlot, STAGE_COOKIE } from '../cookies'\nimport type { TestMeta } from '../harness'\nimport type { DevSnapshot } from '../lib/snapshot'\n\nexport type DevLink = { href: string; title: string }\n\ntype Corner = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\ntype Size = 'sm' | 'md' | 'lg'\ntype Settings = { corner: Corner; size: Size }\ntype View = 'main' | 'info' | 'seed' | 'pages' | 'tests' | 'settings'\ntype SeedError = { error: string; issues?: string[] }\ntype StageSelection = { testKey: string; versionId: string }\n\nconst STORE_KEY = 'pdt-settings'\nconst HIDE_KEY = 'pdt-hidden'\nconst DEFAULTS: Settings = { corner: 'bottom-right', size: 'md' }\nconst CORNER_CLASS: Record<Corner, string> = { 'bottom-right': 'br', 'bottom-left': 'bl', 'top-right': 'tr', 'top-left': 'tl' }\nconst CORNERS: { value: Corner; arrow: string }[] = [\n { value: 'top-left', arrow: '↖' },\n { value: 'top-right', arrow: '↗' },\n { value: 'bottom-left', arrow: '↙' },\n { value: 'bottom-right', arrow: '↘' },\n]\nconst SIZES: Size[] = ['sm', 'md', 'lg']\nconst VIEW_TITLE: Record<Exclude<View, 'main'>, string> = { info: 'Info', seed: 'Seed', pages: 'Pages', tests: 'Tests', settings: 'Settings' }\n\nconst readSettings = (): Settings => {\n try {\n const parsed: unknown = JSON.parse(localStorage.getItem(STORE_KEY) ?? '{}')\n return parsed && typeof parsed === 'object' ? { ...DEFAULTS, ...parsed } : DEFAULTS\n } catch {\n return DEFAULTS\n }\n}\n\n/** A selection cookie (`testKey:versionId`), read client-side — the server reads the same cookie\n * (test pages for the stage cookie, `resolveDevChrome` for the chrome slots), so the toolbar\n * chips and the rendered result always agree. */\nconst readSelectionCookie = (name: string): StageSelection | null => {\n const raw = document.cookie\n .split('; ')\n .find((c) => c.startsWith(`${name}=`))\n ?.split('=')[1]\n if (!raw) return null\n try {\n const decoded = decodeURIComponent(raw)\n const sep = decoded.indexOf(':')\n return sep > 0 ? { testKey: decoded.slice(0, sep), versionId: decoded.slice(sep + 1) } : null\n } catch {\n return null\n }\n}\n\n/**\n * The toolbar panel — THE controller for the dev experience. Navigation happens through it (the\n * dev pages render content only, no nav of their own), the panel stays open across route changes\n * (it lives in the layout, and rows are client-side `<Link>`s), and the Tests view both opens a\n * test's page and toggles which version that page shows.\n */\nexport function DevToolbarClient({ tests, links }: { tests: TestMeta[]; links: DevLink[] }) {\n const router = useRouter()\n const pathname = usePathname()\n const [mounted, setMounted] = useState(false)\n const [hidden, setHidden] = useState(false)\n const [open, setOpen] = useState(false)\n const [view, setView] = useState<View>('main')\n const [settings, setSettings] = useState<Settings>(DEFAULTS)\n const [selection, setSelection] = useState<StageSelection | null>(null)\n const [chrome, setChrome] = useState<Record<ChromeSlot, StageSelection | null>>({ header: null, footer: null })\n const [snapshot, setSnapshot] = useState<DevSnapshot | null>(null)\n const [snapshotError, setSnapshotError] = useState(false)\n const [seeding, setSeeding] = useState(false)\n const [confirming, setConfirming] = useState(false)\n const [seedError, setSeedError] = useState<SeedError | null>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n setHidden(sessionStorage.getItem(HIDE_KEY) === '1')\n setSettings(readSettings())\n setSelection(readSelectionCookie(STAGE_COOKIE))\n setChrome({ header: readSelectionCookie(CHROME_COOKIES.header), footer: readSelectionCookie(CHROME_COOKIES.footer) })\n setMounted(true)\n }, [])\n\n const fetchSnapshot = useCallback(async () => {\n try {\n const res = await fetch('/api/dev', { headers: { accept: 'application/json' }, credentials: 'include' })\n if (!res.ok) throw new Error(String(res.status))\n setSnapshot((await res.json()) as DevSnapshot)\n setSnapshotError(false)\n } catch {\n setSnapshotError(true)\n }\n }, [])\n\n // Lazy: the snapshot loads on first open, not on page load.\n useEffect(() => {\n if (open && !snapshot && !snapshotError) void fetchSnapshot()\n }, [open, snapshot, snapshotError, fetchSnapshot])\n\n const base = snapshot?.devRoute ?? '/dev'\n\n /** Select a version: write the cookie, then show it — refresh if we're already on the test's\n * page, navigate there if not. The panel stays open either way. */\n const selectVersion = useCallback(\n (testKey: string, versionId: string) => {\n // biome-ignore lint/suspicious/noDocumentCookie: dev-only synchronous cookie write; Cookie Store API is async and not universal\n document.cookie = `${STAGE_COOKIE}=${encodeURIComponent(`${testKey}:${versionId}`)}; path=/; samesite=lax`\n setSelection({ testKey, versionId })\n const testPath = `${base}/tests/${testKey}`\n if (pathname === testPath) router.refresh()\n else router.push(testPath)\n },\n [base, pathname, router],\n )\n\n /** Set/clear a chrome override (header/footer swap): the cookie applies SITE-WIDE in dev —\n * `resolveDevChrome` in the host layout swaps the variant in wherever you browse. */\n const selectChrome = useCallback(\n (slot: ChromeSlot, sel: StageSelection | null) => {\n // biome-ignore lint/suspicious/noDocumentCookie: dev-only synchronous cookie write; Cookie Store API is async and not universal\n document.cookie = sel\n ? `${CHROME_COOKIES[slot]}=${encodeURIComponent(`${sel.testKey}:${sel.versionId}`)}; path=/; samesite=lax`\n : `${CHROME_COOKIES[slot]}=; path=/; max-age=0; samesite=lax`\n setChrome((prev) => ({ ...prev, [slot]: sel }))\n router.refresh()\n },\n [router],\n )\n\n const update = useCallback((patch: Partial<Settings>) => {\n setSettings((prev) => {\n const next = { ...prev, ...patch }\n try {\n localStorage.setItem(STORE_KEY, JSON.stringify(next))\n } catch {}\n return next\n })\n }, [])\n\n const runSeed = async () => {\n setSeeding(true)\n setSeedError(null)\n try {\n const res = await fetch('/api/seed', { method: 'POST', credentials: 'include' })\n if (res.ok) {\n setConfirming(false)\n setSeeding(false)\n await fetchSnapshot()\n router.refresh()\n return\n }\n const body = (await res.json().catch(() => null)) as SeedError | null\n setSeedError(body?.error ? body : { error: `Seed failed (HTTP ${res.status}).` })\n } catch {\n setSeedError({ error: 'Seed request failed — is the dev server running?' })\n }\n setSeeding(false)\n setConfirming(false)\n }\n\n useEffect(() => {\n if (!open) return\n const onDown = (e: MouseEvent) => {\n if (rootRef.current && e.target instanceof Node && !rootRef.current.contains(e.target)) setOpen(false)\n }\n document.addEventListener('mousedown', onDown)\n return () => document.removeEventListener('mousedown', onDown)\n }, [open])\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || !open) return\n if (view === 'main') setOpen(false)\n else setView('main')\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, view])\n\n if (!mounted || hidden) return null\n\n const corner = CORNER_CLASS[settings.corner]\n const seed = snapshot?.seed\n\n const pageLinks: DevLink[] = [\n { href: base, title: 'Overview' },\n ...(snapshot?.icons ? [{ href: `${base}/icons`, title: 'Icons' }] : []),\n ...(snapshot?.fonts ? [{ href: `${base}/fonts`, title: 'Fonts' }] : []),\n ...(snapshot?.images ? [{ href: `${base}/images`, title: 'Images' }] : []),\n ...(snapshot?.mux ? [{ href: `${base}/mux`, title: 'Mux' }] : []),\n ...links,\n { href: snapshot?.adminRoute ?? '/admin', title: 'Payload admin' },\n { href: 'https://payload-plugins.prolaico.com/docs', title: 'Plugin docs ↗' },\n ]\n\n return (\n <div ref={rootRef} className={`pdt-root pdt-corner-${corner}`}>\n {open ? (\n <div className={`pdt-panel pdt-panel-${corner}`}>\n <div className=\"pdt-head\">\n {view !== 'main' ? (\n <button type=\"button\" className=\"pdt-back\" aria-label=\"Back\" onClick={() => setView('main')}>\n ‹\n </button>\n ) : null}\n <span className=\"pdt-head-title\">{view === 'main' ? 'Dev tools' : VIEW_TITLE[view]}</span>\n <span className=\"pdt-head-badge\">dev only</span>\n </div>\n\n <div className=\"pdt-body\">\n {view === 'main' ? (\n <ul className=\"pdt-menu\">\n <MenuRow label=\"Info\" hint={snapshot ? snapshot.env.nodeEnv : undefined} onClick={() => setView('info')} />\n {snapshot?.plugins.seed !== false ? (\n <MenuRow\n label=\"Seed\"\n hint={seed ? (seed.seeded ? `${seed.totalDocs} docs` : 'empty') : undefined}\n onClick={() => setView('seed')}\n />\n ) : null}\n <MenuRow label=\"Pages\" hint={pathname.startsWith(base) ? pathname : undefined} onClick={() => setView('pages')} />\n {tests.length ? <MenuRow label=\"Tests\" hint={`${tests.length}`} onClick={() => setView('tests')} /> : null}\n <MenuRow label=\"Settings\" onClick={() => setView('settings')} />\n </ul>\n ) : null}\n\n {view === 'info' ? (\n <div>\n {snapshotError ? <SnapshotMissing retry={fetchSnapshot} /> : null}\n {snapshot ? (\n <>\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">Environment</span>\n <button type=\"button\" className=\"pdt-kind\" onClick={fetchSnapshot}>\n refresh\n </button>\n </div>\n <p className=\"pdt-small\" style={{ margin: 0 }}>\n <span className=\"pdt-code\">{snapshot.env.nodeEnv}</span> · node {snapshot.env.nodeVersion}\n </p>\n <div style={{ marginTop: 8, display: 'flex', flexWrap: 'wrap', gap: '3px 12px' }} className=\"pdt-small\">\n {Object.entries(snapshot.plugins).map(([name, on]) => (\n <span key={name}>\n <span className={`pdt-dot ${on ? 'pdt-dot-on' : 'pdt-dot-off'}`} />\n {name}\n </span>\n ))}\n </div>\n </div>\n\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">Collections</span>\n </div>\n <table className=\"pdt-table\">\n <tbody>\n {snapshot.collections.map((c) => (\n <tr key={c.slug}>\n <td>{c.slug}</td>\n <td>{c.count ?? '?'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {snapshot.icons ? (\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">Icons</span>\n <span className=\"pdt-kind\">{snapshot.icons.iconCount ?? '?'}</span>\n </div>\n <p className=\"pdt-small\" style={{ margin: 0 }}>\n Active set: {snapshot.icons.activeSet ?? <span className=\"pdt-warn\">none</span>}\n </p>\n {snapshot.icons.misses.length ? (\n <p className=\"pdt-small pdt-warn\" style={{ margin: '6px 0 0' }}>\n Misses:{' '}\n {snapshot.icons.misses.map((m) => (\n <span key={m.name} className=\"pdt-code\" style={{ marginRight: 5 }}>\n {m.name} ×{m.count}\n </span>\n ))}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {snapshot.fonts ? (\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">Fonts</span>\n <span className=\"pdt-kind\">{snapshot.fonts.fontCount ?? '?'}</span>\n </div>\n <table className=\"pdt-table\">\n <tbody>\n {snapshot.fonts.familyKeys.map((key) => (\n <tr key={key}>\n <td>{key}</td>\n <td>{snapshot.fonts?.slots[key] ?? 'unset'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : null}\n\n {snapshot.mux ? (\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">Mux</span>\n <span className=\"pdt-kind\">\n {snapshot.mux.total ?? '?'} / {snapshot.mux.ready ?? '?'} ready\n </span>\n </div>\n {!snapshot.mux.credentialed ? (\n <p className=\"pdt-small pdt-warn\" style={{ margin: 0 }}>\n MUX_TOKEN_ID / MUX_TOKEN_SECRET not set\n </p>\n ) : null}\n </div>\n ) : null}\n </>\n ) : !snapshotError ? (\n <p className=\"pdt-note\">Loading…</p>\n ) : null}\n </div>\n ) : null}\n\n {view === 'seed' ? (\n <div>\n {snapshotError ? <SnapshotMissing retry={fetchSnapshot} /> : null}\n {snapshot && !seed ? (\n <p className=\"pdt-note\">\n <span className=\"pdt-code\">@pro-laico/payload-seed</span> isn't installed — add{' '}\n <span className=\"pdt-code\">seedPlugin()</span> to get one-click seeding here.\n </p>\n ) : null}\n {seed ? (\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">{seed.seeded ? `Seeded — ${seed.totalDocs} docs` : 'Not seeded'}</span>\n {!seed.enabled ? <span className=\"pdt-kind pdt-warn\">locked</span> : null}\n </div>\n {seed.definitions.length ? (\n <table className=\"pdt-table\">\n <tbody>\n {seed.definitions.map((d) => (\n <tr key={d.slug}>\n <td>\n {d.slug}\n {d.disabled ? <span className=\"pdt-warn\"> · skipped</span> : null}\n </td>\n <td>{d.kind === 'global' ? 'global' : (seed.counts[d.slug] ?? 0)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n ) : (\n <p className=\"pdt-note\" style={{ margin: 0 }}>\n No seed definitions registered.\n </p>\n )}\n <div style={{ marginTop: 10, display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n className={`pdt-btn ${seed.seeded ? 'pdt-btn-danger' : 'pdt-btn-primary'}`}\n disabled={seeding}\n onClick={() => (seed.seeded && !confirming ? setConfirming(true) : void runSeed())}\n >\n {seeding ? 'Seeding…' : confirming ? 'Destructive — click again' : seed.seeded ? 'Reseed' : 'Seed the database'}\n </button>\n {confirming ? (\n <button type=\"button\" className=\"pdt-btn\" onClick={() => setConfirming(false)}>\n Cancel\n </button>\n ) : null}\n </div>\n {!seed.enabled ? (\n <p className=\"pdt-note\">\n Set <span className=\"pdt-code\">ENABLE_SEED=true</span> in <span className=\"pdt-code\">.env.local</span> — the seed wipes\n seeded collections, so it's off by default.\n </p>\n ) : null}\n <p className=\"pdt-note\" style={{ marginBottom: 0 }}>\n Needs a logged-in{' '}\n <a href={snapshot?.adminRoute ?? '/admin'} style={{ textDecoration: 'underline' }}>\n admin\n </a>{' '}\n user · CLI: <span className=\"pdt-code\">ENABLE_SEED=true pnpm seed</span>\n </p>\n {seedError ? (\n <div className=\"pdt-error\">\n {seedError.error}\n {seedError.issues?.length ? (\n <ul>\n {seedError.issues.map((issue) => (\n <li key={issue}>{issue}</li>\n ))}\n </ul>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {view === 'pages' ? (\n <div>\n <ul className=\"pdt-menu\">\n {pageLinks.map((link) =>\n link.href.startsWith('http') ? (\n <li key={link.href}>\n <a className=\"pdt-menu-row\" href={link.href} target=\"_blank\" rel=\"noreferrer\">\n <span>{link.title}</span>\n <span className=\"pdt-menu-hint\">{link.href.replace(/^https?:\\/\\//, '')}</span>\n </a>\n </li>\n ) : (\n <li key={link.href}>\n <Link className={`pdt-menu-row ${pathname === link.href ? 'pdt-current' : ''}`} href={link.href}>\n <span>{link.title}</span>\n <span className=\"pdt-menu-hint\">{link.href}</span>\n </Link>\n </li>\n ),\n )}\n </ul>\n {!snapshot && !snapshotError ? <p className=\"pdt-note\">Loading plugin pages…</p> : null}\n {snapshotError ? <SnapshotMissing retry={fetchSnapshot} /> : null}\n </div>\n ) : null}\n\n {view === 'tests' ? (\n <div>\n {tests.map((t) => {\n // header/footer kinds are chrome OVERRIDES: chips swap the variant into the real\n // layout site-wide (via resolveDevChrome) instead of opening a test page.\n if (t.kind === 'header' || t.kind === 'footer') {\n const slot = t.kind\n const active = chrome[slot]?.testKey === t.key ? chrome[slot] : null\n return (\n <div key={t.key} className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">{t.label}</span>\n <span className=\"pdt-kind\">{active ? <span className=\"pdt-viewing\">override on</span> : `${t.kind} override`}</span>\n </div>\n <div className=\"pdt-chips\">\n <button type=\"button\" className={`pdt-chip ${active ? '' : 'pdt-active'}`} onClick={() => selectChrome(slot, null)}>\n Real\n </button>\n {t.versions.map((v) => (\n <button\n key={v.id}\n type=\"button\"\n className={`pdt-chip ${active?.versionId === v.id ? 'pdt-active' : ''}`}\n onClick={() => selectChrome(slot, { testKey: t.key, versionId: v.id })}\n >\n {v.label}\n </button>\n ))}\n </div>\n </div>\n )\n }\n const testPath = `${base}/tests/${t.key}`\n const onPage = pathname === testPath\n // The page defaults to the first version when no cookie targets this test.\n const selectedId = selection?.testKey === t.key ? selection.versionId : t.versions[0]?.id\n return (\n <div key={t.key} className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <Link href={testPath} className=\"pdt-card-title\" style={{ textDecoration: onPage ? 'none' : undefined }}>\n {t.label} {onPage ? null : <span aria-hidden>›</span>}\n </Link>\n <span className=\"pdt-kind\">{onPage ? <span className=\"pdt-viewing\">viewing</span> : t.kind}</span>\n </div>\n <div className=\"pdt-chips\">\n {t.versions.map((v) => (\n <button\n key={v.id}\n type=\"button\"\n className={`pdt-chip ${selectedId === v.id ? 'pdt-active' : ''}`}\n onClick={() => selectVersion(t.key, v.id)}\n >\n {v.label}\n </button>\n ))}\n </div>\n </div>\n )\n })}\n <p className=\"pdt-note\">\n Page tests open as their own page; header/footer overrides swap into the live layout everywhere until you hit Real. Scriptable\n via <span className=\"pdt-code\">/api/dev/stage?test=…&version=…</span>\n </p>\n </div>\n ) : null}\n\n {view === 'settings' ? (\n <div>\n <div className=\"pdt-settings-row\">\n <span className=\"pdt-small pdt-muted\">Corner</span>\n <div className=\"pdt-corner-grid\">\n {CORNERS.map((c) => (\n <button\n key={c.value}\n type=\"button\"\n aria-label={c.value}\n className={`pdt-corner-btn ${settings.corner === c.value ? 'pdt-active' : ''}`}\n onClick={() => update({ corner: c.value })}\n >\n {c.arrow}\n </button>\n ))}\n </div>\n </div>\n <div className=\"pdt-settings-row\">\n <span className=\"pdt-small pdt-muted\">Size</span>\n <div className=\"pdt-seg\">\n {SIZES.map((s) => (\n <button key={s} type=\"button\" className={settings.size === s ? 'pdt-active' : ''} onClick={() => update({ size: s })}>\n {s}\n </button>\n ))}\n </div>\n </div>\n <div style={{ padding: '6px 4px 2px' }}>\n <button\n type=\"button\"\n className=\"pdt-btn\"\n style={{ width: '100%', justifyContent: 'center' }}\n onClick={() => {\n try {\n sessionStorage.setItem(HIDE_KEY, '1')\n } catch {}\n setHidden(true)\n setOpen(false)\n }}\n >\n Hide for this session\n </button>\n <p className=\"pdt-note\" style={{ textAlign: 'center' }}>\n reopens in a new tab / session\n </p>\n </div>\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n\n <button\n type=\"button\"\n aria-label=\"Dev tools\"\n title=\"Dev tools\"\n className={`pdt-fab pdt-fab-${settings.size} ${open ? 'pdt-open' : ''}`}\n onClick={() => {\n setOpen((v) => !v)\n setView('main')\n }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"m5 8 4 4-4 4\" />\n <path d=\"M13 16h6\" />\n </svg>\n </button>\n </div>\n )\n}\n\nconst MenuRow = ({ label, hint, onClick }: { label: string; hint?: string; onClick: () => void }) => (\n <li>\n <button type=\"button\" className=\"pdt-menu-row\" onClick={onClick}>\n <span>{label}</span>\n <span className=\"pdt-menu-hint\">\n {hint ? <span>{hint}</span> : null}\n <span aria-hidden>›</span>\n </span>\n </button>\n </li>\n)\n\nconst SnapshotMissing = ({ retry }: { retry: () => Promise<void> }) => (\n <p className=\"pdt-note\">\n <span className=\"pdt-warn\">Couldn't reach /api/dev.</span> Is <span className=\"pdt-code\">devToolsPlugin()</span> in your Payload plugins\n list?{' '}\n <button type=\"button\" style={{ textDecoration: 'underline' }} onClick={() => void retry()}>\n Retry\n </button>\n </p>\n)\n"],"names":["Link","usePathname","useRouter","useCallback","useEffect","useRef","useState","CHROME_COOKIES","STAGE_COOKIE","STORE_KEY","HIDE_KEY","DEFAULTS","corner","size","CORNER_CLASS","CORNERS","value","arrow","SIZES","VIEW_TITLE","info","seed","pages","tests","settings","readSettings","parsed","JSON","parse","localStorage","getItem","readSelectionCookie","name","raw","document","cookie","split","find","c","startsWith","decoded","decodeURIComponent","sep","indexOf","testKey","slice","versionId","DevToolbarClient","links","router","pathname","mounted","setMounted","hidden","setHidden","open","setOpen","view","setView","setSettings","selection","setSelection","chrome","setChrome","header","footer","snapshot","setSnapshot","snapshotError","setSnapshotError","seeding","setSeeding","confirming","setConfirming","seedError","setSeedError","rootRef","sessionStorage","fetchSnapshot","res","fetch","headers","accept","credentials","ok","Error","String","status","json","base","devRoute","selectVersion","encodeURIComponent","testPath","refresh","push","selectChrome","slot","sel","prev","update","patch","next","setItem","stringify","runSeed","method","body","catch","error","onDown","e","current","target","Node","contains","addEventListener","removeEventListener","onKey","key","pageLinks","href","title","icons","fonts","images","mux","adminRoute","div","ref","className","button","type","aria-label","onClick","span","ul","MenuRow","label","hint","env","nodeEnv","undefined","plugins","seeded","totalDocs","length","SnapshotMissing","retry","p","style","margin","nodeVersion","marginTop","display","flexWrap","gap","Object","entries","map","on","table","tbody","collections","tr","td","slug","count","iconCount","activeSet","misses","m","marginRight","fontCount","familyKeys","slots","total","ready","credentialed","enabled","definitions","d","disabled","kind","counts","marginBottom","a","textDecoration","issues","issue","li","link","rel","replace","t","active","versions","v","id","onPage","selectedId","aria-hidden","s","padding","width","justifyContent","textAlign","svg","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","path"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/components/DevToolbarClient.tsx"],"sourcesContent":["'use client'\n\nimport Link from 'next/link'\nimport { usePathname, useRouter } from 'next/navigation'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { CHROME_COOKIES, type ChromeSlot, STAGE_COOKIE } from '../cookies'\nimport type { TestMeta } from '../harness'\nimport type { DevSnapshot } from '../lib/snapshot'\n\nexport type DevLink = { href: string; title: string }\n\ntype Corner = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\ntype Size = 'sm' | 'md' | 'lg'\ntype Settings = { corner: Corner; size: Size }\ntype View = 'main' | 'info' | 'seed' | 'pages' | 'tests' | 'settings'\ntype SeedError = { error: string; issues?: string[] }\ntype StageSelection = { testKey: string; versionId: string }\n\nconst STORE_KEY = 'pdt-settings'\nconst HIDE_KEY = 'pdt-hidden'\nconst DEFAULTS: Settings = { corner: 'bottom-right', size: 'md' }\nconst CORNER_CLASS: Record<Corner, string> = { 'bottom-right': 'br', 'bottom-left': 'bl', 'top-right': 'tr', 'top-left': 'tl' }\nconst CORNERS: { value: Corner; arrow: string }[] = [\n { value: 'top-left', arrow: '↖' },\n { value: 'top-right', arrow: '↗' },\n { value: 'bottom-left', arrow: '↙' },\n { value: 'bottom-right', arrow: '↘' },\n]\nconst SIZES: Size[] = ['sm', 'md', 'lg']\nconst VIEW_TITLE: Record<Exclude<View, 'main'>, string> = { info: 'Info', seed: 'Seed', pages: 'Pages', tests: 'Tests', settings: 'Settings' }\n\nconst readSettings = (): Settings => {\n try {\n const parsed: unknown = JSON.parse(localStorage.getItem(STORE_KEY) ?? '{}')\n return parsed && typeof parsed === 'object' ? { ...DEFAULTS, ...parsed } : DEFAULTS\n } catch {\n return DEFAULTS\n }\n}\n\n/** A selection cookie (`testKey:versionId`), read client-side — the server reads the same cookie\n * (test pages for the stage cookie, `resolveDevChrome` for the chrome slots), so the toolbar\n * chips and the rendered result always agree. */\nconst readSelectionCookie = (name: string): StageSelection | null => {\n const raw = document.cookie\n .split('; ')\n .find((c) => c.startsWith(`${name}=`))\n ?.split('=')[1]\n if (!raw) return null\n try {\n const decoded = decodeURIComponent(raw)\n const sep = decoded.indexOf(':')\n return sep > 0 ? { testKey: decoded.slice(0, sep), versionId: decoded.slice(sep + 1) } : null\n } catch {\n return null\n }\n}\n\n/**\n * The toolbar panel — THE controller for the dev experience. Navigation happens through it (the\n * dev pages render content only, no nav of their own), the panel stays open across route changes\n * (it lives in the layout, and rows are client-side `<Link>`s), and the Tests view both opens a\n * test's page and toggles which version that page shows.\n */\nexport function DevToolbarClient({ tests, links }: { tests: TestMeta[]; links: DevLink[] }) {\n const router = useRouter()\n const pathname = usePathname()\n const [mounted, setMounted] = useState(false)\n const [hidden, setHidden] = useState(false)\n const [open, setOpen] = useState(false)\n const [view, setView] = useState<View>('main')\n const [settings, setSettings] = useState<Settings>(DEFAULTS)\n const [selection, setSelection] = useState<StageSelection | null>(null)\n const [chrome, setChrome] = useState<Record<ChromeSlot, StageSelection | null>>({ header: null, footer: null })\n const [snapshot, setSnapshot] = useState<DevSnapshot | null>(null)\n const [snapshotError, setSnapshotError] = useState(false)\n const [draft, setDraft] = useState<boolean | null>(null)\n const [draftBusy, setDraftBusy] = useState(false)\n const [seeding, setSeeding] = useState(false)\n const [confirming, setConfirming] = useState(false)\n const [seedError, setSeedError] = useState<SeedError | null>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n setHidden(sessionStorage.getItem(HIDE_KEY) === '1')\n setSettings(readSettings())\n setSelection(readSelectionCookie(STAGE_COOKIE))\n setChrome({ header: readSelectionCookie(CHROME_COOKIES.header), footer: readSelectionCookie(CHROME_COOKIES.footer) })\n setMounted(true)\n }, [])\n\n const fetchSnapshot = useCallback(async () => {\n try {\n const res = await fetch('/api/dev', { headers: { accept: 'application/json' }, credentials: 'include' })\n if (!res.ok) throw new Error(String(res.status))\n setSnapshot((await res.json()) as DevSnapshot)\n setSnapshotError(false)\n } catch {\n setSnapshotError(true)\n }\n }, [])\n\n // Lazy: the snapshot loads on first open, not on page load.\n useEffect(() => {\n if (open && !snapshot && !snapshotError) void fetchSnapshot()\n }, [open, snapshot, snapshotError, fetchSnapshot])\n\n // Draft mode is server-held state (`__prerender_bypass` is httpOnly), so re-read it on every\n // open — a preview route or another tab may have flipped it. null = endpoint unavailable, row hidden.\n useEffect(() => {\n if (!open) return\n void fetch('/api/dev/draft', { credentials: 'include' })\n .then(async (res) => (res.ok ? setDraft(((await res.json()) as { enabled: boolean }).enabled) : setDraft(null)))\n .catch(() => setDraft(null))\n }, [open])\n\n const toggleDraft = useCallback(async () => {\n if (draft === null || draftBusy) return\n setDraftBusy(true)\n try {\n const res = await fetch(`/api/dev/draft?enable=${draft ? 0 : 1}`, { credentials: 'include' })\n if (!res.ok) throw new Error(String(res.status))\n setDraft(((await res.json()) as { enabled: boolean }).enabled)\n router.refresh()\n } catch {\n setDraft(null)\n } finally {\n setDraftBusy(false)\n }\n }, [draft, draftBusy, router])\n\n const base = snapshot?.devRoute ?? '/dev'\n\n /** Select a version: write the cookie, then show it — refresh if we're already on the test's\n * page, navigate there if not. The panel stays open either way. */\n const selectVersion = useCallback(\n (testKey: string, versionId: string) => {\n // biome-ignore lint/suspicious/noDocumentCookie: dev-only synchronous cookie write; Cookie Store API is async and not universal\n document.cookie = `${STAGE_COOKIE}=${encodeURIComponent(`${testKey}:${versionId}`)}; path=/; samesite=lax`\n setSelection({ testKey, versionId })\n const testPath = `${base}/tests/${testKey}`\n if (pathname === testPath) router.refresh()\n else router.push(testPath)\n },\n [base, pathname, router],\n )\n\n /** Set/clear a chrome override (header/footer swap): the cookie applies SITE-WIDE in dev —\n * `resolveDevChrome` in the host layout swaps the variant in wherever you browse. */\n const selectChrome = useCallback(\n (slot: ChromeSlot, sel: StageSelection | null) => {\n // biome-ignore lint/suspicious/noDocumentCookie: dev-only synchronous cookie write; Cookie Store API is async and not universal\n document.cookie = sel\n ? `${CHROME_COOKIES[slot]}=${encodeURIComponent(`${sel.testKey}:${sel.versionId}`)}; path=/; samesite=lax`\n : `${CHROME_COOKIES[slot]}=; path=/; max-age=0; samesite=lax`\n setChrome((prev) => ({ ...prev, [slot]: sel }))\n router.refresh()\n },\n [router],\n )\n\n const update = useCallback((patch: Partial<Settings>) => {\n setSettings((prev) => {\n const next = { ...prev, ...patch }\n try {\n localStorage.setItem(STORE_KEY, JSON.stringify(next))\n } catch {}\n return next\n })\n }, [])\n\n const runSeed = async () => {\n setSeeding(true)\n setSeedError(null)\n try {\n const res = await fetch('/api/seed', { method: 'POST', credentials: 'include' })\n if (res.ok) {\n setConfirming(false)\n setSeeding(false)\n await fetchSnapshot()\n router.refresh()\n return\n }\n const body = (await res.json().catch(() => null)) as SeedError | null\n setSeedError(body?.error ? body : { error: `Seed failed (HTTP ${res.status}).` })\n } catch {\n setSeedError({ error: 'Seed request failed — is the dev server running?' })\n }\n setSeeding(false)\n setConfirming(false)\n }\n\n useEffect(() => {\n if (!open) return\n const onDown = (e: MouseEvent) => {\n if (rootRef.current && e.target instanceof Node && !rootRef.current.contains(e.target)) setOpen(false)\n }\n document.addEventListener('mousedown', onDown)\n return () => document.removeEventListener('mousedown', onDown)\n }, [open])\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' || !open) return\n if (view === 'main') setOpen(false)\n else setView('main')\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, view])\n\n if (!mounted || hidden) return null\n\n const corner = CORNER_CLASS[settings.corner]\n const seed = snapshot?.seed\n\n const pageLinks: DevLink[] = [\n { href: base, title: 'Overview' },\n ...(snapshot?.icons ? [{ href: `${base}/icons`, title: 'Icons' }] : []),\n ...(snapshot?.fonts ? [{ href: `${base}/fonts`, title: 'Fonts' }] : []),\n ...(snapshot?.images ? [{ href: `${base}/images`, title: 'Images' }] : []),\n ...(snapshot?.mux ? [{ href: `${base}/mux`, title: 'Mux' }] : []),\n ...(snapshot?.revalidate ? [{ href: `${base}/revalidate`, title: 'Revalidate' }] : []),\n ...links,\n { href: snapshot?.adminRoute ?? '/admin', title: 'Payload admin' },\n { href: 'https://payload-plugins.prolaico.com/docs', title: 'Plugin docs ↗' },\n ]\n\n return (\n <div ref={rootRef} className={`pdt-root pdt-corner-${corner}`}>\n {open ? (\n <div className={`pdt-panel pdt-panel-${corner}`}>\n <div className=\"pdt-head\">\n {view !== 'main' ? (\n <button type=\"button\" className=\"pdt-back\" aria-label=\"Back\" onClick={() => setView('main')}>\n ‹\n </button>\n ) : null}\n <span className=\"pdt-head-title\">{view === 'main' ? 'Dev tools' : VIEW_TITLE[view]}</span>\n {draft !== null ? (\n <button\n type=\"button\"\n title=\"Toggle Next.js draft mode\"\n className={`pdt-head-draft ${draft ? 'pdt-on' : ''}`}\n disabled={draftBusy}\n onClick={() => void toggleDraft()}\n >\n <span>draft</span>\n <span className={`pdt-switch ${draft ? 'pdt-active' : ''}`} aria-hidden />\n </button>\n ) : (\n <span className=\"pdt-head-badge\">dev only</span>\n )}\n </div>\n\n <div className=\"pdt-body\">\n {view === 'main' ? (\n <ul className=\"pdt-menu\">\n <MenuRow label=\"Info\" hint={snapshot ? snapshot.env.nodeEnv : undefined} onClick={() => setView('info')} />\n {snapshot?.plugins.seed !== false ? (\n <MenuRow\n label=\"Seed\"\n hint={seed ? (seed.seeded ? `${seed.totalDocs} docs` : 'empty') : undefined}\n onClick={() => setView('seed')}\n />\n ) : null}\n <MenuRow label=\"Pages\" hint={pathname.startsWith(base) ? pathname : undefined} onClick={() => setView('pages')} />\n {tests.length ? <MenuRow label=\"Tests\" hint={`${tests.length}`} onClick={() => setView('tests')} /> : null}\n <MenuRow label=\"Settings\" onClick={() => setView('settings')} />\n </ul>\n ) : null}\n\n {view === 'info' ? (\n <div>\n {snapshotError ? <SnapshotMissing retry={fetchSnapshot} /> : null}\n {snapshot ? (\n <>\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">Environment</span>\n <button type=\"button\" className=\"pdt-kind\" onClick={fetchSnapshot}>\n refresh\n </button>\n </div>\n <p className=\"pdt-small\" style={{ margin: 0 }}>\n <span className=\"pdt-code\">{snapshot.env.nodeEnv}</span> · node {snapshot.env.nodeVersion}\n </p>\n <div style={{ marginTop: 8, display: 'flex', flexWrap: 'wrap', gap: '3px 12px' }} className=\"pdt-small\">\n {Object.entries(snapshot.plugins).map(([name, on]) => (\n <span key={name}>\n <span className={`pdt-dot ${on ? 'pdt-dot-on' : 'pdt-dot-off'}`} />\n {name}\n </span>\n ))}\n </div>\n </div>\n\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">Collections</span>\n </div>\n <table className=\"pdt-table\">\n <tbody>\n {snapshot.collections.map((c) => (\n <tr key={c.slug}>\n <td>{c.slug}</td>\n <td>{c.count ?? '?'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {snapshot.icons ? (\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">Icons</span>\n <span className=\"pdt-kind\">{snapshot.icons.iconCount ?? '?'}</span>\n </div>\n <p className=\"pdt-small\" style={{ margin: 0 }}>\n Active set: {snapshot.icons.activeSet ?? <span className=\"pdt-warn\">none</span>}\n </p>\n {snapshot.icons.misses.length ? (\n <p className=\"pdt-small pdt-warn\" style={{ margin: '6px 0 0' }}>\n Misses:{' '}\n {snapshot.icons.misses.map((m) => (\n <span key={m.name} className=\"pdt-code\" style={{ marginRight: 5 }}>\n {m.name} ×{m.count}\n </span>\n ))}\n </p>\n ) : null}\n </div>\n ) : null}\n\n {snapshot.fonts ? (\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">Fonts</span>\n <span className=\"pdt-kind\">{snapshot.fonts.fontCount ?? '?'}</span>\n </div>\n <table className=\"pdt-table\">\n <tbody>\n {snapshot.fonts.familyKeys.map((key) => (\n <tr key={key}>\n <td>{key}</td>\n <td>{snapshot.fonts?.slots[key] ?? 'unset'}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : null}\n\n {snapshot.mux ? (\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">Mux</span>\n <span className=\"pdt-kind\">\n {snapshot.mux.total ?? '?'} / {snapshot.mux.ready ?? '?'} ready\n </span>\n </div>\n {!snapshot.mux.credentialed ? (\n <p className=\"pdt-small pdt-warn\" style={{ margin: 0 }}>\n MUX_TOKEN_ID / MUX_TOKEN_SECRET not set\n </p>\n ) : null}\n </div>\n ) : null}\n\n {snapshot.revalidate ? (\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">Revalidate</span>\n <span className=\"pdt-kind\">{snapshot.revalidate.edges} edges</span>\n </div>\n <p className=\"pdt-small\" style={{ margin: 0 }}>\n {snapshot.revalidate.reads} reads · {snapshot.revalidate.events} events\n {!snapshot.revalidate.observing ? <span className=\"pdt-warn\"> · not observing</span> : null}\n </p>\n </div>\n ) : null}\n </>\n ) : !snapshotError ? (\n <p className=\"pdt-note\">Loading…</p>\n ) : null}\n </div>\n ) : null}\n\n {view === 'seed' ? (\n <div>\n {snapshotError ? <SnapshotMissing retry={fetchSnapshot} /> : null}\n {snapshot && !seed ? (\n <p className=\"pdt-note\">\n <span className=\"pdt-code\">@pro-laico/payload-seed</span> isn't installed — add{' '}\n <span className=\"pdt-code\">seedPlugin()</span> to get one-click seeding here.\n </p>\n ) : null}\n {seed ? (\n <div className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">{seed.seeded ? `Seeded — ${seed.totalDocs} docs` : 'Not seeded'}</span>\n {!seed.enabled ? <span className=\"pdt-kind pdt-warn\">locked</span> : null}\n </div>\n {seed.definitions.length ? (\n <table className=\"pdt-table\">\n <tbody>\n {seed.definitions.map((d) => (\n <tr key={d.slug}>\n <td>\n {d.slug}\n {d.disabled ? <span className=\"pdt-warn\"> · skipped</span> : null}\n </td>\n <td>{d.kind === 'global' ? 'global' : (seed.counts[d.slug] ?? 0)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n ) : (\n <p className=\"pdt-note\" style={{ margin: 0 }}>\n No seed definitions registered.\n </p>\n )}\n <div style={{ marginTop: 10, display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n className={`pdt-btn ${seed.seeded ? 'pdt-btn-danger' : 'pdt-btn-primary'}`}\n disabled={seeding}\n onClick={() => (seed.seeded && !confirming ? setConfirming(true) : void runSeed())}\n >\n {seeding ? 'Seeding…' : confirming ? 'Destructive — click again' : seed.seeded ? 'Reseed' : 'Seed the database'}\n </button>\n {confirming ? (\n <button type=\"button\" className=\"pdt-btn\" onClick={() => setConfirming(false)}>\n Cancel\n </button>\n ) : null}\n </div>\n {!seed.enabled ? (\n <p className=\"pdt-note\">\n Set <span className=\"pdt-code\">ENABLE_SEED=true</span> in <span className=\"pdt-code\">.env.local</span> — the seed wipes\n seeded collections, so it's off by default.\n </p>\n ) : null}\n <p className=\"pdt-note\" style={{ marginBottom: 0 }}>\n Needs a logged-in{' '}\n <a href={snapshot?.adminRoute ?? '/admin'} style={{ textDecoration: 'underline' }}>\n admin\n </a>{' '}\n user · CLI: <span className=\"pdt-code\">ENABLE_SEED=true pnpm seed</span>\n </p>\n {seedError ? (\n <div className=\"pdt-error\">\n {seedError.error}\n {seedError.issues?.length ? (\n <ul>\n {seedError.issues.map((issue) => (\n <li key={issue}>{issue}</li>\n ))}\n </ul>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {view === 'pages' ? (\n <div>\n <ul className=\"pdt-menu\">\n {pageLinks.map((link) =>\n link.href.startsWith('http') ? (\n <li key={link.href}>\n <a className=\"pdt-menu-row\" href={link.href} target=\"_blank\" rel=\"noreferrer\">\n <span>{link.title}</span>\n <span className=\"pdt-menu-hint\">{link.href.replace(/^https?:\\/\\//, '')}</span>\n </a>\n </li>\n ) : (\n <li key={link.href}>\n <Link className={`pdt-menu-row ${pathname === link.href ? 'pdt-current' : ''}`} href={link.href}>\n <span>{link.title}</span>\n <span className=\"pdt-menu-hint\">{link.href}</span>\n </Link>\n </li>\n ),\n )}\n </ul>\n {!snapshot && !snapshotError ? <p className=\"pdt-note\">Loading plugin pages…</p> : null}\n {snapshotError ? <SnapshotMissing retry={fetchSnapshot} /> : null}\n </div>\n ) : null}\n\n {view === 'tests' ? (\n <div>\n {tests.map((t) => {\n // header/footer kinds are chrome OVERRIDES: chips swap the variant into the real\n // layout site-wide (via resolveDevChrome) instead of opening a test page.\n if (t.kind === 'header' || t.kind === 'footer') {\n const slot = t.kind\n const active = chrome[slot]?.testKey === t.key ? chrome[slot] : null\n return (\n <div key={t.key} className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <span className=\"pdt-card-title\">{t.label}</span>\n <span className=\"pdt-kind\">{active ? <span className=\"pdt-viewing\">override on</span> : `${t.kind} override`}</span>\n </div>\n <div className=\"pdt-chips\">\n <button type=\"button\" className={`pdt-chip ${active ? '' : 'pdt-active'}`} onClick={() => selectChrome(slot, null)}>\n Real\n </button>\n {t.versions.map((v) => (\n <button\n key={v.id}\n type=\"button\"\n className={`pdt-chip ${active?.versionId === v.id ? 'pdt-active' : ''}`}\n onClick={() => selectChrome(slot, { testKey: t.key, versionId: v.id })}\n >\n {v.label}\n </button>\n ))}\n </div>\n </div>\n )\n }\n const testPath = `${base}/tests/${t.key}`\n const onPage = pathname === testPath\n // The page defaults to the first version when no cookie targets this test.\n const selectedId = selection?.testKey === t.key ? selection.versionId : t.versions[0]?.id\n return (\n <div key={t.key} className=\"pdt-card\">\n <div className=\"pdt-card-head\">\n <Link href={testPath} className=\"pdt-card-title\" style={{ textDecoration: onPage ? 'none' : undefined }}>\n {t.label} {onPage ? null : <span aria-hidden>›</span>}\n </Link>\n <span className=\"pdt-kind\">{onPage ? <span className=\"pdt-viewing\">viewing</span> : t.kind}</span>\n </div>\n <div className=\"pdt-chips\">\n {t.versions.map((v) => (\n <button\n key={v.id}\n type=\"button\"\n className={`pdt-chip ${selectedId === v.id ? 'pdt-active' : ''}`}\n onClick={() => selectVersion(t.key, v.id)}\n >\n {v.label}\n </button>\n ))}\n </div>\n </div>\n )\n })}\n <p className=\"pdt-note\">\n Page tests open as their own page; header/footer overrides swap into the live layout everywhere until you hit Real. Scriptable\n via <span className=\"pdt-code\">/api/dev/stage?test=…&version=…</span>\n </p>\n </div>\n ) : null}\n\n {view === 'settings' ? (\n <div>\n <div className=\"pdt-settings-row\">\n <span className=\"pdt-small pdt-muted\">Corner</span>\n <div className=\"pdt-corner-grid\">\n {CORNERS.map((c) => (\n <button\n key={c.value}\n type=\"button\"\n aria-label={c.value}\n className={`pdt-corner-btn ${settings.corner === c.value ? 'pdt-active' : ''}`}\n onClick={() => update({ corner: c.value })}\n >\n {c.arrow}\n </button>\n ))}\n </div>\n </div>\n <div className=\"pdt-settings-row\">\n <span className=\"pdt-small pdt-muted\">Size</span>\n <div className=\"pdt-seg\">\n {SIZES.map((s) => (\n <button key={s} type=\"button\" className={settings.size === s ? 'pdt-active' : ''} onClick={() => update({ size: s })}>\n {s}\n </button>\n ))}\n </div>\n </div>\n <div style={{ padding: '6px 4px 2px' }}>\n <button\n type=\"button\"\n className=\"pdt-btn\"\n style={{ width: '100%', justifyContent: 'center' }}\n onClick={() => {\n try {\n sessionStorage.setItem(HIDE_KEY, '1')\n } catch {}\n setHidden(true)\n setOpen(false)\n }}\n >\n Hide for this session\n </button>\n <p className=\"pdt-note\" style={{ textAlign: 'center' }}>\n reopens in a new tab / session\n </p>\n </div>\n </div>\n ) : null}\n </div>\n </div>\n ) : null}\n\n <button\n type=\"button\"\n aria-label=\"Dev tools\"\n title=\"Dev tools\"\n className={`pdt-fab pdt-fab-${settings.size} ${open ? 'pdt-open' : ''}`}\n onClick={() => {\n setOpen((v) => !v)\n setView('main')\n }}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"m5 8 4 4-4 4\" />\n <path d=\"M13 16h6\" />\n </svg>\n </button>\n </div>\n )\n}\n\nconst MenuRow = ({ label, hint, onClick }: { label: string; hint?: string; onClick: () => void }) => (\n <li>\n <button type=\"button\" className=\"pdt-menu-row\" onClick={onClick}>\n <span>{label}</span>\n <span className=\"pdt-menu-hint\">\n {hint ? <span>{hint}</span> : null}\n <span aria-hidden>›</span>\n </span>\n </button>\n </li>\n)\n\nconst SnapshotMissing = ({ retry }: { retry: () => Promise<void> }) => (\n <p className=\"pdt-note\">\n <span className=\"pdt-warn\">Couldn't reach /api/dev.</span> Is <span className=\"pdt-code\">devToolsPlugin()</span> in your Payload plugins\n list?{' '}\n <button type=\"button\" style={{ textDecoration: 'underline' }} onClick={() => void retry()}>\n Retry\n </button>\n </p>\n)\n"],"names":["Link","usePathname","useRouter","useCallback","useEffect","useRef","useState","CHROME_COOKIES","STAGE_COOKIE","STORE_KEY","HIDE_KEY","DEFAULTS","corner","size","CORNER_CLASS","CORNERS","value","arrow","SIZES","VIEW_TITLE","info","seed","pages","tests","settings","readSettings","parsed","JSON","parse","localStorage","getItem","readSelectionCookie","name","raw","document","cookie","split","find","c","startsWith","decoded","decodeURIComponent","sep","indexOf","testKey","slice","versionId","DevToolbarClient","links","router","pathname","mounted","setMounted","hidden","setHidden","open","setOpen","view","setView","setSettings","selection","setSelection","chrome","setChrome","header","footer","snapshot","setSnapshot","snapshotError","setSnapshotError","draft","setDraft","draftBusy","setDraftBusy","seeding","setSeeding","confirming","setConfirming","seedError","setSeedError","rootRef","sessionStorage","fetchSnapshot","res","fetch","headers","accept","credentials","ok","Error","String","status","json","then","enabled","catch","toggleDraft","refresh","base","devRoute","selectVersion","encodeURIComponent","testPath","push","selectChrome","slot","sel","prev","update","patch","next","setItem","stringify","runSeed","method","body","error","onDown","e","current","target","Node","contains","addEventListener","removeEventListener","onKey","key","pageLinks","href","title","icons","fonts","images","mux","revalidate","adminRoute","div","ref","className","button","type","aria-label","onClick","span","disabled","aria-hidden","ul","MenuRow","label","hint","env","nodeEnv","undefined","plugins","seeded","totalDocs","length","SnapshotMissing","retry","p","style","margin","nodeVersion","marginTop","display","flexWrap","gap","Object","entries","map","on","table","tbody","collections","tr","td","slug","count","iconCount","activeSet","misses","m","marginRight","fontCount","familyKeys","slots","total","ready","credentialed","edges","reads","events","observing","definitions","d","kind","counts","marginBottom","a","textDecoration","issues","issue","li","link","rel","replace","t","active","versions","v","id","onPage","selectedId","s","padding","width","justifyContent","textAlign","svg","viewBox","fill","stroke","strokeWidth","strokeLinecap","strokeLinejoin","path"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** The toolbar's entire stylesheet, injected by `<DevToolbar>` as one `<style>` tag so the host
|
|
2
2
|
* app needs no CSS import and no Tailwind. Everything is `.pdt-` prefixed and self-contained
|
|
3
3
|
* (own dark theme); `--pdt-accent` is the override seam. */
|
|
4
|
-
export declare const PDT_CSS = "\n.pdt-root { position: fixed; z-index: 999999; color-scheme: dark;\n --pdt-accent: oklch(0.72 0.16 250); --pdt-bg: oklch(0.185 0 0); --pdt-fg: oklch(0.985 0 0);\n --pdt-muted: oklch(0.708 0 0); --pdt-border: oklch(1 0 0 / 12%); --pdt-hover: oklch(1 0 0 / 7%);\n --pdt-danger: oklch(0.65 0.18 25); --pdt-warn: oklch(0.8 0.14 85);\n font-family: ui-sans-serif, system-ui, sans-serif; font-size: 14px; line-height: 1.45; color: var(--pdt-fg); }\n.pdt-root *, .pdt-root *::before, .pdt-root *::after { box-sizing: border-box; }\n/* :where() keeps this reset at zero specificity so component classes below always win it. */\n:where(.pdt-root) button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }\n.pdt-root a { color: inherit; text-decoration: none; }\n\n.pdt-corner-br { bottom: 16px; right: 16px; } .pdt-corner-bl { bottom: 16px; left: 16px; }\n.pdt-corner-tr { top: 16px; right: 16px; } .pdt-corner-tl { top: 16px; left: 16px; }\n\n/* The launcher: solid black, no shadow, a thin border that breathes toward grey \u2014 the same\n idiom as Next.js's own dev indicator, so the two read as siblings. */\n@keyframes pdt-fab-breathe { 0%, 100% { border-color: oklch(0.25 0 0); } 50% { border-color: oklch(0.52 0 0); } }\n.pdt-fab { display: flex; align-items: center; justify-content: center; border-radius: 999px;\n background: oklch(0 0 0); color: oklch(0.985 0 0); border: 1px solid oklch(0.25 0 0);\n animation: pdt-fab-breathe 4s ease-in-out infinite; transition: border-color 0.2s ease; }\n.pdt-fab:hover { animation: none; border-color: oklch(0.6 0 0); }\n.pdt-fab.pdt-open { animation: none; border-color: var(--pdt-accent); }\n.pdt-fab-sm { width: 30px; height: 30px; } .pdt-fab-sm svg { width: 14px; height: 14px; }\n.pdt-fab-md { width: 38px; height: 38px; } .pdt-fab-md svg { width: 17px; height: 17px; }\n.pdt-fab-lg { width: 46px; height: 46px; } .pdt-fab-lg svg { width: 21px; height: 21px; }\n\n.pdt-panel { position: absolute; width: 330px; max-height: 72vh; display: flex; flex-direction: column;\n overflow: hidden; border-radius: 12px; border: 1px solid var(--pdt-border); background: var(--pdt-bg);\n box-shadow: 0 12px 40px oklch(0 0 0 / 55%); }\n.pdt-panel-br { bottom: calc(100% + 10px); right: 0; } .pdt-panel-bl { bottom: calc(100% + 10px); left: 0; }\n.pdt-panel-tr { top: calc(100% + 10px); right: 0; } .pdt-panel-tl { top: calc(100% + 10px); left: 0; }\n\n.pdt-head { display: flex; align-items: center; gap: 8px; padding: 9px 12px;\n border-bottom: 1px solid var(--pdt-border); background: oklch(0.14 0 0); }\n.pdt-head-title { flex: 1; font-family: ui-monospace, Consolas, monospace; font-size: 11px;\n text-transform: uppercase; letter-spacing: 0.08em; }\n.pdt-head-badge { font-family: ui-monospace, Consolas, monospace; font-size: 10px; text-transform: uppercase;\n color: var(--pdt-muted); border: 1px solid var(--pdt-border); border-radius: 4px; padding: 1px 6px; }\n.pdt-back { color: var(--pdt-muted); padding: 0 4px; font-size: 16px; line-height: 1; }\n.pdt-back:hover { color: var(--pdt-fg); }\n\n/* Minimal scrollbar for the tiny panel: a bare 4px thumb, no track, no arrows. */\n.pdt-body { overflow-y: auto; padding: 8px; scrollbar-width: thin; scrollbar-color: oklch(0.42 0 0) transparent; }\n.pdt-body::-webkit-scrollbar { width: 4px; }\n.pdt-body::-webkit-scrollbar-track { background: transparent; }\n.pdt-body::-webkit-scrollbar-thumb { background: oklch(0.42 0 0); border-radius: 999px; }\n.pdt-body::-webkit-scrollbar-thumb:hover { background: oklch(0.58 0 0); }\n.pdt-body::-webkit-scrollbar-button { display: none; width: 0; height: 0; }\n.pdt-menu { list-style: none; margin: 0; padding: 0; }\n.pdt-menu-row { display: flex; width: 100%; align-items: center; justify-content: space-between;\n padding: 9px 10px; border-radius: 8px; text-align: left; }\n.pdt-menu-row:hover { background: var(--pdt-hover); }\n.pdt-menu-hint { display: flex; align-items: center; gap: 8px; color: var(--pdt-muted);\n font-family: ui-monospace, Consolas, monospace; font-size: 11px; }\n\n.pdt-card { border: 1px solid var(--pdt-border); border-radius: 10px; padding: 10px; margin: 4px 2px 10px; }\n.pdt-card-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 8px; }\n.pdt-card-title { font-weight: 600; }\n.pdt-kind { font-family: ui-monospace, Consolas, monospace; font-size: 10px; text-transform: uppercase;\n letter-spacing: 0.06em; color: var(--pdt-muted); }\n.pdt-viewing { color: var(--pdt-accent); font-weight: 600; }\n\n.pdt-chips { display: flex; flex-wrap: wrap; gap: 6px; }\n.pdt-chip { border: 1px solid var(--pdt-border); border-radius: 999px; padding: 5px 14px; font-size: 12.5px;\n background: oklch(0.24 0 0); transition: border-color 0.15s ease, background 0.15s ease; }\n.pdt-chip:hover { background: oklch(0.29 0 0); border-color: oklch(0.45 0 0); }\n.pdt-chip.pdt-active { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-btn { display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--pdt-border);\n border-radius: 8px; padding: 7px 12px; font-size: 13px; font-weight: 500; }\n.pdt-btn:hover { background: var(--pdt-hover); }\n.pdt-btn:disabled { opacity: 0.55; cursor: default; }\n.pdt-btn-danger { border-color: color-mix(in oklch, var(--pdt-danger), transparent 45%); color: var(--pdt-danger); }\n.pdt-btn-primary { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-muted { color: var(--pdt-muted); } .pdt-warn { color: var(--pdt-warn); } .pdt-danger-text { color: var(--pdt-danger); }\n.pdt-small { font-size: 12px; } .pdt-mono { font-family: ui-monospace, Consolas, monospace; font-size: 0.9em; }\n.pdt-note { margin: 6px 2px 4px; font-size: 11.5px; color: var(--pdt-muted); }\n.pdt-code { font-family: ui-monospace, Consolas, monospace; font-size: 0.85em; background: oklch(0.26 0 0);\n padding: 1px 5px; border-radius: 4px; }\n.pdt-error { margin-top: 8px; border: 1px solid color-mix(in oklch, var(--pdt-danger), transparent 55%);\n border-radius: 8px; padding: 8px 10px; font-size: 12.5px; color: var(--pdt-danger); }\n.pdt-error ul { margin: 6px 0 0; padding-left: 18px; color: var(--pdt-fg); }\n\n.pdt-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }\n.pdt-table td { padding: 4px 8px; border-bottom: 1px solid var(--pdt-border); }\n.pdt-table td:last-child { text-align: right; color: var(--pdt-muted); font-family: ui-monospace, Consolas, monospace; }\n.pdt-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; margin-right: 7px; }\n.pdt-dot-on { background: oklch(0.75 0.15 165); } .pdt-dot-off { background: oklch(0.45 0 0); }\n\n.pdt-settings-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 6px 4px; }\n.pdt-corner-grid { display: grid; grid-template-columns: repeat(2, 24px); gap: 3px; }\n.pdt-corner-btn { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center;\n border: 1px solid var(--pdt-border); border-radius: 5px; font-size: 12px; }\n.pdt-corner-btn:hover { background: var(--pdt-hover); }\n.pdt-corner-btn.pdt-active { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); }\n.pdt-seg { display: flex; overflow: hidden; border: 1px solid var(--pdt-border); border-radius: 6px; }\n.pdt-seg button { padding: 4px 10px; font-size: 11px; text-transform: uppercase; }\n.pdt-seg button:hover { background: var(--pdt-hover); }\n.pdt-seg button.pdt-active { background: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-menu-row.pdt-current { background: var(--pdt-hover); }\n.pdt-menu-row.pdt-current > span:first-child { color: var(--pdt-accent); font-weight: 600; }\n\n@media print { .pdt-root { display: none !important; } }\n";
|
|
4
|
+
export declare const PDT_CSS = "\n.pdt-root { position: fixed; z-index: 999999; color-scheme: dark;\n --pdt-accent: oklch(0.72 0.16 250); --pdt-bg: oklch(0.185 0 0); --pdt-fg: oklch(0.985 0 0);\n --pdt-muted: oklch(0.708 0 0); --pdt-border: oklch(1 0 0 / 12%); --pdt-hover: oklch(1 0 0 / 7%);\n --pdt-danger: oklch(0.65 0.18 25); --pdt-warn: oklch(0.8 0.14 85);\n font-family: ui-sans-serif, system-ui, sans-serif; font-size: 14px; line-height: 1.45; color: var(--pdt-fg); }\n.pdt-root *, .pdt-root *::before, .pdt-root *::after { box-sizing: border-box; }\n/* :where() keeps this reset at zero specificity so component classes below always win it. */\n:where(.pdt-root) button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }\n.pdt-root a { color: inherit; text-decoration: none; }\n\n.pdt-corner-br { bottom: 16px; right: 16px; } .pdt-corner-bl { bottom: 16px; left: 16px; }\n.pdt-corner-tr { top: 16px; right: 16px; } .pdt-corner-tl { top: 16px; left: 16px; }\n\n/* The launcher: solid black, no shadow, a thin border that breathes toward grey \u2014 the same\n idiom as Next.js's own dev indicator, so the two read as siblings. */\n@keyframes pdt-fab-breathe { 0%, 100% { border-color: oklch(0.25 0 0); } 50% { border-color: oklch(0.52 0 0); } }\n.pdt-fab { display: flex; align-items: center; justify-content: center; border-radius: 999px;\n background: oklch(0 0 0); color: oklch(0.985 0 0); border: 1px solid oklch(0.25 0 0);\n animation: pdt-fab-breathe 4s ease-in-out infinite; transition: border-color 0.2s ease; }\n.pdt-fab:hover { animation: none; border-color: oklch(0.6 0 0); }\n.pdt-fab.pdt-open { animation: none; border-color: var(--pdt-accent); }\n.pdt-fab-sm { width: 30px; height: 30px; } .pdt-fab-sm svg { width: 14px; height: 14px; }\n.pdt-fab-md { width: 38px; height: 38px; } .pdt-fab-md svg { width: 17px; height: 17px; }\n.pdt-fab-lg { width: 46px; height: 46px; } .pdt-fab-lg svg { width: 21px; height: 21px; }\n\n.pdt-panel { position: absolute; width: 330px; max-height: 72vh; display: flex; flex-direction: column;\n overflow: hidden; border-radius: 12px; border: 1px solid var(--pdt-border); background: var(--pdt-bg);\n box-shadow: 0 12px 40px oklch(0 0 0 / 55%); }\n.pdt-panel-br { bottom: calc(100% + 10px); right: 0; } .pdt-panel-bl { bottom: calc(100% + 10px); left: 0; }\n.pdt-panel-tr { top: calc(100% + 10px); right: 0; } .pdt-panel-tl { top: calc(100% + 10px); left: 0; }\n\n.pdt-head { display: flex; align-items: center; gap: 8px; padding: 9px 12px;\n border-bottom: 1px solid var(--pdt-border); background: oklch(0.14 0 0); }\n.pdt-head-title { flex: 1; font-family: ui-monospace, Consolas, monospace; font-size: 11px;\n text-transform: uppercase; letter-spacing: 0.08em; }\n.pdt-head-badge { font-family: ui-monospace, Consolas, monospace; font-size: 10px; text-transform: uppercase;\n color: var(--pdt-muted); border: 1px solid var(--pdt-border); border-radius: 4px; padding: 1px 6px; }\n.pdt-back { color: var(--pdt-muted); padding: 0 4px; font-size: 16px; line-height: 1; }\n.pdt-back:hover { color: var(--pdt-fg); }\n\n/* The header's draft-mode toggle \u2014 same tiny-mono idiom as the old \"dev only\" badge it replaced. */\n.pdt-head-draft { display: inline-flex; align-items: center; gap: 6px; font-family: ui-monospace, Consolas, monospace;\n font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--pdt-muted); }\n.pdt-head-draft:hover { color: var(--pdt-fg); }\n.pdt-head-draft.pdt-on { color: var(--pdt-accent); }\n.pdt-head-draft:disabled { opacity: 0.55; cursor: default; }\n.pdt-switch { display: inline-block; position: relative; width: 22px; height: 13px; border-radius: 999px;\n background: oklch(0.32 0 0); transition: background 0.15s ease; }\n.pdt-switch::after { content: ''; position: absolute; top: 2px; left: 2px; width: 9px; height: 9px;\n border-radius: 50%; background: oklch(0.85 0 0); transition: transform 0.15s ease; }\n.pdt-switch.pdt-active { background: var(--pdt-accent); }\n.pdt-switch.pdt-active::after { transform: translateX(9px); background: oklch(0.13 0 0); }\n\n/* Minimal scrollbar for the tiny panel: a bare 4px thumb, no track, no arrows. */\n.pdt-body { overflow-y: auto; padding: 8px; scrollbar-width: thin; scrollbar-color: oklch(0.42 0 0) transparent; }\n.pdt-body::-webkit-scrollbar { width: 4px; }\n.pdt-body::-webkit-scrollbar-track { background: transparent; }\n.pdt-body::-webkit-scrollbar-thumb { background: oklch(0.42 0 0); border-radius: 999px; }\n.pdt-body::-webkit-scrollbar-thumb:hover { background: oklch(0.58 0 0); }\n.pdt-body::-webkit-scrollbar-button { display: none; width: 0; height: 0; }\n.pdt-menu { list-style: none; margin: 0; padding: 0; }\n.pdt-menu-row { display: flex; width: 100%; align-items: center; justify-content: space-between;\n padding: 9px 10px; border-radius: 8px; text-align: left; }\n.pdt-menu-row:hover { background: var(--pdt-hover); }\n.pdt-menu-hint { display: flex; align-items: center; gap: 8px; color: var(--pdt-muted);\n font-family: ui-monospace, Consolas, monospace; font-size: 11px; }\n\n.pdt-card { border: 1px solid var(--pdt-border); border-radius: 10px; padding: 10px; margin: 4px 2px 10px; }\n.pdt-card-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 8px; }\n.pdt-card-title { font-weight: 600; }\n.pdt-kind { font-family: ui-monospace, Consolas, monospace; font-size: 10px; text-transform: uppercase;\n letter-spacing: 0.06em; color: var(--pdt-muted); }\n.pdt-viewing { color: var(--pdt-accent); font-weight: 600; }\n\n.pdt-chips { display: flex; flex-wrap: wrap; gap: 6px; }\n.pdt-chip { border: 1px solid var(--pdt-border); border-radius: 999px; padding: 5px 14px; font-size: 12.5px;\n background: oklch(0.24 0 0); transition: border-color 0.15s ease, background 0.15s ease; }\n.pdt-chip:hover { background: oklch(0.29 0 0); border-color: oklch(0.45 0 0); }\n.pdt-chip.pdt-active { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-btn { display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--pdt-border);\n border-radius: 8px; padding: 7px 12px; font-size: 13px; font-weight: 500; }\n.pdt-btn:hover { background: var(--pdt-hover); }\n.pdt-btn:disabled { opacity: 0.55; cursor: default; }\n.pdt-btn-danger { border-color: color-mix(in oklch, var(--pdt-danger), transparent 45%); color: var(--pdt-danger); }\n.pdt-btn-primary { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-muted { color: var(--pdt-muted); } .pdt-warn { color: var(--pdt-warn); } .pdt-danger-text { color: var(--pdt-danger); }\n.pdt-small { font-size: 12px; } .pdt-mono { font-family: ui-monospace, Consolas, monospace; font-size: 0.9em; }\n.pdt-note { margin: 6px 2px 4px; font-size: 11.5px; color: var(--pdt-muted); }\n.pdt-code { font-family: ui-monospace, Consolas, monospace; font-size: 0.85em; background: oklch(0.26 0 0);\n padding: 1px 5px; border-radius: 4px; }\n.pdt-error { margin-top: 8px; border: 1px solid color-mix(in oklch, var(--pdt-danger), transparent 55%);\n border-radius: 8px; padding: 8px 10px; font-size: 12.5px; color: var(--pdt-danger); }\n.pdt-error ul { margin: 6px 0 0; padding-left: 18px; color: var(--pdt-fg); }\n\n.pdt-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }\n.pdt-table td { padding: 4px 8px; border-bottom: 1px solid var(--pdt-border); }\n.pdt-table td:last-child { text-align: right; color: var(--pdt-muted); font-family: ui-monospace, Consolas, monospace; }\n.pdt-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; margin-right: 7px; }\n.pdt-dot-on { background: oklch(0.75 0.15 165); } .pdt-dot-off { background: oklch(0.45 0 0); }\n\n.pdt-settings-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 6px 4px; }\n.pdt-corner-grid { display: grid; grid-template-columns: repeat(2, 24px); gap: 3px; }\n.pdt-corner-btn { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center;\n border: 1px solid var(--pdt-border); border-radius: 5px; font-size: 12px; }\n.pdt-corner-btn:hover { background: var(--pdt-hover); }\n.pdt-corner-btn.pdt-active { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); }\n.pdt-seg { display: flex; overflow: hidden; border: 1px solid var(--pdt-border); border-radius: 6px; }\n.pdt-seg button { padding: 4px 10px; font-size: 11px; text-transform: uppercase; }\n.pdt-seg button:hover { background: var(--pdt-hover); }\n.pdt-seg button.pdt-active { background: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-menu-row.pdt-current { background: var(--pdt-hover); }\n.pdt-menu-row.pdt-current > span:first-child { color: var(--pdt-accent); font-weight: 600; }\n\n@media print { .pdt-root { display: none !important; } }\n";
|
|
5
5
|
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/components/styles.ts"],"names":[],"mappings":"AAAA;;6DAE6D;AAC7D,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/components/styles.ts"],"names":[],"mappings":"AAAA;;6DAE6D;AAC7D,eAAO,MAAM,OAAO,6vRAsHnB,CAAA"}
|
|
@@ -41,6 +41,19 @@
|
|
|
41
41
|
.pdt-back { color: var(--pdt-muted); padding: 0 4px; font-size: 16px; line-height: 1; }
|
|
42
42
|
.pdt-back:hover { color: var(--pdt-fg); }
|
|
43
43
|
|
|
44
|
+
/* The header's draft-mode toggle — same tiny-mono idiom as the old "dev only" badge it replaced. */
|
|
45
|
+
.pdt-head-draft { display: inline-flex; align-items: center; gap: 6px; font-family: ui-monospace, Consolas, monospace;
|
|
46
|
+
font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--pdt-muted); }
|
|
47
|
+
.pdt-head-draft:hover { color: var(--pdt-fg); }
|
|
48
|
+
.pdt-head-draft.pdt-on { color: var(--pdt-accent); }
|
|
49
|
+
.pdt-head-draft:disabled { opacity: 0.55; cursor: default; }
|
|
50
|
+
.pdt-switch { display: inline-block; position: relative; width: 22px; height: 13px; border-radius: 999px;
|
|
51
|
+
background: oklch(0.32 0 0); transition: background 0.15s ease; }
|
|
52
|
+
.pdt-switch::after { content: ''; position: absolute; top: 2px; left: 2px; width: 9px; height: 9px;
|
|
53
|
+
border-radius: 50%; background: oklch(0.85 0 0); transition: transform 0.15s ease; }
|
|
54
|
+
.pdt-switch.pdt-active { background: var(--pdt-accent); }
|
|
55
|
+
.pdt-switch.pdt-active::after { transform: translateX(9px); background: oklch(0.13 0 0); }
|
|
56
|
+
|
|
44
57
|
/* Minimal scrollbar for the tiny panel: a bare 4px thumb, no track, no arrows. */
|
|
45
58
|
.pdt-body { overflow-y: auto; padding: 8px; scrollbar-width: thin; scrollbar-color: oklch(0.42 0 0) transparent; }
|
|
46
59
|
.pdt-body::-webkit-scrollbar { width: 4px; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/styles.ts"],"sourcesContent":["/** The toolbar's entire stylesheet, injected by `<DevToolbar>` as one `<style>` tag so the host\n * app needs no CSS import and no Tailwind. Everything is `.pdt-` prefixed and self-contained\n * (own dark theme); `--pdt-accent` is the override seam. */\nexport const PDT_CSS = `\n.pdt-root { position: fixed; z-index: 999999; color-scheme: dark;\n --pdt-accent: oklch(0.72 0.16 250); --pdt-bg: oklch(0.185 0 0); --pdt-fg: oklch(0.985 0 0);\n --pdt-muted: oklch(0.708 0 0); --pdt-border: oklch(1 0 0 / 12%); --pdt-hover: oklch(1 0 0 / 7%);\n --pdt-danger: oklch(0.65 0.18 25); --pdt-warn: oklch(0.8 0.14 85);\n font-family: ui-sans-serif, system-ui, sans-serif; font-size: 14px; line-height: 1.45; color: var(--pdt-fg); }\n.pdt-root *, .pdt-root *::before, .pdt-root *::after { box-sizing: border-box; }\n/* :where() keeps this reset at zero specificity so component classes below always win it. */\n:where(.pdt-root) button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }\n.pdt-root a { color: inherit; text-decoration: none; }\n\n.pdt-corner-br { bottom: 16px; right: 16px; } .pdt-corner-bl { bottom: 16px; left: 16px; }\n.pdt-corner-tr { top: 16px; right: 16px; } .pdt-corner-tl { top: 16px; left: 16px; }\n\n/* The launcher: solid black, no shadow, a thin border that breathes toward grey — the same\n idiom as Next.js's own dev indicator, so the two read as siblings. */\n@keyframes pdt-fab-breathe { 0%, 100% { border-color: oklch(0.25 0 0); } 50% { border-color: oklch(0.52 0 0); } }\n.pdt-fab { display: flex; align-items: center; justify-content: center; border-radius: 999px;\n background: oklch(0 0 0); color: oklch(0.985 0 0); border: 1px solid oklch(0.25 0 0);\n animation: pdt-fab-breathe 4s ease-in-out infinite; transition: border-color 0.2s ease; }\n.pdt-fab:hover { animation: none; border-color: oklch(0.6 0 0); }\n.pdt-fab.pdt-open { animation: none; border-color: var(--pdt-accent); }\n.pdt-fab-sm { width: 30px; height: 30px; } .pdt-fab-sm svg { width: 14px; height: 14px; }\n.pdt-fab-md { width: 38px; height: 38px; } .pdt-fab-md svg { width: 17px; height: 17px; }\n.pdt-fab-lg { width: 46px; height: 46px; } .pdt-fab-lg svg { width: 21px; height: 21px; }\n\n.pdt-panel { position: absolute; width: 330px; max-height: 72vh; display: flex; flex-direction: column;\n overflow: hidden; border-radius: 12px; border: 1px solid var(--pdt-border); background: var(--pdt-bg);\n box-shadow: 0 12px 40px oklch(0 0 0 / 55%); }\n.pdt-panel-br { bottom: calc(100% + 10px); right: 0; } .pdt-panel-bl { bottom: calc(100% + 10px); left: 0; }\n.pdt-panel-tr { top: calc(100% + 10px); right: 0; } .pdt-panel-tl { top: calc(100% + 10px); left: 0; }\n\n.pdt-head { display: flex; align-items: center; gap: 8px; padding: 9px 12px;\n border-bottom: 1px solid var(--pdt-border); background: oklch(0.14 0 0); }\n.pdt-head-title { flex: 1; font-family: ui-monospace, Consolas, monospace; font-size: 11px;\n text-transform: uppercase; letter-spacing: 0.08em; }\n.pdt-head-badge { font-family: ui-monospace, Consolas, monospace; font-size: 10px; text-transform: uppercase;\n color: var(--pdt-muted); border: 1px solid var(--pdt-border); border-radius: 4px; padding: 1px 6px; }\n.pdt-back { color: var(--pdt-muted); padding: 0 4px; font-size: 16px; line-height: 1; }\n.pdt-back:hover { color: var(--pdt-fg); }\n\n/* Minimal scrollbar for the tiny panel: a bare 4px thumb, no track, no arrows. */\n.pdt-body { overflow-y: auto; padding: 8px; scrollbar-width: thin; scrollbar-color: oklch(0.42 0 0) transparent; }\n.pdt-body::-webkit-scrollbar { width: 4px; }\n.pdt-body::-webkit-scrollbar-track { background: transparent; }\n.pdt-body::-webkit-scrollbar-thumb { background: oklch(0.42 0 0); border-radius: 999px; }\n.pdt-body::-webkit-scrollbar-thumb:hover { background: oklch(0.58 0 0); }\n.pdt-body::-webkit-scrollbar-button { display: none; width: 0; height: 0; }\n.pdt-menu { list-style: none; margin: 0; padding: 0; }\n.pdt-menu-row { display: flex; width: 100%; align-items: center; justify-content: space-between;\n padding: 9px 10px; border-radius: 8px; text-align: left; }\n.pdt-menu-row:hover { background: var(--pdt-hover); }\n.pdt-menu-hint { display: flex; align-items: center; gap: 8px; color: var(--pdt-muted);\n font-family: ui-monospace, Consolas, monospace; font-size: 11px; }\n\n.pdt-card { border: 1px solid var(--pdt-border); border-radius: 10px; padding: 10px; margin: 4px 2px 10px; }\n.pdt-card-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 8px; }\n.pdt-card-title { font-weight: 600; }\n.pdt-kind { font-family: ui-monospace, Consolas, monospace; font-size: 10px; text-transform: uppercase;\n letter-spacing: 0.06em; color: var(--pdt-muted); }\n.pdt-viewing { color: var(--pdt-accent); font-weight: 600; }\n\n.pdt-chips { display: flex; flex-wrap: wrap; gap: 6px; }\n.pdt-chip { border: 1px solid var(--pdt-border); border-radius: 999px; padding: 5px 14px; font-size: 12.5px;\n background: oklch(0.24 0 0); transition: border-color 0.15s ease, background 0.15s ease; }\n.pdt-chip:hover { background: oklch(0.29 0 0); border-color: oklch(0.45 0 0); }\n.pdt-chip.pdt-active { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-btn { display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--pdt-border);\n border-radius: 8px; padding: 7px 12px; font-size: 13px; font-weight: 500; }\n.pdt-btn:hover { background: var(--pdt-hover); }\n.pdt-btn:disabled { opacity: 0.55; cursor: default; }\n.pdt-btn-danger { border-color: color-mix(in oklch, var(--pdt-danger), transparent 45%); color: var(--pdt-danger); }\n.pdt-btn-primary { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-muted { color: var(--pdt-muted); } .pdt-warn { color: var(--pdt-warn); } .pdt-danger-text { color: var(--pdt-danger); }\n.pdt-small { font-size: 12px; } .pdt-mono { font-family: ui-monospace, Consolas, monospace; font-size: 0.9em; }\n.pdt-note { margin: 6px 2px 4px; font-size: 11.5px; color: var(--pdt-muted); }\n.pdt-code { font-family: ui-monospace, Consolas, monospace; font-size: 0.85em; background: oklch(0.26 0 0);\n padding: 1px 5px; border-radius: 4px; }\n.pdt-error { margin-top: 8px; border: 1px solid color-mix(in oklch, var(--pdt-danger), transparent 55%);\n border-radius: 8px; padding: 8px 10px; font-size: 12.5px; color: var(--pdt-danger); }\n.pdt-error ul { margin: 6px 0 0; padding-left: 18px; color: var(--pdt-fg); }\n\n.pdt-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }\n.pdt-table td { padding: 4px 8px; border-bottom: 1px solid var(--pdt-border); }\n.pdt-table td:last-child { text-align: right; color: var(--pdt-muted); font-family: ui-monospace, Consolas, monospace; }\n.pdt-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; margin-right: 7px; }\n.pdt-dot-on { background: oklch(0.75 0.15 165); } .pdt-dot-off { background: oklch(0.45 0 0); }\n\n.pdt-settings-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 6px 4px; }\n.pdt-corner-grid { display: grid; grid-template-columns: repeat(2, 24px); gap: 3px; }\n.pdt-corner-btn { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center;\n border: 1px solid var(--pdt-border); border-radius: 5px; font-size: 12px; }\n.pdt-corner-btn:hover { background: var(--pdt-hover); }\n.pdt-corner-btn.pdt-active { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); }\n.pdt-seg { display: flex; overflow: hidden; border: 1px solid var(--pdt-border); border-radius: 6px; }\n.pdt-seg button { padding: 4px 10px; font-size: 11px; text-transform: uppercase; }\n.pdt-seg button:hover { background: var(--pdt-hover); }\n.pdt-seg button.pdt-active { background: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-menu-row.pdt-current { background: var(--pdt-hover); }\n.pdt-menu-row.pdt-current > span:first-child { color: var(--pdt-accent); font-weight: 600; }\n\n@media print { .pdt-root { display: none !important; } }\n`\n"],"names":["PDT_CSS"],"mappings":"AAAA;;2DAE2D,GAC3D,OAAO,MAAMA,UAAU,CAAC
|
|
1
|
+
{"version":3,"sources":["../../src/components/styles.ts"],"sourcesContent":["/** The toolbar's entire stylesheet, injected by `<DevToolbar>` as one `<style>` tag so the host\n * app needs no CSS import and no Tailwind. Everything is `.pdt-` prefixed and self-contained\n * (own dark theme); `--pdt-accent` is the override seam. */\nexport const PDT_CSS = `\n.pdt-root { position: fixed; z-index: 999999; color-scheme: dark;\n --pdt-accent: oklch(0.72 0.16 250); --pdt-bg: oklch(0.185 0 0); --pdt-fg: oklch(0.985 0 0);\n --pdt-muted: oklch(0.708 0 0); --pdt-border: oklch(1 0 0 / 12%); --pdt-hover: oklch(1 0 0 / 7%);\n --pdt-danger: oklch(0.65 0.18 25); --pdt-warn: oklch(0.8 0.14 85);\n font-family: ui-sans-serif, system-ui, sans-serif; font-size: 14px; line-height: 1.45; color: var(--pdt-fg); }\n.pdt-root *, .pdt-root *::before, .pdt-root *::after { box-sizing: border-box; }\n/* :where() keeps this reset at zero specificity so component classes below always win it. */\n:where(.pdt-root) button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }\n.pdt-root a { color: inherit; text-decoration: none; }\n\n.pdt-corner-br { bottom: 16px; right: 16px; } .pdt-corner-bl { bottom: 16px; left: 16px; }\n.pdt-corner-tr { top: 16px; right: 16px; } .pdt-corner-tl { top: 16px; left: 16px; }\n\n/* The launcher: solid black, no shadow, a thin border that breathes toward grey — the same\n idiom as Next.js's own dev indicator, so the two read as siblings. */\n@keyframes pdt-fab-breathe { 0%, 100% { border-color: oklch(0.25 0 0); } 50% { border-color: oklch(0.52 0 0); } }\n.pdt-fab { display: flex; align-items: center; justify-content: center; border-radius: 999px;\n background: oklch(0 0 0); color: oklch(0.985 0 0); border: 1px solid oklch(0.25 0 0);\n animation: pdt-fab-breathe 4s ease-in-out infinite; transition: border-color 0.2s ease; }\n.pdt-fab:hover { animation: none; border-color: oklch(0.6 0 0); }\n.pdt-fab.pdt-open { animation: none; border-color: var(--pdt-accent); }\n.pdt-fab-sm { width: 30px; height: 30px; } .pdt-fab-sm svg { width: 14px; height: 14px; }\n.pdt-fab-md { width: 38px; height: 38px; } .pdt-fab-md svg { width: 17px; height: 17px; }\n.pdt-fab-lg { width: 46px; height: 46px; } .pdt-fab-lg svg { width: 21px; height: 21px; }\n\n.pdt-panel { position: absolute; width: 330px; max-height: 72vh; display: flex; flex-direction: column;\n overflow: hidden; border-radius: 12px; border: 1px solid var(--pdt-border); background: var(--pdt-bg);\n box-shadow: 0 12px 40px oklch(0 0 0 / 55%); }\n.pdt-panel-br { bottom: calc(100% + 10px); right: 0; } .pdt-panel-bl { bottom: calc(100% + 10px); left: 0; }\n.pdt-panel-tr { top: calc(100% + 10px); right: 0; } .pdt-panel-tl { top: calc(100% + 10px); left: 0; }\n\n.pdt-head { display: flex; align-items: center; gap: 8px; padding: 9px 12px;\n border-bottom: 1px solid var(--pdt-border); background: oklch(0.14 0 0); }\n.pdt-head-title { flex: 1; font-family: ui-monospace, Consolas, monospace; font-size: 11px;\n text-transform: uppercase; letter-spacing: 0.08em; }\n.pdt-head-badge { font-family: ui-monospace, Consolas, monospace; font-size: 10px; text-transform: uppercase;\n color: var(--pdt-muted); border: 1px solid var(--pdt-border); border-radius: 4px; padding: 1px 6px; }\n.pdt-back { color: var(--pdt-muted); padding: 0 4px; font-size: 16px; line-height: 1; }\n.pdt-back:hover { color: var(--pdt-fg); }\n\n/* The header's draft-mode toggle — same tiny-mono idiom as the old \"dev only\" badge it replaced. */\n.pdt-head-draft { display: inline-flex; align-items: center; gap: 6px; font-family: ui-monospace, Consolas, monospace;\n font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--pdt-muted); }\n.pdt-head-draft:hover { color: var(--pdt-fg); }\n.pdt-head-draft.pdt-on { color: var(--pdt-accent); }\n.pdt-head-draft:disabled { opacity: 0.55; cursor: default; }\n.pdt-switch { display: inline-block; position: relative; width: 22px; height: 13px; border-radius: 999px;\n background: oklch(0.32 0 0); transition: background 0.15s ease; }\n.pdt-switch::after { content: ''; position: absolute; top: 2px; left: 2px; width: 9px; height: 9px;\n border-radius: 50%; background: oklch(0.85 0 0); transition: transform 0.15s ease; }\n.pdt-switch.pdt-active { background: var(--pdt-accent); }\n.pdt-switch.pdt-active::after { transform: translateX(9px); background: oklch(0.13 0 0); }\n\n/* Minimal scrollbar for the tiny panel: a bare 4px thumb, no track, no arrows. */\n.pdt-body { overflow-y: auto; padding: 8px; scrollbar-width: thin; scrollbar-color: oklch(0.42 0 0) transparent; }\n.pdt-body::-webkit-scrollbar { width: 4px; }\n.pdt-body::-webkit-scrollbar-track { background: transparent; }\n.pdt-body::-webkit-scrollbar-thumb { background: oklch(0.42 0 0); border-radius: 999px; }\n.pdt-body::-webkit-scrollbar-thumb:hover { background: oklch(0.58 0 0); }\n.pdt-body::-webkit-scrollbar-button { display: none; width: 0; height: 0; }\n.pdt-menu { list-style: none; margin: 0; padding: 0; }\n.pdt-menu-row { display: flex; width: 100%; align-items: center; justify-content: space-between;\n padding: 9px 10px; border-radius: 8px; text-align: left; }\n.pdt-menu-row:hover { background: var(--pdt-hover); }\n.pdt-menu-hint { display: flex; align-items: center; gap: 8px; color: var(--pdt-muted);\n font-family: ui-monospace, Consolas, monospace; font-size: 11px; }\n\n.pdt-card { border: 1px solid var(--pdt-border); border-radius: 10px; padding: 10px; margin: 4px 2px 10px; }\n.pdt-card-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; margin-bottom: 8px; }\n.pdt-card-title { font-weight: 600; }\n.pdt-kind { font-family: ui-monospace, Consolas, monospace; font-size: 10px; text-transform: uppercase;\n letter-spacing: 0.06em; color: var(--pdt-muted); }\n.pdt-viewing { color: var(--pdt-accent); font-weight: 600; }\n\n.pdt-chips { display: flex; flex-wrap: wrap; gap: 6px; }\n.pdt-chip { border: 1px solid var(--pdt-border); border-radius: 999px; padding: 5px 14px; font-size: 12.5px;\n background: oklch(0.24 0 0); transition: border-color 0.15s ease, background 0.15s ease; }\n.pdt-chip:hover { background: oklch(0.29 0 0); border-color: oklch(0.45 0 0); }\n.pdt-chip.pdt-active { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-btn { display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--pdt-border);\n border-radius: 8px; padding: 7px 12px; font-size: 13px; font-weight: 500; }\n.pdt-btn:hover { background: var(--pdt-hover); }\n.pdt-btn:disabled { opacity: 0.55; cursor: default; }\n.pdt-btn-danger { border-color: color-mix(in oklch, var(--pdt-danger), transparent 45%); color: var(--pdt-danger); }\n.pdt-btn-primary { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-muted { color: var(--pdt-muted); } .pdt-warn { color: var(--pdt-warn); } .pdt-danger-text { color: var(--pdt-danger); }\n.pdt-small { font-size: 12px; } .pdt-mono { font-family: ui-monospace, Consolas, monospace; font-size: 0.9em; }\n.pdt-note { margin: 6px 2px 4px; font-size: 11.5px; color: var(--pdt-muted); }\n.pdt-code { font-family: ui-monospace, Consolas, monospace; font-size: 0.85em; background: oklch(0.26 0 0);\n padding: 1px 5px; border-radius: 4px; }\n.pdt-error { margin-top: 8px; border: 1px solid color-mix(in oklch, var(--pdt-danger), transparent 55%);\n border-radius: 8px; padding: 8px 10px; font-size: 12.5px; color: var(--pdt-danger); }\n.pdt-error ul { margin: 6px 0 0; padding-left: 18px; color: var(--pdt-fg); }\n\n.pdt-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }\n.pdt-table td { padding: 4px 8px; border-bottom: 1px solid var(--pdt-border); }\n.pdt-table td:last-child { text-align: right; color: var(--pdt-muted); font-family: ui-monospace, Consolas, monospace; }\n.pdt-dot { display: inline-block; width: 7px; height: 7px; border-radius: 50%; margin-right: 7px; }\n.pdt-dot-on { background: oklch(0.75 0.15 165); } .pdt-dot-off { background: oklch(0.45 0 0); }\n\n.pdt-settings-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 6px 4px; }\n.pdt-corner-grid { display: grid; grid-template-columns: repeat(2, 24px); gap: 3px; }\n.pdt-corner-btn { width: 24px; height: 24px; display: flex; align-items: center; justify-content: center;\n border: 1px solid var(--pdt-border); border-radius: 5px; font-size: 12px; }\n.pdt-corner-btn:hover { background: var(--pdt-hover); }\n.pdt-corner-btn.pdt-active { background: var(--pdt-accent); border-color: var(--pdt-accent); color: oklch(0.13 0 0); }\n.pdt-seg { display: flex; overflow: hidden; border: 1px solid var(--pdt-border); border-radius: 6px; }\n.pdt-seg button { padding: 4px 10px; font-size: 11px; text-transform: uppercase; }\n.pdt-seg button:hover { background: var(--pdt-hover); }\n.pdt-seg button.pdt-active { background: var(--pdt-accent); color: oklch(0.13 0 0); font-weight: 600; }\n\n.pdt-menu-row.pdt-current { background: var(--pdt-hover); }\n.pdt-menu-row.pdt-current > span:first-child { color: var(--pdt-accent); font-weight: 600; }\n\n@media print { .pdt-root { display: none !important; } }\n`\n"],"names":["PDT_CSS"],"mappings":"AAAA;;2DAE2D,GAC3D,OAAO,MAAMA,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsHxB,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activateIconSet.d.ts","sourceRoot":"","sources":["../../src/endpoints/activateIconSet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvD;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"activateIconSet.d.ts","sourceRoot":"","sources":["../../src/endpoints/activateIconSet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGvD;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CA8BzE"}
|
|
@@ -31,6 +31,8 @@ import { devToolsEnabled } from "../options.js";
|
|
|
31
31
|
await req.payload.update({
|
|
32
32
|
collection: marker.iconSetSlug,
|
|
33
33
|
id: body.id,
|
|
34
|
+
// Through `never`: the app's generated update-data union only knows the app's own
|
|
35
|
+
// collections — hosts without payload-icons' iconSet can't type `active`.
|
|
34
36
|
data: {
|
|
35
37
|
active: true,
|
|
36
38
|
_status: 'published'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/endpoints/activateIconSet.ts"],"sourcesContent":["import type { CollectionSlug, Endpoint } from 'payload'\nimport { devToolsEnabled } from '../options'\n\n/**\n * `POST /api/dev/icons/activate` (body `{ id }`) — activate an icon set, publishing the change so\n * the frontend re-skins immediately. Powers the set switcher on the `/dev/icons` page: flipping\n * between sets to visually compare them is exactly the kind of one-click dev action this plugin\n * exists for. payload-icons' own single-active hook deactivates the others. Dev-only (404s\n * otherwise); requires payload-icons (discovered via its config marker).\n */\nexport function createActivateIconSetEndpoint(enabled?: boolean): Endpoint {\n return {\n path: '/dev/icons/activate',\n method: 'post',\n handler: async (req) => {\n if (!devToolsEnabled(enabled)) return Response.json({ error: 'Not found' }, { status: 404 })\n\n const marker = req.payload.config.custom?.payloadIcons as { iconSetSlug?: string | null } | undefined\n if (!marker?.iconSetSlug)\n return Response.json({ error: 'payload-icons (with its iconSet collection) is not installed.' }, { status: 400 })\n\n const body = (await req.json?.().catch(() => null)) as { id?: string | number } | null\n if (!body?.id) return Response.json({ error: 'Missing icon set `id`.' }, { status: 400 })\n\n try {\n await req.payload.update({\n collection: marker.iconSetSlug as CollectionSlug,\n id: body.id,\n data: { active: true, _status: 'published' },\n draft: false,\n overrideAccess: true,\n })\n return Response.json({ success: true })\n } catch (e) {\n return Response.json({ error: e instanceof Error ? e.message : 'Failed to activate icon set.' }, { status: 500 })\n }\n },\n }\n}\n"],"names":["devToolsEnabled","createActivateIconSetEndpoint","enabled","path","method","handler","req","Response","json","error","status","marker","payload","config","custom","payloadIcons","iconSetSlug","body","catch","id","update","collection","data","active","_status","draft","overrideAccess","success","e","Error","message"],"mappings":"AACA,SAASA,eAAe,QAAQ,gBAAY;AAE5C;;;;;;CAMC,GACD,OAAO,SAASC,8BAA8BC,OAAiB;IAC7D,OAAO;QACLC,MAAM;QACNC,QAAQ;QACRC,SAAS,OAAOC;YACd,IAAI,CAACN,gBAAgBE,UAAU,OAAOK,SAASC,IAAI,CAAC;gBAAEC,OAAO;YAAY,GAAG;gBAAEC,QAAQ;YAAI;YAE1F,MAAMC,SAASL,IAAIM,OAAO,CAACC,MAAM,CAACC,MAAM,EAAEC;YAC1C,IAAI,CAACJ,QAAQK,aACX,OAAOT,SAASC,IAAI,CAAC;gBAAEC,OAAO;YAAgE,GAAG;gBAAEC,QAAQ;YAAI;YAEjH,MAAMO,OAAQ,MAAMX,IAAIE,IAAI,KAAKU,MAAM,IAAM;YAC7C,IAAI,CAACD,MAAME,IAAI,OAAOZ,SAASC,IAAI,CAAC;gBAAEC,OAAO;YAAyB,GAAG;gBAAEC,QAAQ;YAAI;YAEvF,IAAI;gBACF,MAAMJ,IAAIM,OAAO,CAACQ,MAAM,CAAC;oBACvBC,YAAYV,OAAOK,WAAW;oBAC9BG,IAAIF,KAAKE,EAAE;
|
|
1
|
+
{"version":3,"sources":["../../src/endpoints/activateIconSet.ts"],"sourcesContent":["import type { CollectionSlug, Endpoint } from 'payload'\nimport { devToolsEnabled } from '../options'\n\n/**\n * `POST /api/dev/icons/activate` (body `{ id }`) — activate an icon set, publishing the change so\n * the frontend re-skins immediately. Powers the set switcher on the `/dev/icons` page: flipping\n * between sets to visually compare them is exactly the kind of one-click dev action this plugin\n * exists for. payload-icons' own single-active hook deactivates the others. Dev-only (404s\n * otherwise); requires payload-icons (discovered via its config marker).\n */\nexport function createActivateIconSetEndpoint(enabled?: boolean): Endpoint {\n return {\n path: '/dev/icons/activate',\n method: 'post',\n handler: async (req) => {\n if (!devToolsEnabled(enabled)) return Response.json({ error: 'Not found' }, { status: 404 })\n\n const marker = req.payload.config.custom?.payloadIcons as { iconSetSlug?: string | null } | undefined\n if (!marker?.iconSetSlug)\n return Response.json({ error: 'payload-icons (with its iconSet collection) is not installed.' }, { status: 400 })\n\n const body = (await req.json?.().catch(() => null)) as { id?: string | number } | null\n if (!body?.id) return Response.json({ error: 'Missing icon set `id`.' }, { status: 400 })\n\n try {\n await req.payload.update({\n collection: marker.iconSetSlug as CollectionSlug,\n id: body.id,\n // Through `never`: the app's generated update-data union only knows the app's own\n // collections — hosts without payload-icons' iconSet can't type `active`.\n data: { active: true, _status: 'published' } as never,\n draft: false,\n overrideAccess: true,\n })\n return Response.json({ success: true })\n } catch (e) {\n return Response.json({ error: e instanceof Error ? e.message : 'Failed to activate icon set.' }, { status: 500 })\n }\n },\n }\n}\n"],"names":["devToolsEnabled","createActivateIconSetEndpoint","enabled","path","method","handler","req","Response","json","error","status","marker","payload","config","custom","payloadIcons","iconSetSlug","body","catch","id","update","collection","data","active","_status","draft","overrideAccess","success","e","Error","message"],"mappings":"AACA,SAASA,eAAe,QAAQ,gBAAY;AAE5C;;;;;;CAMC,GACD,OAAO,SAASC,8BAA8BC,OAAiB;IAC7D,OAAO;QACLC,MAAM;QACNC,QAAQ;QACRC,SAAS,OAAOC;YACd,IAAI,CAACN,gBAAgBE,UAAU,OAAOK,SAASC,IAAI,CAAC;gBAAEC,OAAO;YAAY,GAAG;gBAAEC,QAAQ;YAAI;YAE1F,MAAMC,SAASL,IAAIM,OAAO,CAACC,MAAM,CAACC,MAAM,EAAEC;YAC1C,IAAI,CAACJ,QAAQK,aACX,OAAOT,SAASC,IAAI,CAAC;gBAAEC,OAAO;YAAgE,GAAG;gBAAEC,QAAQ;YAAI;YAEjH,MAAMO,OAAQ,MAAMX,IAAIE,IAAI,KAAKU,MAAM,IAAM;YAC7C,IAAI,CAACD,MAAME,IAAI,OAAOZ,SAASC,IAAI,CAAC;gBAAEC,OAAO;YAAyB,GAAG;gBAAEC,QAAQ;YAAI;YAEvF,IAAI;gBACF,MAAMJ,IAAIM,OAAO,CAACQ,MAAM,CAAC;oBACvBC,YAAYV,OAAOK,WAAW;oBAC9BG,IAAIF,KAAKE,EAAE;oBACX,kFAAkF;oBAClF,0EAA0E;oBAC1EG,MAAM;wBAAEC,QAAQ;wBAAMC,SAAS;oBAAY;oBAC3CC,OAAO;oBACPC,gBAAgB;gBAClB;gBACA,OAAOnB,SAASC,IAAI,CAAC;oBAAEmB,SAAS;gBAAK;YACvC,EAAE,OAAOC,GAAG;gBACV,OAAOrB,SAASC,IAAI,CAAC;oBAAEC,OAAOmB,aAAaC,QAAQD,EAAEE,OAAO,GAAG;gBAA+B,GAAG;oBAAEpB,QAAQ;gBAAI;YACjH;QACF;IACF;AACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Endpoint } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* `GET /api/dev/draft` — Next.js draft mode as a dev-tools switch. Without params it reports
|
|
4
|
+
* `{ enabled }`; `?enable=1|0` (also `true/false`, `on/off`) flips it and reports the new state.
|
|
5
|
+
* `?to=/path` redirects (303, same-site only) instead of returning JSON, so a script or an AI
|
|
6
|
+
* agent can land on a page with drafts visible via one URL. The toolbar's Draft mode toggle
|
|
7
|
+
* calls this. Uses `draftMode()` from `next/headers` (imported lazily — the plugin entry stays
|
|
8
|
+
* loadable outside Next, e.g. under the Payload CLI), so the real `__prerender_bypass` cookie is
|
|
9
|
+
* set, exactly as a preview route would. Outside dev it 404s (see {@link devToolsEnabled}).
|
|
10
|
+
*/
|
|
11
|
+
export declare function createDraftEndpoint(enabled?: boolean): Endpoint;
|
|
12
|
+
//# sourceMappingURL=draft.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draft.d.ts","sourceRoot":"","sources":["../../src/endpoints/draft.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAMvC;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CA8B/D"}
|