@morphika/andami 0.5.0 → 0.5.2

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 (122) hide show
  1. package/README.md +151 -36
  2. package/app/admin/assets/page.tsx +6 -6
  3. package/app/admin/database/page.tsx +302 -302
  4. package/app/admin/error.tsx +53 -53
  5. package/app/admin/layout.tsx +320 -327
  6. package/app/admin/navigation/page.tsx +255 -255
  7. package/app/admin/pages/[slug]/page.tsx +6 -6
  8. package/app/admin/pages/page.tsx +11 -11
  9. package/app/admin/projects/page.tsx +14 -14
  10. package/app/admin/setup/page.tsx +1 -1
  11. package/app/admin/styles/page.tsx +1 -1
  12. package/components/admin/MetadataEditor.tsx +6 -6
  13. package/components/admin/nav-builder/NavBuilder.tsx +1 -1
  14. package/components/admin/nav-builder/NavBuilderGrid.tsx +3 -3
  15. package/components/admin/nav-builder/NavGridCell.tsx +48 -48
  16. package/components/admin/nav-builder/NavGridItem.tsx +4 -4
  17. package/components/admin/nav-builder/NavItemSettings.tsx +331 -331
  18. package/components/admin/nav-builder/NavItemTypePicker.tsx +102 -102
  19. package/components/admin/nav-builder/NavLivePreview.tsx +1 -1
  20. package/components/admin/nav-builder/NavMobileLivePreview.tsx +226 -226
  21. package/components/admin/nav-builder/NavMobileSettings.tsx +242 -242
  22. package/components/admin/nav-builder/NavSettingsFields.tsx +514 -514
  23. package/components/admin/setup-wizard/BrandingStep.tsx +3 -3
  24. package/components/admin/setup-wizard/DatabaseStep.tsx +2 -2
  25. package/components/admin/setup-wizard/DoneStep.tsx +1 -1
  26. package/components/admin/setup-wizard/SetupWizard.tsx +4 -4
  27. package/components/admin/setup-wizard/StorageStep.tsx +2 -2
  28. package/components/admin/setup-wizard/WelcomeStep.tsx +2 -2
  29. package/components/admin/styles/ColorsEditor.tsx +2 -2
  30. package/components/admin/styles/FontsEditor.tsx +6 -6
  31. package/components/admin/styles/GridLayoutEditor.tsx +9 -9
  32. package/components/admin/styles/LinksButtonsEditor.tsx +5 -5
  33. package/components/admin/styles/TypographyEditor.tsx +6 -6
  34. package/components/admin/styles/shared.tsx +68 -68
  35. package/components/blocks/AudioBlockRenderer.tsx +286 -0
  36. package/components/blocks/BeforeAfterBlockRenderer.tsx +274 -0
  37. package/components/blocks/MarqueeBlockRenderer.tsx +316 -0
  38. package/components/blocks/ProjectCarouselBlockRenderer.tsx +1 -1
  39. package/components/builder/BlockCardIcons.tsx +316 -227
  40. package/components/builder/BlockTypePicker.tsx +3 -1
  41. package/components/builder/BubbleIcons.tsx +90 -0
  42. package/components/builder/BuilderCanvas.tsx +2 -0
  43. package/components/builder/CanvasMinimap.tsx +2 -2
  44. package/components/builder/CoverSectionCanvas.tsx +363 -275
  45. package/components/builder/DeviceFrame.tsx +1 -1
  46. package/components/builder/DndWrapper.tsx +3 -3
  47. package/components/builder/InsertionLines.tsx +1 -1
  48. package/components/builder/SectionCardIcons.tsx +421 -320
  49. package/components/builder/SectionEditorBar.tsx +1 -1
  50. package/components/builder/SectionTypePicker.tsx +4 -4
  51. package/components/builder/SectionV2Canvas.tsx +20 -4
  52. package/components/builder/SectionV2Column.tsx +74 -68
  53. package/components/builder/SortableBlock.tsx +93 -73
  54. package/components/builder/SortableRow.tsx +27 -26
  55. package/components/builder/VirtualAssetGrid.tsx +2 -2
  56. package/components/builder/asset-browser/R2BrowserContent.tsx +34 -17
  57. package/components/builder/asset-browser/helpers.ts +4 -0
  58. package/components/builder/asset-browser/types.ts +2 -1
  59. package/components/builder/blockStyles.tsx +192 -173
  60. package/components/builder/color-picker/AlphaSlider.tsx +141 -141
  61. package/components/builder/color-picker/ColorInputs.tsx +105 -105
  62. package/components/builder/color-picker/EyedropperButton.tsx +74 -74
  63. package/components/builder/color-picker/HueSlider.tsx +124 -124
  64. package/components/builder/color-picker/SaturationCanvas.tsx +142 -142
  65. package/components/builder/color-picker/SwatchBar.tsx +93 -93
  66. package/components/builder/editors/AudioBlockEditor.tsx +242 -0
  67. package/components/builder/editors/BeforeAfterBlockEditor.tsx +360 -0
  68. package/components/builder/editors/ButtonBlockEditor.tsx +4 -4
  69. package/components/builder/editors/EnterAnimationPicker.tsx +2 -2
  70. package/components/builder/editors/HoverEffectPicker.tsx +2 -2
  71. package/components/builder/editors/ImageBlockEditor.tsx +2 -2
  72. package/components/builder/editors/ImageGridBlockEditor.tsx +4 -4
  73. package/components/builder/editors/MarqueeBlockEditor.tsx +621 -0
  74. package/components/builder/editors/ProjectCarouselBlockEditor.tsx +443 -443
  75. package/components/builder/editors/ProjectGridEditor.tsx +9 -9
  76. package/components/builder/editors/SpacerBlockEditor.tsx +5 -5
  77. package/components/builder/editors/StaggerSettings.tsx +109 -109
  78. package/components/builder/editors/TextBlockEditor.tsx +3 -3
  79. package/components/builder/editors/TextStylePicker.tsx +1 -1
  80. package/components/builder/editors/VideoBlockEditor.tsx +2 -2
  81. package/components/builder/editors/index.ts +11 -10
  82. package/components/builder/editors/shared.tsx +7 -7
  83. package/components/builder/live-preview/LiveAudioPreview.tsx +120 -0
  84. package/components/builder/live-preview/LiveBeforeAfterPreview.tsx +176 -0
  85. package/components/builder/live-preview/LiveImageGridPreview.tsx +10 -2
  86. package/components/builder/live-preview/LiveImagePreview.tsx +1 -1
  87. package/components/builder/live-preview/LiveMarqueePreview.tsx +39 -0
  88. package/components/builder/live-preview/LiveProjectCarouselPreview.tsx +1 -1
  89. package/components/builder/live-preview/LiveVideoPreview.tsx +1 -1
  90. package/components/builder/live-preview/ProjectCardWrapper.tsx +291 -291
  91. package/components/builder/settings-panel/AnimationTab.tsx +138 -138
  92. package/components/builder/settings-panel/BlockLayoutTab.tsx +7 -7
  93. package/components/builder/settings-panel/CardEntranceSection.tsx +114 -114
  94. package/components/builder/settings-panel/ColumnV2Settings.tsx +5 -5
  95. package/components/builder/settings-panel/CoverSectionLayoutTab.tsx +71 -71
  96. package/components/builder/settings-panel/CoverSectionSettings.tsx +335 -335
  97. package/components/builder/settings-panel/PageSettings.tsx +3 -3
  98. package/components/builder/settings-panel/ParallaxSlideSettings.tsx +2 -2
  99. package/components/builder/settings-panel/SectionV2AnimationTab.tsx +4 -4
  100. package/components/builder/settings-panel/SectionV2LayoutTab.tsx +356 -356
  101. package/components/builder/settings-panel/SectionV2Settings.tsx +14 -14
  102. package/components/builder/settings-panel/TRBLInputs.tsx +1 -1
  103. package/lib/animation/enter-types.ts +3 -0
  104. package/lib/animation/hover-effect-presets.ts +210 -210
  105. package/lib/animation/hover-effect-types.ts +3 -0
  106. package/lib/builder/block-registrations.ts +468 -335
  107. package/lib/builder/constants.ts +111 -111
  108. package/lib/builder/store-sections.ts +2 -2
  109. package/lib/builder/types-slices.ts +414 -414
  110. package/lib/builder/types.ts +6 -1
  111. package/lib/config/index.ts +27 -27
  112. package/lib/sanity/types.ts +156 -1
  113. package/lib/version.ts +1 -1
  114. package/package.json +1 -1
  115. package/sanity/schemas/blocks/audioBlock.ts +69 -0
  116. package/sanity/schemas/blocks/beforeAfterBlock.ts +121 -0
  117. package/sanity/schemas/blocks/index.ts +12 -9
  118. package/sanity/schemas/blocks/marqueeBlock.ts +292 -0
  119. package/sanity/schemas/index.ts +120 -111
  120. package/styles/admin.css +85 -85
  121. package/styles/animations.css +237 -237
  122. package/styles/base.css +114 -114
