create-ailk 0.30.0 → 0.31.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.
Files changed (67) hide show
  1. package/README.md +71 -3
  2. package/component-catalog.json +524 -8
  3. package/component-catalog.md +8 -5
  4. package/dist/cli.js +99 -0
  5. package/dist/cutover.d.ts +109 -0
  6. package/dist/cutover.js +494 -0
  7. package/dist/design-presets.js +20 -4
  8. package/dist/export-content.d.ts +55 -0
  9. package/dist/export-content.js +303 -0
  10. package/dist/inventory.d.ts +216 -0
  11. package/dist/inventory.js +833 -0
  12. package/dist/language-import.d.ts +114 -0
  13. package/dist/language-import.js +435 -0
  14. package/dist/lib/env-catalog.js +1 -1
  15. package/dist/lib/import-mdx.d.ts +38 -0
  16. package/dist/lib/import-mdx.js +411 -64
  17. package/dist/lib/render-comparison.d.ts +200 -0
  18. package/dist/lib/render-comparison.js +374 -0
  19. package/dist/migrate-content.d.ts +6 -2
  20. package/dist/migrate-content.js +60 -14
  21. package/dist/seed-workspace.d.ts +3 -1
  22. package/dist/seed-workspace.js +45 -16
  23. package/dist/topology.d.ts +12 -0
  24. package/dist/topology.js +24 -10
  25. package/package.json +3 -3
  26. package/templates/.claude/cloudparity-repo-hooks.json +5 -0
  27. package/templates/.claude/hooks/content-source-guard.sh +75 -0
  28. package/templates/.claude/settings.json +9 -0
  29. package/templates/.github/workflows/ci.yml +2 -0
  30. package/templates/CLAUDE.md +5 -0
  31. package/templates/apps/mcp/CLAUDE.md +8 -4
  32. package/templates/apps/web/.env.example +4 -2
  33. package/templates/apps/web/CLAUDE.md +16 -5
  34. package/templates/apps/web/app/[locale]/[slug]/[detail]/__tests__/page.test.tsx +153 -4
  35. package/templates/apps/web/app/[locale]/[slug]/[detail]/page.tsx +45 -2
  36. package/templates/apps/web/app/[locale]/contact/__tests__/site-contact-lines.test.ts +49 -0
  37. package/templates/apps/web/app/[locale]/contact/site-contact-lines.ts +6 -4
  38. package/templates/apps/web/app/[locale]/events/[slug]/page.tsx +13 -1
  39. package/templates/apps/web/app/[locale]/events/__tests__/program-event.test.tsx +120 -0
  40. package/templates/apps/web/app/[locale]/events/page.tsx +11 -0
  41. package/templates/apps/web/app/[locale]/flows/[slug]/FlowStepperClient.tsx +44 -5
  42. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.thanks-by-tier.test.tsx +306 -0
  43. package/templates/apps/web/app/[locale]/layout.tsx +122 -27
  44. package/templates/apps/web/app/[locale]/thanks/[slug]/__tests__/page.test.tsx +21 -2
  45. package/templates/apps/web/app/[locale]/thanks/[slug]/page.tsx +1 -0
  46. package/templates/apps/web/app/llms.txt/route.ts +16 -9
  47. package/templates/apps/web/app/sitemap.xml/route.ts +3 -0
  48. package/templates/apps/web/jest.config.cjs +46 -1
  49. package/templates/apps/web/lib/__tests__/bot-check.test.ts +247 -4
  50. package/templates/apps/web/lib/__tests__/in-page-magnet-self-request.test.ts +92 -0
  51. package/templates/apps/web/lib/__tests__/page-chrome.test.ts +90 -0
  52. package/templates/apps/web/lib/__tests__/relay.test.ts +33 -8
  53. package/templates/apps/web/lib/__tests__/site-identity-feature-list.test.ts +196 -0
  54. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +11 -1
  55. package/templates/apps/web/lib/bot-check.ts +113 -13
  56. package/templates/apps/web/lib/in-page-magnet.ts +4 -1
  57. package/templates/apps/web/lib/page-chrome.ts +65 -5
  58. package/templates/apps/web/lib/relay.ts +22 -3
  59. package/templates/apps/web/lib/site-identity.ts +75 -24
  60. package/templates/apps/web/messages/en.json +5 -1
  61. package/templates/apps/web/next.config.mjs +15 -1
  62. package/templates/apps/web/package.json +1 -1
  63. package/templates/apps/web/scripts/assert-content-bundled.ts +36 -8
  64. package/templates/apps/web/scripts/content-snapshot.ts +33 -0
  65. package/templates/package.json +2 -1
  66. package/templates/tools/check-content-source.ts +108 -0
  67. package/versions.json +48 -48
