@neatico/visual-core 0.14.3 → 0.14.64

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 (68) hide show
  1. package/dist/candidateRanking.d.ts +31 -0
  2. package/dist/candidateRanking.js +55 -0
  3. package/dist/cjs/candidateRanking.js +61 -0
  4. package/dist/cjs/composition.js +62 -36
  5. package/dist/cjs/compositionNumbers.js +111 -0
  6. package/dist/cjs/compositionScenes.js +91 -38
  7. package/dist/cjs/compositionUseCases.js +145 -0
  8. package/dist/cjs/content.js +574 -120
  9. package/dist/cjs/contentBrief.js +82 -0
  10. package/dist/cjs/designBlueprint.js +94 -19
  11. package/dist/cjs/designSystem.js +536 -77
  12. package/dist/cjs/editorial.js +76 -20
  13. package/dist/cjs/fontCatalog.js +81 -23
  14. package/dist/cjs/formalCompositions.js +120 -0
  15. package/dist/cjs/index.js +13 -0
  16. package/dist/cjs/layoutContracts.js +57 -11
  17. package/dist/cjs/layouts.js +5 -92
  18. package/dist/cjs/nativeSocialParameters.js +145 -0
  19. package/dist/cjs/pagination.js +27 -7
  20. package/dist/cjs/parameterDefaults.js +20 -0
  21. package/dist/cjs/recipeParameters.js +304 -0
  22. package/dist/cjs/socialLayouts.js +127 -387
  23. package/dist/cjs/styleManifest.js +107 -0
  24. package/dist/cjs/text.js +12 -2
  25. package/dist/cjs/textPresentation.js +68 -0
  26. package/dist/composition.d.ts +4 -4
  27. package/dist/composition.js +62 -36
  28. package/dist/compositionNumbers.d.ts +4 -0
  29. package/dist/compositionNumbers.js +108 -0
  30. package/dist/compositionScenes.d.ts +2 -2
  31. package/dist/compositionScenes.js +91 -38
  32. package/dist/compositionUseCases.d.ts +1 -0
  33. package/dist/compositionUseCases.js +142 -0
  34. package/dist/content.d.ts +65 -20
  35. package/dist/content.js +575 -121
  36. package/dist/contentBrief.d.ts +16 -0
  37. package/dist/contentBrief.js +78 -0
  38. package/dist/designBlueprint.d.ts +4 -4
  39. package/dist/designBlueprint.js +95 -20
  40. package/dist/designSystem.d.ts +11 -7
  41. package/dist/designSystem.js +537 -79
  42. package/dist/editorial.d.ts +1 -1
  43. package/dist/editorial.js +77 -21
  44. package/dist/fontCatalog.d.ts +1 -1
  45. package/dist/fontCatalog.js +81 -23
  46. package/dist/formalCompositions.d.ts +26 -0
  47. package/dist/formalCompositions.js +116 -0
  48. package/dist/index.d.ts +10 -0
  49. package/dist/index.js +10 -0
  50. package/dist/layoutContracts.d.ts +3 -3
  51. package/dist/layoutContracts.js +58 -12
  52. package/dist/layouts.d.ts +2 -2
  53. package/dist/layouts.js +5 -92
  54. package/dist/nativeSocialParameters.d.ts +38 -0
  55. package/dist/nativeSocialParameters.js +139 -0
  56. package/dist/pagination.js +27 -7
  57. package/dist/parameterDefaults.d.ts +2 -0
  58. package/dist/parameterDefaults.js +17 -0
  59. package/dist/recipeParameters.d.ts +34 -0
  60. package/dist/recipeParameters.js +300 -0
  61. package/dist/socialLayouts.d.ts +40 -232
  62. package/dist/socialLayouts.js +127 -387
  63. package/dist/styleManifest.d.ts +20 -0
  64. package/dist/styleManifest.js +103 -0
  65. package/dist/text.js +12 -2
  66. package/dist/textPresentation.d.ts +29 -0
  67. package/dist/textPresentation.js +64 -0
  68. package/package.json +1 -1
