@orion-studios/payload-studio 0.6.0-beta.2 → 0.6.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/admin/client.d.mts +1 -1
  2. package/dist/admin/client.d.ts +1 -1
  3. package/dist/admin/client.js +4026 -1943
  4. package/dist/admin/client.mjs +3804 -1727
  5. package/dist/admin/index.d.mts +2 -2
  6. package/dist/admin/index.d.ts +2 -2
  7. package/dist/admin/index.js +140 -17
  8. package/dist/admin/index.mjs +1 -1
  9. package/dist/admin-app/index.d.mts +2 -2
  10. package/dist/admin-app/index.d.ts +2 -2
  11. package/dist/admin-app/styles.css +466 -41
  12. package/dist/admin.css +18 -2
  13. package/dist/{chunk-PF3EBZXF.mjs → chunk-4LSIUED5.mjs} +7 -2
  14. package/dist/{chunk-XKUTZ7IU.mjs → chunk-EDW7DPXW.mjs} +1 -1
  15. package/dist/{chunk-OTHERBGX.mjs → chunk-H4GTEY24.mjs} +1 -1
  16. package/dist/{chunk-QJAWO6K3.mjs → chunk-JC3UV74N.mjs} +140 -17
  17. package/dist/index-BV0vEGl6.d.ts +188 -0
  18. package/dist/{index-52HdVLQq.d.ts → index-DAdN56fM.d.ts} +1 -1
  19. package/dist/index-DLfPOqYA.d.mts +188 -0
  20. package/dist/{index-DEQC3Dwj.d.mts → index-G_uTNffQ.d.mts} +1 -1
  21. package/dist/index.d.mts +3 -3
  22. package/dist/index.d.ts +3 -3
  23. package/dist/index.js +147 -19
  24. package/dist/index.mjs +6 -6
  25. package/dist/nextjs/index.js +7 -2
  26. package/dist/nextjs/index.mjs +2 -2
  27. package/dist/{sitePreviewTypes-BkHCWxNW.d.mts → sitePreviewTypes-BrJwGzJj.d.mts} +1 -1
  28. package/dist/{sitePreviewTypes-BkHCWxNW.d.ts → sitePreviewTypes-BrJwGzJj.d.ts} +1 -1
  29. package/dist/studio-pages/builder.css +18 -5
  30. package/dist/studio-pages/client.js +11 -3
  31. package/dist/studio-pages/client.mjs +11 -3
  32. package/dist/studio-pages/index.js +7 -2
  33. package/dist/studio-pages/index.mjs +2 -2
  34. package/package.json +1 -1
  35. package/dist/index-B6_D4Hm4.d.ts +0 -439
  36. package/dist/index-CYaWadBl.d.mts +0 -439
package/dist/index.d.mts CHANGED
@@ -1,11 +1,11 @@
1
- export { i as admin } from './index-CYaWadBl.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-B6_D4Hm4.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,8 +241,10 @@ function configureAdmin(config) {
241
241
  brandPrimary = "#3b82f6",
242
242
  brandSecondary = "#8b5cf6",
243
243
  defaultTheme = "brand-light",
244
+ logoOnDarkUrl,
244
245
  logoUrl,
245
- allowThemePreference = false
246
+ allowThemePreference = false,
247
+ userSessionDurationSeconds = 60 * 60 * 24
246
248
  } = config;
247
249
  const studioEnabled = config.studio?.enabled ?? true;
248
250
  const formsEnabled = config.studio?.forms?.enabled ?? false;
@@ -347,6 +349,49 @@ function configureAdmin(config) {
347
349
  }
348
350
  };
349
351
  };
