@orion-studios/payload-studio 0.6.0-beta.7 → 0.6.0-beta.70

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 (48) hide show
  1. package/dist/admin/client.js +2076 -618
  2. package/dist/admin/client.mjs +2037 -590
  3. package/dist/admin/index.d.mts +2 -2
  4. package/dist/admin/index.d.ts +2 -2
  5. package/dist/admin/index.js +140 -17
  6. package/dist/admin/index.mjs +1 -1
  7. package/dist/admin-app/client.js +11 -4
  8. package/dist/admin-app/client.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 +343 -41
  12. package/dist/admin.css +18 -2
  13. package/dist/builder-v2/client.d.mts +18 -0
  14. package/dist/builder-v2/client.d.ts +18 -0
  15. package/dist/builder-v2/client.js +1662 -0
  16. package/dist/builder-v2/client.mjs +1537 -0
  17. package/dist/builder-v2/index.d.mts +237 -0
  18. package/dist/builder-v2/index.d.ts +237 -0
  19. package/dist/builder-v2/index.js +735 -0
  20. package/dist/builder-v2/index.mjs +685 -0
  21. package/dist/builder-v2/styles.css +1524 -0
  22. package/dist/{chunk-KPIX7OSV.mjs → chunk-2XH7X34N.mjs} +11 -4
  23. package/dist/{chunk-PF3EBZXF.mjs → chunk-7ZMXZRBP.mjs} +39 -3
  24. package/dist/{chunk-5FNTVRCR.mjs → chunk-JC3UV74N.mjs} +140 -17
  25. package/dist/{chunk-XKUTZ7IU.mjs → chunk-NGLIA2OE.mjs} +53 -2
  26. package/dist/{chunk-OTHERBGX.mjs → chunk-ZADL33R6.mjs} +1 -1
  27. package/dist/{index-QPDAedIX.d.ts → index-BV0vEGl6.d.ts} +4 -2
  28. package/dist/{index-Cv-6qnrw.d.mts → index-D5zrOdyv.d.mts} +3 -1
  29. package/dist/{index-52HdVLQq.d.ts → index-DAdN56fM.d.ts} +1 -1
  30. package/dist/{index-DyMmaRfI.d.mts → index-DLfPOqYA.d.mts} +4 -2
  31. package/dist/{index-Crx_MtPw.d.ts → index-Dv-Alx4h.d.ts} +3 -1
  32. package/dist/{index-DEQC3Dwj.d.mts → index-G_uTNffQ.d.mts} +1 -1
  33. package/dist/index.d.mts +4 -4
  34. package/dist/index.d.ts +4 -4
  35. package/dist/index.js +231 -21
  36. package/dist/index.mjs +4 -4
  37. package/dist/nextjs/index.js +39 -3
  38. package/dist/nextjs/index.mjs +2 -2
  39. package/dist/{sitePreviewTypes-BkHCWxNW.d.mts → sitePreviewTypes-BrJwGzJj.d.mts} +1 -1
  40. package/dist/{sitePreviewTypes-BkHCWxNW.d.ts → sitePreviewTypes-BrJwGzJj.d.ts} +1 -1
  41. package/dist/studio-pages/builder.css +24 -5
  42. package/dist/studio-pages/client.js +574 -64
  43. package/dist/studio-pages/client.mjs +574 -64
  44. package/dist/studio-pages/index.d.mts +1 -1
  45. package/dist/studio-pages/index.d.ts +1 -1
  46. package/dist/studio-pages/index.js +91 -4
  47. package/dist/studio-pages/index.mjs +2 -2
  48. package/package.json +22 -3
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 = {
@@ -3570,7 +3693,9 @@ var defaultBuilderBlockSettingsV2 = {
3570
3693
  },
3571
3694
  typography: {
3572
3695
  bodyAlign: "left",
3696
+ bodySizePt: null,
3573
3697
  headingAlign: "left",
3698
+ headingSizePt: null,
3574
3699
  letterSpacingPreset: "normal",
3575
3700
  lineHeightPreset: "normal",
3576
3701
  maxTextWidth: "auto"
@@ -3599,7 +3724,9 @@ var defaultBuilderItemSettingsV2 = {
3599
3724
  },
3600
3725
  typography: {
3601
3726
  bodyAlign: "left",
3727
+ bodySizePt: null,
3602
3728
  headingAlign: "left",
3729
+ headingSizePt: null,
3603
3730
  letterSpacingPreset: "normal",
3604
3731
  lineHeightPreset: "normal",
3605
3732
  maxTextWidth: "auto"
@@ -3629,6 +3756,7 @@ var defaultBuilderThemeTokens = {
3629
3756
 
3630
3757
  // src/studio-pages/builder/adapters/settingsV2.ts
3631
3758
  var isRecord3 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
3759
+ var isTextAlign = (value) => value === "left" || value === "center" || value === "right" || value === "justify";
3632
3760
  var parsePercent = (value) => {
3633
3761
  if (typeof value === "number" && Number.isFinite(value)) {
3634
3762
  return Math.max(0, Math.min(100, value));
@@ -3653,6 +3781,18 @@ var parsePixel = (value) => {
3653
3781
  }
3654
3782
  return null;
3655
3783
  };
3784
+ var parsePoint = (value) => {
3785
+ if (typeof value === "number" && Number.isFinite(value)) {
3786
+ return Math.max(6, Math.min(120, Math.round(value)));
3787
+ }
3788
+ if (typeof value === "string" && value.trim().length > 0) {
3789
+ const parsed = Number(value);
3790
+ if (Number.isFinite(parsed)) {
3791
+ return Math.max(6, Math.min(120, Math.round(parsed)));
3792
+ }
3793
+ }
3794
+ return null;
3795
+ };
3656
3796
  var mergeSettings = (defaults, input) => {
3657
3797
  if (!isRecord3(input)) {
3658
3798
  return structuredClone(defaults);
@@ -3671,6 +3811,10 @@ var mergeSettings = (defaults, input) => {
3671
3811
  };
3672
3812
  var legacyBlockToV2Settings = (block) => {
3673
3813
  const current = structuredClone(defaultBuilderBlockSettingsV2);
3814
+ if (block.blockType === "hero" && block.variant === "centered") {
3815
+ current.typography.headingAlign = "center";
3816
+ current.typography.bodyAlign = "center";
3817
+ }
3674
3818
  current.layout.contentWidth = block.contentWidth === "narrow" || block.contentWidth === "content" || block.contentWidth === "wide" || block.contentWidth === "full" || block.contentWidth === "inherit" ? block.contentWidth : current.layout.contentWidth;
3675
3819
  current.layout.sectionPaddingX = block.sectionPaddingX === "none" || block.sectionPaddingX === "sm" || block.sectionPaddingX === "md" || block.sectionPaddingX === "lg" || block.sectionPaddingX === "inherit" ? block.sectionPaddingX : current.layout.sectionPaddingX;
3676
3820
  current.layout.sectionPaddingY = block.sectionPaddingY === "none" || block.sectionPaddingY === "sm" || block.sectionPaddingY === "lg" ? block.sectionPaddingY : current.layout.sectionPaddingY;
@@ -3707,15 +3851,28 @@ var legacyBlockToV2Settings = (block) => {
3707
3851
  current.media.positionX = parsePercent(block.imagePositionX ?? block.backgroundImagePositionX);
3708
3852
  current.media.positionY = parsePercent(block.imagePositionY ?? block.backgroundImagePositionY);
3709
3853
  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;
3854
+ current.typography.headingAlign = isTextAlign(block.textHeadingAlign) ? block.textHeadingAlign : current.typography.headingAlign;
3855
+ current.typography.bodyAlign = isTextAlign(block.textBodyAlign) ? block.textBodyAlign : current.typography.bodyAlign;
3856
+ current.typography.headingSizePt = parsePoint(block.textHeadingSizePt);
3857
+ current.typography.bodySizePt = parsePoint(block.textBodySizePt);
3712
3858
  current.typography.maxTextWidth = block.textMaxWidth === "auto" || block.textMaxWidth === "sm" || block.textMaxWidth === "md" || block.textMaxWidth === "lg" || block.textMaxWidth === "full" ? block.textMaxWidth : current.typography.maxTextWidth;
3713
3859
  current.typography.lineHeightPreset = block.textLineHeightPreset === "tight" || block.textLineHeightPreset === "normal" || block.textLineHeightPreset === "relaxed" ? block.textLineHeightPreset : current.typography.lineHeightPreset;
3714
3860
  current.typography.letterSpacingPreset = block.textLetterSpacingPreset === "tight" || block.textLetterSpacingPreset === "normal" || block.textLetterSpacingPreset === "relaxed" ? block.textLetterSpacingPreset : current.typography.letterSpacingPreset;
3715
3861
  current.advanced.editCopyInPanel = Boolean(block.editCopyInPanel ?? current.advanced.editCopyInPanel);
3716
3862
  current.advanced.customClassName = typeof block.customClassName === "string" ? block.customClassName : current.advanced.customClassName;
3717
3863
  current.advanced.hideOnMobile = Boolean(block.hideOnMobile ?? current.advanced.hideOnMobile);
3718
- return mergeSettings(current, block.settings);
3864
+ const settings = mergeSettings(current, block.settings);
3865
+ if (block.blockType === "hero") {
3866
+ const top = settings.layout.paddingTopPt;
3867
+ const bottom = settings.layout.paddingBottomPt;
3868
+ const hasLegacyLinkedHeroPadding = settings.layout.linkVerticalPadding !== false && (top === null || typeof top === "undefined" || top === 30) && (bottom === null || typeof bottom === "undefined" || bottom === 30 || bottom === 20);
3869
+ if (hasLegacyLinkedHeroPadding) {
3870
+ settings.layout.linkVerticalPadding = false;
3871
+ settings.layout.paddingTopPt = 30;
3872
+ settings.layout.paddingBottomPt = 20;
3873
+ }
3874
+ }
3875
+ return settings;
3719
3876
  };
3720
3877
  var v2SettingsToLegacyBlock = (blockWithSettings) => {
3721
3878
  const settings = legacyBlockToV2Settings(blockWithSettings);
@@ -3741,6 +3898,8 @@ var v2SettingsToLegacyBlock = (blockWithSettings) => {
3741
3898
  next.contentGradientAngle = settings.appearance.contentGradientAngle;
3742
3899
  next.textHeadingAlign = settings.typography.headingAlign;
3743
3900
  next.textBodyAlign = settings.typography.bodyAlign;
3901
+ next.textHeadingSizePt = settings.typography.headingSizePt;
3902
+ next.textBodySizePt = settings.typography.bodySizePt;
3744
3903
  next.textMaxWidth = settings.typography.maxTextWidth;
3745
3904
  next.textLineHeightPreset = settings.typography.lineHeightPreset;
3746
3905
  next.textLetterSpacingPreset = settings.typography.letterSpacingPreset;
@@ -4164,8 +4323,52 @@ var alignOptions = [
4164
4323
  { label: "Right", value: "right" },
4165
4324
  { label: "Justify", value: "justify" }
4166
4325
  ];
4167
- var layoutFieldSet = [];
4326
+ var layoutFieldSet = [
4327
+ {
4328
+ group: "layout",
4329
+ key: "settings.layout.linkVerticalPadding",
4330
+ label: "Link Top/Bottom Padding",
4331
+ tags: ["spacing", "padding", "vertical"],
4332
+ type: "checkbox"
4333
+ },
4334
+ {
4335
+ group: "layout",
4336
+ key: "settings.layout.paddingTopPt",
4337
+ label: "Top Padding (pt)",
4338
+ max: 240,
4339
+ min: 0,
4340
+ tags: ["spacing", "padding", "top"],
4341
+ type: "number"
4342
+ },
4343
+ {
4344
+ group: "layout",
4345
+ key: "settings.layout.paddingBottomPt",
4346
+ label: "Bottom Padding (pt)",
4347
+ max: 240,
4348
+ min: 0,
4349
+ tags: ["spacing", "padding", "bottom"],
4350
+ type: "number"
4351
+ }
4352
+ ];
4168
4353
  var typographyFieldSet = [
4354
+ {
4355
+ group: "typography",
4356
+ key: "settings.typography.headingSizePt",
4357
+ label: "Heading Text Size (pt)",
4358
+ max: 120,
4359
+ min: 6,
4360
+ tags: ["text", "size", "heading", "font"],
4361
+ type: "number"
4362
+ },
4363
+ {
4364
+ group: "typography",
4365
+ key: "settings.typography.bodySizePt",
4366
+ label: "Body Text Size (pt)",
4367
+ max: 72,
4368
+ min: 6,
4369
+ tags: ["text", "size", "body", "paragraph", "font"],
4370
+ type: "number"
4371
+ },
4169
4372
  {
4170
4373
  group: "typography",
4171
4374
  key: "settings.typography.headingAlign",
@@ -4382,6 +4585,13 @@ var inspectorDefinitionByBlockType = {
4382
4585
  { group: "basics", inlineEditable: true, key: "kicker", label: "Kicker", type: "text" },
4383
4586
  { group: "basics", inlineEditable: true, key: "headline", label: "Headline", type: "text" },
4384
4587
  { group: "basics", inlineEditable: true, key: "subheadline", label: "Subheadline", type: "textarea" },
4588
+ {
4589
+ group: "basics",
4590
+ key: "settings.marquee.itemsText",
4591
+ label: "Scrolling Bar Options",
4592
+ tags: ["marquee", "scrolling", "bar", "categories"],
4593
+ type: "textarea"
4594
+ },
4385
4595
  {
4386
4596
  group: "basics",
4387
4597
  key: "variant",
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  admin_exports
3
- } from "./chunk-5FNTVRCR.mjs";
3
+ } from "./chunk-JC3UV74N.mjs";
4
4
  import {
5
5
  admin_app_exports
6
6
  } from "./chunk-RKTIFEUY.mjs";
@@ -10,13 +10,13 @@ import {
10
10
  } from "./chunk-JQAHXYAM.mjs";
11
11
  import {
12
12
  nextjs_exports
13
- } from "./chunk-OTHERBGX.mjs";
13
+ } from "./chunk-ZADL33R6.mjs";
14
14
  import "./chunk-ZTXJG4K5.mjs";
15
15
  import {
16
16
  studio_pages_exports
17
- } from "./chunk-XKUTZ7IU.mjs";
17
+ } from "./chunk-NGLIA2OE.mjs";
18
18
  import "./chunk-OQSEJXC4.mjs";
19
- import "./chunk-PF3EBZXF.mjs";
19
+ import "./chunk-7ZMXZRBP.mjs";
20
20
  import {
21
21
  studio_exports
22
22
  } from "./chunk-ADIIWIYL.mjs";
@@ -127,7 +127,9 @@ var defaultBuilderBlockSettingsV2 = {
127
127
  },
128
128
  typography: {
129
129
  bodyAlign: "left",
130
+ bodySizePt: null,
130
131
  headingAlign: "left",
132
+ headingSizePt: null,
131
133
  letterSpacingPreset: "normal",
132
134
  lineHeightPreset: "normal",
133
135
  maxTextWidth: "auto"
@@ -156,7 +158,9 @@ var defaultBuilderItemSettingsV2 = {
156
158
  },
157
159
  typography: {
158
160
  bodyAlign: "left",
161
+ bodySizePt: null,
159
162
  headingAlign: "left",
163
+ headingSizePt: null,
160
164
  letterSpacingPreset: "normal",
161
165
  lineHeightPreset: "normal",
162
166
  maxTextWidth: "auto"
@@ -166,6 +170,7 @@ var defaultBuilderItemSettingsV2 = {
166
170
 
167
171
  // src/studio-pages/builder/adapters/settingsV2.ts
168
172
  var isRecord2 = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
173
+ var isTextAlign = (value) => value === "left" || value === "center" || value === "right" || value === "justify";
169
174
  var parsePercent = (value) => {
170
175
  if (typeof value === "number" && Number.isFinite(value)) {
171
176
  return Math.max(0, Math.min(100, value));
@@ -190,6 +195,18 @@ var parsePixel = (value) => {
190
195
  }
191
196
  return null;
192
197
  };
198
+ var parsePoint = (value) => {
199
+ if (typeof value === "number" && Number.isFinite(value)) {
200
+ return Math.max(6, Math.min(120, Math.round(value)));
201
+ }
202
+ if (typeof value === "string" && value.trim().length > 0) {
203
+ const parsed = Number(value);
204
+ if (Number.isFinite(parsed)) {
205
+ return Math.max(6, Math.min(120, Math.round(parsed)));
206
+ }
207
+ }
208
+ return null;
209
+ };
193
210
  var mergeSettings = (defaults, input) => {
194
211
  if (!isRecord2(input)) {
195
212
  return structuredClone(defaults);
@@ -208,6 +225,10 @@ var mergeSettings = (defaults, input) => {
208
225
  };
209
226
  var legacyBlockToV2Settings = (block) => {
210
227
  const current = structuredClone(defaultBuilderBlockSettingsV2);
228
+ if (block.blockType === "hero" && block.variant === "centered") {
229
+ current.typography.headingAlign = "center";
230
+ current.typography.bodyAlign = "center";
231
+ }
211
232
  current.layout.contentWidth = block.contentWidth === "narrow" || block.contentWidth === "content" || block.contentWidth === "wide" || block.contentWidth === "full" || block.contentWidth === "inherit" ? block.contentWidth : current.layout.contentWidth;
212
233
  current.layout.sectionPaddingX = block.sectionPaddingX === "none" || block.sectionPaddingX === "sm" || block.sectionPaddingX === "md" || block.sectionPaddingX === "lg" || block.sectionPaddingX === "inherit" ? block.sectionPaddingX : current.layout.sectionPaddingX;
213
234
  current.layout.sectionPaddingY = block.sectionPaddingY === "none" || block.sectionPaddingY === "sm" || block.sectionPaddingY === "lg" ? block.sectionPaddingY : current.layout.sectionPaddingY;
@@ -244,15 +265,28 @@ var legacyBlockToV2Settings = (block) => {
244
265
  current.media.positionX = parsePercent(block.imagePositionX ?? block.backgroundImagePositionX);
245
266
  current.media.positionY = parsePercent(block.imagePositionY ?? block.backgroundImagePositionY);
246
267
  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;
268
+ current.typography.headingAlign = isTextAlign(block.textHeadingAlign) ? block.textHeadingAlign : current.typography.headingAlign;
269
+ current.typography.bodyAlign = isTextAlign(block.textBodyAlign) ? block.textBodyAlign : current.typography.bodyAlign;
270
+ current.typography.headingSizePt = parsePoint(block.textHeadingSizePt);
271
+ current.typography.bodySizePt = parsePoint(block.textBodySizePt);
249
272
  current.typography.maxTextWidth = block.textMaxWidth === "auto" || block.textMaxWidth === "sm" || block.textMaxWidth === "md" || block.textMaxWidth === "lg" || block.textMaxWidth === "full" ? block.textMaxWidth : current.typography.maxTextWidth;
250
273
  current.typography.lineHeightPreset = block.textLineHeightPreset === "tight" || block.textLineHeightPreset === "normal" || block.textLineHeightPreset === "relaxed" ? block.textLineHeightPreset : current.typography.lineHeightPreset;
251
274
  current.typography.letterSpacingPreset = block.textLetterSpacingPreset === "tight" || block.textLetterSpacingPreset === "normal" || block.textLetterSpacingPreset === "relaxed" ? block.textLetterSpacingPreset : current.typography.letterSpacingPreset;
252
275
  current.advanced.editCopyInPanel = Boolean(block.editCopyInPanel ?? current.advanced.editCopyInPanel);
253
276
  current.advanced.customClassName = typeof block.customClassName === "string" ? block.customClassName : current.advanced.customClassName;
254
277
  current.advanced.hideOnMobile = Boolean(block.hideOnMobile ?? current.advanced.hideOnMobile);
255
- return mergeSettings(current, block.settings);
278
+ const settings = mergeSettings(current, block.settings);
279
+ if (block.blockType === "hero") {
280
+ const top = settings.layout.paddingTopPt;
281
+ const bottom = settings.layout.paddingBottomPt;
282
+ const hasLegacyLinkedHeroPadding = settings.layout.linkVerticalPadding !== false && (top === null || typeof top === "undefined" || top === 30) && (bottom === null || typeof bottom === "undefined" || bottom === 30 || bottom === 20);
283
+ if (hasLegacyLinkedHeroPadding) {
284
+ settings.layout.linkVerticalPadding = false;
285
+ settings.layout.paddingTopPt = 30;
286
+ settings.layout.paddingBottomPt = 20;
287
+ }
288
+ }
289
+ return settings;
256
290
  };
257
291
  var v2SettingsToLegacyBlock = (blockWithSettings) => {
258
292
  const settings = legacyBlockToV2Settings(blockWithSettings);
@@ -278,6 +312,8 @@ var v2SettingsToLegacyBlock = (blockWithSettings) => {
278
312
  next.contentGradientAngle = settings.appearance.contentGradientAngle;
279
313
  next.textHeadingAlign = settings.typography.headingAlign;
280
314
  next.textBodyAlign = settings.typography.bodyAlign;
315
+ next.textHeadingSizePt = settings.typography.headingSizePt;
316
+ next.textBodySizePt = settings.typography.bodySizePt;
281
317
  next.textMaxWidth = settings.typography.maxTextWidth;
282
318
  next.textLineHeightPreset = settings.typography.lineHeightPreset;
283
319
  next.textLetterSpacingPreset = settings.typography.letterSpacingPreset;
@@ -5,9 +5,9 @@ import {
5
5
  createSiteQueries,
6
6
  resolveMedia,
7
7
  resolveSocialMediaLinks
8
- } from "../chunk-OTHERBGX.mjs";
8
+ } from "../chunk-ZADL33R6.mjs";
9
9
  import "../chunk-ZTXJG4K5.mjs";
10
- import "../chunk-PF3EBZXF.mjs";
10
+ import "../chunk-7ZMXZRBP.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 = {
@@ -116,6 +116,12 @@ h4 {
116
116
  --orion-shell-max: 100%;
117
117
  }
118
118
 
119
+ @media (max-width: 767px) {
120
+ .orion-builder-hide-mobile {
121
+ display: none !important;
122
+ }
123
+ }
124
+
119
125
  .orion-builder-content {
120
126
  width: min(var(--orion-shell-max), calc(100% - (var(--orion-shell-inline) * 2)));
121
127
  margin-inline: auto;
@@ -256,36 +262,44 @@ h4 {
256
262
  }
257
263
 
258
264
  .hero-content {
259
- position: absolute;
260
- inset: 0;
261
265
  display: flex;
262
266
  flex-direction: column;
263
267
  justify-content: center;
264
- padding: 2rem;
268
+ inset: 0;
265
269
  max-width: 610px;
270
+ padding: 2rem;
271
+ position: absolute;
272
+ text-align: var(--orion-builder-body-align, left);
266
273
  }
267
274
 
268
275
  .hero h1 {
269
276
  font-size: clamp(2rem, 4vw, 3.1rem);
270
277
  letter-spacing: -0.02em;
271
278
  margin: 0;
279
+ text-align: var(--orion-builder-heading-align, var(--orion-builder-body-align, left));
272
280
  }
273
281
 
274
282
  .hero p {
283
+ color: color-mix(in srgb, var(--orion-studio-accent-contrast) 90%, transparent);
275
284
  margin-top: 0.75rem;
276
285
  max-width: 48ch;
277
- color: color-mix(in srgb, var(--orion-studio-accent-contrast) 90%, transparent);
286
+ text-align: var(--orion-builder-body-align, left);
278
287
  }
279
288
 
280
289
  .hero-actions {
281
290
  display: flex;
282
291
  flex-wrap: wrap;
283
292
  gap: 0.75rem;
293
+ justify-content: var(--orion-builder-actions-align, flex-start);
284
294
  margin-top: 1.1rem;
285
295
  }
286
296
 
287
297
  .hero-centered .hero-content {
288
- text-align: center;
298
+ text-align: var(--orion-builder-body-align, center);
299
+ }
300
+
301
+ .hero .kicker {
302
+ text-align: var(--orion-builder-heading-align, var(--orion-builder-body-align, left));
289
303
  }
290
304
 
291
305
  .features {
@@ -984,6 +998,11 @@ h4 {
984
998
  text-align: var(--orion-builder-heading-align, inherit);
985
999
  }
986
1000
 
1001
+ .orion-builder-content p,
1002
+ .orion-builder-content li {
1003
+ text-align: var(--orion-builder-body-align, inherit);
1004
+ }
1005
+
987
1006
  /* Builder-only override: show full testimonial copy even if host app globals clamp it. */
988
1007
  .orion-builder-shell .orion-builder-content .testimonial-quote {
989
1008
  -webkit-box-orient: initial;