@@ -9,7 +9,7 @@
9
9
  "importPath": "@working-theory/ui/sections",
10
10
  "rootBarrel": "@working-theory/ui",
11
11
  "sourceRoot": "packages/ui/src/sections",
12
- "count": 57
12
+ "count": 60
13
13
  },
14
14
  {
15
15
  "name": "blocks",
@@ -133,6 +133,17 @@
133
133
  }
134
134
  ],
135
135
  "components": [
136
+ {
137
+ "name": "AddToCalendar",
138
+ "tier": "sections",
139
+ "sourcePath": "packages/ui/src/sections/AddToCalendar.tsx",
140
+ "importPath": "@working-theory/ui/sections",
141
+ "exported": true,
142
+ "description": "An Event page's \"Add to calendar\" control. A Server Component of three plain links built by `eventCalendarLinks` in `@working-theory/schema`: Google Calendar and Outlook open in a new tab; Apple Calendar downloads the `.ics`. Rendered directly by `renderPage` for every Event page with a start date (the `BlogPost` precedent of a section a caller renders with typed props), never authored in `sections[]`.",
143
+ "descriptionSource": "doc-comment",
144
+ "descriptionGrade": "strong",
145
+ "sectionType": null
146
+ },
136
147
  {
137
148
  "name": "AlertSection",
138
149
  "tier": "sections",
@@ -474,6 +485,17 @@
474
485
  "descriptionGrade": "strong",
475
486
  "sectionType": null
476
487
  },
488
+ {
489
+ "name": "HeroTypedHeadline",
490
+ "tier": "sections",
491
+ "sourcePath": "packages/ui/src/sections/HeroTypedHeadline.tsx",
492
+ "importPath": "@working-theory/ui/sections",
493
+ "exported": false,
494
+ "description": "The centred Hero's `typing` opt-in. The headline, then each subheadline sentence, types on its own line with a caret: solid while letters appear, blinking at every pause and after the last line. THE FULL TEXT IS ALWAYS IN THE DOM: each row renders its typed part and its untyped rest, and only the split point moves.",
495
+ "descriptionSource": "doc-comment",
496
+ "descriptionGrade": "strong",
497
+ "sectionType": null
498
+ },
477
499
  {
478
500
  "name": "Items",
479
501
  "tier": "sections",
@@ -584,6 +606,17 @@
584
606
  "descriptionGrade": "strong",
585
607
  "sectionType": "pricing"
586
608
  },
609
+ {
610
+ "name": "ProjectListings",
611
+ "tier": "sections",
612
+ "sourcePath": "packages/ui/src/sections/ProjectListings.tsx",
613
+ "importPath": "@working-theory/ui/sections",
614
+ "exported": false,
615
+ "description": "The site's public project listings — each a name linking to /projects/<slug>, newest decided first, at most `limit` (default 6), no logos. Use it on the home to show what the site lists; the rows are filled at render from the site's public project listings, never authored, and with none (or the API unreachable) the section is removed from the page. Author only the eyebrow, headline, description and `limit`.",
616
+ "descriptionSource": "registry",
617
+ "descriptionGrade": "strong",
618
+ "sectionType": "project-listings"
619
+ },
587
620
  {
588
621
  "name": "ReportHeader",
589
622
  "tier": "sections",
@@ -3934,6 +3967,10 @@
3934
3967
  "headline": {
3935
3968
  "type": "string"
3936
3969
  },
3970
+ "headlineHref": {
3971
+ "type": "string",
3972
+ "minLength": 1
3973
+ },
3937
3974
  "description": {
3938
3975
  "type": "string"
3939
3976
  },
@@ -4227,6 +4264,10 @@
4227
4264
  "headline": {
4228
4265
  "type": "string"
4229
4266
  },
4267
+ "headlineHref": {
4268
+ "type": "string",
4269
+ "minLength": 1
4270
+ },
4230
4271
  "description": {
4231
4272
  "type": "string"
4232
4273
  },
@@ -4460,6 +4501,10 @@
4460
4501
  "headline": {
4461
4502
  "type": "string"
4462
4503
  },
4504
+ "headlineHref": {
4505
+ "type": "string",
4506
+ "minLength": 1
4507
+ },
4463
4508
  "description": {
4464
4509
  "type": "string"
4465
4510
  },
@@ -4748,6 +4793,37 @@
4748
4793
  "chips"
4749
4794
  ]
4750
4795
  },