@@ -0,0 +1,300 @@
1
+ import { COMPOSITION_ILLUSTRATIONS } from "./nativeSocialParameters.js";
2
+ import { textPresentationSchema } from './textPresentation.js';
3
+ import { DESIGN_RECIPES } from "./designSystem.js";
4
+ const text = (description, maxLength = 600) => ({
5
+ type: "string",
6
+ description,
7
+ maxLength,
8
+ });
9
+ const object = (properties, required) => ({
10
+ type: "object",
11
+ additionalProperties: false,
12
+ properties,
13
+ required,
14
+ });
15
+ const array = (items, minItems, maxItems) => ({ type: "array", items, minItems, maxItems });
16
+ const evidence = array(object({
17
+ sourceId: text("Existing source segment ID.", 160),
18
+ quote: text("Exact source quotation.", 2000),
19
+ }, ["sourceId"]), 1, 32);
20
+ const base = (kind, properties, required) => object({
21
+ id: text("Stable block ID, unique within this page.", 80),
22
+ kind: { const: kind },
23
+ evidence,
24
+ ...properties,
25
+ }, ["id", "kind", "evidence", ...required]);
26
+ const descriptions = {
27
+ paragraph: "Explain a narrative idea with readable prose and optional section headings.",
28
+ features: "Present parallel capabilities or a list of distinct ideas without implying a sequence.",
29
+ steps: "Explain ordered actions or a chronological sequence supported by the source.",
30
+ comparison: "Compare supplied alternatives with aligned criteria; never invent a competing alternative.",
31
+ parameters: "Present exact specifications, logistics, identifiers, dates, prices, or named facts.",
32
+ quote: "Emphasize a verbatim quotation with its supplied attribution.",
33
+ chart: "Explain a comparable numeric series with source-backed values and a shared unit.",
34
+ code: "Display exact source code without rewriting identifiers, literals, or line breaks.",
35
+ image: "Arrange a real, previously supplied image asset with its source reference and focal subject.",
36
+ };
37
+ function blockSchema(kind, maximum) {
38
+ const count = Math.max(1, Math.min(12, maximum || 12));
39
+ switch (kind) {
40
+ case "paragraph":
41
+ return base(kind, {
42
+ text: text("Source-faithful prose.", 2000),
43
+ heading: text("Optional source-supported heading.", 120),
44
+ level: { enum: [2, 3] },
45
+ }, ["text"]);
46
+ case "features":
47
+ case "steps":
48
+ return base(kind, {
49
+ entries: array(object({
50
+ title: text("Concise item label without an ordinal prefix.", 120),
51
+ description: text("Source-faithful explanation; omit filler.", 600),
52
+ }, ["title", "description"]), 1, count),
53
+ }, ["entries"]);
54
+ case "comparison":
55
+ return base(kind, {
56
+ columns: array(object({
57
+ title: text("A supplied alternative.", 120),
58
+ points: array(text("Source-backed comparison criterion.", 600), 1, 8),
59
+ price: text("Exact source price, only when supplied.", 120),
60
+ values: array(text("Exact value aligned with points.", 160), 1, 8),
61
+ statuses: array({ enum: ["included", "excluded", "partial", "unknown"] }, 1, 8),
62
+ }, ["title", "points"]), 2, Math.max(2, Math.min(4, count))),
63
+ }, ["columns"]);
64
+ case "parameters":
65
+ return base(kind, {
66
+ rows: array(object({
67
+ name: text("Fact name.", 120),
68
+ value: text("Exact source value.", 300),
69
+ description: text("Source-supported qualification, otherwise an empty string.", 600),
70
+ }, ["name", "value", "description"]), 1, count),
71
+ }, ["rows"]);
72
+ case "quote":
73
+ return base(kind, {
74
+ text: text("Verbatim source quotation.", 1200),
75
+ attribution: text("Exact source attribution.", 160),
76
+ role: text("Role only when explicitly supplied.", 160),
77
+ avatarAssetId: text("Existing supplied portrait asset ID; never invent a person or image.", 160),
78
+ }, ["text", "attribution"]);
79
+ case "chart":
80
+ return base(kind, {
81
+ chart: { enum: ["bar", "line"] },
82
+ unit: text("Exact source unit.", 80),
83
+ values: array(object({
84
+ label: text("Exact source label.", 120),
85
+ value: { type: "number" },
86
+ }, ["label", "value"]), 2, 12),
87
+ }, ["chart", "unit", "values"]);
88
+ case "code":
89
+ return base(kind, {
90
+ sourceId: text("Existing code source ID; code remains unchanged.", 160),
91
+ language: text("Source code language.", 80),
92
+ code: text("Exact source code.", 20000),
93
+ }, ["sourceId", "language", "code"]);
94
+ case "image":
95
+ return base(kind, {
96
+ sourceId: text("Existing image source ID.", 160),
97
+ assetId: text("Existing asset ID; no generated URLs.", 160),
98
+ alt: text("Subject and purpose of the supplied image.", 600),
99
+ treatment: { enum: ["screenshot", "photograph", "diagram"] },
100
+ status: { enum: ["available", "missing"] },
101
+ }, ["sourceId", "alt", "treatment", "status"]);
102
+ }
103
+ }
104
+ /** Each authored renderer receives a fixed block sequence and bounded copy. */
105
+ function fixedBlocks(recipe) {
106
+ const id = recipe.id;
107
+ let kinds;
108
+ if (id.endsWith("ledger-chart"))
109
+ kinds = ["parameters", "chart"];
110
+ else if (id.endsWith("detail-sidebar"))
111
+ kinds = ["paragraph", "parameters"];
112
+ else if (id.endsWith("technical-log"))
113
+ kinds = ["paragraph", "code"];
114
+ else if (id.endsWith("architecture-stack"))
115
+ kinds = ["steps", "paragraph"];
116
+ else if (["authored-mechanism-flow", "authored-reference-capability-map"].includes(id))
117
+ kinds = ["features", "paragraph"];
118
+ else if (id === "authored-founder-timeline")
119
+ kinds = ["steps", "paragraph"];
120
+ else if (id === "authored-founder-comparison")
121
+ kinds = ["comparison", "paragraph"];
122
+ else if (id === "semantic-hero-editorial")
123
+ kinds = ["paragraph", "paragraph", "paragraph", "image"];
124
+ else if (id.endsWith("speaker-lineup"))
125
+ kinds = ["parameters", "quote", "quote", "quote"];
126
+ else if (id.endsWith("speaker-spotlight"))
127
+ kinds = ["parameters", "quote"];
128
+ else if (id === "authored-reference-story")
129
+ kinds = ["image", "paragraph", "features"];
130
+ else if (id === "authored-reference-photo")
131
+ kinds = ["paragraph", "image"];
132
+ else if (id === "authored-image-triptych")
133
+ kinds = ["paragraph", "features", "paragraph", "image"];
134
+ else if (recipe.requiresImage && recipe.accepts.includes("image"))
135
+ kinds = ["image"];
136
+ else if (recipe.family === "mixed-stack")
137
+ kinds = ["features"];
138
+ else
139
+ kinds = [
140
+ recipe.accepts.find((kind) => kind !== "paragraph" && kind !== "image") ||
141
+ "paragraph",
142
+ ];
143
+ if (id.startsWith("bookend-") || recipe.family.startsWith("prose-"))
144
+ kinds = ["paragraph"];
145
+ const items = kinds.map((kind) => {
146
+ const schema = JSON.parse(JSON.stringify(blockSchema(kind, recipe.maxEntries)));
147
+ const fields = schema.properties;
148
+ const count = Math.max(recipe.minEntries || 1, Math.min(3, recipe.maxEntries || 3));
149
+ if (kind === "paragraph")
150
+ fields.text.maxLength =
151
+ ["authored-reference-detail-sidebar", "authored-reference-diagonal", "authored-prose-inset"].includes(id) ? 160 : 120;
152
+ if (kind === "features" || kind === "steps") {
153
+ const entries = fields.entries;
154
+ entries.minItems = id === "authored-reference-story" ? 2 : count;
155
+ entries.maxItems = count;
156
+ entries.items.properties.illustration = {
157
+ type: "string",
158
+ enum: [...COMPOSITION_ILLUSTRATIONS, "symbol"],
159
+ default: "structure",
160
+ description: "Editable native illustration for the item. Choose the visual concept that explains its meaning. This field controls a graphic, not prose.",
161
+ };
162
+ entries.items.required.push("illustration");
163
+ entries.items.properties.icon = { type: "string", enum: ["BsJournalText", "BsPersonCheck", "BsShare", "BsPeople", "BsSearch", "BsShieldCheck", "BsBarChart", "BsCodeSlash", "BsSignpostSplit", "BsCheck2Circle", "BsFolder2Open", "BsGrid1X2"], description: "Optional authored icon variant; illustration remains the primary visual concept." };
164
+ entries.items.properties.title.maxLength = 28;
165
+ entries.items.properties.description.maxLength =
166
+ id === "authored-feature-focus" ? 160 : 48;
167
+ if (/(?:reference-faq|editorial-faq)$/.test(id) || id === "faq")
168
+ entries.items.properties.title.pattern = "^.+[??]$";
169
+ }
170
+ if (kind === "parameters") {
171
+ const rows = id.endsWith("ledger-chart") ||
172
+ id.endsWith("detail-sidebar") ||
173
+ id.includes("speaker-")
174
+ ? 2
175
+ : count;
176
+ fields.rows.minItems = id.endsWith("speaker-lineup") ? 1 : id === "pricing" ? 2 : rows;
177
+ fields.rows.maxItems = rows;
178
+ fields.rows.items.properties.name.maxLength = 20;
179
+ fields.rows.items.properties.value.maxLength = 24;
180
+ fields.rows.items.properties.description.maxLength = 64;
181
+ if (id.includes("speaker-"))
182
+ fields.rows.items.properties.description = { const: "" };
183
+ }
184
+ if (kind === "comparison") {
185
+ fields.columns.minItems = 2;
186
+ fields.columns.maxItems = 2;
187
+ const column = fields.columns.items.properties;
188
+ column.title.maxLength = 20;
189
+ column.points.minItems = id === "authored-founder-comparison" ? 1 : 2;
190
+ column.points.maxItems = 3;
191
+ column.points.items.maxLength = id === "authored-founder-comparison" ? 64 : 40;
192
+ column.values.maxItems = 3;
193
+ column.values.items.maxLength = 16;
194
+ column.values.minItems = 0;
195
+ column.statuses.minItems = 0;
196
+ column.statuses.maxItems = 3;
197
+ column.price.maxLength = 24;
198
+ }
199
+ if (kind === "quote") {
200
+ fields.text.maxLength = id.includes("speaker-") ? 48 : 160;
201
+ fields.attribution.maxLength = 32;
202
+ if (id.includes("speaker-")) {
203
+ fields.avatarAssetId.description =
204
+ "An existing portrait asset ID, or neatico-editorial-placeholder for an original source-attributed illustration.";
205
+ schema.required.push("avatarAssetId");
206
+ }
207
+ }
208
+ if (kind === "code") {
209
+ fields.code.maxLength = 400;
210
+ fields.code.description =
211
+ "A concise exact source excerpt, or a clearly labeled illustrative example when no source code exists. At most eight lines and 56 columns per line.";
212
+ fields.code.pattern = String.raw `^(?:[^\n]{0,56}\n){0,7}[^\n]{0,56}$`;
213
+ }
214
+ if (kind === "image")
215
+ fields.alt.maxLength = 80;
216
+ if (kind === "chart") {
217
+ const count = id.endsWith("ledger-chart") ? 3 : 4;
218
+ fields.values.minItems = Math.min(3, count);
219
+ fields.values.maxItems = count;
220
+ fields.values.items.properties.label.maxLength = 20;
221
+ fields.unit.maxLength = 24;
222
+ if (/trend/.test(id))
223
+ fields.chart = { const: "line" };
224
+ if (/bars|ledger-chart/.test(id))
225
+ fields.chart = { const: "bar" };
226
+ if (/donut|reference-share|reference-metrics/.test(id)) {
227
+ fields.chart = { const: "bar" };
228
+ fields.unit = { type: "string", maxLength: 24, pattern: "%", description: "Percentage unit, optionally qualified as illustrative or simulated." };
229
+ fields.values.description =
230
+ "Nonnegative shares totaling exactly 100. Use labeled illustrative shares when the input has no comparable numbers.";
231
+ fields.values.items.properties.value.minimum = 0;
232
+ fields.values.items.properties.value.maximum = 100;
233
+ }
234
+ }
235
+ return schema;
236
+ });
237
+ return {
238
+ type: "array",
239
+ items,
240
+ minItems: items.length,
241
+ maxItems: items.length,
242
+ additionalItems: false,
243
+ description: "Fixed ordered parameters for this renderer. Return every block exactly once in this order; do not add explanatory blocks.",
244
+ };
245
+ }
246
+ /** Fixed renderer parameters, not executable layout trees. The complete schema
247
+ * travels with each formal generation batch; summaries are scheduling aids only.
248
+ */
249
+ export function recipeParameterContract(recipe, supportedKinds = [recipe.kind]) {
250
+ return {
251
+ id: recipe.id,
252
+ schemaVersion: 1,
253
+ supportedKinds,
254
+ semanticDescription: recipe.accepts
255
+ .map((kind) => descriptions[kind])
256
+ .join(" "),
257
+ scenes: recipe.scenes || [],
258
+ rendererKey: `${recipe.renderer}:${recipe.id}`,
259
+ capacity: {
260
+ minEntries: recipe.minEntries,
261
+ maxEntries: recipe.maxEntries,
262
+ requiresImage: recipe.requiresImage,
263
+ },
264
+ parameterSchema: object({
265
+ title: {
266
+ ...text("Audience-facing headline preserving the original topic.", 64),
267
+ minLength: 1,
268
+ },
269
+ blocks: fixedBlocks(recipe),
270
+ textPresentation: textPresentationSchema(),
271
+ }, ["title", "blocks"]),
272
+ importance: { title: 3, blocks: 7 },
273
+ generationPolicy: {
274
+ title: ["user-fact", "derived", "creative"],
275
+ blocks: ["user-fact", "derived", "creative", "simulated"],
276
+ assets: ["existing-reference-only"],
277
+ },
278
+ fallbackPolicy: {
279
+ missingContent: "derive-or-labeled-example",
280
+ missingAsset: "search-or-native-placeholder",
281
+ omitCandidate: false,
282
+ },
283
+ themeBindings: [
284
+ "palette.background",
285
+ "palette.surface",
286
+ "palette.ink",
287
+ "palette.muted",
288
+ "palette.accent",
289
+ "palette.line",
290
+ "typography.heading",
291
+ "typography.body",
292
+ "typography.code",
293
+ "geometry",
294
+ ],
295
+ };
296
+ }
297
+ /** Shared recipes are one part of the formal catalog; host-specific renderer
298
+ * definitions register through the same contract constructor during migration.
299
+ */
300
+ export const RECIPE_PARAMETER_CONTRACTS = DESIGN_RECIPES.filter((recipe, index, recipes) => recipes.findIndex((other) => other.id === recipe.id) === index).map((recipe) => recipeParameterContract(recipe, DESIGN_RECIPES.filter((other) => other.id === recipe.id).map((other) => other.kind)));
@@ -1,5 +1,45 @@
1
1
  /** Stable authored social layouts and their semantic scenes. */
