@contractspec/bundle.marketing 3.4.3 → 3.5.0

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.
@@ -0,0 +1,289 @@
1
+ /**
2
+ * Marketing bundle spec for landing, template gallery, and changelog surfaces.
3
+ * Uses @contractspec/lib.surface-runtime for adaptive, preference-driven layouts.
4
+ */
5
+
6
+ import { defineModuleBundle } from '@contractspec/lib.surface-runtime/spec';
7
+
8
+ export const MarketingBundle = defineModuleBundle({
9
+ meta: {
10
+ key: 'marketing.pages',
11
+ version: '0.1.0',
12
+ title: 'Marketing Pages',
13
+ description:
14
+ 'Adaptive surfaces for landing, template gallery, changelog, and product pages',
15
+ owners: ['team-platform'],
16
+ tags: ['marketing', 'landing', 'templates', 'changelog'],
17
+ stability: 'experimental',
18
+ },
19
+
20
+ routes: [
21
+ {
22
+ routeId: 'landing',
23
+ path: '/',
24
+ defaultSurface: 'landing',
25
+ },
26
+ {
27
+ routeId: 'product',
28
+ path: '/product',
29
+ defaultSurface: 'product',
30
+ },
31
+ {
32
+ routeId: 'templates',
33
+ path: '/templates',
34
+ defaultSurface: 'template-gallery',
35
+ },
36
+ {
37
+ routeId: 'changelog',
38
+ path: '/changelog',
39
+ defaultSurface: 'changelog',
40
+ },
41
+ {
42
+ routeId: 'contact',
43
+ path: '/contact',
44
+ defaultSurface: 'contact',
45
+ },
46
+ ],
47
+
48
+ surfaces: {
49
+ landing: {
50
+ surfaceId: 'landing',
51
+ kind: 'overview',
52
+ title: 'Landing Page',
53
+ slots: [
54
+ {
55
+ slotId: 'header',
56
+ role: 'header',
57
+ accepts: ['action-bar'],
58
+ cardinality: 'many',
59
+ },
60
+ {
61
+ slotId: 'primary',
62
+ role: 'primary',
63
+ accepts: ['entity-section', 'custom-widget'],
64
+ cardinality: 'many',
65
+ },
66
+ ],
67
+ layouts: [
68
+ {
69
+ layoutId: 'single-column',
70
+ title: 'Single column',
71
+ root: {
72
+ type: 'panel-group',
73
+ direction: 'vertical',
74
+ persistKey: 'marketing.landing',
75
+ children: [
76
+ { type: 'slot', slotId: 'header' },
77
+ { type: 'slot', slotId: 'primary' },
78
+ ],
79
+ },
80
+ },
81
+ ],
82
+ data: [],
83
+ verification: {
84
+ dimensions: {
85
+ guidance:
86
+ 'Can reveal product tour, feature highlights, and contextual CTAs.',
87
+ density:
88
+ 'Can select compact hero or detailed multi-section layouts.',
89
+ dataDepth: 'Controls section depth and inline expansion.',
90
+ control: 'Shows advanced navigation when allowed.',
91
+ media: 'Supports text-first, visual hero, and hybrid modes.',
92
+ pace: 'Maps to scroll and transition behavior.',
93
+ narrative:
94
+ 'Can order hero before or after problem/solution sections.',
95
+ },
96
+ },
97
+ },
98
+ 'template-gallery': {
99
+ surfaceId: 'template-gallery',
100
+ kind: 'list',
101
+ title: 'Template Gallery',
102
+ slots: [
103
+ {
104
+ slotId: 'header',
105
+ role: 'header',
106
+ accepts: ['action-bar'],
107
+ cardinality: 'many',
108
+ },
109
+ {
110
+ slotId: 'primary',
111
+ role: 'primary',
112
+ accepts: ['entity-section', 'table', 'custom-widget'],
113
+ cardinality: 'many',
114
+ },
115
+ ],
116
+ layouts: [
117
+ {
118
+ layoutId: 'gallery',
119
+ title: 'Gallery',
120
+ root: {
121
+ type: 'panel-group',
122
+ direction: 'vertical',
123
+ persistKey: 'marketing.templates',
124
+ children: [
125
+ { type: 'slot', slotId: 'header' },
126
+ { type: 'slot', slotId: 'primary' },
127
+ ],
128
+ },
129
+ },
130
+ ],
131
+ data: [],
132
+ verification: {
133
+ dimensions: {
134
+ guidance:
135
+ 'Can reveal template descriptions, filters, and preview hints.',
136
+ density:
137
+ 'Can select grid density (compact, standard, detailed cards).',
138
+ dataDepth: 'Controls template metadata and preview depth.',
139
+ control: 'Shows filters and sort when allowed.',
140
+ media: 'Supports card grid, list, and preview modes.',
141
+ pace: 'Maps to modal and transition behavior.',
142
+ narrative:
143
+ 'Can order featured templates before or after full list.',
144
+ },
145
+ },
146
+ },
147
+ changelog: {
148
+ surfaceId: 'changelog',
149
+ kind: 'timeline',
150
+ title: 'Changelog',
151
+ slots: [
152
+ {
153
+ slotId: 'header',
154
+ role: 'header',
155
+ accepts: ['action-bar'],
156
+ cardinality: 'many',
157
+ },
158
+ {
159
+ slotId: 'primary',
160
+ role: 'primary',
161
+ accepts: ['entity-section', 'timeline', 'custom-widget'],
162
+ cardinality: 'many',
163
+ },
164
+ ],
165
+ layouts: [
166
+ {
167
+ layoutId: 'timeline',
168
+ title: 'Timeline',
169
+ root: {
170
+ type: 'panel-group',
171
+ direction: 'vertical',
172
+ persistKey: 'marketing.changelog',
173
+ children: [
174
+ { type: 'slot', slotId: 'header' },
175
+ { type: 'slot', slotId: 'primary' },
176
+ ],
177
+ },
178
+ },
179
+ ],
180
+ data: [],
181
+ verification: {
182
+ dimensions: {
183
+ guidance: 'Can reveal version notes and migration hints.',
184
+ density: 'Can select compact or detailed changelog entries.',
185
+ dataDepth: 'Controls entry expansion and diff visibility.',
186
+ control: 'Shows filters and version navigation when allowed.',
187
+ media: 'Supports text-first and code-highlight modes.',
188
+ pace: 'Maps to scroll and expand behavior.',
189
+ narrative:
190
+ 'Can order newest-first or oldest-first chronology.',
191
+ },
192
+ },
193
+ },
194
+ product: {
195
+ surfaceId: 'product',
196
+ kind: 'overview',
197
+ title: 'Product Page',
198
+ slots: [
199
+ {
200
+ slotId: 'header',
201
+ role: 'header',
202
+ accepts: ['action-bar'],
203
+ cardinality: 'many',
204
+ },
205
+ {
206
+ slotId: 'primary',
207
+ role: 'primary',
208
+ accepts: ['entity-section', 'custom-widget'],
209
+ cardinality: 'many',
210
+ },
211
+ ],
212
+ layouts: [
213
+ {
214
+ layoutId: 'product-layout',
215
+ title: 'Product',
216
+ root: {
217
+ type: 'panel-group',
218
+ direction: 'vertical',
219
+ persistKey: 'marketing.product',
220
+ children: [
221
+ { type: 'slot', slotId: 'header' },
222
+ { type: 'slot', slotId: 'primary' },
223
+ ],
224
+ },
225
+ },
226
+ ],
227
+ data: [],
228
+ verification: {
229
+ dimensions: {
230
+ guidance: 'Can reveal product features and comparison hints.',
231
+ density: 'Can select compact or detailed product sections.',
232
+ dataDepth: 'Controls feature depth and comparison tables.',
233
+ control: 'Shows pricing and plan details when allowed.',
234
+ media: 'Supports text-first and visual feature modes.',
235
+ pace: 'Maps to section transitions.',
236
+ narrative:
237
+ 'Can order value prop before or after feature details.',
238
+ },
239
+ },
240
+ },
241
+ contact: {
242
+ surfaceId: 'contact',
243
+ kind: 'detail',
244
+ title: 'Contact',
245
+ slots: [
246
+ {
247
+ slotId: 'header',
248
+ role: 'header',
249
+ accepts: ['action-bar'],
250
+ cardinality: 'many',
251
+ },
252
+ {
253
+ slotId: 'primary',
254
+ role: 'primary',
255
+ accepts: ['form', 'entity-section', 'custom-widget'],
256
+ cardinality: 'many',
257
+ },
258
+ ],
259
+ layouts: [
260
+ {
261
+ layoutId: 'contact-layout',
262
+ title: 'Contact',
263
+ root: {
264
+ type: 'panel-group',
265
+ direction: 'vertical',
266
+ persistKey: 'marketing.contact',
267
+ children: [
268
+ { type: 'slot', slotId: 'header' },
269
+ { type: 'slot', slotId: 'primary' },
270
+ ],
271
+ },
272
+ },
273
+ ],
274
+ data: [],
275
+ verification: {
276
+ dimensions: {
277
+ guidance: 'Can reveal form hints and validation help.',
278
+ density: 'Can select compact or detailed form layout.',
279
+ dataDepth: 'Controls field visibility and validation depth.',
280
+ control: 'Shows additional contact options when allowed.',
281
+ media: 'Supports text-first form and hybrid modes.',
282
+ pace: 'Maps to validation and submit feedback.',
283
+ narrative:
284
+ 'Can order form before or after contact info.',
285
+ },
286
+ },
287
+ },
288
+ },
289
+ });
@@ -0,0 +1 @@
1
+ export { MarketingBundle } from './MarketingBundle';