4796
+ "newsletter": {
4797
+ "type": "object",
4798
+ "properties": {
4799
+ "action": {
4800
+ "type": "string",
4801
+ "minLength": 1
4802
+ },
4803
+ "placeholder": {
4804
+ "type": "string"
4805
+ },
4806
+ "submitLabel": {
4807
+ "type": "string",
4808
+ "minLength": 1
4809
+ },
4810
+ "siteId": {
4811
+ "type": "string",
4812
+ "minLength": 1,
4813
+ "maxLength": 128,
4814
+ "pattern": "^[a-zA-Z0-9._-]+$"
4815
+ },
4816
+ "source": {
4817
+ "type": "string",
4818
+ "minLength": 1,
4819
+ "maxLength": 64
4820
+ }
4821
+ },
4822
+ "required": [
4823
+ "action",
4824
+ "submitLabel"
4825
+ ]
4826
+ },
4751
4827
  "fill": {
4752
4828
  "type": "string",
4753
4829
  "enum": [
@@ -4906,6 +4982,43 @@
4906
4982
  }
4907
4983
  },
4908
4984
  "additionalProperties": false
4985
+ },
4986
+ "typing": {
4987
+ "type": "object",
4988
+ "properties": {
4989
+ "startDelayMs": {
4990
+ "type": "integer",
4991
+ "minimum": 0,
4992
+ "maximum": 10000
4993
+ },
4994
+ "pauseMs": {
4995
+ "type": "integer",
4996
+ "minimum": 0,
4997
+ "maximum": 10000
4998
+ },
4999
+ "typeMs": {
5000
+ "type": "integer",
5001
+ "minimum": 20,
5002
+ "maximum": 500
5003
+ },
5004
+ "caretWidth": {
5005
+ "type": "string",
5006
+ "enum": [
5007
+ "hairline",
5008
+ "medium",
5009
+ "wide"
5010
+ ]
5011
+ },
5012
+ "caretColor": {
5013
+ "type": "string",
5014
+ "enum": [
5015
+ "fg",
5016
+ "brand",
5017
+ "accent"
5018
+ ]
5019
+ }
5020
+ },
5021
+ "additionalProperties": false
4909
5022
  }
4910
5023
  },
4911
5024
  "required": [
@@ -4923,7 +5036,8 @@
4923
5036
  "gapBelow",
4924
5037
  "measure",
4925
5038
  "ctaSize",
4926
- "fill"
5039
+ "fill",
5040
+ "typing"
4927
5041
  ]
4928
5042
  },
4929
5043
  {
@@ -4950,6 +5064,10 @@
4950
5064
  "headline": {
4951
5065
  "type": "string"
4952
5066
  },
5067
+ "headlineHref": {
5068
+ "type": "string",
5069
+ "minLength": 1
5070
+ },
4953
5071
  "description": {
4954
5072
  "type": "string"
4955
5073
  },
@@ -5150,6 +5268,19 @@
5150
5268
  "link",
5151
5269
  "destructive"
5152
5270
  ]
5271
+ },
5272
+ "icon": {
5273
+ "type": "string",
5274
+ "enum": [
5275
+ "github",
5276
+ "arrow-right",
5277
+ "external-link",
5278
+ "download",
5279
+ "calendar",
5280
+ "mail",
5281
+ "book-open",
5282
+ "play"
5283
+ ]
5153
5284
  }
5154
5285
  },
5155
5286
  "required": [
@@ -5215,7 +5346,8 @@
5215
5346
  "minimal",
5216
5347
  "tile",
5217
5348
  "tiles",
5218
- "list"
5349
+ "list",
5350
+ "numeral"
5219
5351
  ]
5220
5352
  },