352
+ const attachStudioEditRedirectToCollection = (collection, options) => {
353
+ if (!studioEnabled) {
354
+ return collection;
355
+ }
356
+ const collectionWithBreadcrumb = attachStudioBackBreadcrumbToCollection(collection);
357
+ const existingViews = collectionWithBreadcrumb.admin?.components?.views;
358
+ const existingEditViews = existingViews?.edit;
359
+ const hasCustomEditView = Boolean(
360
+ existingEditViews?.root || existingEditViews?.default && typeof existingEditViews.default === "object" && existingEditViews.default.Component
361
+ );
362
+ if (hasCustomEditView) {
363
+ return collectionWithBreadcrumb;
364
+ }
365
+ return {
366
+ ...collectionWithBreadcrumb,
367
+ admin: {
368
+ ...collectionWithBreadcrumb.admin,
369
+ components: {
370
+ ...collectionWithBreadcrumb.admin?.components,
371
+ views: {
372
+ ...existingViews,
373
+ edit: {
374
+ ...existingEditViews,
375
+ default: {
376
+ ...typeof existingEditViews?.default === "object" ? existingEditViews.default : {},
377
+ Component: {
378
+ exportName: "StudioDocumentRedirect",
379
+ path: clientPath,
380
+ clientProps: {
381
+ description: options.description,
382
+ ...options.emptyHref ? { emptyHref: options.emptyHref } : {},
383
+ ...options.emptyLabel ? { emptyLabel: options.emptyLabel } : {},
384
+ pathBase: options.pathBase,
385
+ title: options.title
386
+ }
387
+ }
388
+ }
389
+ }
390
+ }
391
+ }
392
+ }
393
+ };
394
+ };
350
395
  return {
351
396
  admin: {
352
397
  css: cssPath,
@@ -364,6 +409,7 @@ function configureAdmin(config) {
364
409
  path: clientPath,
365
410
  clientProps: {
366
411
  brandName,
412
+ logoOnDarkUrl,
367
413
  logoUrl
368
414
  }
369
415
  },
@@ -372,6 +418,7 @@ function configureAdmin(config) {
372
418
  path: clientPath,
373
419
  clientProps: {
374
420
  brandName,
421
+ logoOnDarkUrl,
375
422
  logoUrl
376
423
  }
377
424
  }
@@ -386,6 +433,7 @@ function configureAdmin(config) {
386
433
  },
387
434
  ...studioEnabled ? {
388
435
  studioGlobals: {
436
+ exact: true,
389
437
  path: globalsBasePath,
390
438
  Component: {
391
439
  exportName: "AdminStudioGlobalsView",
@@ -397,10 +445,11 @@ function configureAdmin(config) {
397
445
  }
398
446
  }
399
447
  },
400
- studioPages: {
401
- path: pagesBasePath,
448
+ studioPageNew: {
449
+ exact: true,
450
+ path: `${pagesBasePath}/new`,
402
451
  Component: {
403
- exportName: "AdminStudioPagesListView",
452
+ exportName: "AdminStudioNewPageView",
404
453
  path: clientPath,
405
454
  clientProps: {
406
455
  ...studioNavClientProps,
@@ -409,6 +458,7 @@ function configureAdmin(config) {
409
458
  }
410
459
  },
411
460
  studioPageEditor: {
461
+ exact: true,
412
462
  path: `${pagesBasePath}/:id`,
413
463
  Component: {
414
464
  exportName: "AdminStudioPageEditView",
@@ -419,10 +469,11 @@ function configureAdmin(config) {
419
469
  }
420
470
  }
421
471
  },
422
- studioPageNew: {
423
- path: `${pagesBasePath}/new`,
472
+ studioPages: {
473
+ exact: true,
474
+ path: pagesBasePath,
424
475
  Component: {
425
- exportName: "AdminStudioNewPageView",
476
+ exportName: "AdminStudioPagesListView",
426
477
  path: clientPath,
427
478
  clientProps: {
428
479
  ...studioNavClientProps,
@@ -431,6 +482,7 @@ function configureAdmin(config) {
431
482
  }
432
483
  },
433
484
  studioContactForm: {
485
+ exact: true,
434
486
  path: contactFormStudioPath,
435
487
  Component: {
436
488
  exportName: "AdminStudioContactFormView",
@@ -443,7 +495,47 @@ function configureAdmin(config) {
443
495
  }
444
496
  },
445
497
  ...formsEnabled ? {
498
+ studioFormSubmission: {
499
+ exact: true,
500
+ path: `${formsBasePath}/submissions/:id`,
501
+ Component: {
502
+ exportName: "AdminStudioFormSubmissionView",
503
+ path: clientPath,
504
+ clientProps: {
505
+ ...studioNavClientProps,
506
+ formsCollectionSlug,
507
+ formSubmissionsCollectionSlug,
508
+ formUploadsCollectionSlug
509
+ }
510
+ }
511
+ },
512
+ studioFormUpload: {
513
+ exact: true,
514
+ path: `${formsBasePath}/uploads/:id`,
515
+ Component: {
516
+ exportName: "AdminStudioFormUploadView",
517
+ path: clientPath,
518
+ clientProps: {
519
+ ...studioNavClientProps,
520
+ formUploadsCollectionSlug
521
+ }
522
+ }
523
+ },
524
+ studioFormDetail: {
525
+ exact: true,
526
+ path: `${formsBasePath}/:id`,
527
+ Component: {
528
+ exportName: "AdminStudioFormDetailView",
529
+ path: clientPath,
530
+ clientProps: {
531
+ ...studioNavClientProps,
532
+ formsCollectionSlug,
533
+ formSubmissionsCollectionSlug
534
+ }
535
+ }
536
+ },
446
537
  studioForms: {
538
+ exact: true,
447
539
  path: formsBasePath,
448
540
  Component: {
449
541
  exportName: "AdminStudioFormsView",
@@ -457,10 +549,11 @@ function configureAdmin(config) {
457
549
  }
458
550
  }
459
551
  } : {},
460
- studioMedia: {
461
- path: mediaBasePath,
552
+ studioMediaItem: {
553
+ exact: true,
554
+ path: `${mediaBasePath}/:id`,
462
555
  Component: {
463
- exportName: "AdminStudioMediaView",
556
+ exportName: "AdminStudioMediaItemView",
464
557
  path: clientPath,
465
558
  clientProps: {
466
559
  ...studioNavClientProps,
@@ -468,10 +561,11 @@ function configureAdmin(config) {
468
561
  }
469
562
  }
470
563
  },
471
- studioMediaItem: {
472
- path: `${mediaBasePath}/:id`,
564
+ studioMedia: {
565
+ exact: true,
566
+ path: mediaBasePath,
473
567
  Component: {
474
- exportName: "AdminStudioMediaItemView",
568
+ exportName: "AdminStudioMediaView",
475
569
  path: clientPath,
476
570
  clientProps: {
477
571
  ...studioNavClientProps,
@@ -480,6 +574,7 @@ function configureAdmin(config) {
480
574
  }
481
575
  },
482
576
  studioTools: {
577
+ exact: true,
483
578
  path: toolsBasePath,
484
579
  Component: {
485
580
  exportName: "AdminStudioToolsView",
@@ -524,6 +619,7 @@ function configureAdmin(config) {
524
619
  path: clientPath,
525
620
  clientProps: {
526
621
  brandName,
622
+ logoOnDarkUrl,
527
623
  logoUrl
528
624
  }
529
625
  }
@@ -560,8 +656,17 @@ function configureAdmin(config) {
560
656
  const hasThemePreference = existingFields.some(
561
657
  (field) => typeof field === "object" && field !== null && "name" in field && field.name === "themePreference"
562
658
  );
659
+ const normalizedAuth = usersCollection.auth === true ? {
660
+ tokenExpiration: userSessionDurationSeconds,
661
+ useSessions: true
662
+ } : usersCollection.auth && typeof usersCollection.auth === "object" ? {
663
+ ...usersCollection.auth,
664
+ tokenExpiration: usersCollection.auth.tokenExpiration ?? userSessionDurationSeconds,
665
+ useSessions: usersCollection.auth.useSessions ?? true
666
+ } : usersCollection.auth;
563
667
  const nextCollection = {
564
668
  ...usersCollection,
669
+ auth: normalizedAuth,
565
670
  fields: !allowThemePreference || hasThemePreference ? existingFields : [...existingFields, createThemePreferenceField(defaultTheme)]
566
671
  };
567
672
  return attachStudioBackBreadcrumbToCollection(nextCollection);
@@ -623,13 +728,31 @@ function configureAdmin(config) {
623
728
  return attachStudioBackBreadcrumbToCollection(mediaCollection);
624
729
  },
625
730
  wrapFormsCollection(formsCollection) {
626
- return attachStudioBackBreadcrumbToCollection(formsCollection);
731
+ return attachStudioEditRedirectToCollection(formsCollection, {
732
+ description: "Redirecting to the Studio form workspace.",
733
+ emptyHref: formsBasePath,
734
+ emptyLabel: "Open Forms",
735
+ pathBase: formsBasePath,
736
+ title: "Opening Form..."
737
+ });
627
738
  },
628
739
  wrapFormSubmissionsCollection(formSubmissionsCollection) {
629
- return attachStudioBackBreadcrumbToCollection(formSubmissionsCollection);
740
+ return attachStudioEditRedirectToCollection(formSubmissionsCollection, {
741
+ description: "Redirecting to the Studio submission workspace.",
742
+ emptyHref: formsBasePath,
743
+ emptyLabel: "Open Forms",
744
+ pathBase: `${formsBasePath}/submissions`,
745
+ title: "Opening Submission..."
746
+ });
630
747
  },
631
748
  wrapFormUploadsCollection(formUploadsCollection) {
632
- return attachStudioBackBreadcrumbToCollection(formUploadsCollection);
749
+ return attachStudioEditRedirectToCollection(formUploadsCollection, {
750
+ description: "Redirecting to the Studio upload workspace.",
751
+ emptyHref: formsBasePath,
752
+ emptyLabel: "Open Forms",
753
+ pathBase: `${formsBasePath}/uploads`,
754
+ title: "Opening Upload..."
755
+ });
633
756
  },
634
757
  wrapGlobals(globals2) {
635
758
  const labelMap = {
@@ -3629,6 +3752,7 @@ var defaultBuilderThemeTokens = {
3629
3752
 
3630
3753
  // src/studio-pages/builder/adapters/settingsV2.ts
3631
3754
  var isRecord3 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
3755
+ var isTextAlign = (value) => value === "left" || value === "center" || value === "right" || value === "justify";
3632
3756
  var parsePercent = (value) => {
3633
3757
  if (typeof value === "number" && Number.isFinite(value)) {
3634
3758
  return Math.max(0, Math.min(100, value));
@@ -3671,6 +3795,10 @@ var mergeSettings = (defaults, input) => {
3671
3795
  };
3672
3796
  var legacyBlockToV2Settings = (block) => {
3673
3797
  const current = structuredClone(defaultBuilderBlockSettingsV2);
3798
+ if (block.blockType === "hero" && block.variant === "centered") {
3799
+ current.typography.headingAlign = "center";
3800
+ current.typography.bodyAlign = "center";
3801
+ }
3674
3802
  current.layout.contentWidth = block.contentWidth === "narrow" || block.contentWidth === "content" || block.contentWidth === "wide" || block.contentWidth === "full" || block.contentWidth === "inherit" ? block.contentWidth : current.layout.contentWidth;
3675
3803
  current.layout.sectionPaddingX = block.sectionPaddingX === "none" || block.sectionPaddingX === "sm" || block.sectionPaddingX === "md" || block.sectionPaddingX === "lg" || block.sectionPaddingX === "inherit" ? block.sectionPaddingX : current.layout.sectionPaddingX;
3676
3804
  current.layout.sectionPaddingY = block.sectionPaddingY === "none" || block.sectionPaddingY === "sm" || block.sectionPaddingY === "lg" ? block.sectionPaddingY : current.layout.sectionPaddingY;
@@ -3707,8 +3835,8 @@ var legacyBlockToV2Settings = (block) => {
3707
3835
  current.media.positionX = parsePercent(block.imagePositionX ?? block.backgroundImagePositionX);
3708
3836
  current.media.positionY = parsePercent(block.imagePositionY ?? block.backgroundImagePositionY);
3709
3837
  current.media.height = parsePixel(block.imageHeight);
3710
- current.typography.headingAlign = block.textHeadingAlign === "left" || block.textHeadingAlign === "center" || block.textHeadingAlign === "right" || block.textHeadingAlign === "justify" ? block.textHeadingAlign : current.typography.headingAlign;
3711
- current.typography.bodyAlign = block.textBodyAlign === "left" || block.textBodyAlign === "center" || block.textBodyAlign === "right" || block.textBodyAlign === "justify" ? block.textBodyAlign : current.typography.bodyAlign;
3838
+ current.typography.headingAlign = isTextAlign(block.textHeadingAlign) ? block.textHeadingAlign : current.typography.headingAlign;
3839
+ current.typography.bodyAlign = isTextAlign(block.textBodyAlign) ? block.textBodyAlign : current.typography.bodyAlign;
3712
3840
  current.typography.maxTextWidth = block.textMaxWidth === "auto" || block.textMaxWidth === "sm" || block.textMaxWidth === "md" || block.textMaxWidth === "lg" || block.textMaxWidth === "full" ? block.textMaxWidth : current.typography.maxTextWidth;
3713
3841
  current.typography.lineHeightPreset = block.textLineHeightPreset === "tight" || block.textLineHeightPreset === "normal" || block.textLineHeightPreset === "relaxed" ? block.textLineHeightPreset : current.typography.lineHeightPreset;
3714
3842
  current.typography.letterSpacingPreset = block.textLetterSpacingPreset === "tight" || block.textLetterSpacingPreset === "normal" || block.textLetterSpacingPreset === "relaxed" ? block.textLetterSpacingPreset : current.typography.letterSpacingPreset;
package/dist/index.mjs CHANGED
@@ -1,22 +1,22 @@
1
- import {
2
- admin_exports
3
- } from "./chunk-QJAWO6K3.mjs";
4
1
  import {
5
2
  admin_app_exports
6
3
  } from "./chunk-RKTIFEUY.mjs";
4
+ import {
5
+ admin_exports
6
+ } from "./chunk-JC3UV74N.mjs";
7
7
  import "./chunk-W2UOCJDX.mjs";
8
8
  import {
9
9
  blocks_exports
10
10
  } from "./chunk-JQAHXYAM.mjs";
11
11
  import {
12
12
  nextjs_exports
13
- } from "./chunk-OTHERBGX.mjs";
13
+ } from "./chunk-H4GTEY24.mjs";
14
14
  import "./chunk-ZTXJG4K5.mjs";
15
15
  import {
16
16
  studio_pages_exports
17
- } from "./chunk-XKUTZ7IU.mjs";
17
+ } from "./chunk-EDW7DPXW.mjs";
18
18
  import "./chunk-OQSEJXC4.mjs";
19
- import "./chunk-PF3EBZXF.mjs";
19
+ import "./chunk-4LSIUED5.mjs";
20
20
  import {
21
21
  studio_exports
22
22
  } from "./chunk-ADIIWIYL.mjs";
@@ -166,6 +166,7 @@ var defaultBuilderItemSettingsV2 = {
166
166
 
167
167
  // src/studio-pages/builder/adapters/settingsV2.ts
168
168
  var isRecord2 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
169
+ var isTextAlign = (value) => value === "left" || value === "center" || value === "right" || value === "justify";
169
170
  var parsePercent = (value) => {
170
171
  if (typeof value === "number" && Number.isFinite(value)) {
171
172
  return Math.max(0, Math.min(100, value));
@@ -208,6 +209,10 @@ var mergeSettings = (defaults, input) => {
208
209
  };
209
210
  var legacyBlockToV2Settings = (block) => {
210
211
  const current = structuredClone(defaultBuilderBlockSettingsV2);
212
+ if (block.blockType === "hero" && block.variant === "centered") {
213
+ current.typography.headingAlign = "center";
214
+ current.typography.bodyAlign = "center";
215
+ }
211
216
  current.layout.contentWidth = block.contentWidth === "narrow" || block.contentWidth === "content" || block.contentWidth === "wide" || block.contentWidth === "full" || block.contentWidth === "inherit" ? block.contentWidth : current.layout.contentWidth;
212
217
  current.layout.sectionPaddingX = block.sectionPaddingX === "none" || block.sectionPaddingX === "sm" || block.sectionPaddingX === "md" || block.sectionPaddingX === "lg" || block.sectionPaddingX === "inherit" ? block.sectionPaddingX : current.layout.sectionPaddingX;
213
218
  current.layout.sectionPaddingY = block.sectionPaddingY === "none" || block.sectionPaddingY === "sm" || block.sectionPaddingY === "lg" ? block.sectionPaddingY : current.layout.sectionPaddingY;
@@ -244,8 +249,8 @@ var legacyBlockToV2Settings = (block) => {
244
249
  current.media.positionX = parsePercent(block.imagePositionX ?? block.backgroundImagePositionX);
245
250
  current.media.positionY = parsePercent(block.imagePositionY ?? block.backgroundImagePositionY);
246
251
  current.media.height = parsePixel(block.imageHeight);
247
- current.typography.headingAlign = block.textHeadingAlign === "left" || block.textHeadingAlign === "center" || block.textHeadingAlign === "right" || block.textHeadingAlign === "justify" ? block.textHeadingAlign : current.typography.headingAlign;
248
- current.typography.bodyAlign = block.textBodyAlign === "left" || block.textBodyAlign === "center" || block.textBodyAlign === "right" || block.textBodyAlign === "justify" ? block.textBodyAlign : current.typography.bodyAlign;
252
+ current.typography.headingAlign = isTextAlign(block.textHeadingAlign) ? block.textHeadingAlign : current.typography.headingAlign;
253
+ current.typography.bodyAlign = isTextAlign(block.textBodyAlign) ? block.textBodyAlign : current.typography.bodyAlign;
249
254
  current.typography.maxTextWidth = block.textMaxWidth === "auto" || block.textMaxWidth === "sm" || block.textMaxWidth === "md" || block.textMaxWidth === "lg" || block.textMaxWidth === "full" ? block.textMaxWidth : current.typography.maxTextWidth;
250
255
  current.typography.lineHeightPreset = block.textLineHeightPreset === "tight" || block.textLineHeightPreset === "normal" || block.textLineHeightPreset === "relaxed" ? block.textLineHeightPreset : current.typography.lineHeightPreset;
251
256
  current.typography.letterSpacingPreset = block.textLetterSpacingPreset === "tight" || block.textLetterSpacingPreset === "normal" || block.textLetterSpacingPreset === "relaxed" ? block.textLetterSpacingPreset : current.typography.letterSpacingPreset;
@@ -5,9 +5,9 @@ import {
5
5
  createSiteQueries,
6
6
  resolveMedia,
7
7
  resolveSocialMediaLinks
8
- } from "../chunk-OTHERBGX.mjs";
8
+ } from "../chunk-H4GTEY24.mjs";
9
9
  import "../chunk-ZTXJG4K5.mjs";
10
- import "../chunk-PF3EBZXF.mjs";
10
+ import "../chunk-4LSIUED5.mjs";
11
11
  import "../chunk-ADIIWIYL.mjs";
12
12
  import "../chunk-6BWS3CLP.mjs";
13
13
  export {
@@ -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 = {
@@ -256,36 +256,44 @@ h4 {
256
256
  }
257
257
 
258
258
  .hero-content {
259
- position: absolute;
260
- inset: 0;
261
259
  display: flex;
262
260
  flex-direction: column;
263
261
  justify-content: center;
264
- padding: 2rem;
262
+ inset: 0;
265
263
  max-width: 610px;
264
+ padding: 2rem;
265
+ position: absolute;
266
+ text-align: var(--orion-builder-body-align, left);
266
267
  }
267
268
 
268
269
  .hero h1 {
269
270
  font-size: clamp(2rem, 4vw, 3.1rem);
270
271
  letter-spacing: -0.02em;
271
272
  margin: 0;
273
+ text-align: var(--orion-builder-heading-align, var(--orion-builder-body-align, left));
272
274
  }
273
275
 
274
276
  .hero p {
277
+ color: color-mix(in srgb, var(--orion-studio-accent-contrast) 90%, transparent);
275
278
  margin-top: 0.75rem;
276
279
  max-width: 48ch;
277
- color: color-mix(in srgb, var(--orion-studio-accent-contrast) 90%, transparent);
280
+ text-align: var(--orion-builder-body-align, left);
278
281
  }
279
282
 
280
283
  .hero-actions {
281
284
  display: flex;
282
285
  flex-wrap: wrap;
283
286
  gap: 0.75rem;
287
+ justify-content: var(--orion-builder-actions-align, flex-start);
284
288
  margin-top: 1.1rem;
285
289
  }
286
290
 
287
291
  .hero-centered .hero-content {
288
- text-align: center;
292
+ text-align: var(--orion-builder-body-align, center);
293
+ }
294
+
295
+ .hero .kicker {
296
+ text-align: var(--orion-builder-heading-align, var(--orion-builder-body-align, left));
289
297
  }
290
298
 
291
299
  .features {
@@ -984,6 +992,11 @@ h4 {
984
992
  text-align: var(--orion-builder-heading-align, inherit);
985
993
  }
986
994
 
995
+ .orion-builder-content p,
996
+ .orion-builder-content li {
997
+ text-align: var(--orion-builder-body-align, inherit);
998
+ }
999
+
987
1000
  /* Builder-only override: show full testimonial copy even if host app globals clamp it. */
988
1001
  .orion-builder-shell .orion-builder-content .testimonial-quote {
989
1002
  -webkit-box-orient: initial;
@@ -156,6 +156,7 @@ var defaultBuilderThemeTokens = {
156
156
 
157
157
  // src/studio-pages/builder/adapters/settingsV2.ts
158
158
  var isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
159
+ var isTextAlign = (value) => value === "left" || value === "center" || value === "right" || value === "justify";
159
160
  var parsePercent = (value) => {
160
161
  if (typeof value === "number" && Number.isFinite(value)) {
161
162
  return Math.max(0, Math.min(100, value));
@@ -198,6 +199,10 @@ var mergeSettings = (defaults, input) => {
198
199
  };
199
200
  var legacyBlockToV2Settings = (block) => {
200
201
  const current = structuredClone(defaultBuilderBlockSettingsV2);
202
+ if (block.blockType === "hero" && block.variant === "centered") {
203
+ current.typography.headingAlign = "center";
204
+ current.typography.bodyAlign = "center";
205
+ }
201
206
  current.layout.contentWidth = block.contentWidth === "narrow" || block.contentWidth === "content" || block.contentWidth === "wide" || block.contentWidth === "full" || block.contentWidth === "inherit" ? block.contentWidth : current.layout.contentWidth;
202
207
  current.layout.sectionPaddingX = block.sectionPaddingX === "none" || block.sectionPaddingX === "sm" || block.sectionPaddingX === "md" || block.sectionPaddingX === "lg" || block.sectionPaddingX === "inherit" ? block.sectionPaddingX : current.layout.sectionPaddingX;
203
208
  current.layout.sectionPaddingY = block.sectionPaddingY === "none" || block.sectionPaddingY === "sm" || block.sectionPaddingY === "lg" ? block.sectionPaddingY : current.layout.sectionPaddingY;
@@ -234,8 +239,8 @@ var legacyBlockToV2Settings = (block) => {
234
239
  current.media.positionX = parsePercent(block.imagePositionX ?? block.backgroundImagePositionX);
235
240
  current.media.positionY = parsePercent(block.imagePositionY ?? block.backgroundImagePositionY);
236
241
  current.media.height = parsePixel(block.imageHeight);
237
- current.typography.headingAlign = block.textHeadingAlign === "left" || block.textHeadingAlign === "center" || block.textHeadingAlign === "right" || block.textHeadingAlign === "justify" ? block.textHeadingAlign : current.typography.headingAlign;
238
- current.typography.bodyAlign = block.textBodyAlign === "left" || block.textBodyAlign === "center" || block.textBodyAlign === "right" || block.textBodyAlign === "justify" ? block.textBodyAlign : current.typography.bodyAlign;
242
+ current.typography.headingAlign = isTextAlign(block.textHeadingAlign) ? block.textHeadingAlign : current.typography.headingAlign;
243
+ current.typography.bodyAlign = isTextAlign(block.textBodyAlign) ? block.textBodyAlign : current.typography.bodyAlign;
239
244
  current.typography.maxTextWidth = block.textMaxWidth === "auto" || block.textMaxWidth === "sm" || block.textMaxWidth === "md" || block.textMaxWidth === "lg" || block.textMaxWidth === "full" ? block.textMaxWidth : current.typography.maxTextWidth;
240
245
  current.typography.lineHeightPreset = block.textLineHeightPreset === "tight" || block.textLineHeightPreset === "normal" || block.textLineHeightPreset === "relaxed" ? block.textLineHeightPreset : current.typography.lineHeightPreset;
241
246
  current.typography.letterSpacingPreset = block.textLetterSpacingPreset === "tight" || block.textLetterSpacingPreset === "normal" || block.textLetterSpacingPreset === "relaxed" ? block.textLetterSpacingPreset : current.typography.letterSpacingPreset;
@@ -4704,8 +4709,9 @@ function BuilderPageEditor({
4704
4709
  const heroMedia = block.blockType === "hero" ? resolveMedia(block.media) : null;
4705
4710
  const heroHasImage = block.blockType === "hero" && Boolean(heroBackgroundImageURL || heroMedia?.url);
4706
4711
  const heroTextColor = block.blockType === "hero" ? heroHasImage ? "#ffffff" : heroBackgroundColor ? getReadableTextColor(heroBackgroundColor, resolvedThemeTokens.colors.headingText, "#ffffff") : resolvedThemeTokens.colors.headingText : null;
4712
+ const bodyAlign = blockTypography.bodyAlign === "center" || blockTypography.bodyAlign === "justify" || blockTypography.bodyAlign === "right" ? blockTypography.bodyAlign : "left";
4707
4713
  const typographyStyle = resolveTypographyStyleFromSettings({
4708
- bodyAlign: blockTypography.bodyAlign === "center" || blockTypography.bodyAlign === "justify" || blockTypography.bodyAlign === "right" ? blockTypography.bodyAlign : "left",
4714
+ bodyAlign,
4709
4715
  letterSpacingPreset: blockTypography.letterSpacingPreset === "tight" || blockTypography.letterSpacingPreset === "relaxed" ? blockTypography.letterSpacingPreset : "normal",
4710
4716
  lineHeightPreset: blockTypography.lineHeightPreset === "tight" || blockTypography.lineHeightPreset === "relaxed" ? blockTypography.lineHeightPreset : "normal",
4711
4717
  maxTextWidth: blockTypography.maxTextWidth === "sm" || blockTypography.maxTextWidth === "md" || blockTypography.maxTextWidth === "lg" || blockTypography.maxTextWidth === "full" ? blockTypography.maxTextWidth : "auto"
@@ -4721,6 +4727,8 @@ function BuilderPageEditor({
4721
4727
  ...shell.contentStyle,
4722
4728
  ...inheritProjectStyles ? {} : {
4723
4729
  "--orion-builder-heading-align": headingAlign,
4730
+ "--orion-builder-body-align": bodyAlign,
4731
+ "--orion-builder-actions-align": bodyAlign === "center" ? "center" : bodyAlign === "right" ? "flex-end" : "flex-start",
4724
4732
  "--orion-builder-heading-color": headingColor,
4725
4733
  color: bodyColor,
4726
4734
  ...typographyStyle
@@ -129,6 +129,7 @@ var defaultBuilderThemeTokens = {
129
129
 
130
130
  // src/studio-pages/builder/adapters/settingsV2.ts
131
131
  var isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
132
+ var isTextAlign = (value) => value === "left" || value === "center" || value === "right" || value === "justify";
132
133
  var parsePercent = (value) => {
133
134
  if (typeof value === "number" && Number.isFinite(value)) {
134
135
  return Math.max(0, Math.min(100, value));
@@ -171,6 +172,10 @@ var mergeSettings = (defaults, input) => {
171
172
  };
172
173
  var legacyBlockToV2Settings = (block) => {
173
174
  const current = structuredClone(defaultBuilderBlockSettingsV2);
175
+ if (block.blockType === "hero" && block.variant === "centered") {
176
+ current.typography.headingAlign = "center";
177
+ current.typography.bodyAlign = "center";
178
+ }
174
179
  current.layout.contentWidth = block.contentWidth === "narrow" || block.contentWidth === "content" || block.contentWidth === "wide" || block.contentWidth === "full" || block.contentWidth === "inherit" ? block.contentWidth : current.layout.contentWidth;
175
180
  current.layout.sectionPaddingX = block.sectionPaddingX === "none" || block.sectionPaddingX === "sm" || block.sectionPaddingX === "md" || block.sectionPaddingX === "lg" || block.sectionPaddingX === "inherit" ? block.sectionPaddingX : current.layout.sectionPaddingX;
176
181
  current.layout.sectionPaddingY = block.sectionPaddingY === "none" || block.sectionPaddingY === "sm" || block.sectionPaddingY === "lg" ? block.sectionPaddingY : current.layout.sectionPaddingY;
@@ -207,8 +212,8 @@ var legacyBlockToV2Settings = (block) => {
207
212
  current.media.positionX = parsePercent(block.imagePositionX ?? block.backgroundImagePositionX);
208
213
  current.media.positionY = parsePercent(block.imagePositionY ?? block.backgroundImagePositionY);
209
214
  current.media.height = parsePixel(block.imageHeight);
210
- current.typography.headingAlign = block.textHeadingAlign === "left" || block.textHeadingAlign === "center" || block.textHeadingAlign === "right" || block.textHeadingAlign === "justify" ? block.textHeadingAlign : current.typography.headingAlign;
211
- current.typography.bodyAlign = block.textBodyAlign === "left" || block.textBodyAlign === "center" || block.textBodyAlign === "right" || block.textBodyAlign === "justify" ? block.textBodyAlign : current.typography.bodyAlign;
215
+ current.typography.headingAlign = isTextAlign(block.textHeadingAlign) ? block.textHeadingAlign : current.typography.headingAlign;
216
+ current.typography.bodyAlign = isTextAlign(block.textBodyAlign) ? block.textBodyAlign : current.typography.bodyAlign;
212
217
  current.typography.maxTextWidth = block.textMaxWidth === "auto" || block.textMaxWidth === "sm" || block.textMaxWidth === "md" || block.textMaxWidth === "lg" || block.textMaxWidth === "full" ? block.textMaxWidth : current.typography.maxTextWidth;
213
218
  current.typography.lineHeightPreset = block.textLineHeightPreset === "tight" || block.textLineHeightPreset === "normal" || block.textLineHeightPreset === "relaxed" ? block.textLineHeightPreset : current.typography.lineHeightPreset;
214
219
  current.typography.letterSpacingPreset = block.textLetterSpacingPreset === "tight" || block.textLetterSpacingPreset === "normal" || block.textLetterSpacingPreset === "relaxed" ? block.textLetterSpacingPreset : current.typography.letterSpacingPreset;
@@ -4584,8 +4589,9 @@ function BuilderPageEditor({
4584
4589
  const heroMedia = block.blockType === "hero" ? resolveMedia(block.media) : null;
4585
4590
  const heroHasImage = block.blockType === "hero" && Boolean(heroBackgroundImageURL || heroMedia?.url);
4586
4591
  const heroTextColor = block.blockType === "hero" ? heroHasImage ? "#ffffff" : heroBackgroundColor ? getReadableTextColor(heroBackgroundColor, resolvedThemeTokens.colors.headingText, "#ffffff") : resolvedThemeTokens.colors.headingText : null;
4592
+ const bodyAlign = blockTypography.bodyAlign === "center" || blockTypography.bodyAlign === "justify" || blockTypography.bodyAlign === "right" ? blockTypography.bodyAlign : "left";
4587
4593
  const typographyStyle = resolveTypographyStyleFromSettings({
4588
- bodyAlign: blockTypography.bodyAlign === "center" || blockTypography.bodyAlign === "justify" || blockTypography.bodyAlign === "right" ? blockTypography.bodyAlign : "left",
4594
+ bodyAlign,
4589
4595
  letterSpacingPreset: blockTypography.letterSpacingPreset === "tight" || blockTypography.letterSpacingPreset === "relaxed" ? blockTypography.letterSpacingPreset : "normal",
4590
4596
  lineHeightPreset: blockTypography.lineHeightPreset === "tight" || blockTypography.lineHeightPreset === "relaxed" ? blockTypography.lineHeightPreset : "normal",
4591
4597
  maxTextWidth: blockTypography.maxTextWidth === "sm" || blockTypography.maxTextWidth === "md" || blockTypography.maxTextWidth === "lg" || blockTypography.maxTextWidth === "full" ? blockTypography.maxTextWidth : "auto"
@@ -4601,6 +4607,8 @@ function BuilderPageEditor({
4601
4607
  ...shell.contentStyle,
4602
4608
  ...inheritProjectStyles ? {} : {
4603
4609
  "--orion-builder-heading-align": headingAlign,
4610
+ "--orion-builder-body-align": bodyAlign,
4611
+ "--orion-builder-actions-align": bodyAlign === "center" ? "center" : bodyAlign === "right" ? "flex-end" : "flex-start",
4604
4612
  "--orion-builder-heading-color": headingColor,
4605
4613
  color: bodyColor,
4606
4614
  ...typographyStyle
@@ -156,6 +156,7 @@ var defaultBuilderThemeTokens = {
156
156
 
157
157
  // src/studio-pages/builder/adapters/settingsV2.ts
158
158
  var isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
159
+ var isTextAlign = (value) => value === "left" || value === "center" || value === "right" || value === "justify";
159
160
  var parsePercent = (value) => {
160
161
  if (typeof value === "number" && Number.isFinite(value)) {
161
162
  return Math.max(0, Math.min(100, value));
@@ -198,6 +199,10 @@ var mergeSettings = (defaults, input) => {
198
199
  };
199
200
  var legacyBlockToV2Settings = (block) => {
200
201
  const current = structuredClone(defaultBuilderBlockSettingsV2);
202
+ if (block.blockType === "hero" && block.variant === "centered") {
203
+ current.typography.headingAlign = "center";
204
+ current.typography.bodyAlign = "center";
205
+ }
201
206
  current.layout.contentWidth = block.contentWidth === "narrow" || block.contentWidth === "content" || block.contentWidth === "wide" || block.contentWidth === "full" || block.contentWidth === "inherit" ? block.contentWidth : current.layout.contentWidth;
202
207
  current.layout.sectionPaddingX = block.sectionPaddingX === "none" || block.sectionPaddingX === "sm" || block.sectionPaddingX === "md" || block.sectionPaddingX === "lg" || block.sectionPaddingX === "inherit" ? block.sectionPaddingX : current.layout.sectionPaddingX;
203
208
  current.layout.sectionPaddingY = block.sectionPaddingY === "none" || block.sectionPaddingY === "sm" || block.sectionPaddingY === "lg" ? block.sectionPaddingY : current.layout.sectionPaddingY;
@@ -234,8 +239,8 @@ var legacyBlockToV2Settings = (block) => {
234
239
  current.media.positionX = parsePercent(block.imagePositionX ?? block.backgroundImagePositionX);
235
240
  current.media.positionY = parsePercent(block.imagePositionY ?? block.backgroundImagePositionY);
236
241
  current.media.height = parsePixel(block.imageHeight);
237
- current.typography.headingAlign = block.textHeadingAlign === "left" || block.textHeadingAlign === "center" || block.textHeadingAlign === "right" || block.textHeadingAlign === "justify" ? block.textHeadingAlign : current.typography.headingAlign;
238
- current.typography.bodyAlign = block.textBodyAlign === "left" || block.textBodyAlign === "center" || block.textBodyAlign === "right" || block.textBodyAlign === "justify" ? block.textBodyAlign : current.typography.bodyAlign;
242
+ current.typography.headingAlign = isTextAlign(block.textHeadingAlign) ? block.textHeadingAlign : current.typography.headingAlign;
243
+ current.typography.bodyAlign = isTextAlign(block.textBodyAlign) ? block.textBodyAlign : current.typography.bodyAlign;
239
244
  current.typography.maxTextWidth = block.textMaxWidth === "auto" || block.textMaxWidth === "sm" || block.textMaxWidth === "md" || block.textMaxWidth === "lg" || block.textMaxWidth === "full" ? block.textMaxWidth : current.typography.maxTextWidth;
240
245
  current.typography.lineHeightPreset = block.textLineHeightPreset === "tight" || block.textLineHeightPreset === "normal" || block.textLineHeightPreset === "relaxed" ? block.textLineHeightPreset : current.typography.lineHeightPreset;
241
246
  current.typography.letterSpacingPreset = block.textLetterSpacingPreset === "tight" || block.textLetterSpacingPreset === "normal" || block.textLetterSpacingPreset === "relaxed" ? block.textLetterSpacingPreset : current.typography.letterSpacingPreset;
@@ -7,14 +7,14 @@ import {
7
7
  pageStudioModuleManifest,
8
8
  resolveBuilderThemeTokens,
9
9
  toEditorInitialDoc
10
- } from "../chunk-XKUTZ7IU.mjs";
10
+ } from "../chunk-EDW7DPXW.mjs";
11
11
  import "../chunk-OQSEJXC4.mjs";
12
12
  import {
13
13
  createDefaultStudioDocument,
14
14
  defaultBuilderThemeTokens,
15
15
  layoutToStudioDocument,
16
16
  studioDocumentToLayout
17
- } from "../chunk-PF3EBZXF.mjs";
17
+ } from "../chunk-4LSIUED5.mjs";
18
18
  import "../chunk-ADIIWIYL.mjs";
19
19
  import "../chunk-6BWS3CLP.mjs";
20
20
  export {