@orion-studios/payload-studio 0.6.0-beta.10 → 0.6.0-beta.12

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.
@@ -1231,17 +1231,22 @@ var resolveUploadUrl = (value) => {
1231
1231
  var resolveLogoUrl = (settings) => {
1232
1232
  return resolveUploadUrl(settings.logo) || resolveUploadUrl(settings.adminLogo) || resolveUploadUrl(settings.brandLogo) || null;
1233
1233
  };
1234
+ var resolveLogoOnDarkUrl = (settings) => {
1235
+ return resolveUploadUrl(settings.logoOnDark) || resolveUploadUrl(settings.logoDark) || resolveUploadUrl(settings.adminLogoDark) || resolveUploadUrl(settings.adminLogoOnDark) || resolveUploadUrl(settings.brandLogoDark) || null;
1236
+ };
1234
1237
  var cachedBranding = null;
1235
- function useSiteBranding(defaultName, defaultLogoUrl) {
1238
+ function useSiteBranding(defaultName, defaultLogoUrl, defaultLogoOnDarkUrl) {
1236
1239
  const [branding, setBranding] = (0, import_react.useState)(() => {
1237
1240
  if (cachedBranding) {
1238
1241
  return {
1239
1242
  logoUrl: cachedBranding.logoUrl || defaultLogoUrl || null,
1243
+ logoOnDarkUrl: cachedBranding.logoOnDarkUrl || defaultLogoOnDarkUrl || null,
1240
1244
  siteName: cachedBranding.siteName || defaultName || null
1241
1245
  };
1242
1246
  }
1243
1247
  return {
1244
1248
  logoUrl: defaultLogoUrl || null,
1249
+ logoOnDarkUrl: defaultLogoOnDarkUrl || null,
1245
1250
  siteName: defaultName || null
1246
1251
  };
1247
1252
  });
@@ -1258,9 +1263,11 @@ function useSiteBranding(defaultName, defaultLogoUrl) {
1258
1263
  if (!record) return;
1259
1264
  const siteName = pickString(record.siteName);
1260
1265
  const logoUrl = resolveLogoUrl(record);
1261
- cachedBranding = { logoUrl, siteName };
1266
+ const logoOnDarkUrl = resolveLogoOnDarkUrl(record);
1267
+ cachedBranding = { logoOnDarkUrl, logoUrl, siteName };
1262
1268
  if (!cancelled) {
1263
1269
  setBranding({
1270
+ logoOnDarkUrl: logoOnDarkUrl || defaultLogoOnDarkUrl || null,
1264
1271
  logoUrl: logoUrl || defaultLogoUrl || null,
1265
1272
  siteName: siteName || defaultName || null
1266
1273
  });
@@ -1272,16 +1279,20 @@ function useSiteBranding(defaultName, defaultLogoUrl) {
1272
1279
  return () => {
1273
1280
  cancelled = true;
1274
1281
  };
1275
- }, [defaultLogoUrl, defaultName]);
1282
+ }, [defaultLogoOnDarkUrl, defaultLogoUrl, defaultName]);
1276
1283
  return branding;
1277
1284
  }
1278
1285
 
1279
1286
  // src/admin/components/Logo.tsx
1280
1287
  var import_jsx_runtime = require("react/jsx-runtime");
1281
- function Logo({ brandName = "Orion Studio", logoUrl } = {}) {
1282
- const branding = useSiteBranding(brandName, logoUrl);
1288
+ function Logo({ brandName = "Orion Studio", logoOnDarkUrl, logoUrl } = {}) {
1289
+ const branding = useSiteBranding(brandName, logoUrl, logoOnDarkUrl);
1283
1290
  const resolvedName = branding.siteName || brandName;
1284
1291
  const resolvedLogo = branding.logoUrl || logoUrl || null;
1292
+ const resolvedLogoOnDark = branding.logoOnDarkUrl || logoOnDarkUrl || resolvedLogo || "";
1293
+ const hasDarkLogoVariant = Boolean(
1294
+ resolvedLogo && resolvedLogoOnDark.trim().length > 0 && resolvedLogoOnDark !== resolvedLogo
1295
+ );
1285
1296
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
1286
1297
  "div",
1287
1298
  {
@@ -1300,8 +1311,6 @@ function Logo({ brandName = "Orion Studio", logoUrl } = {}) {
1300
1311
  className: "orion-admin-logo-mark",
1301
1312
  style: {
1302
1313
  alignItems: "center",
1303
- background: "var(--orion-cms-logo-bg, var(--admin-accent, #3b82f6))",
1304
- borderRadius: "var(--orion-cms-logo-radius, var(--admin-radius-md, 8px))",
1305
1314
  display: "flex",
1306
1315
  flexShrink: 0,
1307
1316
  height: 32,
@@ -1309,14 +1318,25 @@ function Logo({ brandName = "Orion Studio", logoUrl } = {}) {
1309
1318
  overflow: "hidden",
1310
1319
  width: 32
1311
1320
  },
1312
- children: resolvedLogo ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1313
- "img",
1314
- {
1315
- alt: `${resolvedName} logo`,
1316
- src: resolvedLogo,
1317
- style: { height: "100%", objectFit: "cover", width: "100%" }
1318
- }
1319
- ) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
1321
+ children: resolvedLogo ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
1322
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1323
+ "img",
1324
+ {
1325
+ alt: `${resolvedName} logo`,
1326
+ className: `orion-admin-logo-image orion-admin-logo-image--default${hasDarkLogoVariant ? "" : " is-only-logo"}`,
1327
+ src: resolvedLogo
1328
+ }
1329
+ ),
1330
+ hasDarkLogoVariant ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
1331
+ "img",
1332
+ {
1333
+ alt: "",
1334
+ "aria-hidden": "true",
1335
+ className: "orion-admin-logo-image orion-admin-logo-image--dark",
1336
+ src: resolvedLogoOnDark
1337
+ }
1338
+ ) : null
1339
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
1320
1340
  "svg",
1321
1341
  {
1322
1342
  fill: "none",
@@ -2554,7 +2574,7 @@ var navItemIsActive = (pathname, item) => {
2554
2574
  };
2555
2575
 
2556
2576
  // src/shared/studioSections.ts
2557
- var studioRoles = /* @__PURE__ */ new Set(["admin", "editor", "client"]);
2577
+ var studioRoles = /* @__PURE__ */ new Set(["admin", "developer", "editor", "client"]);
2558
2578
  var studioIcons = new Set(adminNavIcons);
2559
2579
  var isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
2560
2580
  var isAbsoluteExternalURL2 = (value) => /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(value) || value.startsWith("//");
@@ -2752,7 +2772,7 @@ var buildStudioNavItems = (props, adminBasePath) => {
2752
2772
  icon: "tools",
2753
2773
  label: "Admin Tools",
2754
2774
  matchPrefixes: [toolsPath, resolveAdminPath(adminBasePath, "/collections/users")],
2755
- roles: ["admin"]
2775
+ roles: ["admin", "developer"]
2756
2776
  };
2757
2777
  const extensionItems = sections.map((section) => ({
2758
2778
  href: resolveAdminPath(adminBasePath, section.href),
@@ -3193,9 +3213,9 @@ var import_react16 = require("react");
3193
3213
  var import_link = __toESM(require("next/link"));
3194
3214
  var import_jsx_runtime21 = require("react/jsx-runtime");
3195
3215
  var SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1e3;
3196
- var isRole = (value) => value === "admin" || value === "editor" || value === "client";
3197
- var canReviewForms = (role) => role === "admin" || role === "editor";
3198
- var canCreatePages = (role) => role === "admin" || role === "editor";
3216
+ var isRole = (value) => value === "admin" || value === "client" || value === "developer" || value === "editor";
3217
+ var canReviewForms = (role) => role === "admin" || role === "developer" || role === "editor";
3218
+ var canCreatePages = (role) => role === "admin" || role === "developer" || role === "editor";
3199
3219
  var canAccess = (role, roles) => {
3200
3220
  if (!roles || roles.length === 0) {
3201
3221
  return true;
@@ -3671,7 +3691,7 @@ function AdminStudioDashboardClient({
3671
3691
  label: "Manage Media",
3672
3692
  tone: "ghost"
3673
3693
  });
3674
- if (role === "admin") {
3694
+ if (role === "admin" || role === "developer") {
3675
3695
  actions.push({
3676
3696
  description: "Manage users, roles, and fallback tools.",
3677
3697
  href: toolsPath,
@@ -3950,7 +3970,7 @@ var buildSectionLinks = (adminBasePath, sections, formsEnabled, globalsBasePath)
3950
3970
  href: resolveAdminPath2(adminBasePath, "/tools"),
3951
3971
  id: "admin-tools",
3952
3972
  label: "Admin Tools",
3953
- roles: ["admin"]
3973
+ roles: ["admin", "developer"]
3954
3974
  }
3955
3975
  ];
3956
3976
  const seen = /* @__PURE__ */ new Set();
@@ -4020,10 +4040,10 @@ var import_react17 = require("react");
4020
4040
  var import_link2 = __toESM(require("next/link"));
4021
4041
  var import_ui5 = require("@payloadcms/ui");
4022
4042
  var import_jsx_runtime23 = require("react/jsx-runtime");
4023
- var isAdmin = (user) => {
4043
+ var hasAdminAccess = (user) => {
4024
4044
  if (!user || typeof user !== "object") return false;
4025
4045
  const role = user.role;
4026
- return typeof role === "string" && role === "admin";
4046
+ return typeof role === "string" && (role === "admin" || role === "developer");
4027
4047
  };
4028
4048
  var getPropString3 = (props, key, fallback) => {
4029
4049
  if (!props || typeof props !== "object") return fallback;
@@ -4086,7 +4106,7 @@ function AdminStudioPagesListView(props) {
4086
4106
  return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(StudioSectionLayout, { navProps: props, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
4087
4107
  AdminPage,
4088
4108
  {
4089
- actions: isAdmin(user) ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_link2.default, { className: "orion-admin-action-button", href: newPagePath, children: "New Page" }) : null,
4109
+ actions: hasAdminAccess(user) ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_link2.default, { className: "orion-admin-action-button", href: newPagePath, children: "New Page" }) : null,
4090
4110
  breadcrumbs: [
4091
4111
  { label: "Dashboard", href: adminBasePath },
4092
4112
  { label: "Pages" }
@@ -4121,10 +4141,10 @@ function AdminStudioPagesListView(props) {
4121
4141
  var import_react18 = require("react");
4122
4142
  var import_ui6 = require("@payloadcms/ui");
4123
4143
  var import_jsx_runtime24 = require("react/jsx-runtime");
4124
- var isAdmin2 = (user) => {
4144
+ var hasAdminAccess2 = (user) => {
4125
4145
  if (!user || typeof user !== "object") return false;
4126
4146
  const role = user.role;
4127
- return typeof role === "string" && role === "admin";
4147
+ return typeof role === "string" && (role === "admin" || role === "developer");
4128
4148
  };
4129
4149
  var isEditor = (user) => {
4130
4150
  if (!user || typeof user !== "object") return false;
@@ -4182,7 +4202,7 @@ function AdminStudioPageEditView(props) {
4182
4202
  }
4183
4203
  setDidResolvePathFallback(true);
4184
4204
  }, [pageIDFromParams]);
4185
- const canPublish = isAdmin2(user) || isEditor(user);
4205
+ const canPublish = hasAdminAccess2(user) || isEditor(user);
4186
4206
  const refreshUnpublishedState = async (id) => {
4187
4207
  try {
4188
4208
  const response = await fetch(
@@ -4475,7 +4495,7 @@ var getPropString5 = (props, key, fallback) => {
4475
4495
  var canManagePages = (user) => {
4476
4496
  if (!user || typeof user !== "object") return false;
4477
4497
  const role = user.role;
4478
- return role === "admin" || role === "editor";
4498
+ return role === "admin" || role === "developer" || role === "editor";
4479
4499
  };
4480
4500
  var slugify = (value) => value.toLowerCase().trim().replace(/[^a-z0-9\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-");
4481
4501
  function AdminStudioNewPageView(props) {
@@ -4497,7 +4517,7 @@ function AdminStudioNewPageView(props) {
4497
4517
  title: "New Page",
4498
4518
  children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: "orion-admin-card", children: [
4499
4519
  /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("strong", { children: "Access denied" }),
4500
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { children: "This section is restricted to administrator and editor accounts." })
4520
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { children: "This section is restricted to administrator, developer, and editor accounts." })
4501
4521
  ] })
4502
4522
  }
4503
4523
  ) });
@@ -7511,17 +7531,17 @@ var FORM_TONE_OVERRIDES = {
7511
7531
  var IDENTITY_KEYS = /* @__PURE__ */ new Set(["contactEmail", "email", "firstName", "lastName", "name"]);
7512
7532
  var RESPONSE_FIELD_PREVIEW_LIMIT = 3;
7513
7533
  var RESPONSE_SCROLL_THRESHOLD = 3;
7514
- var isAdmin3 = (user) => {
7534
+ var hasAdminAccess3 = (user) => {
7515
7535
  if (!user || typeof user !== "object") return false;
7516
7536
  const role = user.role;
7517
- return typeof role === "string" && role === "admin";
7537
+ return typeof role === "string" && (role === "admin" || role === "developer");
7518
7538
  };
7519
7539
  var isEditor2 = (user) => {
7520
7540
  if (!user || typeof user !== "object") return false;
7521
7541
  const role = user.role;
7522
7542
  return typeof role === "string" && role === "editor";
7523
7543
  };
7524
- var canReviewForms2 = (user) => isAdmin3(user) || isEditor2(user);
7544
+ var canReviewForms2 = (user) => hasAdminAccess3(user) || isEditor2(user);
7525
7545
  var getPropString13 = (props, key, fallback) => {
7526
7546
  if (!props || typeof props !== "object") return fallback;
7527
7547
  const direct = props[key];
@@ -8004,11 +8024,11 @@ function AdminStudioFormsView(props) {
8004
8024
  var import_react32 = require("react");
8005
8025
  var import_ui12 = require("@payloadcms/ui");
8006
8026
  var import_jsx_runtime41 = require("react/jsx-runtime");
8007
- var userRoles = ["admin", "client", "editor"];
8008
- var isAdmin4 = (user) => {
8027
+ var userRoles = ["admin", "client", "developer", "editor"];
8028
+ var hasAdminAccess4 = (user) => {
8009
8029
  if (!user || typeof user !== "object") return false;
8010
8030
  const role = user.role;
8011
- return typeof role === "string" && role === "admin";
8031
+ return typeof role === "string" && (role === "admin" || role === "developer");
8012
8032
  };
8013
8033
  var normalizeRole = (value) => userRoles.includes(value) ? value : "editor";
8014
8034
  function AdminStudioToolsView(props) {
@@ -8020,7 +8040,7 @@ function AdminStudioToolsView(props) {
8020
8040
  const [savedMessage, setSavedMessage] = (0, import_react32.useState)(null);
8021
8041
  const [createSubmitting, setCreateSubmitting] = (0, import_react32.useState)(false);
8022
8042
  const [updatingUserID, setUpdatingUserID] = (0, import_react32.useState)(null);
8023
- if (!isAdmin4(user)) {
8043
+ if (!hasAdminAccess4(user)) {
8024
8044
  return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(StudioSectionLayout, { navProps: props, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
8025
8045
  AdminPage,
8026
8046
  {
@@ -8032,7 +8052,7 @@ function AdminStudioToolsView(props) {
8032
8052
  title: "Admin Tools",
8033
8053
  children: /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "orion-admin-card", children: [
8034
8054
  /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("strong", { children: "Access denied" }),
8035
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { children: "This section is restricted to administrator accounts." })
8055
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { children: "This section is restricted to administrator and developer accounts." })
8036
8056
  ] })
8037
8057
  }
8038
8058
  ) });
@@ -41,17 +41,22 @@ var resolveUploadUrl = (value) => {
41
41
  var resolveLogoUrl = (settings) => {
42
42
  return resolveUploadUrl(settings.logo) || resolveUploadUrl(settings.adminLogo) || resolveUploadUrl(settings.brandLogo) || null;
43
43
  };
44
+ var resolveLogoOnDarkUrl = (settings) => {
45
+ return resolveUploadUrl(settings.logoOnDark) || resolveUploadUrl(settings.logoDark) || resolveUploadUrl(settings.adminLogoDark) || resolveUploadUrl(settings.adminLogoOnDark) || resolveUploadUrl(settings.brandLogoDark) || null;
46
+ };
44
47
  var cachedBranding = null;
45
- function useSiteBranding(defaultName, defaultLogoUrl) {
48
+ function useSiteBranding(defaultName, defaultLogoUrl, defaultLogoOnDarkUrl) {
46
49
  const [branding, setBranding] = useState(() => {
47
50
  if (cachedBranding) {
48
51
  return {
49
52
  logoUrl: cachedBranding.logoUrl || defaultLogoUrl || null,
53
+ logoOnDarkUrl: cachedBranding.logoOnDarkUrl || defaultLogoOnDarkUrl || null,
50
54
  siteName: cachedBranding.siteName || defaultName || null
51
55
  };
52
56
  }
53
57
  return {
54
58
  logoUrl: defaultLogoUrl || null,
59
+ logoOnDarkUrl: defaultLogoOnDarkUrl || null,
55
60
  siteName: defaultName || null
56
61
  };
57
62
  });
@@ -68,9 +73,11 @@ function useSiteBranding(defaultName, defaultLogoUrl) {
68
73
  if (!record) return;
69
74
  const siteName = pickString(record.siteName);
70
75
  const logoUrl = resolveLogoUrl(record);
71
- cachedBranding = { logoUrl, siteName };
76
+ const logoOnDarkUrl = resolveLogoOnDarkUrl(record);
77
+ cachedBranding = { logoOnDarkUrl, logoUrl, siteName };
72
78
  if (!cancelled) {
73
79
  setBranding({
80
+ logoOnDarkUrl: logoOnDarkUrl || defaultLogoOnDarkUrl || null,
74
81
  logoUrl: logoUrl || defaultLogoUrl || null,
75
82
  siteName: siteName || defaultName || null
76
83
  });
@@ -82,16 +89,20 @@ function useSiteBranding(defaultName, defaultLogoUrl) {
82
89
  return () => {
83
90
  cancelled = true;
84
91
  };
85
- }, [defaultLogoUrl, defaultName]);
92
+ }, [defaultLogoOnDarkUrl, defaultLogoUrl, defaultName]);
86
93
  return branding;
87
94
  }
88
95
 
89
96
  // src/admin/components/Logo.tsx
90
- import { jsx, jsxs } from "react/jsx-runtime";
91
- function Logo({ brandName = "Orion Studio", logoUrl } = {}) {
92
- const branding = useSiteBranding(brandName, logoUrl);
97
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
98
+ function Logo({ brandName = "Orion Studio", logoOnDarkUrl, logoUrl } = {}) {
99
+ const branding = useSiteBranding(brandName, logoUrl, logoOnDarkUrl);
93
100
  const resolvedName = branding.siteName || brandName;
94
101
  const resolvedLogo = branding.logoUrl || logoUrl || null;
102
+ const resolvedLogoOnDark = branding.logoOnDarkUrl || logoOnDarkUrl || resolvedLogo || "";
103
+ const hasDarkLogoVariant = Boolean(
104
+ resolvedLogo && resolvedLogoOnDark.trim().length > 0 && resolvedLogoOnDark !== resolvedLogo
105
+ );
95
106
  return /* @__PURE__ */ jsxs(
96
107
  "div",
97
108
  {
@@ -110,8 +121,6 @@ function Logo({ brandName = "Orion Studio", logoUrl } = {}) {
110
121
  className: "orion-admin-logo-mark",
111
122
  style: {
112
123
  alignItems: "center",
113
- background: "var(--orion-cms-logo-bg, var(--admin-accent, #3b82f6))",
114
- borderRadius: "var(--orion-cms-logo-radius, var(--admin-radius-md, 8px))",
115
124
  display: "flex",
116
125
  flexShrink: 0,
117
126
  height: 32,
@@ -119,14 +128,25 @@ function Logo({ brandName = "Orion Studio", logoUrl } = {}) {
119
128
  overflow: "hidden",
120
129
  width: 32
121
130
  },
122
- children: resolvedLogo ? /* @__PURE__ */ jsx(
123
- "img",
124
- {
125
- alt: `${resolvedName} logo`,
126
- src: resolvedLogo,
127
- style: { height: "100%", objectFit: "cover", width: "100%" }
128
- }
129
- ) : /* @__PURE__ */ jsxs(
131
+ children: resolvedLogo ? /* @__PURE__ */ jsxs(Fragment, { children: [
132
+ /* @__PURE__ */ jsx(
133
+ "img",
134
+ {
135
+ alt: `${resolvedName} logo`,
136
+ className: `orion-admin-logo-image orion-admin-logo-image--default${hasDarkLogoVariant ? "" : " is-only-logo"}`,
137
+ src: resolvedLogo
138
+ }
139
+ ),
140
+ hasDarkLogoVariant ? /* @__PURE__ */ jsx(
141
+ "img",
142
+ {
143
+ alt: "",
144
+ "aria-hidden": "true",
145
+ className: "orion-admin-logo-image orion-admin-logo-image--dark",
146
+ src: resolvedLogoOnDark
147
+ }
148
+ ) : null
149
+ ] }) : /* @__PURE__ */ jsxs(
130
150
  "svg",
131
151
  {
132
152
  fill: "none",
@@ -463,7 +483,7 @@ function useTheme(defaultTheme = "brand-light") {
463
483
  }
464
484
 
465
485
  // src/admin/components/ThemeSwitcher.tsx
466
- import { Fragment, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
486
+ import { Fragment as Fragment2, jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
467
487
  var iconSize = 16;
468
488
  function SunIcon() {
469
489
  return /* @__PURE__ */ jsxs5("svg", { width: iconSize, height: iconSize, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", children: [
@@ -603,7 +623,7 @@ function ThemeProvider({
603
623
  } catch {
604
624
  }
605
625
  }, [allowThemePreference, defaultTheme]);
606
- return /* @__PURE__ */ jsx5(Fragment, { children });
626
+ return /* @__PURE__ */ jsx5(Fragment2, { children });
607
627
  }
608
628
 
609
629
  // src/admin/components/HelpTooltip.tsx
@@ -1333,7 +1353,7 @@ var useAdminBasePath = (fallback = DEFAULT_ADMIN_BASE_PATH) => {
1333
1353
  };
1334
1354
 
1335
1355
  // src/shared/studioSections.ts
1336
- var studioRoles = /* @__PURE__ */ new Set(["admin", "editor", "client"]);
1356
+ var studioRoles = /* @__PURE__ */ new Set(["admin", "developer", "editor", "client"]);
1337
1357
  var studioIcons = new Set(adminNavIcons);
1338
1358
  var isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
1339
1359
  var isAbsoluteExternalURL2 = (value) => /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(value) || value.startsWith("//");
@@ -1531,7 +1551,7 @@ var buildStudioNavItems = (props, adminBasePath) => {
1531
1551
  icon: "tools",
1532
1552
  label: "Admin Tools",
1533
1553
  matchPrefixes: [toolsPath, resolveAdminPath(adminBasePath, "/collections/users")],
1534
- roles: ["admin"]
1554
+ roles: ["admin", "developer"]
1535
1555
  };
1536
1556
  const extensionItems = sections.map((section) => ({
1537
1557
  href: resolveAdminPath(adminBasePath, section.href),
@@ -1568,7 +1588,7 @@ var isStudioShellRoute = (pathname, props, adminBasePath) => {
1568
1588
  };
1569
1589
 
1570
1590
  // src/admin/components/studio/AdminStudioNav.tsx
1571
- import { Fragment as Fragment2, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
1591
+ import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
1572
1592
  var iconSize2 = 18;
1573
1593
  function NavIcon({ sectionID }) {
1574
1594
  const props = {
@@ -1726,7 +1746,7 @@ function AdminStudioNav(props) {
1726
1746
  textAlign: compact ? "center" : "left"
1727
1747
  },
1728
1748
  children: [
1729
- !compact ? /* @__PURE__ */ jsxs11(Fragment2, { children: [
1749
+ !compact ? /* @__PURE__ */ jsxs11(Fragment3, { children: [
1730
1750
  /* @__PURE__ */ jsx12("div", { style: { color: "var(--theme-elevation-700)", fontSize: "0.85rem" }, children: "Signed in as" }),
1731
1751
  /* @__PURE__ */ jsx12("div", { style: { fontWeight: 800, marginBottom: "0.55rem" }, children: typeof user?.email === "string" ? user.email : "User" })
1732
1752
  ] }) : null,
@@ -1824,9 +1844,9 @@ import { startTransition, useEffect as useEffect7, useMemo as useMemo3, useState
1824
1844
  import Link from "next/link";
1825
1845
  import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
1826
1846
  var SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1e3;
1827
- var isRole = (value) => value === "admin" || value === "editor" || value === "client";
1828
- var canReviewForms = (role) => role === "admin" || role === "editor";
1829
- var canCreatePages = (role) => role === "admin" || role === "editor";
1847
+ var isRole = (value) => value === "admin" || value === "client" || value === "developer" || value === "editor";
1848
+ var canReviewForms = (role) => role === "admin" || role === "developer" || role === "editor";
1849
+ var canCreatePages = (role) => role === "admin" || role === "developer" || role === "editor";
1830
1850
  var canAccess = (role, roles) => {
1831
1851
  if (!roles || roles.length === 0) {
1832
1852
  return true;
@@ -2302,7 +2322,7 @@ function AdminStudioDashboardClient({
2302
2322
  label: "Manage Media",
2303
2323
  tone: "ghost"
2304
2324
  });
2305
- if (role === "admin") {
2325
+ if (role === "admin" || role === "developer") {
2306
2326
  actions.push({
2307
2327
  description: "Manage users, roles, and fallback tools.",
2308
2328
  href: toolsPath,
@@ -2581,7 +2601,7 @@ var buildSectionLinks = (adminBasePath, sections, formsEnabled, globalsBasePath)
2581
2601
  href: resolveAdminPath2(adminBasePath, "/tools"),
2582
2602
  id: "admin-tools",
2583
2603
  label: "Admin Tools",
2584
- roles: ["admin"]
2604
+ roles: ["admin", "developer"]
2585
2605
  }
2586
2606
  ];
2587
2607
  const seen = /* @__PURE__ */ new Set();
@@ -2651,10 +2671,10 @@ import { useEffect as useEffect8, useMemo as useMemo4, useState as useState8 } f
2651
2671
  import Link2 from "next/link";
2652
2672
  import { useAuth as useAuth3 } from "@payloadcms/ui";
2653
2673
  import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
2654
- var isAdmin = (user) => {
2674
+ var hasAdminAccess = (user) => {
2655
2675
  if (!user || typeof user !== "object") return false;
2656
2676
  const role = user.role;
2657
- return typeof role === "string" && role === "admin";
2677
+ return typeof role === "string" && (role === "admin" || role === "developer");
2658
2678
  };
2659
2679
  var getPropString3 = (props, key, fallback) => {
2660
2680
  if (!props || typeof props !== "object") return fallback;
@@ -2717,7 +2737,7 @@ function AdminStudioPagesListView(props) {
2717
2737
  return /* @__PURE__ */ jsx18(StudioSectionLayout, { navProps: props, children: /* @__PURE__ */ jsxs15(
2718
2738
  AdminPage,
2719
2739
  {
2720
- actions: isAdmin(user) ? /* @__PURE__ */ jsx18(Link2, { className: "orion-admin-action-button", href: newPagePath, children: "New Page" }) : null,
2740
+ actions: hasAdminAccess(user) ? /* @__PURE__ */ jsx18(Link2, { className: "orion-admin-action-button", href: newPagePath, children: "New Page" }) : null,
2721
2741
  breadcrumbs: [
2722
2742
  { label: "Dashboard", href: adminBasePath },
2723
2743
  { label: "Pages" }
@@ -2751,11 +2771,11 @@ function AdminStudioPagesListView(props) {
2751
2771
  // src/admin/components/studio/AdminStudioPageEditView.tsx
2752
2772
  import { useEffect as useEffect9, useMemo as useMemo5, useRef as useRef3, useState as useState9 } from "react";
2753
2773
  import { SetStepNav, toast, useAuth as useAuth4 } from "@payloadcms/ui";
2754
- import { Fragment as Fragment3, jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
2755
- var isAdmin2 = (user) => {
2774
+ import { Fragment as Fragment4, jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
2775
+ var hasAdminAccess2 = (user) => {
2756
2776
  if (!user || typeof user !== "object") return false;
2757
2777
  const role = user.role;
2758
- return typeof role === "string" && role === "admin";
2778
+ return typeof role === "string" && (role === "admin" || role === "developer");
2759
2779
  };
2760
2780
  var isEditor = (user) => {
2761
2781
  if (!user || typeof user !== "object") return false;
@@ -2813,7 +2833,7 @@ function AdminStudioPageEditView(props) {
2813
2833
  }
2814
2834
  setDidResolvePathFallback(true);
2815
2835
  }, [pageIDFromParams]);
2816
- const canPublish = isAdmin2(user) || isEditor(user);
2836
+ const canPublish = hasAdminAccess2(user) || isEditor(user);
2817
2837
  const refreshUnpublishedState = async (id) => {
2818
2838
  try {
2819
2839
  const response = await fetch(
@@ -2904,7 +2924,7 @@ function AdminStudioPageEditView(props) {
2904
2924
  return () => window.removeEventListener("message", onMessage);
2905
2925
  }, []);
2906
2926
  if (!pageID && !didResolvePathFallback) {
2907
- return /* @__PURE__ */ jsx19(StudioSectionLayout, { navProps: props, children: /* @__PURE__ */ jsxs16(Fragment3, { children: [
2927
+ return /* @__PURE__ */ jsx19(StudioSectionLayout, { navProps: props, children: /* @__PURE__ */ jsxs16(Fragment4, { children: [
2908
2928
  /* @__PURE__ */ jsx19(
2909
2929
  SetStepNav,
2910
2930
  {
@@ -2919,7 +2939,7 @@ function AdminStudioPageEditView(props) {
2919
2939
  ] }) });
2920
2940
  }
2921
2941
  if (!pageID) {
2922
- return /* @__PURE__ */ jsx19(StudioSectionLayout, { navProps: props, children: /* @__PURE__ */ jsxs16(Fragment3, { children: [
2942
+ return /* @__PURE__ */ jsx19(StudioSectionLayout, { navProps: props, children: /* @__PURE__ */ jsxs16(Fragment4, { children: [
2923
2943
  /* @__PURE__ */ jsx19(
2924
2944
  SetStepNav,
2925
2945
  {
@@ -2933,7 +2953,7 @@ function AdminStudioPageEditView(props) {
2933
2953
  /* @__PURE__ */ jsx19("p", { style: { color: "var(--theme-elevation-600)" }, children: "Missing page ID." })
2934
2954
  ] }) });
2935
2955
  }
2936
- return /* @__PURE__ */ jsx19(StudioSectionLayout, { navProps: props, children: /* @__PURE__ */ jsxs16(Fragment3, { children: [
2956
+ return /* @__PURE__ */ jsx19(StudioSectionLayout, { navProps: props, children: /* @__PURE__ */ jsxs16(Fragment4, { children: [
2937
2957
  /* @__PURE__ */ jsx19(
2938
2958
  SetStepNav,
2939
2959
  {
@@ -3106,7 +3126,7 @@ var getPropString5 = (props, key, fallback) => {
3106
3126
  var canManagePages = (user) => {
3107
3127
  if (!user || typeof user !== "object") return false;
3108
3128
  const role = user.role;
3109
- return role === "admin" || role === "editor";
3129
+ return role === "admin" || role === "developer" || role === "editor";
3110
3130
  };
3111
3131
  var slugify = (value) => value.toLowerCase().trim().replace(/[^a-z0-9\s-]/g, "").replace(/\s+/g, "-").replace(/-+/g, "-");
3112
3132
  function AdminStudioNewPageView(props) {
@@ -3128,7 +3148,7 @@ function AdminStudioNewPageView(props) {
3128
3148
  title: "New Page",
3129
3149
  children: /* @__PURE__ */ jsxs17("div", { className: "orion-admin-card", children: [
3130
3150
  /* @__PURE__ */ jsx20("strong", { children: "Access denied" }),
3131
- /* @__PURE__ */ jsx20("span", { children: "This section is restricted to administrator and editor accounts." })
3151
+ /* @__PURE__ */ jsx20("span", { children: "This section is restricted to administrator, developer, and editor accounts." })
3132
3152
  ] })
3133
3153
  }
3134
3154
  ) });
@@ -5185,17 +5205,17 @@ var FORM_TONE_OVERRIDES = {
5185
5205
  var IDENTITY_KEYS = /* @__PURE__ */ new Set(["contactEmail", "email", "firstName", "lastName", "name"]);
5186
5206
  var RESPONSE_FIELD_PREVIEW_LIMIT = 3;
5187
5207
  var RESPONSE_SCROLL_THRESHOLD = 3;
5188
- var isAdmin3 = (user) => {
5208
+ var hasAdminAccess3 = (user) => {
5189
5209
  if (!user || typeof user !== "object") return false;
5190
5210
  const role = user.role;
5191
- return typeof role === "string" && role === "admin";
5211
+ return typeof role === "string" && (role === "admin" || role === "developer");
5192
5212
  };
5193
5213
  var isEditor2 = (user) => {
5194
5214
  if (!user || typeof user !== "object") return false;
5195
5215
  const role = user.role;
5196
5216
  return typeof role === "string" && role === "editor";
5197
5217
  };
5198
- var canReviewForms2 = (user) => isAdmin3(user) || isEditor2(user);
5218
+ var canReviewForms2 = (user) => hasAdminAccess3(user) || isEditor2(user);
5199
5219
  var getPropString13 = (props, key, fallback) => {
5200
5220
  if (!props || typeof props !== "object") return fallback;
5201
5221
  const direct = props[key];
@@ -5678,11 +5698,11 @@ function AdminStudioFormsView(props) {
5678
5698
  import { useEffect as useEffect18, useState as useState19 } from "react";
5679
5699
  import { useAuth as useAuth7 } from "@payloadcms/ui";
5680
5700
  import { jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
5681
- var userRoles = ["admin", "client", "editor"];
5682
- var isAdmin4 = (user) => {
5701
+ var userRoles = ["admin", "client", "developer", "editor"];
5702
+ var hasAdminAccess4 = (user) => {
5683
5703
  if (!user || typeof user !== "object") return false;
5684
5704
  const role = user.role;
5685
- return typeof role === "string" && role === "admin";
5705
+ return typeof role === "string" && (role === "admin" || role === "developer");
5686
5706
  };
5687
5707
  var normalizeRole = (value) => userRoles.includes(value) ? value : "editor";
5688
5708
  function AdminStudioToolsView(props) {
@@ -5694,7 +5714,7 @@ function AdminStudioToolsView(props) {
5694
5714
  const [savedMessage, setSavedMessage] = useState19(null);
5695
5715
  const [createSubmitting, setCreateSubmitting] = useState19(false);
5696
5716
  const [updatingUserID, setUpdatingUserID] = useState19(null);
5697
- if (!isAdmin4(user)) {
5717
+ if (!hasAdminAccess4(user)) {
5698
5718
  return /* @__PURE__ */ jsx30(StudioSectionLayout, { navProps: props, children: /* @__PURE__ */ jsx30(
5699
5719
  AdminPage,
5700
5720
  {
@@ -5706,7 +5726,7 @@ function AdminStudioToolsView(props) {
5706
5726
  title: "Admin Tools",
5707
5727
  children: /* @__PURE__ */ jsxs27("div", { className: "orion-admin-card", children: [
5708
5728
  /* @__PURE__ */ jsx30("strong", { children: "Access denied" }),
5709
- /* @__PURE__ */ jsx30("span", { children: "This section is restricted to administrator accounts." })
5729
+ /* @__PURE__ */ jsx30("span", { children: "This section is restricted to administrator and developer accounts." })
5710
5730
  ] })
5711
5731
  }
5712
5732
  ) });
@@ -1,4 +1,4 @@
1
- export { A as AdminConfig, a as AdminStudioConfig, b as AdminStudioFooterPreviewConfig, c as AdminStudioHeaderPreviewConfig, d as AdminStudioSitePreviewConfig, C as CreateSocialMediaConnectionsFieldOptions, e as CreateSocialMediaGlobalOptions, R as ResolvedStudioDashboardPanel, f as ResolvedStudioSection, S as StudioDashboardPanel, g as StudioDashboardPanelSpan, h as StudioGlobalLink, j as StudioSection, k as StudioSectionCard, l as StudioSectionComponent, m as StudioSectionRole, n as StudioSectionView, o as configureAdmin, p as createHeaderNavItemsField, q as createSocialMediaConnectionsField, r as createSocialMediaGlobal, s as createThemePreferenceField, t as socialMediaConnectionsField, u as themePreferenceField, w as withTooltips } from '../index-Bm2SaC3r.mjs';
1
+ export { A as AdminConfig, a as AdminStudioConfig, b as AdminStudioFooterPreviewConfig, c as AdminStudioHeaderPreviewConfig, d as AdminStudioSitePreviewConfig, C as CreateSocialMediaConnectionsFieldOptions, e as CreateSocialMediaGlobalOptions, R as ResolvedStudioDashboardPanel, f as ResolvedStudioSection, S as StudioDashboardPanel, g as StudioDashboardPanelSpan, h as StudioGlobalLink, j as StudioSection, k as StudioSectionCard, l as StudioSectionComponent, m as StudioSectionRole, n as StudioSectionView, o as configureAdmin, p as createHeaderNavItemsField, q as createSocialMediaConnectionsField, r as createSocialMediaGlobal, s as createThemePreferenceField, t as socialMediaConnectionsField, u as themePreferenceField, w as withTooltips } from '../index-DLfPOqYA.mjs';
2
2
  export { b as SOCIAL_MEDIA_DEFAULT_ICON_BY_PLATFORM, c as SOCIAL_MEDIA_ICON_OPTIONS, d as SOCIAL_MEDIA_PLATFORMS, e as SOCIAL_MEDIA_PLATFORM_LABELS, S as SocialMediaGlobalData, f as SocialMediaIconLibrary, g as SocialMediaIconOption, a as SocialMediaPlatform, h as SocialMediaProfileData, i as SocialMediaProfilesData } from '../socialMedia-C05Iy-SV.mjs';
3
3
  import 'payload';
4
- import '../sitePreviewTypes-BkHCWxNW.mjs';
4
+ import '../sitePreviewTypes-BrJwGzJj.mjs';
@@ -1,4 +1,4 @@
1
- export { A as AdminConfig, a as AdminStudioConfig, b as AdminStudioFooterPreviewConfig, c as AdminStudioHeaderPreviewConfig, d as AdminStudioSitePreviewConfig, C as CreateSocialMediaConnectionsFieldOptions, e as CreateSocialMediaGlobalOptions, R as ResolvedStudioDashboardPanel, f as ResolvedStudioSection, S as StudioDashboardPanel, g as StudioDashboardPanelSpan, h as StudioGlobalLink, j as StudioSection, k as StudioSectionCard, l as StudioSectionComponent, m as StudioSectionRole, n as StudioSectionView, o as configureAdmin, p as createHeaderNavItemsField, q as createSocialMediaConnectionsField, r as createSocialMediaGlobal, s as createThemePreferenceField, t as socialMediaConnectionsField, u as themePreferenceField, w as withTooltips } from '../index-CkT_eyhK.js';
1
+ export { A as AdminConfig, a as AdminStudioConfig, b as AdminStudioFooterPreviewConfig, c as AdminStudioHeaderPreviewConfig, d as AdminStudioSitePreviewConfig, C as CreateSocialMediaConnectionsFieldOptions, e as CreateSocialMediaGlobalOptions, R as ResolvedStudioDashboardPanel, f as ResolvedStudioSection, S as StudioDashboardPanel, g as StudioDashboardPanelSpan, h as StudioGlobalLink, j as StudioSection, k as StudioSectionCard, l as StudioSectionComponent, m as StudioSectionRole, n as StudioSectionView, o as configureAdmin, p as createHeaderNavItemsField, q as createSocialMediaConnectionsField, r as createSocialMediaGlobal, s as createThemePreferenceField, t as socialMediaConnectionsField, u as themePreferenceField, w as withTooltips } from '../index-BV0vEGl6.js';
2
2
  export { b as SOCIAL_MEDIA_DEFAULT_ICON_BY_PLATFORM, c as SOCIAL_MEDIA_ICON_OPTIONS, d as SOCIAL_MEDIA_PLATFORMS, e as SOCIAL_MEDIA_PLATFORM_LABELS, S as SocialMediaGlobalData, f as SocialMediaIconLibrary, g as SocialMediaIconOption, a as SocialMediaPlatform, h as SocialMediaProfileData, i as SocialMediaProfilesData } from '../socialMedia-C05Iy-SV.js';
3
3
  import 'payload';
4
- import '../sitePreviewTypes-BkHCWxNW.js';
4
+ import '../sitePreviewTypes-BrJwGzJj.js';
@@ -81,7 +81,7 @@ var adminNavIcons = [
81
81
  ];
82
82
 
83
83
  // src/shared/studioSections.ts
84
- var studioRoles = /* @__PURE__ */ new Set(["admin", "editor", "client"]);
84
+ var studioRoles = /* @__PURE__ */ new Set(["admin", "developer", "editor", "client"]);
85
85
  var studioIcons = new Set(adminNavIcons);
86
86
  var isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
87
87
  var isAbsoluteExternalURL = (value) => /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(value) || value.startsWith("//");
@@ -215,6 +215,7 @@ function configureAdmin(config) {
215
215
  brandPrimary = "#3b82f6",
216
216
  brandSecondary = "#8b5cf6",
217
217
  defaultTheme = "brand-light",
218
+ logoOnDarkUrl,
218
219
  logoUrl,
219
220
  allowThemePreference = false,
220
221
  userSessionDurationSeconds = 60 * 60 * 24
@@ -339,6 +340,7 @@ function configureAdmin(config) {
339
340
  path: clientPath,
340
341
  clientProps: {
341
342
  brandName,
343
+ logoOnDarkUrl,
342
344
  logoUrl
343
345
  }
344
346
  },
@@ -347,6 +349,7 @@ function configureAdmin(config) {
347
349
  path: clientPath,
348
350
  clientProps: {
349
351
  brandName,
352
+ logoOnDarkUrl,
350
353
  logoUrl
351
354
  }
352
355
  }
@@ -499,6 +502,7 @@ function configureAdmin(config) {
499
502
  path: clientPath,
500
503
  clientProps: {
501
504
  brandName,
505
+ logoOnDarkUrl,
502
506
  logoUrl
503
507
  }
504
508
  }
@@ -7,7 +7,7 @@ import {
7
7
  socialMediaConnectionsField,
8
8
  themePreferenceField,
9
9
  withTooltips
10
- } from "../chunk-WLOPFFN2.mjs";
10
+ } from "../chunk-XZQILJK3.mjs";
11
11
  import "../chunk-W2UOCJDX.mjs";
12
12
  import {
13
13
  SOCIAL_MEDIA_DEFAULT_ICON_BY_PLATFORM,
@@ -1,4 +1,4 @@
1
- export { A as AdminBreadcrumbs, a as AdminNavInput, b as AdminNavLinkItem, c as AdminPage, d as AdminPageLinkOption, e as AdminPageRecord, M as MediaDetailPanelProps, f as MediaListItemProps, N as NestedNavItem, g as NestedNavItemInput, h as NestedNavTree, j as buildAdminPageLinkOptions, k as buildNestedNavTree, l as getAdminNavRows, n as normalizeAdminNavInputs, m as normalizeNestedNavItems, p as parseAdminHeaderNavFromForm } from '../index-DEQC3Dwj.mjs';
2
- export { A as AdminBreadcrumbItem, a as AdminNavIcon, b as AdminNavItem, c as AdminRole, S as SiteFooterPreviewData, d as SiteHeaderPreviewData, e as SitePreviewLink, f as SitePreviewLocationSummary, g as SitePreviewSocialLink, n as navItemIsActive, r as roleCanAccessNav } from '../sitePreviewTypes-BkHCWxNW.mjs';
1
+ export { A as AdminBreadcrumbs, a as AdminNavInput, b as AdminNavLinkItem, c as AdminPage, d as AdminPageLinkOption, e as AdminPageRecord, M as MediaDetailPanelProps, f as MediaListItemProps, N as NestedNavItem, g as NestedNavItemInput, h as NestedNavTree, j as buildAdminPageLinkOptions, k as buildNestedNavTree, l as getAdminNavRows, n as normalizeAdminNavInputs, m as normalizeNestedNavItems, p as parseAdminHeaderNavFromForm } from '../index-G_uTNffQ.mjs';
2
+ export { A as AdminBreadcrumbItem, a as AdminNavIcon, b as AdminNavItem, c as AdminRole, S as SiteFooterPreviewData, d as SiteHeaderPreviewData, e as SitePreviewLink, f as SitePreviewLocationSummary, g as SitePreviewSocialLink, n as navItemIsActive, r as roleCanAccessNav } from '../sitePreviewTypes-BrJwGzJj.mjs';
3
3
  import 'react/jsx-runtime';
4
4
  import 'react';
@@ -1,4 +1,4 @@
1
- export { A as AdminBreadcrumbs, a as AdminNavInput, b as AdminNavLinkItem, c as AdminPage, d as AdminPageLinkOption, e as AdminPageRecord, M as MediaDetailPanelProps, f as MediaListItemProps, N as NestedNavItem, g as NestedNavItemInput, h as NestedNavTree, j as buildAdminPageLinkOptions, k as buildNestedNavTree, l as getAdminNavRows, n as normalizeAdminNavInputs, m as normalizeNestedNavItems, p as parseAdminHeaderNavFromForm } from '../index-52HdVLQq.js';
2
- export { A as AdminBreadcrumbItem, a as AdminNavIcon, b as AdminNavItem, c as AdminRole, S as SiteFooterPreviewData, d as SiteHeaderPreviewData, e as SitePreviewLink, f as SitePreviewLocationSummary, g as SitePreviewSocialLink, n as navItemIsActive, r as roleCanAccessNav } from '../sitePreviewTypes-BkHCWxNW.js';
1
+ export { A as AdminBreadcrumbs, a as AdminNavInput, b as AdminNavLinkItem, c as AdminPage, d as AdminPageLinkOption, e as AdminPageRecord, M as MediaDetailPanelProps, f as MediaListItemProps, N as NestedNavItem, g as NestedNavItemInput, h as NestedNavTree, j as buildAdminPageLinkOptions, k as buildNestedNavTree, l as getAdminNavRows, n as normalizeAdminNavInputs, m as normalizeNestedNavItems, p as parseAdminHeaderNavFromForm } from '../index-DAdN56fM.js';
2
+ export { A as AdminBreadcrumbItem, a as AdminNavIcon, b as AdminNavItem, c as AdminRole, S as SiteFooterPreviewData, d as SiteHeaderPreviewData, e as SitePreviewLink, f as SitePreviewLocationSummary, g as SitePreviewSocialLink, n as navItemIsActive, r as roleCanAccessNav } from '../sitePreviewTypes-BrJwGzJj.js';
3
3
  import 'react/jsx-runtime';
4
4
  import 'react';
@@ -35,6 +35,11 @@
35
35
  --orion-cms-logo-radius,
36
36
  var(--orion-cms-logo-radius-resolved, var(--orion-admin-radius-md))
37
37
  );
38
+ --orion-admin-logo-bg: var(--orion-cms-logo-bg, transparent);
39
+ --orion-admin-logo-border: var(--orion-cms-logo-border, transparent);
40
+ --orion-admin-logo-shadow: var(--orion-cms-logo-shadow, none);
41
+ --orion-admin-logo-padding: var(--orion-cms-logo-padding, 0px);
42
+ --orion-admin-logo-fit: var(--orion-cms-logo-fit, contain);
38
43
  --orion-admin-control-bg: var(--orion-cms-surface, var(--orion-cms-surface-resolved, #ffffff));
39
44
  --orion-admin-control-hover-bg: color-mix(in srgb, var(--orion-admin-control-bg) 78%, white);
40
45
  --orion-admin-input-bg: var(
@@ -164,19 +169,47 @@
164
169
  }
165
170
 
166
171
  .orion-admin-brand-logo {
172
+ align-items: center;
173
+ background: var(--orion-admin-logo-bg);
174
+ border: 1px solid var(--orion-admin-logo-border);
167
175
  border-radius: var(--orion-admin-logo-radius);
176
+ box-shadow: var(--orion-admin-logo-shadow);
177
+ box-sizing: border-box;
178
+ display: flex;
168
179
  flex: 0 0 auto;
169
180
  height: 48px;
181
+ justify-content: center;
170
182
  overflow: hidden;
183
+ padding: var(--orion-admin-logo-padding);
171
184
  width: 48px;
172
185
  }
173
186
 
174
187
  .orion-admin-brand-logo img {
175
188
  height: 100%;
176
- object-fit: cover;
189
+ object-fit: var(--orion-admin-logo-fit);
177
190
  width: 100%;
178
191
  }
179
192
 
193
+ .orion-admin-logo-mark {
194
+ background: var(--orion-admin-logo-bg);
195
+ border: 1px solid var(--orion-admin-logo-border);
196
+ border-radius: var(--orion-admin-logo-radius);
197
+ box-shadow: var(--orion-admin-logo-shadow);
198
+ box-sizing: border-box;
199
+ padding: var(--orion-admin-logo-padding);
200
+ }
201
+
202
+ .orion-admin-logo-image {
203
+ display: block;
204
+ height: 100%;
205
+ object-fit: var(--orion-admin-logo-fit);
206
+ width: 100%;
207
+ }
208
+
209
+ .orion-admin-logo-image--dark {
210
+ display: none;
211
+ }
212
+
180
213
  .orion-admin-brand-text {
181
214
  min-width: 0;
182
215
  }
@@ -945,12 +978,34 @@
945
978
  }
946
979
 
947
980
  .template-minimal.login .login__brand .orion-admin-logo-mark {
981
+ --orion-admin-logo-bg: var(
982
+ --orion-cms-logo-dark-bg,
983
+ color-mix(in srgb, var(--orion-admin-login-panel-bg) 88%, white)
984
+ );
985
+ --orion-admin-logo-border: var(
986
+ --orion-cms-logo-dark-border,
987
+ color-mix(in srgb, var(--brand-secondary) 26%, rgba(255, 255, 255, 0.28))
988
+ );
989
+ --orion-admin-logo-fit: var(--orion-cms-logo-dark-fit, contain);
990
+ --orion-admin-logo-padding: var(--orion-cms-logo-dark-padding, clamp(0.32rem, 0.8vw, 0.48rem));
991
+ --orion-admin-logo-shadow: var(
992
+ --orion-cms-logo-dark-shadow,
993
+ 0 18px 36px rgba(7, 13, 24, 0.18),
994
+ inset 0 1px 0 rgba(255, 255, 255, 0.72)
995
+ );
948
996
  border-radius: var(--orion-admin-logo-radius) !important;
949
- box-shadow: var(--orion-admin-shadow-card);
950
997
  height: 58px !important;
951
998
  width: 58px !important;
952
999
  }
953
1000
 
1001
+ .template-minimal.login .login__brand .orion-admin-logo-mark .orion-admin-logo-image--dark {
1002
+ display: block;
1003
+ }
1004
+
1005
+ .template-minimal.login .login__brand .orion-admin-logo-mark .orion-admin-logo-image--default:not(.is-only-logo) {
1006
+ display: none;
1007
+ }
1008
+
954
1009
  .template-minimal.login .login__brand .orion-admin-logo-wordmark {
955
1010
  color: var(--orion-admin-login-hero-text) !important;
956
1011
  font-family: var(--orion-cms-font-heading, var(--orion-cms-font-heading-resolved, Georgia, 'Times New Roman', serif));
@@ -53,7 +53,7 @@ var createThemePreferenceField = (defaultTheme = "brand-light") => ({
53
53
  var themePreferenceField = createThemePreferenceField("brand-light");
54
54
 
55
55
  // src/shared/studioSections.ts
56
- var studioRoles = /* @__PURE__ */ new Set(["admin", "editor", "client"]);
56
+ var studioRoles = /* @__PURE__ */ new Set(["admin", "developer", "editor", "client"]);
57
57
  var studioIcons = new Set(adminNavIcons);
58
58
  var isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
59
59
  var isAbsoluteExternalURL = (value) => /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(value) || value.startsWith("//");
@@ -186,6 +186,7 @@ function configureAdmin(config) {
186
186
  brandPrimary = "#3b82f6",
187
187
  brandSecondary = "#8b5cf6",
188
188
  defaultTheme = "brand-light",
189
+ logoOnDarkUrl,
189
190
  logoUrl,
190
191
  allowThemePreference = false,
191
192
  userSessionDurationSeconds = 60 * 60 * 24
@@ -310,6 +311,7 @@ function configureAdmin(config) {
310
311
  path: clientPath,
311
312
  clientProps: {
312
313
  brandName,
314
+ logoOnDarkUrl,
313
315
  logoUrl
314
316
  }
315
317
  },
@@ -318,6 +320,7 @@ function configureAdmin(config) {
318
320
  path: clientPath,
319
321
  clientProps: {
320
322
  brandName,
323
+ logoOnDarkUrl,
321
324
  logoUrl
322
325
  }
323
326
  }
@@ -470,6 +473,7 @@ function configureAdmin(config) {
470
473
  path: clientPath,
471
474
  clientProps: {
472
475
  brandName,
476
+ logoOnDarkUrl,
473
477
  logoUrl
474
478
  }
475
479
  }
@@ -1,12 +1,12 @@
1
1
  import { Field, CollectionConfig, GlobalConfig } from 'payload';
2
- import { a as AdminNavIcon, e as SitePreviewLink, f as SitePreviewLocationSummary } from './sitePreviewTypes-BkHCWxNW.js';
2
+ import { a as AdminNavIcon, e as SitePreviewLink, f as SitePreviewLocationSummary } from './sitePreviewTypes-BrJwGzJj.js';
3
3
  import { a as SocialMediaPlatform, b as SOCIAL_MEDIA_DEFAULT_ICON_BY_PLATFORM, c as SOCIAL_MEDIA_ICON_OPTIONS, d as SOCIAL_MEDIA_PLATFORMS, e as SOCIAL_MEDIA_PLATFORM_LABELS, S as SocialMediaGlobalData, f as SocialMediaIconLibrary, g as SocialMediaIconOption, h as SocialMediaProfileData, i as SocialMediaProfilesData } from './socialMedia-C05Iy-SV.js';
4
4
 
5
5
  type ThemeOption = 'light' | 'dark' | 'brand-light' | 'brand-dark';
6
6
  declare const createThemePreferenceField: (defaultTheme?: ThemeOption) => Field;
7
7
  declare const themePreferenceField: Field;
8
8
 
9
- type StudioSectionRole = 'admin' | 'editor' | 'client';
9
+ type StudioSectionRole = 'admin' | 'developer' | 'editor' | 'client';
10
10
  type StudioSectionCard = {
11
11
  description?: string;
12
12
  title: string;
@@ -104,6 +104,7 @@ interface AdminConfig {
104
104
  brandPrimary?: string;
105
105
  brandSecondary?: string;
106
106
  defaultTheme?: ThemeOption;
107
+ logoOnDarkUrl?: string;
107
108
  logoUrl?: string;
108
109
  basePath?: string;
109
110
  studio?: AdminStudioConfig;
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { A as AdminBreadcrumbItem, a as AdminNavIcon, b as AdminNavItem, c as AdminRole, S as SiteFooterPreviewData, d as SiteHeaderPreviewData, e as SitePreviewLink, f as SitePreviewLocationSummary, g as SitePreviewSocialLink, n as navItemIsActive, r as roleCanAccessNav } from './sitePreviewTypes-BkHCWxNW.js';
2
+ import { A as AdminBreadcrumbItem, a as AdminNavIcon, b as AdminNavItem, c as AdminRole, S as SiteFooterPreviewData, d as SiteHeaderPreviewData, e as SitePreviewLink, f as SitePreviewLocationSummary, g as SitePreviewSocialLink, n as navItemIsActive, r as roleCanAccessNav } from './sitePreviewTypes-BrJwGzJj.js';
3
3
  import { ReactNode } from 'react';
4
4
 
5
5
  type AdminBreadcrumbsProps = {
@@ -1,12 +1,12 @@
1
1
  import { Field, CollectionConfig, GlobalConfig } from 'payload';
2
- import { a as AdminNavIcon, e as SitePreviewLink, f as SitePreviewLocationSummary } from './sitePreviewTypes-BkHCWxNW.mjs';
2
+ import { a as AdminNavIcon, e as SitePreviewLink, f as SitePreviewLocationSummary } from './sitePreviewTypes-BrJwGzJj.mjs';
3
3
  import { a as SocialMediaPlatform, b as SOCIAL_MEDIA_DEFAULT_ICON_BY_PLATFORM, c as SOCIAL_MEDIA_ICON_OPTIONS, d as SOCIAL_MEDIA_PLATFORMS, e as SOCIAL_MEDIA_PLATFORM_LABELS, S as SocialMediaGlobalData, f as SocialMediaIconLibrary, g as SocialMediaIconOption, h as SocialMediaProfileData, i as SocialMediaProfilesData } from './socialMedia-C05Iy-SV.mjs';
4
4
 
5
5
  type ThemeOption = 'light' | 'dark' | 'brand-light' | 'brand-dark';
6
6
  declare const createThemePreferenceField: (defaultTheme?: ThemeOption) => Field;
7
7
  declare const themePreferenceField: Field;
8
8
 
9
- type StudioSectionRole = 'admin' | 'editor' | 'client';
9
+ type StudioSectionRole = 'admin' | 'developer' | 'editor' | 'client';
10
10
  type StudioSectionCard = {
11
11
  description?: string;
12
12
  title: string;
@@ -104,6 +104,7 @@ interface AdminConfig {
104
104
  brandPrimary?: string;
105
105
  brandSecondary?: string;
106
106
  defaultTheme?: ThemeOption;
107
+ logoOnDarkUrl?: string;
107
108
  logoUrl?: string;
108
109
  basePath?: string;
109
110
  studio?: AdminStudioConfig;
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { A as AdminBreadcrumbItem, a as AdminNavIcon, b as AdminNavItem, c as AdminRole, S as SiteFooterPreviewData, d as SiteHeaderPreviewData, e as SitePreviewLink, f as SitePreviewLocationSummary, g as SitePreviewSocialLink, n as navItemIsActive, r as roleCanAccessNav } from './sitePreviewTypes-BkHCWxNW.mjs';
2
+ import { A as AdminBreadcrumbItem, a as AdminNavIcon, b as AdminNavItem, c as AdminRole, S as SiteFooterPreviewData, d as SiteHeaderPreviewData, e as SitePreviewLink, f as SitePreviewLocationSummary, g as SitePreviewSocialLink, n as navItemIsActive, r as roleCanAccessNav } from './sitePreviewTypes-BrJwGzJj.mjs';
3
3
  import { ReactNode } from 'react';
4
4
 
5
5
  type AdminBreadcrumbsProps = {
package/dist/index.d.mts CHANGED
@@ -1,11 +1,11 @@
1
- export { i as admin } from './index-Bm2SaC3r.mjs';
2
- export { i as adminApp } from './index-DEQC3Dwj.mjs';
1
+ export { i as admin } from './index-DLfPOqYA.mjs';
2
+ export { i as adminApp } from './index-G_uTNffQ.mjs';
3
3
  export { i as blocks } from './index-CluwY0ZQ.mjs';
4
4
  export { i as nextjs } from './index-D8BNfUJb.mjs';
5
5
  export { i as studio } from './index-DWmudwDm.mjs';
6
6
  export { i as studioPages } from './index-Cv-6qnrw.mjs';
7
7
  import 'payload';
8
- import './sitePreviewTypes-BkHCWxNW.mjs';
8
+ import './sitePreviewTypes-BrJwGzJj.mjs';
9
9
  import './socialMedia-C05Iy-SV.mjs';
10
10
  import 'react/jsx-runtime';
11
11
  import 'react';
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- export { i as admin } from './index-CkT_eyhK.js';
2
- export { i as adminApp } from './index-52HdVLQq.js';
1
+ export { i as admin } from './index-BV0vEGl6.js';
2
+ export { i as adminApp } from './index-DAdN56fM.js';
3
3
  export { i as blocks } from './index-CluwY0ZQ.js';
4
4
  export { i as nextjs } from './index-DD_E2UfJ.js';
5
5
  export { i as studio } from './index-DWmudwDm.js';
6
6
  export { i as studioPages } from './index-Crx_MtPw.js';
7
7
  import 'payload';
8
- import './sitePreviewTypes-BkHCWxNW.js';
8
+ import './sitePreviewTypes-BrJwGzJj.js';
9
9
  import './socialMedia-C05Iy-SV.js';
10
10
  import 'react/jsx-runtime';
11
11
  import 'react';
package/dist/index.js CHANGED
@@ -107,7 +107,7 @@ var navItemIsActive = (pathname, item) => {
107
107
  };
108
108
 
109
109
  // src/shared/studioSections.ts
110
- var studioRoles = /* @__PURE__ */ new Set(["admin", "editor", "client"]);
110
+ var studioRoles = /* @__PURE__ */ new Set(["admin", "developer", "editor", "client"]);
111
111
  var studioIcons = new Set(adminNavIcons);
112
112
  var isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
113
113
  var isAbsoluteExternalURL = (value) => /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(value) || value.startsWith("//");
@@ -241,6 +241,7 @@ function configureAdmin(config) {
241
241
  brandPrimary = "#3b82f6",
242
242
  brandSecondary = "#8b5cf6",
243
243
  defaultTheme = "brand-light",
244
+ logoOnDarkUrl,
244
245
  logoUrl,
245
246
  allowThemePreference = false,
246
247
  userSessionDurationSeconds = 60 * 60 * 24
@@ -365,6 +366,7 @@ function configureAdmin(config) {
365
366
  path: clientPath,
366
367
  clientProps: {
367
368
  brandName,
369
+ logoOnDarkUrl,
368
370
  logoUrl
369
371
  }
370
372
  },
@@ -373,6 +375,7 @@ function configureAdmin(config) {
373
375
  path: clientPath,
374
376
  clientProps: {
375
377
  brandName,
378
+ logoOnDarkUrl,
376
379
  logoUrl
377
380
  }
378
381
  }
@@ -525,6 +528,7 @@ function configureAdmin(config) {
525
528
  path: clientPath,
526
529
  clientProps: {
527
530
  brandName,
531
+ logoOnDarkUrl,
528
532
  logoUrl
529
533
  }
530
534
  }
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  admin_exports
3
- } from "./chunk-WLOPFFN2.mjs";
3
+ } from "./chunk-XZQILJK3.mjs";
4
4
  import {
5
5
  admin_app_exports
6
6
  } from "./chunk-RKTIFEUY.mjs";
@@ -1,4 +1,4 @@
1
- type AdminRole = 'admin' | 'editor' | 'client';
1
+ type AdminRole = 'admin' | 'developer' | 'editor' | 'client';
2
2
  declare const adminNavIcons: readonly ["dashboard", "pages", "forms", "globals", "media", "tools", "account", "analytics"];
3
3
  type AdminNavIcon = (typeof adminNavIcons)[number];
4
4
  type AdminNavItem = {
@@ -1,4 +1,4 @@
1
- type AdminRole = 'admin' | 'editor' | 'client';
1
+ type AdminRole = 'admin' | 'developer' | 'editor' | 'client';
2
2
  declare const adminNavIcons: readonly ["dashboard", "pages", "forms", "globals", "media", "tools", "account", "analytics"];
3
3
  type AdminNavIcon = (typeof adminNavIcons)[number];
4
4
  type AdminNavItem = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orion-studios/payload-studio",
3
- "version": "0.6.0-beta.10",
3
+ "version": "0.6.0-beta.12",
4
4
  "description": "Base CMS, builder, and custom admin toolkit for Orion Studios websites",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.js",