@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.
Files changed (2) hide show
  1. package/package.json +212 -212
  2. package/sanity/schemas/siteStyles.ts +212 -210
package/package.json CHANGED
@@ -1,212 +1,212 @@
1
- {
2
- "name": "@morphika/webframe",
3
- "version": "0.1.0",
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 config from "../../site.config";
3
-
4
- export default defineType({
5
- name: "siteStyles",
6
- title: "Site Styles",
7
- type: "document",
8
- groups: [
9
- { name: "grid", title: "Grid", default: true },
10
- { name: "fonts", title: "Fonts" },
11
- { name: "typography", title: "Typography" },
12
- { name: "colors", title: "Colors" },
13
- { name: "links", title: "Links & Buttons" },
14
- ],
15
- fields: [
16
- // === GRID ===
17
- defineField({ name: "grid_width", title: "Max-Width", type: "string", group: "grid", initialValue: "1445" }),
18
- defineField({ name: "grid_outer_padding", title: "Outer Padding", type: "string", group: "grid", initialValue: "30" }),
19
- defineField({ name: "grid_gutter_desktop", title: "Gutter Width (Desktop)", type: "string", group: "grid", initialValue: "30" }),
20
- defineField({ name: "grid_gutter_responsive", title: "Gutter Width (Tablet)", type: "string", group: "grid", initialValue: "30" }),
21
- defineField({ name: "grid_gutter_phone", title: "Gutter Width (Phone)", type: "string", group: "grid", initialValue: "16" }),
22
-
23
- // === FONTS ===
24
- defineField({
25
- name: "fonts",
26
- title: "Font Families",
27
- type: "array",
28
- group: "fonts",
29
- of: [
30
- {
31
- type: "object",
32
- fields: [
33
- defineField({
34
- name: "family",
35
- title: "Font Family Name",
36
- type: "string",
37
- validation: (Rule) => Rule.required(),
38
- }),
39
- defineField({
40
- name: "is_builtin",
41
- title: "Built-in Font",
42
- type: "boolean",
43
- description: "True for fonts already in /public/fonts/",
44
- initialValue: false,
45
- }),
46
- defineField({
47
- name: "variants",
48
- title: "Font Variants",
49
- type: "array",
50
- of: [
51
- {
52
- type: "object",
53
- fields: [
54
- defineField({
55
- name: "weight",
56
- title: "Weight",
57
- type: "string",
58
- options: {
59
- list: [
60
- { title: "Thin (100)", value: "100" },
61
- { title: "Light (300)", value: "300" },
62
- { title: "Regular (400)", value: "400" },
63
- { title: "Medium (500)", value: "500" },
64
- { title: "Semi-Bold (600)", value: "600" },
65
- { title: "Bold (700)", value: "700" },
66
- { title: "Extra-Bold (800)", value: "800" },
67
- { title: "Black (900)", value: "900" },
68
- ],
69
- },
70
- validation: (Rule) => Rule.required(),
71
- }),
72
- defineField({
73
- name: "style",
74
- title: "Style",
75
- type: "string",
76
- options: {
77
- list: [
78
- { title: "Normal", value: "normal" },
79
- { title: "Italic", value: "italic" },
80
- ],
81
- },
82
- initialValue: "normal",
83
- }),
84
- defineField({
85
- name: "file_url",
86
- title: "Font File URL",
87
- type: "url",
88
- description: "Sanity CDN URL for the font file",
89
- }),
90
- defineField({
91
- name: "file_id",
92
- title: "Sanity Asset ID",
93
- type: "string",
94
- hidden: true,
95
- }),
96
- defineField({
97
- name: "original_filename",
98
- title: "Original Filename",
99
- type: "string",
100
- }),
101
- ],
102
- preview: {
103
- select: {
104
- weight: "weight",
105
- style: "style",
106
- filename: "original_filename",
107
- },
108
- prepare({ weight, style, filename }) {
109
- return {
110
- title: `${weight} ${style || "normal"}`,
111
- subtitle: filename,
112
- };
113
- },
114
- },
115
- },
116
- ],
117
- }),
118
- ],
119
- preview: {
120
- select: { family: "family", is_builtin: "is_builtin" },
121
- prepare({ family, is_builtin }) {
122
- return {
123
- title: family,
124
- subtitle: is_builtin ? "Built-in" : "Custom upload",
125
- };
126
- },
127
- },
128
- },
129
- ],
130
- }),
131
-
132
- // === TYPOGRAPHY ===
133
- ...["h1", "h2", "h3", "h4", "body", "small"].map((level) =>
134
- defineField({
135
- name: `typography_${level}`,
136
- title: `Typography — ${level.toUpperCase()}`,
137
- type: "object",
138
- group: "typography",
139
- fields: [
140
- defineField({ name: "font_family", title: "Font Family", type: "string" }),
141
- defineField({ name: "font_size", title: "Font Size", type: "string" }),
142
- defineField({ name: "font_weight", title: "Font Weight", type: "string" }),
143
- defineField({ name: "line_height", title: "Line Height", type: "string" }),
144
- defineField({ name: "letter_spacing", title: "Letter Spacing", type: "string" }),
145
- defineField({
146
- name: "text_transform",
147
- title: "Text Transform",
148
- type: "string",
149
- options: {
150
- list: ["none", "uppercase", "lowercase", "capitalize"],
151
- },
152
- }),
153
- defineField({ name: "color", title: "Color Override", type: "string" }),
154
- ],
155
- })
156
- ),
157
-
158
- // === COLOR PALETTE ===
159
- defineField({
160
- name: "color_palette",
161
- title: "Color Palette",
162
- type: "array",
163
- group: "colors",
164
- of: [
165
- {
166
- type: "object",
167
- fields: [
168
- defineField({ name: "name", title: "Color Name", type: "string", validation: (Rule) => Rule.required() }),
169
- defineField({ name: "hex", title: "Hex Value", type: "string", validation: (Rule) => Rule.required() }),
170
- ],
171
- preview: {
172
- select: { name: "name", hex: "hex" },
173
- prepare({ name, hex }) {
174
- return { title: name || "Unnamed", subtitle: hex };
175
- },
176
- },
177
- },
178
- ],
179
- }),
180
-
181
- // Legacy fixed color fields (kept for backward compatibility, read-only)
182
- defineField({ name: "color_background", title: "Background Color (legacy)", type: "string", group: "colors", hidden: true }),
183
- defineField({ name: "color_text", title: "Text Color (legacy)", type: "string", group: "colors", hidden: true }),
184
- defineField({ name: "color_primary", title: "Primary Color (legacy)", type: "string", group: "colors", hidden: true }),
185
- defineField({ name: "color_secondary", title: "Secondary Color (legacy)", type: "string", group: "colors", hidden: true }),
186
- defineField({ name: "color_accent", title: "Accent Color (legacy)", type: "string", group: "colors", hidden: true }),
187
- defineField({ name: "color_muted", title: "Muted Color (legacy)", type: "string", group: "colors", hidden: true }),
188
-
189
- // === LINK STYLE ===
190
- defineField({ name: "link_color", title: "Link Color", type: "string", group: "links", initialValue: config.palette.primary }),
191
- defineField({ name: "link_hover_color", title: "Link Hover Color", type: "string", group: "links", initialValue: "#091ed4" }),
192
- defineField({ name: "link_underline", title: "Link Underline", type: "boolean", group: "links", initialValue: true }),
193
-
194
- // === BUTTON STYLE ===
195
- defineField({ name: "button_primary_bg", title: "Primary Button BG", type: "string", group: "links", initialValue: "#ffffff" }),
196
- defineField({ name: "button_primary_text", title: "Primary Button Text", type: "string", group: "links", initialValue: "#000000" }),
197
- defineField({ name: "button_secondary_bg", title: "Secondary Button BG", type: "string", group: "links", initialValue: "#1a1a1a" }),
198
- defineField({ name: "button_secondary_text", title: "Secondary Button Text", type: "string", group: "links", initialValue: "#ffffff" }),
199
- defineField({ name: "button_border_radius", title: "Button Border Radius", type: "string", group: "links", initialValue: "8px" }),
200
-
201
- // === ANIMATION ===
202
- defineField({
203
- name: "disable_scroll_animations_mobile",
204
- title: "Disable Scroll Animations on Small Screens",
205
- type: "boolean",
206
- description: "When enabled, all scroll-linked animations are disabled on phones (< 768px)",
207
- initialValue: false,
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
+ });