@aglyn/aglyn 1.0.0-beta.277 → 1.0.0-beta.283

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 (95) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/account-preferences.d.ts +146 -11
  3. package/src/lib/app-utils/account-preferences.js +266 -18
  4. package/src/lib/app-utils/account-preferences.js.map +1 -1
  5. package/src/lib/app-utils/activity-presenter.js +2 -26
  6. package/src/lib/app-utils/activity-presenter.js.map +1 -1
  7. package/src/lib/app-utils/activity-type-labels.d.ts +18 -0
  8. package/src/lib/app-utils/activity-type-labels.js +46 -0
  9. package/src/lib/app-utils/activity-type-labels.js.map +1 -0
  10. package/src/lib/app-utils/artifact-provenance.d.ts +3 -1
  11. package/src/lib/app-utils/artifact-provenance.js.map +1 -1
  12. package/src/lib/app-utils/bundle-intent.d.ts +37 -0
  13. package/src/lib/app-utils/bundle-intent.js +47 -3
  14. package/src/lib/app-utils/bundle-intent.js.map +1 -1
  15. package/src/lib/app-utils/compose-reusable-components.d.ts +17 -1
  16. package/src/lib/app-utils/compose-reusable-components.js +80 -5
  17. package/src/lib/app-utils/compose-reusable-components.js.map +1 -1
  18. package/src/lib/app-utils/docs-help-sections.generated.js +13 -1
  19. package/src/lib/app-utils/docs-help-sections.generated.js.map +1 -1
  20. package/src/lib/app-utils/docs-help.generated.d.ts +23 -11
  21. package/src/lib/app-utils/docs-help.generated.js +64 -7
  22. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  23. package/src/lib/app-utils/docs-index.generated.js +359 -51
  24. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  25. package/src/lib/app-utils/error-beacon.d.ts +19 -0
  26. package/src/lib/app-utils/error-beacon.js +28 -0
  27. package/src/lib/app-utils/error-beacon.js.map +1 -1
  28. package/src/lib/app-utils/health-report.d.ts +3 -2
  29. package/src/lib/app-utils/health-report.js +22 -2
  30. package/src/lib/app-utils/health-report.js.map +1 -1
  31. package/src/lib/app-utils/native-nav.d.ts +39 -4
  32. package/src/lib/app-utils/native-nav.js +69 -3
  33. package/src/lib/app-utils/native-nav.js.map +1 -1
  34. package/src/lib/app-utils/native-themes.d.ts +28 -17
  35. package/src/lib/app-utils/native-themes.js +123 -45
  36. package/src/lib/app-utils/native-themes.js.map +1 -1
  37. package/src/lib/app-utils/operator-alerts.js +4 -2
  38. package/src/lib/app-utils/operator-alerts.js.map +1 -1
  39. package/src/lib/app-utils/org-permission-editor.d.ts +75 -0
  40. package/src/lib/app-utils/org-permission-editor.js +124 -0
  41. package/src/lib/app-utils/org-permission-editor.js.map +1 -0
  42. package/src/lib/app-utils/org-permissions.d.ts +36 -0
  43. package/src/lib/app-utils/org-permissions.js +78 -26
  44. package/src/lib/app-utils/org-permissions.js.map +1 -1
  45. package/src/lib/app-utils/org-role-grants.d.ts +59 -9
  46. package/src/lib/app-utils/org-role-grants.js +97 -10
  47. package/src/lib/app-utils/org-role-grants.js.map +1 -1
  48. package/src/lib/app-utils/plan-entitlements.d.ts +13 -0
  49. package/src/lib/app-utils/plan-entitlements.js +22 -0
  50. package/src/lib/app-utils/plan-entitlements.js.map +1 -1
  51. package/src/lib/app-utils/release-flags.d.ts +52 -1
  52. package/src/lib/app-utils/release-flags.js +68 -2
  53. package/src/lib/app-utils/release-flags.js.map +1 -1
  54. package/src/lib/app-utils/reusable-component-keys.d.ts +13 -0
  55. package/src/lib/app-utils/reusable-component-keys.js +12 -0
  56. package/src/lib/app-utils/reusable-component-keys.js.map +1 -1
  57. package/src/lib/app-utils/screen-analytics-aggregate.d.ts +34 -0
  58. package/src/lib/app-utils/screen-analytics-aggregate.js +37 -0
  59. package/src/lib/app-utils/screen-analytics-aggregate.js.map +1 -1
  60. package/src/lib/app-utils/site-care.d.ts +35 -0
  61. package/src/lib/app-utils/site-care.js +48 -0
  62. package/src/lib/app-utils/site-care.js.map +1 -1
  63. package/src/lib/app-utils/site-font-pairings.d.ts +59 -0
  64. package/src/lib/app-utils/site-font-pairings.js +514 -0
  65. package/src/lib/app-utils/site-font-pairings.js.map +1 -0
  66. package/src/lib/app-utils/site-starter.d.ts +136 -0
  67. package/src/lib/app-utils/site-starter.js +116 -0
  68. package/src/lib/app-utils/site-starter.js.map +1 -0
  69. package/src/lib/app-utils/stock-photos/stock-photo-picker-server.d.ts +95 -0
  70. package/src/lib/app-utils/stock-photos/stock-photo-picker-server.js +333 -0
  71. package/src/lib/app-utils/stock-photos/stock-photo-picker-server.js.map +1 -0
  72. package/src/lib/app-utils/stock-photos/stock-photo-picker.d.ts +188 -0
  73. package/src/lib/app-utils/stock-photos/stock-photo-picker.js +193 -0
  74. package/src/lib/app-utils/stock-photos/stock-photo-picker.js.map +1 -0
  75. package/src/lib/plugin-manager/feature-plugins.d.ts +32 -0
  76. package/src/lib/plugin-manager/feature-plugins.js +12 -0
  77. package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
  78. package/src/lib/plugin-manager/first-party-plugins.generated.js +27 -1
  79. package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
  80. package/src/lib/plugin-manager/plugin-entitlements.d.ts +37 -0
  81. package/src/lib/plugin-manager/plugin-entitlements.js +84 -2
  82. package/src/lib/plugin-manager/plugin-entitlements.js.map +1 -1
  83. package/src/lib/plugin-manager/plugin-media-ingest.d.ts +15 -0
  84. package/src/lib/plugin-manager/plugin-media-ingest.js.map +1 -1
  85. package/src/lib/plugin-manager/plugin-permissions.d.ts +7 -0
  86. package/src/lib/plugin-manager/plugin-permissions.js.map +1 -1
  87. package/src/lib/plugin-manager/plugin-product-catalog.d.ts +12 -0
  88. package/src/lib/plugin-manager/plugin-product-catalog.js.map +1 -1
  89. package/src/lib/plugin-manager/plugin-site-starters.d.ts +73 -0
  90. package/src/lib/plugin-manager/plugin-site-starters.js +30 -0
  91. package/src/lib/plugin-manager/plugin-site-starters.js.map +1 -0
  92. package/src/lib/plugin-manager/plugin-sitemap-sections.d.ts +8 -1
  93. package/src/lib/plugin-manager/plugin-sitemap-sections.js.map +1 -1
  94. package/src/lib/plugin-manager/stock-photo-provider.d.ts +12 -0
  95. package/src/lib/plugin-manager/stock-photo-provider.js.map +1 -1
