@morphika/webframe 0.1.0 → 0.1.1
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.
- package/package.json +212 -212
- package/sanity/schemas/siteStyles.ts +212 -210
package/package.json
CHANGED
|
@@ -1,212 +1,212 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@morphika/webframe",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Visual Page Builder — core library. A reusable website builder with visual editing, CMS integration, and asset management.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"repository": {
|
|
8
|
-
"type": "git",
|
|
9
|
-
"url": "https://github.com/MorphikaStudio/Morphika_Webframe.git"
|
|
10
|
-
},
|
|
11
|
-
"keywords": [
|
|
12
|
-
"visual-builder",
|
|
13
|
-
"website-builder",
|
|
14
|
-
"cms",
|
|
15
|
-
"next.js",
|
|
16
|
-
"sanity",
|
|
17
|
-
"page-builder",
|
|
18
|
-
"morphika"
|
|
19
|
-
],
|
|
20
|
-
"files": [
|
|
21
|
-
"admin/",
|
|
22
|
-
"app/",
|
|
23
|
-
"components/",
|
|
24
|
-
"lib/",
|
|
25
|
-
"sanity/",
|
|
26
|
-
"site/",
|
|
27
|
-
"studio/",
|
|
28
|
-
"styles/",
|
|
29
|
-
"tsconfig.json",
|
|
30
|
-
"LICENSE",
|
|
31
|
-
"!**/__tests__/",
|
|
32
|
-
"!**/*.test.ts",
|
|
33
|
-
"!**/*.test.tsx",
|
|
34
|
-
"!**/*.spec.ts",
|
|
35
|
-
"!**/*.spec.tsx",
|
|
36
|
-
"!**/archive/"
|
|
37
|
-
],
|
|
38
|
-
"scripts": {
|
|
39
|
-
"prepack": "node scripts/prepack.mjs",
|
|
40
|
-
"postpack": "node scripts/postpack.mjs",
|
|
41
|
-
"test": "vitest",
|
|
42
|
-
"test:run": "vitest run",
|
|
43
|
-
"lint": "eslint",
|
|
44
|
-
"typecheck": "tsc --noEmit"
|
|
45
|
-
},
|
|
46
|
-
"exports": {
|
|
47
|
-
"./config": "./lib/config/index.ts",
|
|
48
|
-
"./config/types": "./lib/config/types.ts",
|
|
49
|
-
|
|
50
|
-
"./components/blocks": "./components/blocks/index.ts",
|
|
51
|
-
"./components/blocks/*": "./components/blocks/*.tsx",
|
|
52
|
-
"./components/builder": "./components/builder/index.ts",
|
|
53
|
-
"./components/builder/*": "./components/builder/*.tsx",
|
|
54
|
-
"./components/builder/editors/*": "./components/builder/editors/*.tsx",
|
|
55
|
-
"./components/builder/settings-panel": "./components/builder/settings-panel/index.ts",
|
|
56
|
-
"./components/builder/settings-panel/*": "./components/builder/settings-panel/*.tsx",
|
|
57
|
-
"./components/builder/asset-browser": "./components/builder/asset-browser/index.ts",
|
|
58
|
-
"./components/builder/asset-browser/*": "./components/builder/asset-browser/*.tsx",
|
|
59
|
-
"./components/builder/live-preview": "./components/builder/live-preview/index.ts",
|
|
60
|
-
"./components/builder/live-preview/*": "./components/builder/live-preview/*.tsx",
|
|
61
|
-
"./components/admin": "./components/admin/index.ts",
|
|
62
|
-
"./components/admin/*": "./components/admin/*.tsx",
|
|
63
|
-
"./components/admin/nav-builder": "./components/admin/nav-builder/index.ts",
|
|
64
|
-
"./components/admin/nav-builder/*": "./components/admin/nav-builder/*.tsx",
|
|
65
|
-
"./components/admin/styles": "./components/admin/styles/index.ts",
|
|
66
|
-
"./components/admin/styles/*": "./components/admin/styles/*.tsx",
|
|
67
|
-
"./components/ui/*": "./components/ui/*.tsx",
|
|
68
|
-
|
|
69
|
-
"./lib/builder": "./lib/builder/index.ts",
|
|
70
|
-
"./lib/builder/*": "./lib/builder/*.ts",
|
|
71
|
-
"./lib/sanity/client": "./lib/sanity/client.ts",
|
|
72
|
-
"./lib/sanity/writeClient": "./lib/sanity/writeClient.ts",
|
|
73
|
-
"./lib/sanity/queries": "./lib/sanity/queries.ts",
|
|
74
|
-
"./lib/sanity/types": "./lib/sanity/types.ts",
|
|
75
|
-
"./lib/animation/*": "./lib/animation/*.ts",
|
|
76
|
-
"./lib/shader/glsl": "./lib/shader/glsl/index.ts",
|
|
77
|
-
"./lib/storage": "./lib/storage/index.ts",
|
|
78
|
-
"./lib/storage/*": "./lib/storage/*.ts",
|
|
79
|
-
"./lib/contexts/*": "./lib/contexts/*.tsx",
|
|
80
|
-
"./lib/styles/provider": "./lib/styles/provider.tsx",
|
|
81
|
-
"./lib/hooks/*": "./lib/hooks/*.ts",
|
|
82
|
-
"./lib/thumbnails/*": "./lib/thumbnails/*.ts",
|
|
83
|
-
"./lib/assets": "./lib/assets.ts",
|
|
84
|
-
"./lib/auth": "./lib/auth.ts",
|
|
85
|
-
"./lib/auth-token": "./lib/auth-token.ts",
|
|
86
|
-
"./lib/csrf": "./lib/csrf.ts",
|
|
87
|
-
"./lib/csrf-client": "./lib/csrf-client.ts",
|
|
88
|
-
"./lib/security": "./lib/security.ts",
|
|
89
|
-
"./lib/sanitize": "./lib/sanitize.ts",
|
|
90
|
-
"./lib/logger": "./lib/logger.ts",
|
|
91
|
-
"./lib/audit": "./lib/audit.ts",
|
|
92
|
-
"./lib/revalidate": "./lib/revalidate.ts",
|
|
93
|
-
"./lib/color-utils": "./lib/color-utils.ts",
|
|
94
|
-
"./lib/format-utils": "./lib/format-utils.ts",
|
|
95
|
-
"./lib/utils": "./lib/utils.ts",
|
|
96
|
-
"./lib/asset-retry": "./lib/asset-retry.ts",
|
|
97
|
-
|
|
98
|
-
"./sanity/schemas": "./sanity/schemas/index.ts",
|
|
99
|
-
"./sanity/schemas/*": "./sanity/schemas/*.ts",
|
|
100
|
-
"./sanity/schemas/blocks": "./sanity/schemas/blocks/index.ts",
|
|
101
|
-
"./sanity/schemas/blocks/*": "./sanity/schemas/blocks/*.ts",
|
|
102
|
-
"./sanity/schemas/objects/*": "./sanity/schemas/objects/*.ts",
|
|
103
|
-
"./sanity/compose": "./sanity/compose.ts",
|
|
104
|
-
"./sanity/config": "./sanity/sanity.config.ts",
|
|
105
|
-
|
|
106
|
-
"./styles/base.css": "./styles/base.css",
|
|
107
|
-
"./styles/animations.css": "./styles/animations.css",
|
|
108
|
-
"./styles/admin.css": "./styles/admin.css",
|
|
109
|
-
"./styles/globals.css": "./styles/globals.css",
|
|
110
|
-
|
|
111
|
-
"./site": "./site/index.ts",
|
|
112
|
-
"./site/page": "./site/page.ts",
|
|
113
|
-
"./site/work": "./site/work.ts",
|
|
114
|
-
"./site/preview": "./site/preview.ts",
|
|
115
|
-
"./site/not-found": "./site/not-found.ts",
|
|
116
|
-
"./site/error": "./site/error.ts",
|
|
117
|
-
"./site/robots": "./site/robots.ts",
|
|
118
|
-
"./site/sitemap": "./site/sitemap.ts",
|
|
119
|
-
|
|
120
|
-
"./admin": "./admin/index.ts",
|
|
121
|
-
"./admin/login": "./admin/login.ts",
|
|
122
|
-
"./admin/pages": "./admin/pages.ts",
|
|
123
|
-
"./admin/pages/editor": "./admin/pages-editor.ts",
|
|
124
|
-
"./admin/projects": "./admin/projects.ts",
|
|
125
|
-
"./admin/projects/editor": "./admin/projects-editor.ts",
|
|
126
|
-
"./admin/styles": "./admin/styles.ts",
|
|
127
|
-
"./admin/navigation": "./admin/navigation.ts",
|
|
128
|
-
"./admin/storage": "./admin/storage.ts",
|
|
129
|
-
"./admin/assets": "./admin/assets.ts",
|
|
130
|
-
"./admin/database": "./admin/database.ts",
|
|
131
|
-
"./admin/settings": "./admin/settings.ts",
|
|
132
|
-
"./admin/setup": "./admin/setup.ts",
|
|
133
|
-
|
|
134
|
-
"./components/admin/setup-wizard": "./components/admin/setup-wizard/index.ts",
|
|
135
|
-
"./components/admin/setup-wizard/*": "./components/admin/setup-wizard/*.tsx",
|
|
136
|
-
|
|
137
|
-
"./lib/setup/detect": "./lib/setup/detect.ts",
|
|
138
|
-
|
|
139
|
-
"./studio": "./studio/index.ts",
|
|
140
|
-
|
|
141
|
-
"./api/admin/auth": "./app/api/admin/auth/route.ts",
|
|
142
|
-
"./api/admin/pages": "./app/api/admin/pages/route.ts",
|
|
143
|
-
"./api/admin/pages/slug": "./app/api/admin/pages/[slug]/route.ts",
|
|
144
|
-
"./api/admin/pages/duplicate": "./app/api/admin/pages/[slug]/duplicate/route.ts",
|
|
145
|
-
"./api/admin/pages/set-home": "./app/api/admin/pages/[slug]/set-home/route.ts",
|
|
146
|
-
"./api/admin/assets/scan": "./app/api/admin/assets/scan/route.ts",
|
|
147
|
-
"./api/admin/assets/registry": "./app/api/admin/assets/registry/route.ts",
|
|
148
|
-
"./api/admin/assets/relink": "./app/api/admin/assets/relink/route.ts",
|
|
149
|
-
"./api/admin/assets/relink-confirm": "./app/api/admin/assets/relink/confirm/route.ts",
|
|
150
|
-
"./api/admin/assets/file": "./app/api/admin/assets/file/route.ts",
|
|
151
|
-
"./api/admin/assets/register": "./app/api/admin/assets/register/route.ts",
|
|
152
|
-
"./api/admin/assets/health": "./app/api/admin/assets/health/route.ts",
|
|
153
|
-
"./api/admin/r2/connect": "./app/api/admin/r2/connect/route.ts",
|
|
154
|
-
"./api/admin/r2/disconnect": "./app/api/admin/r2/disconnect/route.ts",
|
|
155
|
-
"./api/admin/r2/status": "./app/api/admin/r2/status/route.ts",
|
|
156
|
-
"./api/admin/r2/upload-url": "./app/api/admin/r2/upload-url/route.ts",
|
|
157
|
-
"./api/admin/r2/delete": "./app/api/admin/r2/delete/route.ts",
|
|
158
|
-
"./api/admin/r2/rename": "./app/api/admin/r2/rename/route.ts",
|
|
159
|
-
"./api/admin/custom-sections": "./app/api/admin/custom-sections/route.ts",
|
|
160
|
-
"./api/admin/custom-sections/slug": "./app/api/admin/custom-sections/[slug]/route.ts",
|
|
161
|
-
"./api/admin/styles": "./app/api/admin/styles/route.ts",
|
|
162
|
-
"./api/admin/styles/fonts": "./app/api/admin/styles/fonts/route.ts",
|
|
163
|
-
"./api/admin/settings": "./app/api/admin/settings/route.ts",
|
|
164
|
-
"./api/admin/database": "./app/api/admin/database/route.ts",
|
|
165
|
-
"./api/admin/setup": "./app/api/admin/setup/route.ts",
|
|
166
|
-
"./api/admin/setup/complete": "./app/api/admin/setup/complete/route.ts",
|
|
167
|
-
"./api/admin/preview": "./app/api/admin/preview/route.ts",
|
|
168
|
-
"./api/admin/revalidate": "./app/api/admin/revalidate/route.ts",
|
|
169
|
-
"./api/admin/storage/switch": "./app/api/admin/storage/switch/route.ts",
|
|
170
|
-
"./api/styles": "./app/api/styles/route.ts",
|
|
171
|
-
"./api/projects": "./app/api/projects/route.ts",
|
|
172
|
-
"./api/assets": "./app/api/assets/[...path]/route.ts",
|
|
173
|
-
"./api/custom-sections": "./app/api/custom-sections/[id]/route.ts",
|
|
174
|
-
"./api/draft-mode/enable": "./app/api/draft-mode/enable/route.ts",
|
|
175
|
-
"./api/draft-mode/disable": "./app/api/draft-mode/disable/route.ts"
|
|
176
|
-
},
|
|
177
|
-
"peerDependencies": {
|
|
178
|
-
"next": ">=16.0.0",
|
|
179
|
-
"react": ">=19.0.0",
|
|
180
|
-
"react-dom": ">=19.0.0"
|
|
181
|
-
},
|
|
182
|
-
"dependencies": {
|
|
183
|
-
"@aws-sdk/client-s3": "^3.1021.0",
|
|
184
|
-
"@aws-sdk/s3-request-presigner": "^3.1021.0",
|
|
185
|
-
"@dnd-kit/core": "^6.3.1",
|
|
186
|
-
"@dnd-kit/modifiers": "^9.0.0",
|
|
187
|
-
"@dnd-kit/sortable": "^10.0.0",
|
|
188
|
-
"@dnd-kit/utilities": "^3.2.2",
|
|
189
|
-
"next-sanity": "^12.1.5",
|
|
190
|
-
"sanity": "^5.17.1",
|
|
191
|
-
"zustand": "^5.0.12",
|
|
192
|
-
"ogl": "^1.0.8"
|
|
193
|
-
},
|
|
194
|
-
"devDependencies": {
|
|
195
|
-
"@tailwindcss/postcss": "^4",
|
|
196
|
-
"@types/node": "^20",
|
|
197
|
-
"@types/react": "^19",
|
|
198
|
-
"@types/react-dom": "^19",
|
|
199
|
-
"eslint": "^9",
|
|
200
|
-
"eslint-config-next": "16.2.1",
|
|
201
|
-
"next": "16.2.1",
|
|
202
|
-
"react": "19.2.4",
|
|
203
|
-
"react-dom": "19.2.4",
|
|
204
|
-
"tailwindcss": "^4",
|
|
205
|
-
"typescript": "^5",
|
|
206
|
-
"vitest": "^4.1.2",
|
|
207
|
-
"@testing-library/react": "^16.3.0",
|
|
208
|
-
"@testing-library/jest-dom": "^6.6.3",
|
|
209
|
-
"@testing-library/user-event": "^14.6.1",
|
|
210
|
-
"jsdom": "^26.1.0"
|
|
211
|
-
}
|
|
212
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@morphika/webframe",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Visual Page Builder — core library. A reusable website builder with visual editing, CMS integration, and asset management.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/MorphikaStudio/Morphika_Webframe.git"
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"visual-builder",
|
|
13
|
+
"website-builder",
|
|
14
|
+
"cms",
|
|
15
|
+
"next.js",
|
|
16
|
+
"sanity",
|
|
17
|
+
"page-builder",
|
|
18
|
+
"morphika"
|
|
19
|
+
],
|
|
20
|
+
"files": [
|
|
21
|
+
"admin/",
|
|
22
|
+
"app/",
|
|
23
|
+
"components/",
|
|
24
|
+
"lib/",
|
|
25
|
+
"sanity/",
|
|
26
|
+
"site/",
|
|
27
|
+
"studio/",
|
|
28
|
+
"styles/",
|
|
29
|
+
"tsconfig.json",
|
|
30
|
+
"LICENSE",
|
|
31
|
+
"!**/__tests__/",
|
|
32
|
+
"!**/*.test.ts",
|
|
33
|
+
"!**/*.test.tsx",
|
|
34
|
+
"!**/*.spec.ts",
|
|
35
|
+
"!**/*.spec.tsx",
|
|
36
|
+
"!**/archive/"
|
|
37
|
+
],
|
|
38
|
+
"scripts": {
|
|
39
|
+
"prepack": "node scripts/prepack.mjs",
|
|
40
|
+
"postpack": "node scripts/postpack.mjs",
|
|
41
|
+
"test": "vitest",
|
|
42
|
+
"test:run": "vitest run",
|
|
43
|
+
"lint": "eslint",
|
|
44
|
+
"typecheck": "tsc --noEmit"
|
|
45
|
+
},
|
|
46
|
+
"exports": {
|
|
47
|
+
"./config": "./lib/config/index.ts",
|
|
48
|
+
"./config/types": "./lib/config/types.ts",
|
|
49
|
+
|
|
50
|
+
"./components/blocks": "./components/blocks/index.ts",
|
|
51
|
+
"./components/blocks/*": "./components/blocks/*.tsx",
|
|
52
|
+
"./components/builder": "./components/builder/index.ts",
|
|
53
|
+
"./components/builder/*": "./components/builder/*.tsx",
|
|
54
|
+
"./components/builder/editors/*": "./components/builder/editors/*.tsx",
|
|
55
|
+
"./components/builder/settings-panel": "./components/builder/settings-panel/index.ts",
|
|
56
|
+
"./components/builder/settings-panel/*": "./components/builder/settings-panel/*.tsx",
|
|
57
|
+
"./components/builder/asset-browser": "./components/builder/asset-browser/index.ts",
|
|
58
|
+
"./components/builder/asset-browser/*": "./components/builder/asset-browser/*.tsx",
|
|
59
|
+
"./components/builder/live-preview": "./components/builder/live-preview/index.ts",
|
|
60
|
+
"./components/builder/live-preview/*": "./components/builder/live-preview/*.tsx",
|
|
61
|
+
"./components/admin": "./components/admin/index.ts",
|
|
62
|
+
"./components/admin/*": "./components/admin/*.tsx",
|
|
63
|
+
"./components/admin/nav-builder": "./components/admin/nav-builder/index.ts",
|
|
64
|
+
"./components/admin/nav-builder/*": "./components/admin/nav-builder/*.tsx",
|
|
65
|
+
"./components/admin/styles": "./components/admin/styles/index.ts",
|
|
66
|
+
"./components/admin/styles/*": "./components/admin/styles/*.tsx",
|
|
67
|
+
"./components/ui/*": "./components/ui/*.tsx",
|
|
68
|
+
|
|
69
|
+
"./lib/builder": "./lib/builder/index.ts",
|
|
70
|
+
"./lib/builder/*": "./lib/builder/*.ts",
|
|
71
|
+
"./lib/sanity/client": "./lib/sanity/client.ts",
|
|
72
|
+
"./lib/sanity/writeClient": "./lib/sanity/writeClient.ts",
|
|
73
|
+
"./lib/sanity/queries": "./lib/sanity/queries.ts",
|
|
74
|
+
"./lib/sanity/types": "./lib/sanity/types.ts",
|
|
75
|
+
"./lib/animation/*": "./lib/animation/*.ts",
|
|
76
|
+
"./lib/shader/glsl": "./lib/shader/glsl/index.ts",
|
|
77
|
+
"./lib/storage": "./lib/storage/index.ts",
|
|
78
|
+
"./lib/storage/*": "./lib/storage/*.ts",
|
|
79
|
+
"./lib/contexts/*": "./lib/contexts/*.tsx",
|
|
80
|
+
"./lib/styles/provider": "./lib/styles/provider.tsx",
|
|
81
|
+
"./lib/hooks/*": "./lib/hooks/*.ts",
|
|
82
|
+
"./lib/thumbnails/*": "./lib/thumbnails/*.ts",
|
|
83
|
+
"./lib/assets": "./lib/assets.ts",
|
|
84
|
+
"./lib/auth": "./lib/auth.ts",
|
|
85
|
+
"./lib/auth-token": "./lib/auth-token.ts",
|
|
86
|
+
"./lib/csrf": "./lib/csrf.ts",
|
|
87
|
+
"./lib/csrf-client": "./lib/csrf-client.ts",
|
|
88
|
+
"./lib/security": "./lib/security.ts",
|
|
89
|
+
"./lib/sanitize": "./lib/sanitize.ts",
|
|
90
|
+
"./lib/logger": "./lib/logger.ts",
|
|
91
|
+
"./lib/audit": "./lib/audit.ts",
|
|
92
|
+
"./lib/revalidate": "./lib/revalidate.ts",
|
|
93
|
+
"./lib/color-utils": "./lib/color-utils.ts",
|
|
94
|
+
"./lib/format-utils": "./lib/format-utils.ts",
|
|
95
|
+
"./lib/utils": "./lib/utils.ts",
|
|
96
|
+
"./lib/asset-retry": "./lib/asset-retry.ts",
|
|
97
|
+
|
|
98
|
+
"./sanity/schemas": "./sanity/schemas/index.ts",
|
|
99
|
+
"./sanity/schemas/*": "./sanity/schemas/*.ts",
|
|
100
|
+
"./sanity/schemas/blocks": "./sanity/schemas/blocks/index.ts",
|
|
101
|
+
"./sanity/schemas/blocks/*": "./sanity/schemas/blocks/*.ts",
|
|
102
|
+
"./sanity/schemas/objects/*": "./sanity/schemas/objects/*.ts",
|
|
103
|
+
"./sanity/compose": "./sanity/compose.ts",
|
|
104
|
+
"./sanity/config": "./sanity/sanity.config.ts",
|
|
105
|
+
|
|
106
|
+
"./styles/base.css": "./styles/base.css",
|
|
107
|
+
"./styles/animations.css": "./styles/animations.css",
|
|
108
|
+
"./styles/admin.css": "./styles/admin.css",
|
|
109
|
+
"./styles/globals.css": "./styles/globals.css",
|
|
110
|
+
|
|
111
|
+
"./site": "./site/index.ts",
|
|
112
|
+
"./site/page": "./site/page.ts",
|
|
113
|
+
"./site/work": "./site/work.ts",
|
|
114
|
+
"./site/preview": "./site/preview.ts",
|
|
115
|
+
"./site/not-found": "./site/not-found.ts",
|
|
116
|
+
"./site/error": "./site/error.ts",
|
|
117
|
+
"./site/robots": "./site/robots.ts",
|
|
118
|
+
"./site/sitemap": "./site/sitemap.ts",
|
|
119
|
+
|
|
120
|
+
"./admin": "./admin/index.ts",
|
|
121
|
+
"./admin/login": "./admin/login.ts",
|
|
122
|
+
"./admin/pages": "./admin/pages.ts",
|
|
123
|
+
"./admin/pages/editor": "./admin/pages-editor.ts",
|
|
124
|
+
"./admin/projects": "./admin/projects.ts",
|
|
125
|
+
"./admin/projects/editor": "./admin/projects-editor.ts",
|
|
126
|
+
"./admin/styles": "./admin/styles.ts",
|
|
127
|
+
"./admin/navigation": "./admin/navigation.ts",
|
|
128
|
+
"./admin/storage": "./admin/storage.ts",
|
|
129
|
+
"./admin/assets": "./admin/assets.ts",
|
|
130
|
+
"./admin/database": "./admin/database.ts",
|
|
131
|
+
"./admin/settings": "./admin/settings.ts",
|
|
132
|
+
"./admin/setup": "./admin/setup.ts",
|
|
133
|
+
|
|
134
|
+
"./components/admin/setup-wizard": "./components/admin/setup-wizard/index.ts",
|
|
135
|
+
"./components/admin/setup-wizard/*": "./components/admin/setup-wizard/*.tsx",
|
|
136
|
+
|
|
137
|
+
"./lib/setup/detect": "./lib/setup/detect.ts",
|
|
138
|
+
|
|
139
|
+
"./studio": "./studio/index.ts",
|
|
140
|
+
|
|
141
|
+
"./api/admin/auth": "./app/api/admin/auth/route.ts",
|
|
142
|
+
"./api/admin/pages": "./app/api/admin/pages/route.ts",
|
|
143
|
+
"./api/admin/pages/slug": "./app/api/admin/pages/[slug]/route.ts",
|
|
144
|
+
"./api/admin/pages/duplicate": "./app/api/admin/pages/[slug]/duplicate/route.ts",
|
|
145
|
+
"./api/admin/pages/set-home": "./app/api/admin/pages/[slug]/set-home/route.ts",
|
|
146
|
+
"./api/admin/assets/scan": "./app/api/admin/assets/scan/route.ts",
|
|
147
|
+
"./api/admin/assets/registry": "./app/api/admin/assets/registry/route.ts",
|
|
148
|
+
"./api/admin/assets/relink": "./app/api/admin/assets/relink/route.ts",
|
|
149
|
+
"./api/admin/assets/relink-confirm": "./app/api/admin/assets/relink/confirm/route.ts",
|
|
150
|
+
"./api/admin/assets/file": "./app/api/admin/assets/file/route.ts",
|
|
151
|
+
"./api/admin/assets/register": "./app/api/admin/assets/register/route.ts",
|
|
152
|
+
"./api/admin/assets/health": "./app/api/admin/assets/health/route.ts",
|
|
153
|
+
"./api/admin/r2/connect": "./app/api/admin/r2/connect/route.ts",
|
|
154
|
+
"./api/admin/r2/disconnect": "./app/api/admin/r2/disconnect/route.ts",
|
|
155
|
+
"./api/admin/r2/status": "./app/api/admin/r2/status/route.ts",
|
|
156
|
+
"./api/admin/r2/upload-url": "./app/api/admin/r2/upload-url/route.ts",
|
|
157
|
+
"./api/admin/r2/delete": "./app/api/admin/r2/delete/route.ts",
|
|
158
|
+
"./api/admin/r2/rename": "./app/api/admin/r2/rename/route.ts",
|
|
159
|
+
"./api/admin/custom-sections": "./app/api/admin/custom-sections/route.ts",
|
|
160
|
+
"./api/admin/custom-sections/slug": "./app/api/admin/custom-sections/[slug]/route.ts",
|
|
161
|
+
"./api/admin/styles": "./app/api/admin/styles/route.ts",
|
|
162
|
+
"./api/admin/styles/fonts": "./app/api/admin/styles/fonts/route.ts",
|
|
163
|
+
"./api/admin/settings": "./app/api/admin/settings/route.ts",
|
|
164
|
+
"./api/admin/database": "./app/api/admin/database/route.ts",
|
|
165
|
+
"./api/admin/setup": "./app/api/admin/setup/route.ts",
|
|
166
|
+
"./api/admin/setup/complete": "./app/api/admin/setup/complete/route.ts",
|
|
167
|
+
"./api/admin/preview": "./app/api/admin/preview/route.ts",
|
|
168
|
+
"./api/admin/revalidate": "./app/api/admin/revalidate/route.ts",
|
|
169
|
+
"./api/admin/storage/switch": "./app/api/admin/storage/switch/route.ts",
|
|
170
|
+
"./api/styles": "./app/api/styles/route.ts",
|
|
171
|
+
"./api/projects": "./app/api/projects/route.ts",
|
|
172
|
+
"./api/assets": "./app/api/assets/[...path]/route.ts",
|
|
173
|
+
"./api/custom-sections": "./app/api/custom-sections/[id]/route.ts",
|
|
174
|
+
"./api/draft-mode/enable": "./app/api/draft-mode/enable/route.ts",
|
|
175
|
+
"./api/draft-mode/disable": "./app/api/draft-mode/disable/route.ts"
|
|
176
|
+
},
|
|
177
|
+
"peerDependencies": {
|
|
178
|
+
"next": ">=16.0.0",
|
|
179
|
+
"react": ">=19.0.0",
|
|
180
|
+
"react-dom": ">=19.0.0"
|
|
181
|
+
},
|
|
182
|
+
"dependencies": {
|
|
183
|
+
"@aws-sdk/client-s3": "^3.1021.0",
|
|
184
|
+
"@aws-sdk/s3-request-presigner": "^3.1021.0",
|
|
185
|
+
"@dnd-kit/core": "^6.3.1",
|
|
186
|
+
"@dnd-kit/modifiers": "^9.0.0",
|
|
187
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
188
|
+
"@dnd-kit/utilities": "^3.2.2",
|
|
189
|
+
"next-sanity": "^12.1.5",
|
|
190
|
+
"sanity": "^5.17.1",
|
|
191
|
+
"zustand": "^5.0.12",
|
|
192
|
+
"ogl": "^1.0.8"
|
|
193
|
+
},
|
|
194
|
+
"devDependencies": {
|
|
195
|
+
"@tailwindcss/postcss": "^4",
|
|
196
|
+
"@types/node": "^20",
|
|
197
|
+
"@types/react": "^19",
|
|
198
|
+
"@types/react-dom": "^19",
|
|
199
|
+
"eslint": "^9",
|
|
200
|
+
"eslint-config-next": "16.2.1",
|
|
201
|
+
"next": "16.2.1",
|
|
202
|
+
"react": "19.2.4",
|
|
203
|
+
"react-dom": "19.2.4",
|
|
204
|
+
"tailwindcss": "^4",
|
|
205
|
+
"typescript": "^5",
|
|
206
|
+
"vitest": "^4.1.2",
|
|
207
|
+
"@testing-library/react": "^16.3.0",
|
|
208
|
+
"@testing-library/jest-dom": "^6.6.3",
|
|
209
|
+
"@testing-library/user-event": "^14.6.1",
|
|
210
|
+
"jsdom": "^26.1.0"
|
|
211
|
+
}
|
|
212
|
+
}
|
|
@@ -1,210 +1,212 @@
|
|
|
1
|
-
import { defineType, defineField } from "sanity";
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
{ name: "
|
|
12
|
-
{ name: "
|
|
13
|
-
{ name: "
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
defineField({ name: "
|
|
20
|
-
defineField({ name: "
|
|
21
|
-
defineField({ name: "
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
{ title: "
|
|
63
|
-
{ title: "
|
|
64
|
-
{ title: "
|
|
65
|
-
{ title: "
|
|
66
|
-
{ title: "
|
|
67
|
-
{ title: "
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
defineField({ name: "
|
|
143
|
-
defineField({ name: "
|
|
144
|
-
defineField({ name: "
|
|
145
|
-
defineField({
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
defineField({ name: "
|
|
185
|
-
defineField({ name: "
|
|
186
|
-
defineField({ name: "
|
|
187
|
-
defineField({ name: "
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
defineField({ name: "
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
defineField({ name: "
|
|
198
|
-
defineField({ name: "
|
|
199
|
-
defineField({ name: "
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
})
|
|
1
|
+
import { defineType, defineField } from "sanity";
|
|
2
|
+
import { getSiteConfig } from "../../lib/config";
|
|
3
|
+
|
|
4
|
+
const config = getSiteConfig();
|
|
5
|
+
|
|
6
|
+
export default defineType({
|
|
7
|
+
name: "siteStyles",
|
|
8
|
+
title: "Site Styles",
|
|
9
|
+
type: "document",
|
|
10
|
+
groups: [
|
|
11
|
+
{ name: "grid", title: "Grid", default: true },
|
|
12
|
+
{ name: "fonts", title: "Fonts" },
|
|
13
|
+
{ name: "typography", title: "Typography" },
|
|
14
|
+
{ name: "colors", title: "Colors" },
|
|
15
|
+
{ name: "links", title: "Links & Buttons" },
|
|
16
|
+
],
|
|
17
|
+
fields: [
|
|
18
|
+
// === GRID ===
|
|
19
|
+
defineField({ name: "grid_width", title: "Max-Width", type: "string", group: "grid", initialValue: "1445" }),
|
|
20
|
+
defineField({ name: "grid_outer_padding", title: "Outer Padding", type: "string", group: "grid", initialValue: "30" }),
|
|
21
|
+
defineField({ name: "grid_gutter_desktop", title: "Gutter Width (Desktop)", type: "string", group: "grid", initialValue: "30" }),
|
|
22
|
+
defineField({ name: "grid_gutter_responsive", title: "Gutter Width (Tablet)", type: "string", group: "grid", initialValue: "30" }),
|
|
23
|
+
defineField({ name: "grid_gutter_phone", title: "Gutter Width (Phone)", type: "string", group: "grid", initialValue: "16" }),
|
|
24
|
+
|
|
25
|
+
// === FONTS ===
|
|
26
|
+
defineField({
|
|
27
|
+
name: "fonts",
|
|
28
|
+
title: "Font Families",
|
|
29
|
+
type: "array",
|
|
30
|
+
group: "fonts",
|
|
31
|
+
of: [
|
|
32
|
+
{
|
|
33
|
+
type: "object",
|
|
34
|
+
fields: [
|
|
35
|
+
defineField({
|
|
36
|
+
name: "family",
|
|
37
|
+
title: "Font Family Name",
|
|
38
|
+
type: "string",
|
|
39
|
+
validation: (Rule) => Rule.required(),
|
|
40
|
+
}),
|
|
41
|
+
defineField({
|
|
42
|
+
name: "is_builtin",
|
|
43
|
+
title: "Built-in Font",
|
|
44
|
+
type: "boolean",
|
|
45
|
+
description: "True for fonts already in /public/fonts/",
|
|
46
|
+
initialValue: false,
|
|
47
|
+
}),
|
|
48
|
+
defineField({
|
|
49
|
+
name: "variants",
|
|
50
|
+
title: "Font Variants",
|
|
51
|
+
type: "array",
|
|
52
|
+
of: [
|
|
53
|
+
{
|
|
54
|
+
type: "object",
|
|
55
|
+
fields: [
|
|
56
|
+
defineField({
|
|
57
|
+
name: "weight",
|
|
58
|
+
title: "Weight",
|
|
59
|
+
type: "string",
|
|
60
|
+
options: {
|
|
61
|
+
list: [
|
|
62
|
+
{ title: "Thin (100)", value: "100" },
|
|
63
|
+
{ title: "Light (300)", value: "300" },
|
|
64
|
+
{ title: "Regular (400)", value: "400" },
|
|
65
|
+
{ title: "Medium (500)", value: "500" },
|
|
66
|
+
{ title: "Semi-Bold (600)", value: "600" },
|
|
67
|
+
{ title: "Bold (700)", value: "700" },
|
|
68
|
+
{ title: "Extra-Bold (800)", value: "800" },
|
|
69
|
+
{ title: "Black (900)", value: "900" },
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
validation: (Rule) => Rule.required(),
|
|
73
|
+
}),
|
|
74
|
+
defineField({
|
|
75
|
+
name: "style",
|
|
76
|
+
title: "Style",
|
|
77
|
+
type: "string",
|
|
78
|
+
options: {
|
|
79
|
+
list: [
|
|
80
|
+
{ title: "Normal", value: "normal" },
|
|
81
|
+
{ title: "Italic", value: "italic" },
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
initialValue: "normal",
|
|
85
|
+
}),
|
|
86
|
+
defineField({
|
|
87
|
+
name: "file_url",
|
|
88
|
+
title: "Font File URL",
|
|
89
|
+
type: "url",
|
|
90
|
+
description: "Sanity CDN URL for the font file",
|
|
91
|
+
}),
|
|
92
|
+
defineField({
|
|
93
|
+
name: "file_id",
|
|
94
|
+
title: "Sanity Asset ID",
|
|
95
|
+
type: "string",
|
|
96
|
+
hidden: true,
|
|
97
|
+
}),
|
|
98
|
+
defineField({
|
|
99
|
+
name: "original_filename",
|
|
100
|
+
title: "Original Filename",
|
|
101
|
+
type: "string",
|
|
102
|
+
}),
|
|
103
|
+
],
|
|
104
|
+
preview: {
|
|
105
|
+
select: {
|
|
106
|
+
weight: "weight",
|
|
107
|
+
style: "style",
|
|
108
|
+
filename: "original_filename",
|
|
109
|
+
},
|
|
110
|
+
prepare({ weight, style, filename }) {
|
|
111
|
+
return {
|
|
112
|
+
title: `${weight} ${style || "normal"}`,
|
|
113
|
+
subtitle: filename,
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
}),
|
|
120
|
+
],
|
|
121
|
+
preview: {
|
|
122
|
+
select: { family: "family", is_builtin: "is_builtin" },
|
|
123
|
+
prepare({ family, is_builtin }) {
|
|
124
|
+
return {
|
|
125
|
+
title: family,
|
|
126
|
+
subtitle: is_builtin ? "Built-in" : "Custom upload",
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
}),
|
|
133
|
+
|
|
134
|
+
// === TYPOGRAPHY ===
|
|
135
|
+
...["h1", "h2", "h3", "h4", "body", "small"].map((level) =>
|
|
136
|
+
defineField({
|
|
137
|
+
name: `typography_${level}`,
|
|
138
|
+
title: `Typography — ${level.toUpperCase()}`,
|
|
139
|
+
type: "object",
|
|
140
|
+
group: "typography",
|
|
141
|
+
fields: [
|
|
142
|
+
defineField({ name: "font_family", title: "Font Family", type: "string" }),
|
|
143
|
+
defineField({ name: "font_size", title: "Font Size", type: "string" }),
|
|
144
|
+
defineField({ name: "font_weight", title: "Font Weight", type: "string" }),
|
|
145
|
+
defineField({ name: "line_height", title: "Line Height", type: "string" }),
|
|
146
|
+
defineField({ name: "letter_spacing", title: "Letter Spacing", type: "string" }),
|
|
147
|
+
defineField({
|
|
148
|
+
name: "text_transform",
|
|
149
|
+
title: "Text Transform",
|
|
150
|
+
type: "string",
|
|
151
|
+
options: {
|
|
152
|
+
list: ["none", "uppercase", "lowercase", "capitalize"],
|
|
153
|
+
},
|
|
154
|
+
}),
|
|
155
|
+
defineField({ name: "color", title: "Color Override", type: "string" }),
|
|
156
|
+
],
|
|
157
|
+
})
|
|
158
|
+
),
|
|
159
|
+
|
|
160
|
+
// === COLOR PALETTE ===
|
|
161
|
+
defineField({
|
|
162
|
+
name: "color_palette",
|
|
163
|
+
title: "Color Palette",
|
|
164
|
+
type: "array",
|
|
165
|
+
group: "colors",
|
|
166
|
+
of: [
|
|
167
|
+
{
|
|
168
|
+
type: "object",
|
|
169
|
+
fields: [
|
|
170
|
+
defineField({ name: "name", title: "Color Name", type: "string", validation: (Rule) => Rule.required() }),
|
|
171
|
+
defineField({ name: "hex", title: "Hex Value", type: "string", validation: (Rule) => Rule.required() }),
|
|
172
|
+
],
|
|
173
|
+
preview: {
|
|
174
|
+
select: { name: "name", hex: "hex" },
|
|
175
|
+
prepare({ name, hex }) {
|
|
176
|
+
return { title: name || "Unnamed", subtitle: hex };
|
|
177
|
+
},
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
}),
|
|
182
|
+
|
|
183
|
+
// Legacy fixed color fields (kept for backward compatibility, read-only)
|
|
184
|
+
defineField({ name: "color_background", title: "Background Color (legacy)", type: "string", group: "colors", hidden: true }),
|
|
185
|
+
defineField({ name: "color_text", title: "Text Color (legacy)", type: "string", group: "colors", hidden: true }),
|
|
186
|
+
defineField({ name: "color_primary", title: "Primary Color (legacy)", type: "string", group: "colors", hidden: true }),
|
|
187
|
+
defineField({ name: "color_secondary", title: "Secondary Color (legacy)", type: "string", group: "colors", hidden: true }),
|
|
188
|
+
defineField({ name: "color_accent", title: "Accent Color (legacy)", type: "string", group: "colors", hidden: true }),
|
|
189
|
+
defineField({ name: "color_muted", title: "Muted Color (legacy)", type: "string", group: "colors", hidden: true }),
|
|
190
|
+
|
|
191
|
+
// === LINK STYLE ===
|
|
192
|
+
defineField({ name: "link_color", title: "Link Color", type: "string", group: "links", initialValue: config.palette.primary }),
|
|
193
|
+
defineField({ name: "link_hover_color", title: "Link Hover Color", type: "string", group: "links", initialValue: "#091ed4" }),
|
|
194
|
+
defineField({ name: "link_underline", title: "Link Underline", type: "boolean", group: "links", initialValue: true }),
|
|
195
|
+
|
|
196
|
+
// === BUTTON STYLE ===
|
|
197
|
+
defineField({ name: "button_primary_bg", title: "Primary Button BG", type: "string", group: "links", initialValue: "#ffffff" }),
|
|
198
|
+
defineField({ name: "button_primary_text", title: "Primary Button Text", type: "string", group: "links", initialValue: "#000000" }),
|
|
199
|
+
defineField({ name: "button_secondary_bg", title: "Secondary Button BG", type: "string", group: "links", initialValue: "#1a1a1a" }),
|
|
200
|
+
defineField({ name: "button_secondary_text", title: "Secondary Button Text", type: "string", group: "links", initialValue: "#ffffff" }),
|
|
201
|
+
defineField({ name: "button_border_radius", title: "Button Border Radius", type: "string", group: "links", initialValue: "8px" }),
|
|
202
|
+
|
|
203
|
+
// === ANIMATION ===
|
|
204
|
+
defineField({
|
|
205
|
+
name: "disable_scroll_animations_mobile",
|
|
206
|
+
title: "Disable Scroll Animations on Small Screens",
|
|
207
|
+
type: "boolean",
|
|
208
|
+
description: "When enabled, all scroll-linked animations are disabled on phones (< 768px)",
|
|
209
|
+
initialValue: false,
|
|
210
|
+
}),
|
|
211
|
+
],
|
|
212
|
+
});
|