5221
5353
  "tileHover": {
@@ -5238,6 +5370,10 @@
5238
5370
  "headline": {
5239
5371
  "type": "string"
5240
5372
  },
5373
+ "headlineHref": {
5374
+ "type": "string",
5375
+ "minLength": 1
5376
+ },
5241
5377
  "description": {
5242
5378
  "type": "string"
5243
5379
  },
@@ -5285,6 +5421,11 @@
5285
5421
  "eyebrow": {
5286
5422
  "type": "string"
5287
5423
  },
5424
+ "numeral": {
5425
+ "type": "string",
5426
+ "minLength": 1,
5427
+ "maxLength": 12
5428
+ },
5288
5429
  "title": {
5289
5430
  "type": "string"
5290
5431
  },
@@ -5483,6 +5624,60 @@
5483
5624
  "countText"
5484
5625
  ],
5485
5626
  "additionalProperties": false
5627
+ },
5628
+ "actions": {
5629
+ "minItems": 1,
5630
+ "maxItems": 2,
5631
+ "type": "array",
5632
+ "items": {
5633
+ "type": "object",
5634
+ "properties": {
5635
+ "kind": {
5636
+ "type": "string",
5637
+ "enum": [
5638
+ "link",
5639
+ "button"
5640
+ ]
5641
+ },
5642
+ "label": {
5643
+ "type": "string"
5644
+ },
5645
+ "href": {
5646
+ "type": "string"
5647
+ },
5648
+ "external": {
5649
+ "type": "boolean"
5650
+ },
5651
+ "variant": {
5652
+ "type": "string",
5653
+ "enum": [
5654
+ "default",
5655
+ "outline",
5656
+ "ghost",
5657
+ "link",
5658
+ "destructive"
5659
+ ]
5660
+ },
5661
+ "icon": {
5662
+ "type": "string",
5663
+ "enum": [
5664
+ "github",
5665
+ "arrow-right",
5666
+ "external-link",
5667
+ "download",
5668
+ "calendar",
5669
+ "mail",
5670
+ "book-open",
5671
+ "play"
5672
+ ]
5673
+ }
5674
+ },
5675
+ "required": [
5676
+ "kind",
5677
+ "label",
5678
+ "href"
5679
+ ]
5680
+ }
5486
5681
  }
5487
5682
  },
5488
5683
  "required": [
@@ -5528,6 +5723,10 @@
5528
5723
  "headline": {
5529
5724
  "type": "string"
5530
5725
  },
5726
+ "headlineHref": {
5727
+ "type": "string",
5728
+ "minLength": 1
5729
+ },
5531
5730
  "subtitle": {
5532
5731
  "type": "string"
5533
5732
  },
@@ -5609,6 +5808,15 @@
5609
5808
  "above"
5610
5809
  ]
5611
5810
  },
5811
+ "mediaWidth": {
5812
+ "type": "string",
5813
+ "enum": [
5814
+ "full",
5815
+ "sm",
5816
+ "md",
5817
+ "lg"
5818
+ ]
5819
+ },
5612
5820
  "cta": {
5613
5821
  "type": "object",
5614
5822
  "properties": {
@@ -5731,6 +5939,7 @@
5731
5939
  "look": [
5732
5940
  "variant",
5733
5941
  "mediaPosition",
5942
+ "mediaWidth",
5734
5943
  "accentStyle",
5735
5944
  "glow",
5736
5945
  "surface",
@@ -5751,6 +5960,10 @@
5751
5960
  "headline": {
5752
5961
  "type": "string"
5753
5962
  },
5963
+ "headlineHref": {
5964
+ "type": "string",
5965
+ "minLength": 1
5966
+ },
5754
5967
  "eyebrow": {
5755
5968
  "type": "string"
5756
5969
  },
@@ -5913,6 +6126,10 @@
5913
6126
  "headline": {
5914
6127
  "type": "string"
5915
6128
  },
6129
+ "headlineHref": {
6130
+ "type": "string",
6131
+ "minLength": 1
6132
+ },
5916
6133
  "description": {
5917
6134
  "type": "string"
5918
6135
  },
@@ -5961,6 +6178,19 @@
5961
6178
  "link",
5962
6179
  "destructive"
5963
6180
  ]
6181
+ },
6182
+ "icon": {
6183
+ "type": "string",
6184
+ "enum": [
6185
+ "github",
6186
+ "arrow-right",
6187
+ "external-link",
6188
+ "download",
6189
+ "calendar",
6190
+ "mail",
6191
+ "book-open",
6192
+ "play"
6193
+ ]
5964
6194
  }
5965
6195
  },