@@ -0,0 +1,514 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /**
17
+ * The font pairings a site's look is chosen from (AGL-4049): a heading family
18
+ * over a body family, each with the weights it loads.
19
+ *
20
+ * The platform's, not one plugin's: the AI site start picks among them for a
21
+ * business's own look, and a site starter names the one it was designed in
22
+ * (`site-starter.ts`), so a starter and a generated site speak one list.
23
+ * Moved here from the AI plugin's `ai-site-kinds.ts`, which re-exports it
24
+ * under its old names.
25
+ *
26
+ * Pure data, safe for any surface to import.
27
+ */ /** A font pairing a look may choose: a heading family over a body family. */ /**
28
+ * The pairings, every family from the Google Fonts catalog the fonts plugin
29
+ * serves (`google-fonts.catalog.json`) and every weight one that family
30
+ * has — the AI plugin's `ai-site-look.spec.ts` holds both. The tenant loads
31
+ * them the way it loads the starter theme's family, so nothing here adds a
32
+ * font host.
33
+ */ export const SITE_FONT_PAIRINGS = [
34
+ {
35
+ id: 'jakarta',
36
+ feel: 'modern, friendly sans',
37
+ heading: {
38
+ family: 'Plus Jakarta Sans',
39
+ category: 'sans-serif',
40
+ weight: 800,
41
+ sub: 700
42
+ },
43
+ body: {
44
+ family: 'Plus Jakarta Sans',
45
+ category: 'sans-serif',
46
+ weights: [
47
+ 400,
48
+ 500,
49
+ 600,
50
+ 700
51
+ ]
52
+ },
53
+ tracking: -0.02
54
+ },
55
+ {
56
+ id: 'inter',
57
+ feel: 'neutral, precise sans',
58
+ heading: {
59
+ family: 'Inter',
60
+ category: 'sans-serif',
61
+ weight: 700,
62
+ sub: 600
63
+ },
64
+ body: {
65
+ family: 'Inter',
66
+ category: 'sans-serif',
67
+ weights: [
68
+ 400,
69
+ 500,
70
+ 600,
71
+ 700
72
+ ]
73
+ },
74
+ tracking: -0.025
75
+ },
76
+ {
77
+ id: 'grotesk',
78
+ feel: 'designer grotesk',
79
+ heading: {
80
+ family: 'Space Grotesk',
81
+ category: 'sans-serif',
82
+ weight: 600,
83
+ sub: 600
84
+ },
85
+ body: {
86
+ family: 'Inter',
87
+ category: 'sans-serif',
88
+ weights: [
89
+ 400,
90
+ 500,
91
+ 600,
92
+ 700
93
+ ]
94
+ },
95
+ tracking: -0.03
96
+ },
97
+ {
98
+ id: 'syne',
99
+ feel: 'expressive, art-school display',
100
+ heading: {
101
+ family: 'Syne',
102
+ category: 'sans-serif',
103
+ weight: 700,
104
+ sub: 600
105
+ },
106
+ body: {
107
+ family: 'Inter',
108
+ category: 'sans-serif',
109
+ weights: [
110
+ 400,
111
+ 500,
112
+ 600,
113
+ 700
114
+ ]
115
+ },
116
+ tracking: -0.02
117
+ },
118
+ {
119
+ id: 'bricolage',
120
+ feel: 'contemporary, characterful sans',
121
+ heading: {
122
+ family: 'Bricolage Grotesque',
123
+ category: 'sans-serif',
124
+ weight: 700,
125
+ sub: 600
126
+ },
127
+ body: {
128
+ family: 'DM Sans',
129
+ category: 'sans-serif',
130
+ weights: [
131
+ 400,
132
+ 500,
133
+ 600,
134
+ 700
135
+ ]
136
+ },
137
+ tracking: -0.025
138
+ },
139
+ {
140
+ id: 'editorial',
141
+ feel: 'editorial serif over clean sans',
142
+ heading: {
143
+ family: 'Playfair Display',
144
+ category: 'serif',
145
+ weight: 700,
146
+ sub: 600
147
+ },
148
+ body: {
149
+ family: 'Source Sans 3',
150
+ category: 'sans-serif',
151
+ weights: [
152
+ 400,
153
+ 500,
154
+ 600,
155
+ 700
156
+ ]
157
+ },
158
+ tracking: -0.01
159
+ },
160
+ {
161
+ id: 'fraunces',
162
+ feel: 'warm, soft serif',
163
+ heading: {
164
+ family: 'Fraunces',
165
+ category: 'serif',
166
+ weight: 600,
167
+ sub: 600
168
+ },
169
+ body: {
170
+ family: 'Inter',
171
+ category: 'sans-serif',
172
+ weights: [
173
+ 400,
174
+ 500,
175
+ 600,
176
+ 700
177
+ ]
178
+ },
179
+ tracking: -0.015
180
+ },
181
+ {
182
+ id: 'instrument',
183
+ feel: 'elegant, light serif headlines',
184
+ heading: {
185
+ family: 'Instrument Serif',
186
+ category: 'serif',
187
+ weight: 400,
188
+ sub: 400
189
+ },
190
+ body: {
191
+ family: 'Inter',
192
+ category: 'sans-serif',
193
+ weights: [
194
+ 400,
195
+ 500,
196
+ 600,
197
+ 700
198
+ ]
199
+ },
200
+ tracking: -0.01
201
+ },
202
+ {
203
+ id: 'reading',
204
+ feel: 'reading-first serif, serif body',
205
+ heading: {
206
+ family: 'Newsreader',
207
+ category: 'serif',
208
+ weight: 600,
209
+ sub: 600
210
+ },
211
+ body: {
212
+ family: 'Source Serif 4',
213
+ category: 'serif',
214
+ weights: [
215
+ 400,
216
+ 600,
217
+ 700
218
+ ]
219
+ },
220
+ tracking: -0.01
221
+ },
222
+ {
223
+ id: 'garamond',
224
+ feel: 'refined, classic serif',
225
+ heading: {
226
+ family: 'Cormorant Garamond',
227
+ category: 'serif',
228
+ weight: 600,
229
+ sub: 600
230
+ },
231
+ body: {
232
+ family: 'Montserrat',
233
+ category: 'sans-serif',
234
+ weights: [
235
+ 400,
236
+ 500,
237
+ 600,
238
+ 700
239
+ ]
240
+ }
241
+ },
242
+ {
243
+ id: 'baskerville',
244
+ feel: 'established, trustworthy serif',
245
+ heading: {
246
+ family: 'Libre Baskerville',
247
+ category: 'serif',
248
+ weight: 700,
249
+ sub: 700
250
+ },
251
+ body: {
252
+ family: 'Source Sans 3',
253
+ category: 'sans-serif',
254
+ weights: [
255
+ 400,
256
+ 500,
257
+ 600,
258
+ 700
259
+ ]
260
+ }
261
+ },
262
+ {
263
+ id: 'merriweather',
264
+ feel: 'sturdy, readable serif',
265
+ heading: {
266
+ family: 'Merriweather',
267
+ category: 'serif',
268
+ weight: 700,
269
+ sub: 700
270
+ },
271
+ body: {
272
+ family: 'Lato',
273
+ category: 'sans-serif',
274
+ weights: [
275
+ 400,
276
+ 700
277
+ ]
278
+ }
279
+ },
280
+ {
281
+ id: 'lora',
282
+ feel: 'gentle, calm serif',
283
+ heading: {
284
+ family: 'Lora',
285
+ category: 'serif',
286
+ weight: 600,
287
+ sub: 600
288
+ },
289
+ body: {
290
+ family: 'Open Sans',
291
+ category: 'sans-serif',
292
+ weights: [
293
+ 400,
294
+ 500,
295
+ 600,
296
+ 700
297
+ ]
298
+ }
299
+ },
300
+ {
301
+ id: 'dmserif',
302
+ feel: 'polished display serif',
303
+ heading: {
304
+ family: 'DM Serif Display',
305
+ category: 'serif',
306
+ weight: 400,
307
+ sub: 400
308
+ },
309
+ body: {
310
+ family: 'DM Sans',
311
+ category: 'sans-serif',
312
+ weights: [
313
+ 400,
314
+ 500,
315
+ 600,
316
+ 700
317
+ ]
318
+ }
319
+ },
320
+ {
321
+ id: 'oswald',
322
+ feel: 'bold, condensed, workmanlike',
323
+ heading: {
324
+ family: 'Oswald',
325
+ category: 'sans-serif',
326
+ weight: 600,
327
+ sub: 500
328
+ },
329
+ body: {
330
+ family: 'Roboto',
331
+ category: 'sans-serif',
332
+ weights: [
333
+ 400,
334
+ 500,
335
+ 700
336
+ ]
337
+ },
338
+ caps: true,
339
+ tracking: 0.01
340
+ },
341
+ {
342
+ id: 'archivo',
343
+ feel: 'heavy, high-impact sans',
344
+ heading: {
345
+ family: 'Archivo Black',
346
+ category: 'sans-serif',
347
+ weight: 400,
348
+ sub: 400
349
+ },
350
+ body: {
351
+ family: 'Archivo',
352
+ category: 'sans-serif',
353
+ weights: [
354
+ 400,
355
+ 500,
356
+ 600,
357
+ 700
358
+ ]
359
+ },
360
+ tracking: -0.01
361
+ },
362
+ {
363
+ id: 'barlow',
364
+ feel: 'athletic, condensed sans',
365
+ heading: {
366
+ family: 'Barlow Condensed',
367
+ category: 'sans-serif',
368
+ weight: 700,
369
+ sub: 600
370
+ },
371
+ body: {
372
+ family: 'Barlow',
373
+ category: 'sans-serif',
374
+ weights: [
375
+ 400,
376
+ 500,
377
+ 600,
378
+ 700
379
+ ]
380
+ },
381
+ caps: true,
382
+ tracking: 0.01
383
+ },
384
+ {
385
+ id: 'anton',
386
+ feel: 'loud poster display',
387
+ heading: {
388
+ family: 'Anton',
389
+ category: 'sans-serif',
390
+ weight: 400,
391
+ sub: 400
392
+ },
393
+ body: {
394
+ family: 'Inter',
395
+ category: 'sans-serif',
396
+ weights: [
397
+ 400,
398
+ 500,
399
+ 600,
400
+ 700
401
+ ]
402
+ },
403
+ caps: true,
404
+ tracking: 0.01
405
+ },
406
+ {
407
+ id: 'nunito',
408
+ feel: 'rounded, approachable sans',
409
+ heading: {
410
+ family: 'Nunito',
411
+ category: 'sans-serif',
412
+ weight: 800,
413
+ sub: 700
414
+ },
415
+ body: {
416
+ family: 'Nunito Sans',
417
+ category: 'sans-serif',
418
+ weights: [
419
+ 400,
420
+ 600,
421
+ 700
422
+ ]
423
+ }
424
+ },
425
+ {
426
+ id: 'quicksand',
427
+ feel: 'soft, airy rounded sans',
428
+ heading: {
429
+ family: 'Quicksand',
430
+ category: 'sans-serif',
431
+ weight: 700,
432
+ sub: 600
433
+ },
434
+ body: {
435
+ family: 'Nunito Sans',
436
+ category: 'sans-serif',
437
+ weights: [
438
+ 400,
439
+ 600,
440
+ 700
441
+ ]
442
+ }
443
+ },
444
+ {
445
+ id: 'manrope',
446
+ feel: 'crisp, confident sans',
447
+ heading: {
448
+ family: 'Manrope',
449
+ category: 'sans-serif',
450
+ weight: 800,
451
+ sub: 700
452
+ },
453
+ body: {
454
+ family: 'Manrope',
455
+ category: 'sans-serif',
456
+ weights: [
457
+ 400,
458
+ 500,
459
+ 600,
460
+ 700
461
+ ]
462
+ },
463
+ tracking: -0.02
464
+ },
465
+ {
466
+ id: 'outfit',
467
+ feel: 'geometric, upbeat sans',
468
+ heading: {
469
+ family: 'Outfit',
470
+ category: 'sans-serif',
471
+ weight: 700,
472
+ sub: 600
473
+ },
474
+ body: {
475
+ family: 'Outfit',
476
+ category: 'sans-serif',
477
+ weights: [
478
+ 400,
479
+ 500,
480
+ 600,
481
+ 700
482
+ ]
483
+ },
484
+ tracking: -0.02
485
+ },
486
+ {
487
+ id: 'plex',
488
+ feel: 'technical, engineered sans',
489
+ heading: {
490
+ family: 'IBM Plex Sans',
491
+ category: 'sans-serif',
492
+ weight: 600,
493
+ sub: 600
494
+ },
495
+ body: {
496
+ family: 'IBM Plex Sans',
497
+ category: 'sans-serif',
498
+ weights: [
499
+ 400,
500
+ 500,
501
+ 600,
502
+ 700
503
+ ]
504
+ },
505
+ tracking: -0.01
506
+ }
507
+ ];
508
+ /** A pairing by id, or `null`. */ export function siteFontPairing(id) {
509
+ var _SITE_FONT_PAIRINGS_find;
510
+ if (typeof id !== 'string' || !id) return null;
511
+ return (_SITE_FONT_PAIRINGS_find = SITE_FONT_PAIRINGS.find((pairing)=>pairing.id === id)) != null ? _SITE_FONT_PAIRINGS_find : null;
512
+ }
513
+
514
+ //# sourceMappingURL=site-font-pairings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/site-font-pairings.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The font pairings a site's look is chosen from (AGL-4049): a heading family\n * over a body family, each with the weights it loads.\n *\n * The platform's, not one plugin's: the AI site start picks among them for a\n * business's own look, and a site starter names the one it was designed in\n * (`site-starter.ts`), so a starter and a generated site speak one list.\n * Moved here from the AI plugin's `ai-site-kinds.ts`, which re-exports it\n * under its old names.\n *\n * Pure data, safe for any surface to import.\n */\n\n/** A font pairing a look may choose: a heading family over a body family. */\nexport interface SiteFontPairing {\n id: string\n /** What the pairing reads like, as the model is told. */\n feel: string\n heading: { family: string; category: 'sans-serif' | 'serif'; weight: number; sub: number }\n body: { family: string; category: 'sans-serif' | 'serif'; weights: number[] }\n /** Letter spacing the headings carry, in em. */\n tracking?: number\n /** Headings set in capitals: a condensed display face. */\n caps?: boolean\n}\n\n/**\n * The pairings, every family from the Google Fonts catalog the fonts plugin\n * serves (`google-fonts.catalog.json`) and every weight one that family\n * has — the AI plugin's `ai-site-look.spec.ts` holds both. The tenant loads\n * them the way it loads the starter theme's family, so nothing here adds a\n * font host.\n */\nexport const SITE_FONT_PAIRINGS: readonly SiteFontPairing[] = [\n { id: 'jakarta', feel: 'modern, friendly sans', heading: { family: 'Plus Jakarta Sans', category: 'sans-serif', weight: 800, sub: 700 }, body: { family: 'Plus Jakarta Sans', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.02 },\n { id: 'inter', feel: 'neutral, precise sans', heading: { family: 'Inter', category: 'sans-serif', weight: 700, sub: 600 }, body: { family: 'Inter', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.025 },\n { id: 'grotesk', feel: 'designer grotesk', heading: { family: 'Space Grotesk', category: 'sans-serif', weight: 600, sub: 600 }, body: { family: 'Inter', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.03 },\n { id: 'syne', feel: 'expressive, art-school display', heading: { family: 'Syne', category: 'sans-serif', weight: 700, sub: 600 }, body: { family: 'Inter', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.02 },\n { id: 'bricolage', feel: 'contemporary, characterful sans', heading: { family: 'Bricolage Grotesque', category: 'sans-serif', weight: 700, sub: 600 }, body: { family: 'DM Sans', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.025 },\n { id: 'editorial', feel: 'editorial serif over clean sans', heading: { family: 'Playfair Display', category: 'serif', weight: 700, sub: 600 }, body: { family: 'Source Sans 3', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.01 },\n { id: 'fraunces', feel: 'warm, soft serif', heading: { family: 'Fraunces', category: 'serif', weight: 600, sub: 600 }, body: { family: 'Inter', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.015 },\n { id: 'instrument', feel: 'elegant, light serif headlines', heading: { family: 'Instrument Serif', category: 'serif', weight: 400, sub: 400 }, body: { family: 'Inter', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.01 },\n { id: 'reading', feel: 'reading-first serif, serif body', heading: { family: 'Newsreader', category: 'serif', weight: 600, sub: 600 }, body: { family: 'Source Serif 4', category: 'serif', weights: [400, 600, 700] }, tracking: -0.01 },\n { id: 'garamond', feel: 'refined, classic serif', heading: { family: 'Cormorant Garamond', category: 'serif', weight: 600, sub: 600 }, body: { family: 'Montserrat', category: 'sans-serif', weights: [400, 500, 600, 700] } },\n { id: 'baskerville', feel: 'established, trustworthy serif', heading: { family: 'Libre Baskerville', category: 'serif', weight: 700, sub: 700 }, body: { family: 'Source Sans 3', category: 'sans-serif', weights: [400, 500, 600, 700] } },\n { id: 'merriweather', feel: 'sturdy, readable serif', heading: { family: 'Merriweather', category: 'serif', weight: 700, sub: 700 }, body: { family: 'Lato', category: 'sans-serif', weights: [400, 700] } },\n { id: 'lora', feel: 'gentle, calm serif', heading: { family: 'Lora', category: 'serif', weight: 600, sub: 600 }, body: { family: 'Open Sans', category: 'sans-serif', weights: [400, 500, 600, 700] } },\n { id: 'dmserif', feel: 'polished display serif', heading: { family: 'DM Serif Display', category: 'serif', weight: 400, sub: 400 }, body: { family: 'DM Sans', category: 'sans-serif', weights: [400, 500, 600, 700] } },\n { id: 'oswald', feel: 'bold, condensed, workmanlike', heading: { family: 'Oswald', category: 'sans-serif', weight: 600, sub: 500 }, body: { family: 'Roboto', category: 'sans-serif', weights: [400, 500, 700] }, caps: true, tracking: 0.01 },\n { id: 'archivo', feel: 'heavy, high-impact sans', heading: { family: 'Archivo Black', category: 'sans-serif', weight: 400, sub: 400 }, body: { family: 'Archivo', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.01 },\n { id: 'barlow', feel: 'athletic, condensed sans', heading: { family: 'Barlow Condensed', category: 'sans-serif', weight: 700, sub: 600 }, body: { family: 'Barlow', category: 'sans-serif', weights: [400, 500, 600, 700] }, caps: true, tracking: 0.01 },\n { id: 'anton', feel: 'loud poster display', heading: { family: 'Anton', category: 'sans-serif', weight: 400, sub: 400 }, body: { family: 'Inter', category: 'sans-serif', weights: [400, 500, 600, 700] }, caps: true, tracking: 0.01 },\n { id: 'nunito', feel: 'rounded, approachable sans', heading: { family: 'Nunito', category: 'sans-serif', weight: 800, sub: 700 }, body: { family: 'Nunito Sans', category: 'sans-serif', weights: [400, 600, 700] } },\n { id: 'quicksand', feel: 'soft, airy rounded sans', heading: { family: 'Quicksand', category: 'sans-serif', weight: 700, sub: 600 }, body: { family: 'Nunito Sans', category: 'sans-serif', weights: [400, 600, 700] } },\n { id: 'manrope', feel: 'crisp, confident sans', heading: { family: 'Manrope', category: 'sans-serif', weight: 800, sub: 700 }, body: { family: 'Manrope', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.02 },\n { id: 'outfit', feel: 'geometric, upbeat sans', heading: { family: 'Outfit', category: 'sans-serif', weight: 700, sub: 600 }, body: { family: 'Outfit', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.02 },\n { id: 'plex', feel: 'technical, engineered sans', heading: { family: 'IBM Plex Sans', category: 'sans-serif', weight: 600, sub: 600 }, body: { family: 'IBM Plex Sans', category: 'sans-serif', weights: [400, 500, 600, 700] }, tracking: -0.01 },\n\n]\n\n/** A pairing by id, or `null`. */\nexport function siteFontPairing(id: unknown): SiteFontPairing | null {\n if (typeof id !== 'string' || !id) return null\n return SITE_FONT_PAIRINGS.find((pairing) => pairing.id === id) ?? null\n}\n"],"names":["SITE_FONT_PAIRINGS","id","feel","heading","family","category","weight","sub","body","weights","tracking","caps","siteFontPairing","find","pairing"],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import type { HostTheme } from '@aglyn/shared-data-types';
18
+ /**
19
+ * Site starters (AGL-4049): a whole site a person picks before it exists,
20
+ * every one of them a listing anyone may publish and price, the platform's own
21
+ * included.
22
+ *
23
+ * This module is the vocabulary every reader of a starter shares: the artifact
24
+ * type it is listed under, the facets a search filters on (stamped on the
25
+ * listing as plain fields, so a query can match them), the payload a resolved
26
+ * starter hands the site it creates, and the one check that payload must pass.
27
+ * Who stores starters and how they are bought is the starter source's business
28
+ * (`plugin-manager/plugin-site-starters.ts`); nothing here reads or writes.
29
+ *
30
+ * Pure data and readers, safe for any surface to import.
31
+ */
32
+ /** The artifact type a site starter is listed and installed under (AGL-4049). */
33
+ export declare const SITE_STARTER_ARTIFACT_TYPE: "siteStarter";
34
+ /**
35
+ * How a starter fills the site it creates: `base` copies its pages as they
36
+ * are; `ai` hands them to the AI site start with the answers it asks for, so
37
+ * the pages are rewritten for the business.
38
+ */
39
+ export type SiteStarterMode = 'base' | 'ai';
40
+ /**
41
+ * The platform's built-in themes a site's look is layered on (AGL-3497,
42
+ * AGL-4049), by the short name of the themes plugin's preset id
43
+ * (`theme-presets.<name>`), and `starter`: the theme a new site is born with.
44
+ * A starter on a built-in theme names one of these; the AI site start picks
45
+ * among the same list.
46
+ */
47
+ export declare const SITE_THEME_BASES: readonly ["starter", "material-ui", "bootstrap", "minimal", "material3", "ant-design", "fluent", "carbon", "cupertino"];
48
+ export type SiteThemeBase = (typeof SITE_THEME_BASES)[number];
49
+ /** Whether a value names one of the {@link SITE_THEME_BASES}. */
50
+ export declare function isSiteThemeBase(value: unknown): value is SiteThemeBase;
51
+ /**
52
+ * A starter's theme (AGL-4049), one of two shapes: a built-in theme with the
53
+ * starter's brand colors and font pairing over it, which is how a person's own
54
+ * pick and edits are stored, or a full theme of its author's own.
55
+ */
56
+ export type SiteStarterTheme = {
57
+ kind: 'builtin';
58
+ /** One of the {@link SITE_THEME_BASES}. */
59
+ base: string;
60
+ /** Palette overrides by scheme, as the theme editor stores them. */
61
+ brand: {
62
+ light: Record<string, string>;
63
+ dark?: Record<string, string>;
64
+ };
65
+ /** A font pairing id (`site-font-pairings.ts`), or `null` for the base theme's own fonts. */
66
+ fonts: string | null;
67
+ } | {
68
+ kind: 'full';
69
+ theme: HostTheme;
70
+ };
71
+ /**
72
+ * What a starter search filters on (AGL-4049). `kind` is the kind of site it
73
+ * is, an id the core does not interpret (the AI plugin keeps the kinds),
74
+ * `base` a {@link SITE_THEME_BASES} name and `fonts` a font pairing id
75
+ * (`site-font-pairings.ts`), each `null` where the starter names none;
76
+ * `pages` is how many pages it creates.
77
+ */
78
+ export interface SiteStarterFacets {
79
+ kind: string | null;
80
+ base: string | null;
81
+ fonts: string | null;
82
+ pages: number;
83
+ mode: SiteStarterMode;
84
+ }
85
+ /** A person's pick: the listing, and the version when one is pinned. */
86
+ export interface SiteStarterChoice {
87
+ listingId: string;
88
+ version?: string;
89
+ }
90
+ /** What a resolved starter hands the site it creates (AGL-4049). */
91
+ export interface SiteStarterPayload {
92
+ mode: SiteStarterMode;
93
+ facets: SiteStarterFacets;
94
+ theme: SiteStarterTheme;
95
+ /**
96
+ * The starter's pages, each carrying its routing `slug` as a starter
97
+ * template's screens do: `'/'` is the home page, and a page without one is
98
+ * unpublished.
99
+ */
100
+ screens: unknown[];
101
+ /** The shared layout every page sits in: the header and footer. */
102
+ layout: unknown | null;
103
+ /** The questions an `ai` starter asks before the site job runs; required for `ai`. */
104
+ answers?: Record<string, unknown>;
105
+ }
106
+ /** The most pages one starter may create. */
107
+ export declare const SITE_STARTER_MAX_SCREENS = 25;
108
+ /**
109
+ * A listing's starter facets, read defensively from the fields
110
+ * {@link siteStarterFacetFields} stamps: a missing or malformed field reads as
111
+ * none, a page count as a whole number from zero, and a mode as `base` unless
112
+ * it says `ai`.
113
+ */
114
+ export declare function siteStarterFacetsOf(doc: Record<string, unknown>): SiteStarterFacets;
115
+ /** The listing fields a starter's publish stamps, the inverse of {@link siteStarterFacetsOf}. */
116
+ export declare function siteStarterFacetFields(facets: SiteStarterFacets): Record<string, unknown>;
117
+ /** Whether a starter's facets meet a filter: every facet the filter names, equal; an absent one, any. */
118
+ export declare function matchSiteStarterFacets(facets: SiteStarterFacets, filter: Partial<SiteStarterFacets>): boolean;
119
+ /**
120
+ * The ids a caller knows, by facet. `siteStarterRefusal` checks a kind, base
121
+ * or font pairing id only against the set its caller passes: the core keeps
122
+ * no list of kinds, and which bases and pairings are offered is the caller's
123
+ * to say (`new Set(SITE_THEME_BASES)`, the ids of `SITE_FONT_PAIRINGS`).
124
+ */
125
+ export interface SiteStarterKnownIds {
126
+ kinds?: ReadonlySet<string>;
127
+ bases?: ReadonlySet<string>;
128
+ fonts?: ReadonlySet<string>;
129
+ }
130
+ /**
131
+ * Why a starter's payload cannot start a site, in the words its author is
132
+ * told, or `null` when it can (AGL-4049). Checked when a starter is published
133
+ * and again when one is resolved, since a site is created from it with no
134
+ * step between to catch what is missing.
135
+ */
136
+ export declare function siteStarterRefusal(payload: SiteStarterPayload, known?: SiteStarterKnownIds): string | null;