2
2
  export declare const SOCIAL_LAYOUT_CATALOG: readonly [{
3
+ readonly id: "note-question";
4
+ readonly scene: "editorial";
5
+ readonly name: "Emoji question";
6
+ }, {
7
+ readonly id: "note-marker";
8
+ readonly scene: "editorial";
9
+ readonly name: "Marker statement";
10
+ }, {
11
+ readonly id: "note-editorial";
12
+ readonly scene: "editorial";
13
+ readonly name: "Warm editorial note";
14
+ }, {
15
+ readonly id: "note-checklist";
16
+ readonly scene: "features";
17
+ readonly name: "Saveable checklist";
18
+ }, {
19
+ readonly id: "note-photo";
20
+ readonly scene: "launch";
21
+ readonly name: "Photo headline";
22
+ }, {
23
+ readonly id: "note-news";
24
+ readonly scene: "editorial";
25
+ readonly name: "News number";
26
+ }, {
27
+ readonly id: "chat-messenger";
28
+ readonly scene: "features";
29
+ readonly name: "Green messenger";
30
+ }, {
31
+ readonly id: "chat-imessage";
32
+ readonly scene: "features";
33
+ readonly name: "Blue messages";
34
+ }, {
35
+ readonly id: "chat-telegram";
36
+ readonly scene: "features";
37
+ readonly name: "Cloud messenger";
38
+ }, {
39
+ readonly id: "chat-workplace";
40
+ readonly scene: "features";
41
+ readonly name: "Team conversation";
42
+ }, {
3
43
  readonly id: "time-notice";
4
44
  readonly scene: "event";
5
45
  readonly name: "Time notice";
@@ -135,238 +175,6 @@ export declare const SOCIAL_LAYOUT_CATALOG: readonly [{
135
175
  readonly id: "benchmark-bars";
136
176
  readonly scene: "features";
137
177
  readonly name: "Metric vs benchmark";
138
- }, {
139
- readonly id: "block-banner";
140
- readonly scene: "editorial";
141
- readonly name: "Bold split banner";
142
- }, {
143
- readonly id: "progress-roadmap";
144
- readonly scene: "steps";
145
- readonly name: "Progress roadmap";
146
- }, {
147
- readonly id: "fan-deck";
148
- readonly scene: "features";
149
- readonly name: "Fanned card stack";
150
- }, {
151
- readonly id: "contents-index";
152
- readonly scene: "features";
153
- readonly name: "Contents rail";
154
- }, {
155
- readonly id: "contents-chapters";
156
- readonly scene: "steps";
157
- readonly name: "Chapter index";
158
- }, {
159
- readonly id: "contents-grid";
160
- readonly scene: "features";
161
- readonly name: "Quick access grid";
162
- }, {
163
- readonly id: "definition-card";
164
- readonly scene: "editorial";
165
- readonly name: "Definition / principle";
166
- }, {
167
- readonly id: "topic-branches";
168
- readonly scene: "features";
169
- readonly name: "Topic framework";
170
- }, {
171
- readonly id: "radial-mindmap";
172
- readonly scene: "organization";
173
- readonly name: "Radial mindmap";
174
- }, {
175
- readonly id: "tips-card";
176
- readonly scene: "features";
177
- readonly name: "Pro tips";
178
- }, {
179
- readonly id: "code-snippet";
180
- readonly scene: "product-showcase";
181
- readonly name: "Code snippet";
182
- }, {
183
- readonly id: "series-carousel";
184
- readonly scene: "story";
185
- readonly name: "Series collection";
186
- }, {
187
- readonly id: "reflection-card";
188
- readonly scene: "editorial-quote";
189
- readonly name: "Reflection note";
190
- }, {
191
- readonly id: "video-cover";
192
- readonly scene: "spotlight";
193
- readonly name: "Video cover";
194
- }, {
195
- readonly id: "digest-card";
196
- readonly scene: "features";
197
- readonly name: "Knowledge digest";
198
- }, {
199
- readonly id: "chat-preview";
200
- readonly scene: "product-showcase";
201
- readonly name: "Chat snippet";
202
- }, {
203
- readonly id: "recommendation-feed";
204
- readonly scene: "product-showcase";
205
- readonly name: "Personalized picks";
206
- }, {
207
- readonly id: "before-after";
208
- readonly scene: "comparison";
209
- readonly name: "Before / after";
210
- }, {
211
- readonly id: "course-syllabus";
212
- readonly scene: "steps";
213
- readonly name: "Course syllabus";
214
- }, {
215
- readonly id: "concept-explainer";
216
- readonly scene: "spotlight";
217
- readonly name: "Concept explainer";
218
- }, {
219
- readonly id: "persona-question";
220
- readonly scene: "quote";
221
- readonly name: "Persona question";
222
- }, {
223
- readonly id: "nutrient-symptom-grid";
224
- readonly scene: "features";
225
- readonly name: "Nutrient symptom grid";
226
- }, {
227
- readonly id: "milestone-history";
228
- readonly scene: "story";
229
- readonly name: "Milestone history";
230
- }, {
231
- readonly id: "release-notes";
232
- readonly scene: "launch";
233
- readonly name: "Release notes";
234
- }, {
235
- readonly id: "product-listing";
236
- readonly scene: "spotlight";
237
- readonly name: "Product listing";
238
- }, {
239
- readonly id: "flash-sale";
240
- readonly scene: "spotlight";
241
- readonly name: "Flash sale";
242
- }, {
243
- readonly id: "event-banner";
244
- readonly scene: "event";
245
- readonly name: "Event banner";
246
- }, {
247
- readonly id: "startup-journey";
248
- readonly scene: "story";
249
- readonly name: "Startup journey";
250
- }, {
251
- readonly id: "vision-goals";
252
- readonly scene: "editorial";
253
- readonly name: "Vision goals";
254
- }, {
255
- readonly id: "tips-grid";
256
- readonly scene: "editorial";
257
- readonly name: "Tips grid";
258
- }, {
259
- readonly id: "experiment-report";
260
- readonly scene: "research-highlight";
261
- readonly name: "Experiment report";
262
- }, {
263
- readonly id: "leaderboard";
264
- readonly scene: "editorial";
265
- readonly name: "Bestseller leaderboard";
266
- }, {
267
- readonly id: "win-journey";
268
- readonly scene: "story";
269
- readonly name: "Win journey";
270
- }, {
271
- readonly id: "device-price-promo";
272
- readonly scene: "pricing";
273
- readonly name: "Device price promo";
274
- }, {
275
- readonly id: "mega-sale-typographic";
276
- readonly scene: "spotlight";
277
- readonly name: "Mega sale typographic";
278
- }, {
279
- readonly id: "illustration-process";
280
- readonly scene: "steps";
281
- readonly name: "Illustration process";
282
- }, {
283
- readonly id: "glass-neon-sale";
284
- readonly scene: "spotlight";
285
- readonly name: "Glass neon sale";
286
- }, {
287
- readonly id: "free-trial-hero";
288
- readonly scene: "pricing";
289
- readonly name: "Free trial hero";
290
- }, {
291
- readonly id: "feature-chip-hero";
292
- readonly scene: "features";
293
- readonly name: "Feature chip hero";
294
- }, {
295
- readonly id: "event-speaker-card";
296
- readonly scene: "event";
297
- readonly name: "Event speaker card";
298
- }, {
299
- readonly id: "corporate-hero";
300
- readonly scene: "launch";
301
- readonly name: "Corporate hero";
302
- }, {
303
- readonly id: "release-version-hero";
304
- readonly scene: "launch";
305
- readonly name: "Release version hero";
306
- }, {
307
- readonly id: "og-cover";
308
- readonly scene: "editorial";
309
- readonly name: "Article OG cover";
310
- }, {
311
- readonly id: "gradient-cover";
312
- readonly scene: "editorial";
313
- readonly name: "Sheen gradient cover";
314
- }, {
315
- readonly id: "bold-diagonal-cover";
316
- readonly scene: "editorial";
317
- readonly name: "Bold diagonal cover";
318
- }, {
319
- readonly id: "split-cover";
320
- readonly scene: "editorial";
321
- readonly name: "Diagonal split cover";
322
- }, {
323
- readonly id: "article-feed-card";
324
- readonly scene: "story";
325
- readonly name: "Article feed card";
326
- }, {
327
- readonly id: "article-summary-card";
328
- readonly scene: "editorial";
329
- readonly name: "Article summary card";
330
- }, {
331
- readonly id: "paragraph-summary-card";
332
- readonly scene: "quote";
333
- readonly name: "Paragraph summary card";
334
- }, {
335
- readonly id: "summary-card-stack";
336
- readonly scene: "editorial";
337
- readonly name: "Summary card stack";
338
- }, {
339
- readonly id: "article-repost-card";
340
- readonly scene: "editorial";
341
- readonly name: "Article repost card";
342
- }, {
343
- readonly id: "article-core-digest";
344
- readonly scene: "editorial";
345
- readonly name: "Article core digest";
346
- }, {
347
- readonly id: "product-thread-mockup";
348
- readonly scene: "story";
349
- readonly name: "Product thread mockup";
350
- }, {
351
- readonly id: "agent-notification";
352
- readonly scene: "launch";
353
- readonly name: "Agent notification card";
354
- }, {
355
- readonly id: "angled-ui-launch";
356
- readonly scene: "launch";
357
- readonly name: "Angled UI launch card";
358
- }, {
359
- readonly id: "repo-card";
360
- readonly scene: "product-showcase";
361
- readonly name: "Repository card";
362
- }, {
363
- readonly id: "magazine-pull-quote";
364
- readonly scene: "editorial-quote";
365
- readonly name: "Magazine pull quote card";
366
- }, {
367
- readonly id: "question-answer-quote";
368
- readonly scene: "quote";
369
- readonly name: "Question and answer quote card";
370
178
  }, {
371
179
  readonly id: "usage-breakdown";
372
180
  readonly scene: "usage-breakdown";