@elementor/editor-canvas 4.3.0-973 → 4.3.0-975
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/dist/index.js
CHANGED
|
@@ -227,37 +227,10 @@ function extractV3ControlsMetadata(controls) {
|
|
|
227
227
|
var CANVAS_SERVER_NAME = "editor-canvas";
|
|
228
228
|
var WIDGET_SCHEMA_URI = "elementor://widgets/schema/{widgetType}";
|
|
229
229
|
var WIDGET_SCHEMA_FULL_URI = `${CANVAS_SERVER_NAME}_${WIDGET_SCHEMA_URI}`;
|
|
230
|
-
var BEST_PRACTICES_URI = "elementor://
|
|
230
|
+
var BEST_PRACTICES_URI = "elementor://style/best-practices";
|
|
231
231
|
var BEST_PRACTICES_FULL_URI = `${CANVAS_SERVER_NAME}_${BEST_PRACTICES_URI}`;
|
|
232
232
|
var initWidgetsSchemaResource = (reg) => {
|
|
233
233
|
const { resource } = reg;
|
|
234
|
-
resource(
|
|
235
|
-
"styles-best-practices",
|
|
236
|
-
BEST_PRACTICES_URI,
|
|
237
|
-
{
|
|
238
|
-
description: "Styling best practices"
|
|
239
|
-
},
|
|
240
|
-
async () => {
|
|
241
|
-
return {
|
|
242
|
-
contents: [
|
|
243
|
-
{
|
|
244
|
-
uri: BEST_PRACTICES_URI,
|
|
245
|
-
text: `# Styling best practices
|
|
246
|
-
Prefer using "em" and "rem" values for text-related sizes, padding and spacing. Use percentages for dynamic sizing relative to parent containers.
|
|
247
|
-
This flexboxes are by default "flex" with "stretch" alignment. To ensure proper layout, define the "justify-content" and "align-items" as in the schema.
|
|
248
|
-
|
|
249
|
-
Styling is provided as raw CSS. The css string must follow standard CSS syntax, with properties and values separated by semicolons, no selectors, or nesting rules allowed.
|
|
250
|
-
|
|
251
|
-
** CRITICAL - VARIABLES **
|
|
252
|
-
When using global variables, ensure that the variables are defined in the ${"elementor://global-variables"} resource.
|
|
253
|
-
Variables from the user context ARE NOT SUPPORTED AND WILL RESOLVE IN ERROR.
|
|
254
|
-
|
|
255
|
-
`
|
|
256
|
-
}
|
|
257
|
-
]
|
|
258
|
-
};
|
|
259
|
-
}
|
|
260
|
-
);
|
|
261
234
|
resource(
|
|
262
235
|
"widget-schema-by-type",
|
|
263
236
|
new import_editor_mcp.ResourceTemplate(WIDGET_SCHEMA_URI, {
|
|
@@ -4195,6 +4168,36 @@ var initAvailableWidgetsResource = (reg) => {
|
|
|
4195
4168
|
onV1Ready();
|
|
4196
4169
|
};
|
|
4197
4170
|
|
|
4171
|
+
// src/mcp/resources/best-practices-resource.ts
|
|
4172
|
+
var import_http_client2 = require("@elementor/http-client");
|
|
4173
|
+
var MCP_PROXY_URL = "elementor/v1/mcp-proxy";
|
|
4174
|
+
var BEST_PRACTICES_URI2 = "elementor://style/best-practices";
|
|
4175
|
+
var initBestPracticesResource = (reg) => {
|
|
4176
|
+
const { resource } = reg;
|
|
4177
|
+
resource(
|
|
4178
|
+
"style-best-practices",
|
|
4179
|
+
BEST_PRACTICES_URI2,
|
|
4180
|
+
{
|
|
4181
|
+
description: "Design quality guidelines for avoiding generic AI output: typography, color strategy, spacing, motion, and visual hierarchy best practices.",
|
|
4182
|
+
mimeType: "text/markdown"
|
|
4183
|
+
},
|
|
4184
|
+
async (uri) => {
|
|
4185
|
+
const { data } = await (0, import_http_client2.httpService)().get(MCP_PROXY_URL, {
|
|
4186
|
+
params: { uri: uri.href }
|
|
4187
|
+
});
|
|
4188
|
+
return {
|
|
4189
|
+
contents: [
|
|
4190
|
+
{
|
|
4191
|
+
uri: uri.href,
|
|
4192
|
+
mimeType: "text/markdown",
|
|
4193
|
+
text: data.data
|
|
4194
|
+
}
|
|
4195
|
+
]
|
|
4196
|
+
};
|
|
4197
|
+
}
|
|
4198
|
+
);
|
|
4199
|
+
};
|
|
4200
|
+
|
|
4198
4201
|
// src/mcp/resources/document-structure-resource.ts
|
|
4199
4202
|
var import_editor_elements11 = require("@elementor/editor-elements");
|
|
4200
4203
|
var import_editor_v1_adapters16 = require("@elementor/editor-v1-adapters");
|
|
@@ -5913,9 +5916,9 @@ Provide styling as raw CSS via the "style" parameter (a flat map of CSS property
|
|
|
5913
5916
|
|
|
5914
5917
|
// src/mcp/tools/create-element/tool.ts
|
|
5915
5918
|
var import_editor_documents4 = require("@elementor/editor-documents");
|
|
5916
|
-
var
|
|
5919
|
+
var import_http_client3 = require("@elementor/http-client");
|
|
5917
5920
|
var import_schema5 = require("@elementor/schema");
|
|
5918
|
-
var
|
|
5921
|
+
var MCP_PROXY_URL2 = "elementor/v1/mcp-proxy";
|
|
5919
5922
|
var initCreateElementTool = (reg) => {
|
|
5920
5923
|
const { addTool } = reg;
|
|
5921
5924
|
addTool({
|
|
@@ -5935,7 +5938,7 @@ var initCreateElementTool = (reg) => {
|
|
|
5935
5938
|
if (!document2?.id) {
|
|
5936
5939
|
throw new Error("No active document found.");
|
|
5937
5940
|
}
|
|
5938
|
-
const { data } = await (0,
|
|
5941
|
+
const { data } = await (0, import_http_client3.httpService)().post(MCP_PROXY_URL2, {
|
|
5939
5942
|
tool: "create-element",
|
|
5940
5943
|
input: {
|
|
5941
5944
|
parent_id: parentId ?? "document",
|
|
@@ -6055,6 +6058,7 @@ var initCanvasMcp = (reg) => {
|
|
|
6055
6058
|
initSelectedElementResource(reg);
|
|
6056
6059
|
initEditorStateResource(reg);
|
|
6057
6060
|
initGeneralContextResource(reg);
|
|
6061
|
+
initBestPracticesResource(reg);
|
|
6058
6062
|
initBuildCompositionsTool(reg);
|
|
6059
6063
|
initGetElementConfigTool(reg);
|
|
6060
6064
|
initConfigureElementTool(reg);
|
package/dist/index.mjs
CHANGED
|
@@ -160,37 +160,10 @@ function extractV3ControlsMetadata(controls) {
|
|
|
160
160
|
var CANVAS_SERVER_NAME = "editor-canvas";
|
|
161
161
|
var WIDGET_SCHEMA_URI = "elementor://widgets/schema/{widgetType}";
|
|
162
162
|
var WIDGET_SCHEMA_FULL_URI = `${CANVAS_SERVER_NAME}_${WIDGET_SCHEMA_URI}`;
|
|
163
|
-
var BEST_PRACTICES_URI = "elementor://
|
|
163
|
+
var BEST_PRACTICES_URI = "elementor://style/best-practices";
|
|
164
164
|
var BEST_PRACTICES_FULL_URI = `${CANVAS_SERVER_NAME}_${BEST_PRACTICES_URI}`;
|
|
165
165
|
var initWidgetsSchemaResource = (reg) => {
|
|
166
166
|
const { resource } = reg;
|
|
167
|
-
resource(
|
|
168
|
-
"styles-best-practices",
|
|
169
|
-
BEST_PRACTICES_URI,
|
|
170
|
-
{
|
|
171
|
-
description: "Styling best practices"
|
|
172
|
-
},
|
|
173
|
-
async () => {
|
|
174
|
-
return {
|
|
175
|
-
contents: [
|
|
176
|
-
{
|
|
177
|
-
uri: BEST_PRACTICES_URI,
|
|
178
|
-
text: `# Styling best practices
|
|
179
|
-
Prefer using "em" and "rem" values for text-related sizes, padding and spacing. Use percentages for dynamic sizing relative to parent containers.
|
|
180
|
-
This flexboxes are by default "flex" with "stretch" alignment. To ensure proper layout, define the "justify-content" and "align-items" as in the schema.
|
|
181
|
-
|
|
182
|
-
Styling is provided as raw CSS. The css string must follow standard CSS syntax, with properties and values separated by semicolons, no selectors, or nesting rules allowed.
|
|
183
|
-
|
|
184
|
-
** CRITICAL - VARIABLES **
|
|
185
|
-
When using global variables, ensure that the variables are defined in the ${"elementor://global-variables"} resource.
|
|
186
|
-
Variables from the user context ARE NOT SUPPORTED AND WILL RESOLVE IN ERROR.
|
|
187
|
-
|
|
188
|
-
`
|
|
189
|
-
}
|
|
190
|
-
]
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
);
|
|
194
167
|
resource(
|
|
195
168
|
"widget-schema-by-type",
|
|
196
169
|
new ResourceTemplate(WIDGET_SCHEMA_URI, {
|
|
@@ -4158,6 +4131,36 @@ var initAvailableWidgetsResource = (reg) => {
|
|
|
4158
4131
|
onV1Ready();
|
|
4159
4132
|
};
|
|
4160
4133
|
|
|
4134
|
+
// src/mcp/resources/best-practices-resource.ts
|
|
4135
|
+
import { httpService as httpService2 } from "@elementor/http-client";
|
|
4136
|
+
var MCP_PROXY_URL = "elementor/v1/mcp-proxy";
|
|
4137
|
+
var BEST_PRACTICES_URI2 = "elementor://style/best-practices";
|
|
4138
|
+
var initBestPracticesResource = (reg) => {
|
|
4139
|
+
const { resource } = reg;
|
|
4140
|
+
resource(
|
|
4141
|
+
"style-best-practices",
|
|
4142
|
+
BEST_PRACTICES_URI2,
|
|
4143
|
+
{
|
|
4144
|
+
description: "Design quality guidelines for avoiding generic AI output: typography, color strategy, spacing, motion, and visual hierarchy best practices.",
|
|
4145
|
+
mimeType: "text/markdown"
|
|
4146
|
+
},
|
|
4147
|
+
async (uri) => {
|
|
4148
|
+
const { data } = await httpService2().get(MCP_PROXY_URL, {
|
|
4149
|
+
params: { uri: uri.href }
|
|
4150
|
+
});
|
|
4151
|
+
return {
|
|
4152
|
+
contents: [
|
|
4153
|
+
{
|
|
4154
|
+
uri: uri.href,
|
|
4155
|
+
mimeType: "text/markdown",
|
|
4156
|
+
text: data.data
|
|
4157
|
+
}
|
|
4158
|
+
]
|
|
4159
|
+
};
|
|
4160
|
+
}
|
|
4161
|
+
);
|
|
4162
|
+
};
|
|
4163
|
+
|
|
4161
4164
|
// src/mcp/resources/document-structure-resource.ts
|
|
4162
4165
|
import {
|
|
4163
4166
|
getWidgetsCache as getWidgetsCache4
|
|
@@ -5898,9 +5901,9 @@ Provide styling as raw CSS via the "style" parameter (a flat map of CSS property
|
|
|
5898
5901
|
|
|
5899
5902
|
// src/mcp/tools/create-element/tool.ts
|
|
5900
5903
|
import { getCurrentDocument as getCurrentDocument2 } from "@elementor/editor-documents";
|
|
5901
|
-
import { httpService as
|
|
5904
|
+
import { httpService as httpService3 } from "@elementor/http-client";
|
|
5902
5905
|
import { z as z3 } from "@elementor/schema";
|
|
5903
|
-
var
|
|
5906
|
+
var MCP_PROXY_URL2 = "elementor/v1/mcp-proxy";
|
|
5904
5907
|
var initCreateElementTool = (reg) => {
|
|
5905
5908
|
const { addTool } = reg;
|
|
5906
5909
|
addTool({
|
|
@@ -5920,7 +5923,7 @@ var initCreateElementTool = (reg) => {
|
|
|
5920
5923
|
if (!document2?.id) {
|
|
5921
5924
|
throw new Error("No active document found.");
|
|
5922
5925
|
}
|
|
5923
|
-
const { data } = await
|
|
5926
|
+
const { data } = await httpService3().post(MCP_PROXY_URL2, {
|
|
5924
5927
|
tool: "create-element",
|
|
5925
5928
|
input: {
|
|
5926
5929
|
parent_id: parentId ?? "document",
|
|
@@ -6040,6 +6043,7 @@ var initCanvasMcp = (reg) => {
|
|
|
6040
6043
|
initSelectedElementResource(reg);
|
|
6041
6044
|
initEditorStateResource(reg);
|
|
6042
6045
|
initGeneralContextResource(reg);
|
|
6046
|
+
initBestPracticesResource(reg);
|
|
6043
6047
|
initBuildCompositionsTool(reg);
|
|
6044
6048
|
initGetElementConfigTool(reg);
|
|
6045
6049
|
initConfigureElementTool(reg);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elementor/editor-canvas",
|
|
3
3
|
"description": "Elementor Editor Canvas",
|
|
4
|
-
"version": "4.3.0-
|
|
4
|
+
"version": "4.3.0-975",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Elementor Team",
|
|
7
7
|
"homepage": "https://elementor.com/",
|
|
@@ -37,26 +37,26 @@
|
|
|
37
37
|
"react-dom": "^18.3.1"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@elementor/editor": "4.3.0-
|
|
41
|
-
"@elementor/editor-controls": "4.3.0-
|
|
42
|
-
"@elementor/editor-documents": "4.3.0-
|
|
43
|
-
"@elementor/editor-elements": "4.3.0-
|
|
44
|
-
"@elementor/editor-interactions": "4.3.0-
|
|
45
|
-
"@elementor/editor-mcp": "4.3.0-
|
|
46
|
-
"@elementor/editor-notifications": "4.3.0-
|
|
47
|
-
"@elementor/editor-props": "4.3.0-
|
|
48
|
-
"@elementor/editor-responsive": "4.3.0-
|
|
49
|
-
"@elementor/editor-styles": "4.3.0-
|
|
50
|
-
"@elementor/editor-styles-repository": "4.3.0-
|
|
51
|
-
"@elementor/editor-ui": "4.3.0-
|
|
52
|
-
"@elementor/editor-v1-adapters": "4.3.0-
|
|
53
|
-
"@elementor/events": "4.3.0-
|
|
54
|
-
"@elementor/http-client": "4.3.0-
|
|
55
|
-
"@elementor/schema": "4.3.0-
|
|
56
|
-
"@elementor/twing": "4.3.0-
|
|
40
|
+
"@elementor/editor": "4.3.0-975",
|
|
41
|
+
"@elementor/editor-controls": "4.3.0-975",
|
|
42
|
+
"@elementor/editor-documents": "4.3.0-975",
|
|
43
|
+
"@elementor/editor-elements": "4.3.0-975",
|
|
44
|
+
"@elementor/editor-interactions": "4.3.0-975",
|
|
45
|
+
"@elementor/editor-mcp": "4.3.0-975",
|
|
46
|
+
"@elementor/editor-notifications": "4.3.0-975",
|
|
47
|
+
"@elementor/editor-props": "4.3.0-975",
|
|
48
|
+
"@elementor/editor-responsive": "4.3.0-975",
|
|
49
|
+
"@elementor/editor-styles": "4.3.0-975",
|
|
50
|
+
"@elementor/editor-styles-repository": "4.3.0-975",
|
|
51
|
+
"@elementor/editor-ui": "4.3.0-975",
|
|
52
|
+
"@elementor/editor-v1-adapters": "4.3.0-975",
|
|
53
|
+
"@elementor/events": "4.3.0-975",
|
|
54
|
+
"@elementor/http-client": "4.3.0-975",
|
|
55
|
+
"@elementor/schema": "4.3.0-975",
|
|
56
|
+
"@elementor/twing": "4.3.0-975",
|
|
57
57
|
"@elementor/ui": "1.37.5",
|
|
58
|
-
"@elementor/utils": "4.3.0-
|
|
59
|
-
"@elementor/wp-media": "4.3.0-
|
|
58
|
+
"@elementor/utils": "4.3.0-975",
|
|
59
|
+
"@elementor/wp-media": "4.3.0-975",
|
|
60
60
|
"@floating-ui/react": "^0.27.5",
|
|
61
61
|
"@wordpress/i18n": "^5.13.0",
|
|
62
62
|
"dompurify": "^3.2.6"
|
package/src/mcp/canvas-mcp.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { type MCPRegistryEntry } from '@elementor/editor-mcp';
|
|
|
2
2
|
import { Schema } from '@elementor/editor-props';
|
|
3
3
|
|
|
4
4
|
import { initAvailableWidgetsResource } from './resources/available-widgets-resource';
|
|
5
|
+
import { initBestPracticesResource } from './resources/best-practices-resource';
|
|
5
6
|
import { initBreakpointsResource } from './resources/breakpoints-resource';
|
|
6
7
|
import { initDocumentStructureResource } from './resources/document-structure-resource';
|
|
7
8
|
import { initDynamicTagsResource } from './resources/dynamic-tags-resource';
|
|
@@ -27,6 +28,7 @@ export const initCanvasMcp = ( reg: MCPRegistryEntry ) => {
|
|
|
27
28
|
initSelectedElementResource( reg );
|
|
28
29
|
initEditorStateResource( reg );
|
|
29
30
|
initGeneralContextResource( reg );
|
|
31
|
+
initBestPracticesResource( reg );
|
|
30
32
|
initBuildCompositionsTool( reg );
|
|
31
33
|
initGetElementConfigTool( reg );
|
|
32
34
|
initConfigureElementTool( reg );
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type MCPRegistryEntry } from '@elementor/editor-mcp';
|
|
2
|
+
import { type HttpResponse, httpService } from '@elementor/http-client';
|
|
3
|
+
|
|
4
|
+
const MCP_PROXY_URL = 'elementor/v1/mcp-proxy';
|
|
5
|
+
export const BEST_PRACTICES_URI = 'elementor://style/best-practices';
|
|
6
|
+
|
|
7
|
+
export const initBestPracticesResource = ( reg: MCPRegistryEntry ) => {
|
|
8
|
+
const { resource } = reg;
|
|
9
|
+
|
|
10
|
+
resource(
|
|
11
|
+
'style-best-practices',
|
|
12
|
+
BEST_PRACTICES_URI,
|
|
13
|
+
{
|
|
14
|
+
description:
|
|
15
|
+
'Design quality guidelines for avoiding generic AI output: typography, color strategy, spacing, motion, and visual hierarchy best practices.',
|
|
16
|
+
mimeType: 'text/markdown',
|
|
17
|
+
},
|
|
18
|
+
async ( uri: URL ) => {
|
|
19
|
+
const { data } = await httpService().get< HttpResponse< string > >( MCP_PROXY_URL, {
|
|
20
|
+
params: { uri: uri.href },
|
|
21
|
+
} );
|
|
22
|
+
|
|
23
|
+
return {
|
|
24
|
+
contents: [
|
|
25
|
+
{
|
|
26
|
+
uri: uri.href,
|
|
27
|
+
mimeType: 'text/markdown',
|
|
28
|
+
text: data.data,
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
};
|
|
@@ -59,40 +59,12 @@ export const CANVAS_SERVER_NAME = 'editor-canvas';
|
|
|
59
59
|
export const WIDGET_SCHEMA_URI = 'elementor://widgets/schema/{widgetType}';
|
|
60
60
|
export const WIDGET_SCHEMA_FULL_URI = `${ CANVAS_SERVER_NAME }_${ WIDGET_SCHEMA_URI }`;
|
|
61
61
|
export const STYLE_SCHEMA_URI = 'elementor://styles/schema/{category}';
|
|
62
|
-
export const BEST_PRACTICES_URI = 'elementor://
|
|
62
|
+
export const BEST_PRACTICES_URI = 'elementor://style/best-practices';
|
|
63
63
|
export const BEST_PRACTICES_FULL_URI = `${ CANVAS_SERVER_NAME }_${ BEST_PRACTICES_URI }`;
|
|
64
64
|
|
|
65
65
|
export const initWidgetsSchemaResource = ( reg: MCPRegistryEntry ) => {
|
|
66
66
|
const { resource } = reg;
|
|
67
67
|
|
|
68
|
-
resource(
|
|
69
|
-
'styles-best-practices',
|
|
70
|
-
BEST_PRACTICES_URI,
|
|
71
|
-
{
|
|
72
|
-
description: 'Styling best practices',
|
|
73
|
-
},
|
|
74
|
-
async () => {
|
|
75
|
-
return {
|
|
76
|
-
contents: [
|
|
77
|
-
{
|
|
78
|
-
uri: BEST_PRACTICES_URI,
|
|
79
|
-
text: `# Styling best practices
|
|
80
|
-
Prefer using "em" and "rem" values for text-related sizes, padding and spacing. Use percentages for dynamic sizing relative to parent containers.
|
|
81
|
-
This flexboxes are by default "flex" with "stretch" alignment. To ensure proper layout, define the "justify-content" and "align-items" as in the schema.
|
|
82
|
-
|
|
83
|
-
Styling is provided as raw CSS. The css string must follow standard CSS syntax, with properties and values separated by semicolons, no selectors, or nesting rules allowed.
|
|
84
|
-
|
|
85
|
-
** CRITICAL - VARIABLES **
|
|
86
|
-
When using global variables, ensure that the variables are defined in the ${ 'elementor://global-variables' } resource.
|
|
87
|
-
Variables from the user context ARE NOT SUPPORTED AND WILL RESOLVE IN ERROR.
|
|
88
|
-
|
|
89
|
-
`,
|
|
90
|
-
},
|
|
91
|
-
],
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
);
|
|
95
|
-
|
|
96
68
|
resource(
|
|
97
69
|
'widget-schema-by-type',
|
|
98
70
|
new ResourceTemplate( WIDGET_SCHEMA_URI, {
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
export const BEST_PRACTICES_PROMPT = `
|
|
2
|
-
# DESIGN QUALITY IMPERATIVE
|
|
3
|
-
|
|
4
|
-
You are generating designs for real users who expect distinctive, intentional aesthetics - NOT generic AI output.
|
|
5
|
-
|
|
6
|
-
**The Core Challenge**: Large language models naturally converge toward statistically common design patterns during generation. This creates predictable, uninspired results that users describe as "AI slop": safe color schemes, default typography hierarchies, minimal contrast, and timid spacing.
|
|
7
|
-
|
|
8
|
-
**Your Mission**: Actively resist distributional convergence by making intentional, distinctive design choices across all aesthetic dimensions. Every design decision should have a clear purpose tied to visual hierarchy, brand personality, or user experience goals.
|
|
9
|
-
|
|
10
|
-
When in doubt between "safe" and "distinctive," choose distinctive - users can always request refinements, but they cannot salvage generic foundations.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
# DESIGN VECTORS - Concrete Implementation Guidance
|
|
15
|
-
|
|
16
|
-
## 1. Typography & Visual Hierarchy
|
|
17
|
-
|
|
18
|
-
### Avoid Distributional Defaults:
|
|
19
|
-
- NO generic sans-serifs as primary typefaces (Inter, Roboto, Arial, Helvetica)
|
|
20
|
-
- NO timid size ratios (1.2x, 1.5x scaling)
|
|
21
|
-
- NO uniform font weights (everything at 400 or 600)
|
|
22
|
-
|
|
23
|
-
### Intentional Alternatives:
|
|
24
|
-
- **For Technical/Modern**: Consider monospace headlines (JetBrains Mono, SF Mono) paired with clean body text
|
|
25
|
-
- **For Editorial/Elegant**: Consider serif headlines (Playfair Display, Crimson Text) with sans-serif body
|
|
26
|
-
- **For Playful/Creative**: Consider display fonts with character, paired with highly legible body text
|
|
27
|
-
|
|
28
|
-
### Scale & Contrast Implementation:
|
|
29
|
-
- Headline-to-body size ratios: 3x minimum (e.g., 48px headline vs 16px body)
|
|
30
|
-
- Use extreme weight contrasts: pair weight-100 or 200 with weight-800 or 900
|
|
31
|
-
- Line height contrasts: tight headlines (1.1) vs. generous body (1.7)
|
|
32
|
-
- Letter spacing: compressed headlines (-0.02em to -0.05em) vs. open small text (0.03em+)
|
|
33
|
-
|
|
34
|
-
## 2. Color & Theme Strategy
|
|
35
|
-
|
|
36
|
-
### Avoid Distributional Defaults:
|
|
37
|
-
- NO purple gradients or blue-purple color schemes (massively overrepresented in AI output)
|
|
38
|
-
- NO evenly-distributed color palettes (3-4 colors used equally)
|
|
39
|
-
- NO timid pastels or all-neutral schemes
|
|
40
|
-
- NO #333333, #666666, #999999 grays
|
|
41
|
-
|
|
42
|
-
### Intentional Alternatives:
|
|
43
|
-
- **Commit to a Dominant Color**: Choose ONE primary brand color that appears in 60-70% of colored elements
|
|
44
|
-
- **Sharp Accent Strategy**: Use 1-2 high-contrast accent colors sparingly (10-15% of colored elements)
|
|
45
|
-
- **Neutrals with Personality**: Replace pure grays with warm (#3d3228, #f5f1ed) or cool (#2a2f3d, #f0f2f5) tinted neutrals
|
|
46
|
-
|
|
47
|
-
### Color Psychology Mapping:
|
|
48
|
-
- Energy/Action → Warm reds, oranges, yellows (NOT purple/blue)
|
|
49
|
-
- Trust/Calm → Deep teals, forest greens (NOT generic blue)
|
|
50
|
-
- Luxury/Premium → Deep burgundy, emerald, charcoal with gold accents
|
|
51
|
-
- Playful/Creative → Unexpected combinations (coral + mint, mustard + navy)
|
|
52
|
-
|
|
53
|
-
## 3. Spatial Design & White Space
|
|
54
|
-
|
|
55
|
-
### Avoid Distributional Defaults:
|
|
56
|
-
- NO uniform spacing (everything 16px or 24px)
|
|
57
|
-
- NO cramped layouts that maximize content density
|
|
58
|
-
- NO default container widths (1200px, 1440px)
|
|
59
|
-
|
|
60
|
-
### Intentional Alternatives:
|
|
61
|
-
- **Breathing Room**: Use generous white space as a design element (80-120px vertical spacing between sections)
|
|
62
|
-
- **Asymmetric Spacing**: Vary padding dramatically (small: 12px, medium: 48px, large: 96px)
|
|
63
|
-
- **Content Width Strategy**:
|
|
64
|
-
- Reading content: max 65-75 characters (600-700px)
|
|
65
|
-
- Hero sections: asymmetric layouts, not centered blocks
|
|
66
|
-
- Cards/components: vary sizes intentionally, not uniform grids
|
|
67
|
-
|
|
68
|
-
## 4. Motion & Interaction Design
|
|
69
|
-
|
|
70
|
-
### Avoid Distributional Defaults:
|
|
71
|
-
- NO scattered micro-interactions on every element
|
|
72
|
-
- NO generic fade-in animations
|
|
73
|
-
- NO 0.3s ease-in-out transitions everywhere
|
|
74
|
-
|
|
75
|
-
### Intentional Alternatives:
|
|
76
|
-
- **High-Impact Moments**: Use animation for 2-3 key moments (page load hero, primary CTA, section reveals)
|
|
77
|
-
- **Staggered Reveals**: When animating multiple items, use staggered delays (0.1s increments)
|
|
78
|
-
- **Purposeful Timing**: Fast interactions (0.15s) for responsiveness, slow reveals (0.6s+) for drama
|
|
79
|
-
|
|
80
|
-
## 5. Backgrounds & Atmospheric Depth
|
|
81
|
-
|
|
82
|
-
### Avoid Distributional Defaults:
|
|
83
|
-
- NO solid white or light gray backgrounds
|
|
84
|
-
- NO single-color backgrounds
|
|
85
|
-
- NO generic gradient overlays
|
|
86
|
-
|
|
87
|
-
### Intentional Alternatives:
|
|
88
|
-
- **Layered Gradients**: Combine 2-3 subtle gradients for depth
|
|
89
|
-
- **Geometric Patterns**: SVG patterns, mesh gradients, or subtle noise textures
|
|
90
|
-
- **Strategic Contrast**: Alternate between light and dark sections for rhythm
|
|
91
|
-
|
|
92
|
-
## 6. Visual Hierarchy Principles
|
|
93
|
-
|
|
94
|
-
### Clear Priority System:
|
|
95
|
-
1. **Primary Focus (1 element)**: Largest, highest contrast, most visual weight
|
|
96
|
-
2. **Secondary Elements (2-3 elements)**: 40-60% of primary size, reduced contrast
|
|
97
|
-
3. **Tertiary/Support (everything else)**: Minimal visual weight, muted colors
|
|
98
|
-
|
|
99
|
-
### Contrast Techniques:
|
|
100
|
-
- Size: 3x+ differences between hierarchy levels
|
|
101
|
-
- Weight: 300+ difference in font-weight values
|
|
102
|
-
- Color: Primary gets brand color, secondary gets neutral, tertiary gets muted
|
|
103
|
-
- Space: Primary gets 2x+ surrounding white space vs. secondary
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
# IMPLEMENTATION WORKFLOW
|
|
107
|
-
|
|
108
|
-
When building a composition:
|
|
109
|
-
|
|
110
|
-
1. **Define the Visual Goal First**
|
|
111
|
-
- What emotion/brand personality? (Professional, playful, elegant, bold)
|
|
112
|
-
- What's the single most important element?
|
|
113
|
-
- What color family (warm/cool/neutral) supports the goal?
|
|
114
|
-
|
|
115
|
-
2. **Choose Typography Personality**
|
|
116
|
-
- Select font pairings that match the personality (NOT defaults)
|
|
117
|
-
- Define scale (3x+ headline ratio)
|
|
118
|
-
- Set weight extremes (light/heavy contrast)
|
|
119
|
-
|
|
120
|
-
3. **Commit to Color Strategy**
|
|
121
|
-
- Pick ONE dominant color (NOT purple, NOT generic blue)
|
|
122
|
-
- Choose 1 sharp accent
|
|
123
|
-
- Define warm or cool neutrals
|
|
124
|
-
|
|
125
|
-
4. **Design Spatial Rhythm**
|
|
126
|
-
- Use generous white space (3-6rem between sections)
|
|
127
|
-
- Create asymmetry (not everything centered)
|
|
128
|
-
- Vary component sizes intentionally
|
|
129
|
-
|
|
130
|
-
5. **Add Strategic Motion**
|
|
131
|
-
- Identify 2-3 high-impact animation moments
|
|
132
|
-
- Use staggered timing for multiple elements
|
|
133
|
-
- Keep interactions purposeful, not decorative
|
|
134
|
-
|
|
135
|
-
6. **Layer Atmospheric Depth**
|
|
136
|
-
- Use gradient combinations for backgrounds
|
|
137
|
-
- Add subtle patterns or textures
|
|
138
|
-
- Alternate light/dark sections for rhythm
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
# CONTEXT-AWARE DESIGN PERSONALITIES
|
|
142
|
-
|
|
143
|
-
Brand personality should influence your choices:
|
|
144
|
-
|
|
145
|
-
- **Corporate/Professional**: Deep neutrals, serif headlines, structured spacing
|
|
146
|
-
- **Creative/Agency**: Bold color, display fonts, asymmetric layouts
|
|
147
|
-
- **Tech/Startup**: Monospace accents, sharp colors, modern spacing
|
|
148
|
-
- **Elegant/Luxury**: Serif dominance, muted colors with metallic accents, generous white space
|
|
149
|
-
|
|
150
|
-
# USER OVERRIDE CAPABILITY
|
|
151
|
-
|
|
152
|
-
Always respect user specifications:
|
|
153
|
-
|
|
154
|
-
If user specifies:
|
|
155
|
-
- Specific colors → use them
|
|
156
|
-
- Specific fonts → use them
|
|
157
|
-
- Specific spacing → use it
|
|
158
|
-
- "Minimal/simple" → reduce ornamentation but maintain quality principles
|
|
159
|
-
`;
|