@morphika/andami 0.1.2 → 0.1.5

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 (85) hide show
  1. package/app/(site)/[slug]/page.tsx +2 -2
  2. package/app/(site)/layout.tsx +1 -0
  3. package/app/(site)/page.tsx +2 -2
  4. package/app/(site)/preview/page.tsx +4 -4
  5. package/app/(site)/work/[slug]/page.tsx +2 -2
  6. package/app/admin/layout.tsx +2 -2
  7. package/app/admin/login/page.tsx +5 -5
  8. package/app/admin/navigation/page.tsx +255 -157
  9. package/app/api/admin/assets/relink/confirm/route.ts +1 -1
  10. package/app/api/admin/pages/[slug]/route.ts +1 -1
  11. package/app/api/admin/settings/route.ts +40 -15
  12. package/app/api/admin/setup/complete/route.ts +1 -1
  13. package/app/api/admin/setup/route.ts +6 -3
  14. package/components/admin/index.ts +7 -0
  15. package/components/admin/nav-builder/NavGeneralSettings.tsx +11 -15
  16. package/components/admin/nav-builder/NavItemSettings.tsx +29 -5
  17. package/components/admin/nav-builder/NavLivePreview.tsx +4 -1
  18. package/components/admin/nav-builder/NavMobileLivePreview.tsx +226 -0
  19. package/components/admin/nav-builder/NavMobileSettings.tsx +223 -0
  20. package/components/admin/nav-builder/index.ts +2 -0
  21. package/components/blocks/BlockRenderer.tsx +65 -13
  22. package/components/blocks/ButtonBlockRenderer.tsx +29 -6
  23. package/components/blocks/CoverBlockRenderer.tsx +36 -14
  24. package/components/blocks/ImageBlockRenderer.tsx +5 -3
  25. package/components/blocks/ImageGridBlockRenderer.tsx +13 -6
  26. package/components/blocks/PageRenderer.tsx +4 -2
  27. package/components/blocks/ProjectGridBlockRenderer.tsx +18 -3
  28. package/components/blocks/SectionRenderer.tsx +9 -8
  29. package/components/blocks/SectionV2Renderer.tsx +8 -8
  30. package/components/blocks/SpacerBlockRenderer.tsx +4 -2
  31. package/components/blocks/TextBlockRenderer.tsx +9 -4
  32. package/components/builder/BuilderCanvas.tsx +10 -4
  33. package/components/builder/ColorPicker.tsx +51 -243
  34. package/components/builder/ColorSwatchPicker.tsx +214 -274
  35. package/components/builder/DndWrapper.tsx +5 -2
  36. package/components/builder/SectionV2Canvas.tsx +15 -4
  37. package/components/builder/asset-browser/useAssetBrowser.ts +9 -1
  38. package/components/builder/color-picker/AlphaSlider.tsx +141 -0
  39. package/components/builder/color-picker/AngleControl.tsx +138 -0
  40. package/components/builder/color-picker/ColorInputs.tsx +105 -0
  41. package/components/builder/color-picker/EyedropperButton.tsx +74 -0
  42. package/components/builder/color-picker/GradientBar.tsx +222 -0
  43. package/components/builder/color-picker/GradientPreview.tsx +53 -0
  44. package/components/builder/color-picker/HueSlider.tsx +124 -0
  45. package/components/builder/color-picker/MeshCanvas.tsx +172 -0
  46. package/components/builder/color-picker/MeshPointEditor.tsx +133 -0
  47. package/components/builder/color-picker/MeshPointList.tsx +200 -0
  48. package/components/builder/color-picker/PositionControl.tsx +158 -0
  49. package/components/builder/color-picker/SaturationCanvas.tsx +142 -0
  50. package/components/builder/color-picker/StopEditor.tsx +178 -0
  51. package/components/builder/color-picker/SwatchBar.tsx +93 -0
  52. package/components/builder/color-picker/UnifiedColorPicker.tsx +713 -0
  53. package/components/builder/color-picker/index.ts +62 -0
  54. package/components/builder/color-picker/types.ts +115 -0
  55. package/components/builder/color-picker/utils.ts +138 -0
  56. package/components/builder/editors/CoverBlockEditor.tsx +86 -32
  57. package/components/builder/editors/ProjectGridEditor.tsx +51 -4
  58. package/components/builder/hooks/useColumnDrag.ts +25 -27
  59. package/components/builder/settings-panel/BlockLayoutTab.tsx +29 -7
  60. package/components/builder/settings-panel/LayoutTab.tsx +382 -310
  61. package/components/builder/settings-panel/PageSettings.tsx +6 -4
  62. package/components/builder/settings-panel/ParallaxSlideSettings.tsx +2 -2
  63. package/components/builder/settings-panel/SectionV2LayoutTab.tsx +392 -312
  64. package/components/builder/settings-panel/SectionV2Settings.tsx +65 -35
  65. package/components/ui/Navbar.tsx +95 -25
  66. package/components/ui/PortfolioTracker.tsx +3 -3
  67. package/lib/assets.ts +1 -1
  68. package/lib/auth.ts +1 -1
  69. package/lib/builder/gradient-presets.ts +128 -0
  70. package/lib/builder/layout-styles.ts +16 -10
  71. package/lib/builder/serializer.ts +1 -0
  72. package/lib/builder/store-blocks.ts +48 -61
  73. package/lib/builder/store-helpers.ts +31 -14
  74. package/lib/builder/store.ts +59 -41
  75. package/lib/builder/types.ts +14 -0
  76. package/lib/color-utils.ts +200 -0
  77. package/lib/config/index.ts +14 -43
  78. package/lib/revalidate.ts +2 -2
  79. package/lib/sanity/queries.ts +4 -3
  80. package/lib/sanity/types.ts +76 -1
  81. package/lib/setup/detect.ts +1 -1
  82. package/package.json +8 -12
  83. package/sanity/schemas/siteSettings.ts +34 -0
  84. package/styles/base.css +7 -51
  85. package/app/globals.css +0 -7