5966
6196
  "required": [
@@ -6090,6 +6320,21 @@
6090
6320
  "start",
6091
6321
  "center"
6092
6322
  ]
6323
+ },
6324
+ "tags": {
6325
+ "maxItems": 20,
6326
+ "type": "array",
6327
+ "items": {
6328
+ "type": "string",
6329
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,63}$"
6330
+ }
6331
+ },
6332
+ "pinned": {
6333
+ "maxItems": 100,
6334
+ "type": "array",
6335
+ "items": {
6336
+ "type": "string"
6337
+ }
6093
6338
  }
6094
6339
  }
6095
6340
  },
@@ -6122,6 +6367,10 @@
6122
6367
  "headline": {
6123
6368
  "type": "string"
6124
6369
  },
6370
+ "headlineHref": {
6371
+ "type": "string",
6372
+ "minLength": 1
6373
+ },
6125
6374
  "description": {
6126
6375
  "type": "string"
6127
6376
  },
@@ -6155,6 +6404,19 @@
6155
6404
  "link",
6156
6405
  "destructive"
6157
6406
  ]
6407
+ },
6408
+ "icon": {
6409
+ "type": "string",
6410
+ "enum": [
6411
+ "github",
6412
+ "arrow-right",
6413
+ "external-link",
6414
+ "download",
6415
+ "calendar",
6416
+ "mail",
6417
+ "book-open",
6418
+ "play"
6419
+ ]
6158
6420
  }
6159
6421
  },