@@ -0,0 +1,292 @@
1
+ import { defineField, defineType } from "sanity";
2
+ import { blockLayoutField, blockAnimationFields } from "./blockLayout";
3
+
4
+ /**
5
+ * marqueeBlock — horizontal infinite-scroll ticker.
6
+ *
7
+ * Signature portfolio element. Supports mixed content (text, images,
8
+ * separators) scrolling horizontally at a configurable speed, with
9
+ * pause-on-hover and a hollow-text "outline" typography option for the
10
+ * classic portfolio look.
11
+ *
12
+ * Treated as a **section-level block** (same semantics as
13
+ * projectGridBlock / projectCarouselBlock): lives inside a full-width
14
+ * column of a pageSectionV2 and is added via the "+ Add Section" modal,
15
+ * not the "+ Add Block" picker. Unlike the two project-related section
16
+ * blocks, Marquee is available on **both pages and projects** — the
17
+ * "AVAILABLE FOR WORK" band fits naturally on `/work/[slug]` too.
18
+ *
19
+ * Performance: the renderer uses pure CSS @keyframes + IntersectionObserver
20
+ * to pause the animation when off-screen. Zero JS in the hot path, zero
21
+ * CPU off-screen. Respects `prefers-reduced-motion`.
22
+ *
23
+ * Hover effects deliberately disabled (enterPresets only): a block that
24
+ * is already moving doesn't benefit from scale/tilt hover effects — would
25
+ * fight the motion.
26
+ */
27
+ export const marqueeBlock = defineType({
28
+ name: "marqueeBlock",
29
+ title: "Marquee",
30
+ type: "object",
31
+ fields: [
32
+ // ─── Content (items array) ────────────────────────────────
33
+ defineField({
34
+ name: "items",
35
+ title: "Items",
36
+ type: "array",
37
+ description:
38
+ "Ordered list of text, images and separators. They repeat in order indefinitely as the marquee scrolls.",
39
+ of: [
40
+ {
41
+ type: "object",
42
+ name: "marqueeText",
43
+ title: "Text",
44
+ fields: [
45
+ defineField({
46
+ name: "text",
47
+ title: "Text",
48
+ type: "string",
49
+ validation: (Rule) => Rule.required().min(1),
50
+ }),
51
+ ],
52
+ preview: {
53
+ select: { title: "text" },
54
+ prepare: ({ title }: { title?: string }) => ({
55
+ title: title || "(empty text)",
56
+ subtitle: "Text",
57
+ }),
58
+ },
59
+ },
60
+ {
61
+ type: "object",
62
+ name: "marqueeImage",
63
+ title: "Image",
64
+ fields: [
65
+ defineField({
66
+ name: "asset_path",
67
+ title: "Asset path",
68
+ type: "string",
69
+ description: "Relative path to the image file",
70
+ validation: (Rule) => Rule.required(),
71
+ }),
72
+ defineField({
73
+ name: "alt",
74
+ title: "Alt text",
75
+ type: "string",
76
+ }),
77
+ defineField({
78
+ name: "border_radius",
79
+ title: "Border radius (px)",
80
+ type: "number",
81
+ initialValue: 0,
82
+ validation: (Rule) => Rule.min(0).max(200),
83
+ }),
84
+ defineField({
85
+ name: "width",
86
+ title: "Width (px)",
87
+ type: "number",
88
+ description:
89
+ "Fixed width. Leave empty to derive from the row height and image aspect ratio.",
90
+ validation: (Rule) => Rule.min(16).max(1200),
91
+ }),
92
+ ],
93
+ preview: {
94
+ select: { title: "alt", subtitle: "asset_path" },
95
+ prepare: ({ title, subtitle }: { title?: string; subtitle?: string }) => ({
96
+ title: title || "(no alt)",
97
+ subtitle: `Image · ${subtitle || "no asset"}`,
98
+ }),
99
+ },
100
+ },
101
+ {
102
+ type: "object",
103
+ name: "marqueeSeparator",
104
+ title: "Separator",
105
+ fields: [
106
+ defineField({
107
+ name: "character",
108
+ title: "Character",
109
+ type: "string",
110
+ description:
111
+ "Any character (or emoji) used as a divider. Common: • · — / ▸ ★",
112
+ initialValue: "•",
113
+ validation: (Rule) => Rule.required().min(1).max(4),
114
+ }),
115
+ ],
116
+ preview: {
117
+ select: { title: "character" },
118
+ prepare: ({ title }: { title?: string }) => ({
119
+ title: title || "•",
120
+ subtitle: "Separator",
121
+ }),
122
+ },
123
+ },
124
+ ],
125
+ }),
126
+
127
+ // ─── Motion ───────────────────────────────────────────────
128
+ defineField({
129
+ name: "direction",
130
+ title: "Direction",
131
+ type: "string",
132
+ description: "Horizontal scroll direction",
133
+ options: {
134
+ list: [
135
+ { title: "Left →", value: "left" },
136
+ { title: "← Right", value: "right" },
137
+ ],
138
+ },
139
+ initialValue: "left",
140
+ }),
141
+ defineField({
142
+ name: "speed",
143
+ title: "Speed (px/s)",
144
+ type: "number",
145
+ description:
146
+ "Scroll speed in pixels per second. Decouples from content length (a 20s loop feels radically different with 10 items vs 100).",
147
+ initialValue: 60,
148
+ validation: (Rule) => Rule.min(5).max(600),
149
+ }),
150
+ defineField({
151
+ name: "pause_on_hover",
152
+ title: "Pause on hover",
153
+ type: "boolean",
154
+ initialValue: true,
155
+ }),
156
+
157
+ // ─── Typography (text + separator items) ──────────────────
158
+ defineField({
159
+ name: "font_size",
160
+ title: "Font size",
161
+ type: "string",
162
+ description: "Size scale for text and separator items",
163
+ options: {
164
+ list: [
165
+ { title: "S", value: "s" },
166
+ { title: "Base", value: "base" },
167
+ { title: "L", value: "l" },
168
+ { title: "XL", value: "xl" },
169
+ { title: "2XL", value: "2xl" },
170
+ { title: "3XL", value: "3xl" },
171
+ { title: "4XL", value: "4xl" },
172
+ { title: "5XL", value: "5xl" },
173
+ { title: "6XL", value: "6xl" },
174
+ ],
175
+ },
176
+ initialValue: "3xl",
177
+ }),
178
+ defineField({
179
+ name: "font_weight",
180
+ title: "Font weight",
181
+ type: "string",
182
+ options: {
183
+ list: [
184
+ { title: "Normal", value: "400" },
185
+ { title: "Medium", value: "500" },
186
+ { title: "Bold", value: "700" },
187
+ { title: "Black", value: "900" },
188
+ ],
189
+ },
190
+ initialValue: "700",
191
+ }),
192
+ defineField({
193
+ name: "color",
194
+ title: "Text color",
195
+ type: "string",
196
+ description: "Hex or palette token",
197
+ initialValue: "#111111",
198
+ }),
199
+ defineField({
200
+ name: "text_style",
201
+ title: "Text style",
202
+ type: "string",
203
+ description:
204
+ "Outline renders hollow text via -webkit-text-stroke — the classic portfolio signature look.",
205
+ options: {
206
+ list: [
207
+ { title: "Solid", value: "solid" },
208
+ { title: "Outline (hollow)", value: "outline" },
209
+ { title: "Italic outline", value: "italic-outline" },
210
+ ],
211
+ },
212
+ initialValue: "solid",
213
+ }),
214
+ defineField({
215
+ name: "letter_spacing",
216
+ title: "Letter spacing (em)",
217
+ type: "number",
218
+ description: "Extra tracking between letters — in em units",
219
+ initialValue: 0,
220
+ validation: (Rule) => Rule.min(-0.1).max(0.5),
221
+ }),
222
+ defineField({
223
+ name: "text_transform",
224
+ title: "Text transform",
225
+ type: "string",
226
+ options: {
227
+ list: [
228
+ { title: "None", value: "none" },
229
+ { title: "UPPERCASE", value: "uppercase" },
230
+ { title: "lowercase", value: "lowercase" },
231
+ ],
232
+ },
233
+ initialValue: "uppercase",
234
+ }),
235
+
236
+ // ─── Layout ───────────────────────────────────────────────
237
+ defineField({
238
+ name: "gap",
239
+ title: "Gap between items (px)",
240
+ type: "number",
241
+ initialValue: 48,
242
+ validation: (Rule) => Rule.min(0).max(200),
243
+ }),
244
+ defineField({
245
+ name: "row_height",
246
+ title: "Row height (px)",
247
+ type: "number",
248
+ description: "Height of the marquee band. Determines image item height.",
249
+ initialValue: 120,
250
+ validation: (Rule) => Rule.min(24).max(600),
251
+ }),
252
+ defineField({
253
+ name: "padding_y",
254
+ title: "Vertical padding (px)",
255
+ type: "number",
256
+ initialValue: 16,
257
+ validation: (Rule) => Rule.min(0).max(200),
258
+ }),
259
+ defineField({
260
+ name: "background_color",
261
+ title: "Background color",
262
+ type: "string",
263
+ description: "Hex or palette token. Leave empty for transparent.",
264
+ }),
265
+
266
+ // ─── Standard block fields ────────────────────────────────
267
+ ...blockAnimationFields,
268
+ blockLayoutField,
269
+ ],
270
+ preview: {
271
+ select: {
272
+ direction: "direction",
273
+ speed: "speed",
274
+ items: "items",
275
+ },
276
+ prepare: ({
277
+ direction,
278
+ speed,
279
+ items,
280
+ }: {
281
+ direction?: string;
282
+ speed?: number;
283
+ items?: unknown[];
284
+ }) => {
285
+ const count = Array.isArray(items) ? items.length : 0;
286
+ const arrow = direction === "right" ? "←" : "→";
287
+ return {
288
+ title: `Marquee (${count} items ${arrow} ${speed ?? 60}px/s)`,
289
+ };
290
+ },
291
+ },
292
+ });
@@ -1,111 +1,120 @@
1
- import page from "./page";
2
- import pageSectionV2 from "./pageSectionV2";
3
- import customSection from "./customSection";
4
- import customSectionInstance from "./customSectionInstance";
5
- import siteSettings from "./siteSettings";
6
- import siteStyles from "./siteStyles";
7
- import assetRegistry from "./assetRegistry";
8
- import enterAnimationConfig from "./objects/enterAnimationConfig";
9
- import hoverEffectConfig from "./objects/hoverEffectConfig";
10
- import typewriterConfig from "./objects/typewriterConfig";
11
- import parallaxSlide from "./objects/parallaxSlide";
12
- import parallaxGroup from "./objects/parallaxGroup";
13
- import coverSection from "./objects/coverSection";
14
- import {
15
- textBlock,
16
- imageBlock,
17
- imageGridBlock,
18
- videoBlock,
19
- spacerBlock,
20
- buttonBlock,
21
- projectGridBlock,
22
- projectCarouselBlock,
23
- } from "./blocks";
24
-
25
- // Re-export individual schemas for granular use by instances
26
- export {
27
- default as page,
28
- } from "./page";
29
- export {
30
- default as siteSettings,
31
- } from "./siteSettings";
32
- export {
33
- default as siteStyles,
34
- } from "./siteStyles";
35
- export {
36
- default as assetRegistry,
37
- } from "./assetRegistry";
38
- export {
39
- default as pageSectionV2,
40
- } from "./pageSectionV2";
41
- export {
42
- default as customSection,
43
- } from "./customSection";
44
- export {
45
- default as customSectionInstance,
46
- } from "./customSectionInstance";
47
- export {
48
- default as enterAnimationConfig,
49
- } from "./objects/enterAnimationConfig";
50
- export {
51
- default as hoverEffectConfig,
52
- } from "./objects/hoverEffectConfig";
53
- export {
54
- default as typewriterConfig,
55
- } from "./objects/typewriterConfig";
56
- export {
57
- default as parallaxSlide,
58
- } from "./objects/parallaxSlide";
59
- export {
60
- default as parallaxGroup,
61
- } from "./objects/parallaxGroup";
62
- export {
63
- default as coverSection,
64
- } from "./objects/coverSection";
65
- export {
66
- textBlock,
67
- imageBlock,
68
- imageGridBlock,
69
- videoBlock,
70
- spacerBlock,
71
- buttonBlock,
72
- projectGridBlock,
73
- projectCarouselBlock,
74
- } from "./blocks";
75
-
76
- export const schemaTypes = [
77
- // Documents
78
- page,
79
- siteSettings,
80
- siteStyles,
81
- assetRegistry,
82
-
83
- // Structural objects
84
- pageSectionV2,
85
- customSection,
86
- customSectionInstance,
87
-
88
- // Reusable objects
89
- enterAnimationConfig, // Enter animation system (Session 117)
90
- hoverEffectConfig, // Unified hover effect system (Session 117)
91
- typewriterConfig, // Typewriter config for textBlock (Session 117)
92
- parallaxSlide, // Parallax V2 slide (Session 123)
93
- parallaxGroup, // Parallax V2 group (Session 123)
94
- coverSection, // Cover Section — proportional rows (Session 176)
95
-
96
- // Blocks (9)
97
- textBlock,
98
- imageBlock,
99
- imageGridBlock,
100
- videoBlock,
101
- spacerBlock,
102
- buttonBlock,
103
- projectGridBlock,
104
- projectCarouselBlock,
105
- ];
106
-
107
- /**
108
- * Named alias for instance consumption.
109
- * Instances import this and pass to composeSchemas().
110
- */
111
- export const coreSchemas = schemaTypes;
1
+ import page from "./page";
2
+ import pageSectionV2 from "./pageSectionV2";
3
+ import customSection from "./customSection";
4
+ import customSectionInstance from "./customSectionInstance";
5
+ import siteSettings from "./siteSettings";
6
+ import siteStyles from "./siteStyles";
7
+ import assetRegistry from "./assetRegistry";
8
+ import enterAnimationConfig from "./objects/enterAnimationConfig";
9
+ import hoverEffectConfig from "./objects/hoverEffectConfig";
10
+ import typewriterConfig from "./objects/typewriterConfig";
11
+ import parallaxSlide from "./objects/parallaxSlide";
12
+ import parallaxGroup from "./objects/parallaxGroup";
13
+ import coverSection from "./objects/coverSection";
14
+ import {
15
+ textBlock,
16
+ imageBlock,
17
+ imageGridBlock,
18
+ videoBlock,
19
+ spacerBlock,
20
+ buttonBlock,
21
+ beforeAfterBlock,
22
+ audioBlock,
23
+ projectGridBlock,
24
+ projectCarouselBlock,
25
+ marqueeBlock,
26
+ } from "./blocks";
27
+
28
+ // Re-export individual schemas for granular use by instances
29
+ export {
30
+ default as page,
31
+ } from "./page";
32
+ export {
33
+ default as siteSettings,
34
+ } from "./siteSettings";
35
+ export {
36
+ default as siteStyles,
37
+ } from "./siteStyles";
38
+ export {
39
+ default as assetRegistry,
40
+ } from "./assetRegistry";
41
+ export {
42
+ default as pageSectionV2,
43
+ } from "./pageSectionV2";
44
+ export {
45
+ default as customSection,
46
+ } from "./customSection";
47
+ export {
48
+ default as customSectionInstance,
49
+ } from "./customSectionInstance";
50
+ export {
51
+ default as enterAnimationConfig,
52
+ } from "./objects/enterAnimationConfig";
53
+ export {
54
+ default as hoverEffectConfig,
55
+ } from "./objects/hoverEffectConfig";
56
+ export {
57
+ default as typewriterConfig,
58
+ } from "./objects/typewriterConfig";
59
+ export {
60
+ default as parallaxSlide,
61
+ } from "./objects/parallaxSlide";
62
+ export {
63
+ default as parallaxGroup,
64
+ } from "./objects/parallaxGroup";
65
+ export {
66
+ default as coverSection,
67
+ } from "./objects/coverSection";
68
+ export {
69
+ textBlock,
70
+ imageBlock,
71
+ imageGridBlock,
72
+ videoBlock,
73
+ spacerBlock,
74
+ buttonBlock,
75
+ beforeAfterBlock,
76
+ audioBlock,
77
+ projectGridBlock,
78
+ projectCarouselBlock,
79
+ marqueeBlock,
80
+ } from "./blocks";
81
+
82
+ export const schemaTypes = [
83
+ // Documents
84
+ page,
85
+ siteSettings,
86
+ siteStyles,
87
+ assetRegistry,
88
+
89
+ // Structural objects
90
+ pageSectionV2,
91
+ customSection,
92
+ customSectionInstance,
93
+
94
+ // Reusable objects
95
+ enterAnimationConfig, // Enter animation system (Session 117)
96
+ hoverEffectConfig, // Unified hover effect system (Session 117)
97
+ typewriterConfig, // Typewriter config for textBlock (Session 117)
98
+ parallaxSlide, // Parallax V2 slide (Session 123)
99
+ parallaxGroup, // Parallax V2 group (Session 123)
100
+ coverSection, // Cover Section — proportional rows (Session 176)
101
+
102
+ // Blocks (11)
103
+ textBlock,
104
+ imageBlock,
105
+ imageGridBlock,
106
+ videoBlock,
107
+ spacerBlock,
108
+ buttonBlock,
109
+ beforeAfterBlock,
110
+ audioBlock,
111
+ projectGridBlock,
112
+ projectCarouselBlock,
113
+ marqueeBlock,
114
+ ];
115
+
116
+ /**
117
+ * Named alias for instance consumption.
118
+ * Instances import this and pass to composeSchemas().
119
+ */
120
+ export const coreSchemas = schemaTypes;