@@ -22,6 +22,7 @@ import {
22
22
  AssetPathInput,
23
23
  } from "../editors/shared";
24
24
  import ColorSwatchPicker, { usePaletteSwatches } from "../ColorSwatchPicker";
25
+ import { serializeColorField, parseColorField, isGradient } from "../../../lib/color-utils";
25
26
  import { TRBLInputs } from "./TRBLInputs";
26
27
  import {
27
28
  getBlockLayoutValue,
@@ -236,6 +237,14 @@ export function BlockLayoutTab({ block }: { block: ContentBlock }) {
236
237
  const paletteSwatches = usePaletteSwatches();
237
238
  const activeViewport = store.activeViewport;
238
239
 
240
+ // Live preview callbacks (Phase 4)
241
+ const handleBgPreview = (val: import("../../../lib/sanity/types").ColorField) => {
242
+ store.setColorPickerPreview({ blockKey: block._key, field: "background_color", value: val });
243
+ };
244
+ const handleBorderPreview = (val: import("../../../lib/sanity/types").ColorField) => {
245
+ store.setColorPickerPreview({ blockKey: block._key, field: "border_color", value: val });
246
+ };
247
+
239
248
  /** Update a block layout property, viewport-aware */
240
249
  const updateLayout = (property: keyof BlockLayout, value: unknown) => {
241
250
  const updates = setBlockLayoutOverride(block, activeViewport, property, value);
@@ -257,6 +266,7 @@ export function BlockLayoutTab({ block }: { block: ContentBlock }) {
257
266
 
258
267
  // Effective values per viewport
259
268
  const bgOpacity = getBlockLayoutValue<number>(block, activeViewport, "background_opacity", 100);
269
+ const bgIsGradient = isGradient(parseColorField(getBlockLayoutValue<string>(block, activeViewport, "background_color", "")));
260
270
  const alignH: AlignH = getBlockLayoutValue<string>(block, activeViewport, "align_h", "left") as AlignH;
261
271
  const alignV: AlignV = getBlockLayoutValue<string>(block, activeViewport, "align_v", "top") as AlignV;
262
272
 
@@ -360,12 +370,15 @@ export function BlockLayoutTab({ block }: { block: ContentBlock }) {
360
370
  <SettingsSection title="Background" defaultOpen icon={<BackgroundSectionIcon />}>
361
371
  <SettingsField label="Color">
362
372
  <ColorSwatchPicker
363
- value={getBlockLayoutValue<string>(block, activeViewport, "background_color", "")}
364
- onChange={(hex) => {
373
+ value={parseColorField(getBlockLayoutValue<string>(block, activeViewport, "background_color", ""))}
374
+ onChange={(val) => {
365
375
  store._pushSnapshot();
366
- updateLayout("background_color", hex);
376
+ store.clearColorPickerPreview();
377
+ updateLayout("background_color", serializeColorField(val));
367
378
  }}
368
379
  swatches={paletteSwatches}
380
+ allowGradients
381
+ onPreview={handleBgPreview}
369
382
  />
370
383
  </SettingsField>
371
384
 
@@ -377,12 +390,18 @@ export function BlockLayoutTab({ block }: { block: ContentBlock }) {
377
390
  max={100}
378
391
  value={bgOpacity}
379
392
  onChange={(e) => updateLayout("background_opacity", parseInt(e.target.value))}
380
- className="flex-1 accent-[#076bff]"
393
+ className={`flex-1 accent-[#076bff] ${bgIsGradient ? "opacity-40 pointer-events-none" : ""}`}
394
+ disabled={bgIsGradient}
381
395
  />
382
396
  <span className="text-xs text-neutral-900 w-10 text-right">
383
397
  {bgOpacity}%
384
398
  </span>
385
399
  </div>
400
+ {bgIsGradient && (
401
+ <p className="text-[9px] text-neutral-400 italic mt-1">
402
+ Opacity is controlled per stop in gradient mode
403
+ </p>
404
+ )}
386
405
  </SettingsField>
387
406
 
388
407
  <SettingsField label="Image">
@@ -450,12 +469,15 @@ export function BlockLayoutTab({ block }: { block: ContentBlock }) {
450
469
  <SettingsSection title="Border" icon={<BorderSectionIcon />}>
451
470
  <SettingsField label="Color">
452
471
  <ColorSwatchPicker
453
- value={getBlockLayoutValue<string>(block, activeViewport, "border_color", "")}
454
- onChange={(hex) => {
472
+ value={parseColorField(getBlockLayoutValue<string>(block, activeViewport, "border_color", ""))}
473
+ onChange={(val) => {
455
474
  store._pushSnapshot();
456
- updateLayout("border_color", hex);
475
+ store.clearColorPickerPreview();
476
+ updateLayout("border_color", serializeColorField(val));
457
477
  }}
458
478
  swatches={paletteSwatches}
479
+ allowGradients
480
+ onPreview={handleBorderPreview}
459
481
  />
460
482
  </SettingsField>
461
483