6160
6422
  "required": [
@@ -6259,6 +6521,10 @@
6259
6521
  "headline": {
6260
6522
  "type": "string"
6261
6523
  },
6524
+ "headlineHref": {
6525
+ "type": "string",
6526
+ "minLength": 1
6527
+ },
6262
6528
  "leadQuote": {
6263
6529
  "type": "object",
6264
6530
  "properties": {
@@ -6498,6 +6764,10 @@
6498
6764
  "headline": {
6499
6765
  "type": "string"
6500
6766
  },
6767
+ "headlineHref": {
6768
+ "type": "string",
6769
+ "minLength": 1
6770
+ },
6501
6771
  "separation": {
6502
6772
  "type": "string",
6503
6773
  "enum": [
@@ -6629,6 +6899,10 @@
6629
6899
  "headline": {
6630
6900
  "type": "string"
6631
6901
  },
6902
+ "headlineHref": {
6903
+ "type": "string",
6904
+ "minLength": 1
6905
+ },
6632
6906
  "separation": {
6633
6907
  "type": "string",
6634
6908
  "enum": [
@@ -6770,6 +7044,10 @@
6770
7044
  "headline": {
6771
7045
  "type": "string"
6772
7046
  },
7047
+ "headlineHref": {
7048
+ "type": "string",
7049
+ "minLength": 1
7050
+ },
6773
7051
  "description": {
6774
7052
  "type": "string"
6775
7053
  },
@@ -7423,6 +7701,10 @@
7423
7701
  "headline": {
7424
7702
  "type": "string"
7425
7703
  },
7704
+ "headlineHref": {
7705
+ "type": "string",
7706
+ "minLength": 1
7707
+ },
7426
7708
  "description": {
7427
7709
  "type": "string"
7428
7710
  },
@@ -7583,6 +7865,10 @@
7583
7865
  "headline": {
7584
7866
  "type": "string"
7585
7867
  },
7868
+ "headlineHref": {
7869
+ "type": "string",
7870
+ "minLength": 1
7871
+ },
7586
7872
  "headlineStyle": {
7587
7873
  "type": "string",
7588
7874
  "enum": [
@@ -7689,6 +7975,19 @@
7689
7975
  "link",
7690
7976
  "destructive"
7691
7977
  ]
7978
+ },
7979
+ "icon": {
7980
+ "type": "string",
7981
+ "enum": [
7982
+ "github",
7983
+ "arrow-right",
7984
+ "external-link",
7985
+ "download",
7986
+ "calendar",
7987
+ "mail",
7988
+ "book-open",
7989
+ "play"
7990
+ ]
7692
7991
  }
7693
7992
  },
7694
7993
  "required": [
@@ -7778,6 +8077,10 @@
7778
8077
  "headline": {
7779
8078
  "type": "string"
7780
8079
  },
8080
+ "headlineHref": {
8081
+ "type": "string",
8082
+ "minLength": 1
8083
+ },
7781
8084
  "description": {
7782
8085
  "type": "string"
7783
8086
  },
@@ -7950,6 +8253,10 @@
7950
8253
  "headline": {
7951
8254
  "type": "string"
7952
8255
  },
8256
+ "headlineHref": {
8257
+ "type": "string",
8258
+ "minLength": 1
8259
+ },
7953
8260
  "description": {
7954
8261
  "type": "string"
7955
8262
  },
@@ -8079,6 +8386,10 @@
8079
8386
  "headline": {
8080
8387
  "type": "string"
8081
8388
  },
8389
+ "headlineHref": {
8390
+ "type": "string",
8391
+ "minLength": 1
8392
+ },
8082
8393
  "description": {
8083
8394
  "type": "string"
8084
8395
  },
@@ -8157,6 +8468,10 @@
8157
8468
  "headline": {
8158
8469
  "type": "string"
8159
8470
  },
8471
+ "headlineHref": {
8472
+ "type": "string",
8473
+ "minLength": 1
8474
+ },
8160
8475
  "description": {
8161
8476
  "type": "string"
8162
8477
  },
@@ -8718,6 +9033,10 @@
8718
9033
  "headline": {
8719
9034
  "type": "string"
8720
9035
  },
9036
+ "headlineHref": {
9037
+ "type": "string",
9038
+ "minLength": 1
9039
+ },
8721
9040
  "description": {
8722
9041
  "type": "string"
8723
9042
  },
@@ -8841,6 +9160,10 @@
8841
9160
  "headline": {
8842
9161
  "type": "string"
8843
9162
  },
9163
+ "headlineHref": {
9164
+ "type": "string",
9165
+ "minLength": 1
9166
+ },
8844
9167
  "description": {
8845
9168
  "type": "string"
8846
9169
  },
@@ -8973,6 +9296,10 @@
8973
9296
  "headline": {
8974
9297
  "type": "string"
8975
9298
  },
9299
+ "headlineHref": {
9300
+ "type": "string",
9301
+ "minLength": 1
9302
+ },
8976
9303
  "description": {
8977
9304
  "type": "string"
8978
9305
  },
@@ -9179,6 +9506,19 @@
9179
9506
  "link",
9180
9507
  "destructive"
9181
9508
  ]
9509
+ },
9510
+ "icon": {
9511
+ "type": "string",
9512
+ "enum": [
9513
+ "github",
9514
+ "arrow-right",
9515
+ "external-link",
9516
+ "download",
9517
+ "calendar",
9518
+ "mail",
9519
+ "book-open",
9520
+ "play"
9521
+ ]
9182
9522
  }
9183
9523
  },
9184
9524
  "required": [
@@ -9227,6 +9567,10 @@
9227
9567
  "headline": {
9228
9568
  "type": "string"
9229
9569
  },
9570
+ "headlineHref": {
9571
+ "type": "string",
9572
+ "minLength": 1
9573
+ },
9230
9574
  "description": {
9231
9575
  "type": "string"
9232
9576
  },
@@ -9432,6 +9776,10 @@
9432
9776
  "headline": {
9433
9777
  "type": "string"
9434
9778
  },
9779
+ "headlineHref": {
9780
+ "type": "string",
9781
+ "minLength": 1
9782
+ },
9435
9783
  "description": {
9436
9784
  "type": "string"
9437
9785
  },
@@ -9627,6 +9975,10 @@
9627
9975
  "headline": {
9628
9976
  "type": "string"
9629
9977
  },
9978
+ "headlineHref": {
9979
+ "type": "string",
9980
+ "minLength": 1
9981
+ },
9630
9982
  "description": {
9631
9983
  "type": "string"
9632
9984
  },
@@ -9698,6 +10050,10 @@
9698
10050
  "headline": {
9699
10051
  "type": "string"
9700
10052
  },
10053
+ "headlineHref": {
10054
+ "type": "string",
10055
+ "minLength": 1
10056
+ },
9701
10057
  "description": {
9702
10058
  "type": "string"
9703
10059
  },
@@ -9710,6 +10066,10 @@
9710
10066
  "action": {
9711
10067
  "type": "string"
9712
10068
  },
10069
+ "magnet": {
10070
+ "type": "string",
10071
+ "const": "newsletter"
10072
+ },
9713
10073
  "siteId": {
9714
10074
  "type": "string",
9715
10075
  "minLength": 1,
@@ -9797,10 +10157,7 @@
9797
10157
  "successMessage": {
9798
10158
  "type": "string"
9799
10159
  }
9800
- },
9801
- "required": [
9802
- "action"
9803
- ]
10160
+ }
9804
10161
  },
9805
10162
  "schemaError": null,
9806
10163
  "look": [
@@ -9819,6 +10176,10 @@
9819
10176
  "headline": {
9820
10177
  "type": "string"
9821
10178
  },
10179
+ "headlineHref": {
10180
+ "type": "string",
10181
+ "minLength": 1
10182
+ },
9822
10183
  "description": {
9823
10184
  "type": "string"
9824
10185
  },
@@ -9854,6 +10215,21 @@
9854
10215
  "list",
9855
10216
  "columns"
9856
10217
  ]
10218
+ },
10219
+ "tags": {
10220
+ "maxItems": 20,
10221
+ "type": "array",
10222
+ "items": {
10223
+ "type": "string",
10224
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,63}$"
10225
+ }
10226
+ },
10227
+ "pinned": {
10228
+ "maxItems": 200,
10229
+ "type": "array",
10230
+ "items": {
10231
+ "type": "string"
10232
+ }
9857
10233
  }
9858
10234
  },
9859
10235
  "required": [
@@ -10421,6 +10797,10 @@
10421
10797
  "headline": {
10422
10798
  "type": "string"
10423
10799
  },
10800
+ "headlineHref": {
10801
+ "type": "string",
10802
+ "minLength": 1
10803
+ },
10424
10804
  "description": {
10425
10805
  "type": "string"
10426
10806
  },
@@ -10454,6 +10834,19 @@
10454
10834
  "link",
10455
10835
  "destructive"
10456
10836
  ]
10837
+ },
10838
+ "icon": {
10839
+ "type": "string",
10840
+ "enum": [
10841
+ "github",
10842
+ "arrow-right",
10843
+ "external-link",
10844
+ "download",
10845
+ "calendar",
10846
+ "mail",
10847
+ "book-open",
10848
+ "play"
10849
+ ]
10457
10850
  }
10458
10851
  },
10459
10852
  "required": [
@@ -10706,6 +11099,21 @@
10706
11099
  "default",
10707
11100
  "strong"
10708
11101
  ]
11102
+ },
11103
+ "tags": {
11104
+ "maxItems": 20,
11105
+ "type": "array",
11106
+ "items": {
11107
+ "type": "string",
11108
+ "pattern": "^[A-Za-z0-9][A-Za-z0-9_.:/-]{0,63}$"
11109
+ }
11110
+ },
11111
+ "pinned": {
11112
+ "maxItems": 1,
11113
+ "type": "array",
11114
+ "items": {
11115
+ "type": "string"
11116
+ }
10709
11117
  }
10710
11118
  },
10711
11119
  "required": [
@@ -10808,6 +11216,10 @@
10808
11216
  "headline": {
10809
11217
  "type": "string"
10810
11218
  },
11219
+ "headlineHref": {
11220
+ "type": "string",
11221
+ "minLength": 1
11222
+ },
10811
11223
  "description": {
10812
11224
  "type": "string"
10813
11225
  },
@@ -10939,6 +11351,10 @@
10939
11351
  "headline": {
10940
11352
  "type": "string"
10941
11353
  },
11354
+ "headlineHref": {
11355
+ "type": "string",
11356
+ "minLength": 1
11357
+ },
10942
11358
  "description": {
10943
11359
  "type": "string"
10944
11360
  },
@@ -11222,6 +11638,10 @@
11222
11638
  "headline": {
11223
11639
  "type": "string"
11224
11640
  },
11641
+ "headlineHref": {
11642
+ "type": "string",
11643
+ "minLength": 1
11644
+ },
11225
11645
  "description": {
11226
11646
  "type": "string"
11227
11647
  },
@@ -11277,6 +11697,10 @@
11277
11697
  "headline": {
11278
11698
  "type": "string"
11279
11699
  },
11700
+ "headlineHref": {
11701
+ "type": "string",
11702
+ "minLength": 1
11703
+ },
11280
11704
  "description": {
11281
11705
  "type": "string"
11282
11706
  },
@@ -11351,6 +11775,19 @@
11351
11775
  "link",
11352
11776
  "destructive"
11353
11777
  ]
11778
+ },
11779
+ "icon": {
11780
+ "type": "string",
11781
+ "enum": [
11782
+ "github",
11783
+ "arrow-right",
11784
+ "external-link",
11785
+ "download",
11786
+ "calendar",
11787
+ "mail",
11788
+ "book-open",
11789
+ "play"
11790
+ ]
11354
11791
  }
11355
11792
  },
11356
11793
  "required": [
@@ -11621,6 +12058,10 @@
11621
12058
  "headline": {
11622
12059
  "type": "string"
11623
12060
  },
12061
+ "headlineHref": {
12062
+ "type": "string",
12063
+ "minLength": 1
12064
+ },
11624
12065
  "src": {
11625
12066
  "type": "string",
11626
12067
  "minLength": 1
@@ -11765,6 +12206,10 @@
11765
12206
  "headline": {
11766
12207
  "type": "string"
11767
12208
  },
12209
+ "headlineHref": {
12210
+ "type": "string",
12211
+ "minLength": 1
12212
+ },
11768
12213
  "description": {
11769
12214
  "type": "string"
11770
12215
  },
@@ -11858,6 +12303,72 @@
11858
12303
  "surface"
11859
12304
  ]
11860
12305
  },
12306
+ {
12307
+ "type": "project-listings",
12308
+ "component": "ProjectListings",
12309
+ "whenToUse": "The site's public project listings — each a name linking to /projects/<slug>, newest decided first, at most `limit` (default 6), no logos. Use it on the home to show what the site lists; the rows are filled at render from the site's public project listings, never authored, and with none (or the API unreachable) the section is removed from the page. Author only the eyebrow, headline, description and `limit`. Not for logos — that is `logoCloud`.",
12310
+ "schema": {
12311
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
12312
+ "type": "object",
12313
+ "properties": {
12314
+ "eyebrow": {
12315
+ "type": "string"
12316
+ },
12317
+ "headline": {
12318
+ "type": "string"
12319
+ },
12320
+ "headlineHref": {
12321
+ "type": "string",
12322
+ "minLength": 1
12323
+ },
12324
+ "description": {
12325
+ "type": "string"
12326
+ },
12327
+ "limit": {
12328
+ "type": "integer",
12329
+ "minimum": 1,
12330
+ "maximum": 24
12331
+ },
12332
+ "entries": {
12333
+ "maxItems": 24,
12334
+ "type": "array",
12335
+ "items": {
12336
+ "type": "object",
12337
+ "properties": {
12338
+ "name": {
12339
+ "type": "string",
12340
+ "minLength": 1
12341
+ },
12342
+ "href": {
12343
+ "type": "string",
12344
+ "minLength": 1
12345
+ }
12346
+ },
12347
+ "required": [
12348
+ "name",
12349
+ "href"
12350
+ ]
12351
+ }
12352
+ },
12353
+ "surface": {
12354
+ "type": "string",
12355
+ "enum": [
12356
+ "none",
12357
+ "gray-100",
12358
+ "wash",
12359
+ "wash-secondary",
12360
+ "gradient-brand",
12361
+ "gradient-dark",
12362
+ "solid-dark"
12363
+ ]
12364
+ }
12365
+ }
12366
+ },
12367
+ "schemaError": null,
12368
+ "look": [
12369
+ "surface"
12370
+ ]
12371
+ },
11861
12372
  {
11862
12373
  "type": "booker",
11863
12374
  "component": "Booker",
@@ -13355,7 +13866,7 @@
13355
13866
  },
13356
13867
  {
13357
13868
  "name": "spacing",
13358
- "leafCount": 15,
13869
+ "leafCount": 16,
13359
13870
  "leaves": [
13360
13871
  {
13361
13872
  "path": "spacing.controlX",
@@ -13412,6 +13923,11 @@
13412
13923
  "type": "string",
13413
13924
  "value": "calc(2 * (var(--control-height-big) + var(--spacing-block-tight)))"
13414
13925
  },
13926
+ {
13927
+ "path": "spacing.heroMark",
13928
+ "type": "string",
13929
+ "value": "var(--spacing-block-loose)"
13930
+ },
13415
13931
  {
13416
13932
  "path": "spacing.paragraph",
13417
13933
  "type": "string",