create-cogenta 0.5.3 → 0.7.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 (178) hide show
  1. package/dist/blueprint-defaults.js +1 -1
  2. package/dist/blueprint-defaults.js.map +1 -1
  3. package/dist/blueprints/registry.d.ts +13 -1
  4. package/dist/blueprints/registry.d.ts.map +1 -1
  5. package/dist/blueprints/registry.js +23 -5
  6. package/dist/blueprints/registry.js.map +1 -1
  7. package/dist/index.d.ts +3 -3
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +2 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/playground-reset.js +2 -2
  12. package/dist/playground-reset.js.map +1 -1
  13. package/dist/recap.js +1 -1
  14. package/dist/recap.js.map +1 -1
  15. package/dist/scaffold.d.ts +5 -3
  16. package/dist/scaffold.d.ts.map +1 -1
  17. package/dist/scaffold.js +20 -13
  18. package/dist/scaffold.js.map +1 -1
  19. package/dist/types.d.ts.map +1 -1
  20. package/dist/types.js +2 -1
  21. package/dist/types.js.map +1 -1
  22. package/dist/wizard.js +1 -1
  23. package/dist/wizard.js.map +1 -1
  24. package/package.json +14 -13
  25. package/dist/blueprints/assets/photos/association/community-cleanup.jpg +0 -0
  26. package/dist/blueprints/assets/photos/association/fundraising-dinner.jpg +0 -0
  27. package/dist/blueprints/assets/photos/association/garden-planting.jpg +0 -0
  28. package/dist/blueprints/assets/photos/association/harvest-food-drive.jpg +0 -0
  29. package/dist/blueprints/assets/photos/association/hero.jpg +0 -0
  30. package/dist/blueprints/assets/photos/association/volunteer-orientation.jpg +0 -0
  31. package/dist/blueprints/assets/photos/association/winter-coat-collection.jpg +0 -0
  32. package/dist/blueprints/assets/photos/blog/blog-runs-itself.jpg +0 -0
  33. package/dist/blueprints/assets/photos/blog/desk-setup.jpg +0 -0
  34. package/dist/blueprints/assets/photos/blog/editing.jpg +0 -0
  35. package/dist/blueprints/assets/photos/blog/hero.jpg +0 -0
  36. package/dist/blueprints/assets/photos/blog/notebooks.jpg +0 -0
  37. package/dist/blueprints/assets/photos/blog/plain-text-editor.jpg +0 -0
  38. package/dist/blueprints/assets/photos/blog/reading-nonfiction.jpg +0 -0
  39. package/dist/blueprints/assets/photos/blog/small-tool.jpg +0 -0
  40. package/dist/blueprints/assets/photos/blog/writing-schedule.jpg +0 -0
  41. package/dist/blueprints/assets/photos/magazine/business-2.jpg +0 -0
  42. package/dist/blueprints/assets/photos/magazine/business-3.jpg +0 -0
  43. package/dist/blueprints/assets/photos/magazine/business.jpg +0 -0
  44. package/dist/blueprints/assets/photos/magazine/culture-2.jpg +0 -0
  45. package/dist/blueprints/assets/photos/magazine/culture-3.jpg +0 -0
  46. package/dist/blueprints/assets/photos/magazine/culture.jpg +0 -0
  47. package/dist/blueprints/assets/photos/magazine/news-2.jpg +0 -0
  48. package/dist/blueprints/assets/photos/magazine/news-3.jpg +0 -0
  49. package/dist/blueprints/assets/photos/magazine/news.jpg +0 -0
  50. package/dist/blueprints/assets/photos/magazine/opinion-2.jpg +0 -0
  51. package/dist/blueprints/assets/photos/magazine/opinion-3.jpg +0 -0
  52. package/dist/blueprints/assets/photos/magazine/opinion.jpg +0 -0
  53. package/dist/blueprints/assets/photos/portfolio/adatum-publishing.jpg +0 -0
  54. package/dist/blueprints/assets/photos/portfolio/contoso-mobile-app.jpg +0 -0
  55. package/dist/blueprints/assets/photos/portfolio/fabrikam-annual-report.jpg +0 -0
  56. package/dist/blueprints/assets/photos/portfolio/hero.jpg +0 -0
  57. package/dist/blueprints/assets/photos/portfolio/litware-signage.jpg +0 -0
  58. package/dist/blueprints/assets/photos/portfolio/northwind-rebrand.jpg +0 -0
  59. package/dist/blueprints/assets/photos/portfolio/proseware-launch.jpg +0 -0
  60. package/dist/blueprints/assets/photos/portfolio/tailspin-streaming.jpg +0 -0
  61. package/dist/blueprints/assets/photos/portfolio/wingtip-wayfinding.jpg +0 -0
  62. package/dist/blueprints/assets/photos/restaurant/charred-octopus.jpg +0 -0
  63. package/dist/blueprints/assets/photos/restaurant/chocolate-tart.jpg +0 -0
  64. package/dist/blueprints/assets/photos/restaurant/creme-brulee.jpg +0 -0
  65. package/dist/blueprints/assets/photos/restaurant/hero.jpg +0 -0
  66. package/dist/blueprints/assets/photos/restaurant/house-red.jpg +0 -0
  67. package/dist/blueprints/assets/photos/restaurant/house-white.jpg +0 -0
  68. package/dist/blueprints/assets/photos/restaurant/pan-seared-trout.jpg +0 -0
  69. package/dist/blueprints/assets/photos/restaurant/poached-pear.jpg +0 -0
  70. package/dist/blueprints/assets/photos/restaurant/roasted-beet-salad.jpg +0 -0
  71. package/dist/blueprints/assets/photos/restaurant/slow-roast-duck-leg.jpg +0 -0
  72. package/dist/blueprints/assets/photos/restaurant/soup-of-the-day.jpg +0 -0
  73. package/dist/blueprints/assets/photos/restaurant/sparkling-water.jpg +0 -0
  74. package/dist/blueprints/assets/photos/restaurant/wild-mushroom-risotto.jpg +0 -0
  75. package/dist/blueprints/assets/photos/saas/avatar-1.jpg +0 -0
  76. package/dist/blueprints/assets/photos/saas/hero.jpg +0 -0
  77. package/dist/blueprints/assets/photos/store/camp-blanket.jpg +0 -0
  78. package/dist/blueprints/assets/photos/store/canvas-tote.jpg +0 -0
  79. package/dist/blueprints/assets/photos/store/cast-iron-skillet.jpg +0 -0
  80. package/dist/blueprints/assets/photos/store/ceramic-pour-over-set.jpg +0 -0
  81. package/dist/blueprints/assets/photos/store/enamel-mug.jpg +0 -0
  82. package/dist/blueprints/assets/photos/store/everyday-tee.jpg +0 -0
  83. package/dist/blueprints/assets/photos/store/field-jacket.jpg +0 -0
  84. package/dist/blueprints/assets/photos/store/hero.jpg +0 -0
  85. package/dist/blueprints/assets/photos/store/leather-card-holder.jpg +0 -0
  86. package/dist/blueprints/assets/photos/store/linen-table-runner.jpg +0 -0
  87. package/dist/blueprints/assets/photos/store/trail-tote.jpg +0 -0
  88. package/dist/blueprints/assets/photos/store/wool-beanie.jpg +0 -0
  89. package/dist/blueprints/assets/photos/store/wool-overshirt.jpg +0 -0
  90. package/dist/blueprints/assets/photos/vitrine/avatar-1.jpg +0 -0
  91. package/dist/blueprints/assets/photos/vitrine/avatar-2.jpg +0 -0
  92. package/dist/blueprints/assets/photos/vitrine/avatar-3.jpg +0 -0
  93. package/dist/blueprints/assets/photos/vitrine/dashboard.jpg +0 -0
  94. package/dist/blueprints/assets/photos/vitrine/hero.jpg +0 -0
  95. package/dist/blueprints/association.d.ts +0 -151
  96. package/dist/blueprints/association.d.ts.map +0 -1
  97. package/dist/blueprints/association.js +0 -732
  98. package/dist/blueprints/association.js.map +0 -1
  99. package/dist/blueprints/blog.d.ts +0 -198
  100. package/dist/blueprints/blog.d.ts.map +0 -1
  101. package/dist/blueprints/blog.js +0 -665
  102. package/dist/blueprints/blog.js.map +0 -1
  103. package/dist/blueprints/content-pack.d.ts +0 -143
  104. package/dist/blueprints/content-pack.d.ts.map +0 -1
  105. package/dist/blueprints/content-pack.js +0 -111
  106. package/dist/blueprints/content-pack.js.map +0 -1
  107. package/dist/blueprints/content-packs.d.ts +0 -11
  108. package/dist/blueprints/content-packs.d.ts.map +0 -1
  109. package/dist/blueprints/content-packs.js +0 -29
  110. package/dist/blueprints/content-packs.js.map +0 -1
  111. package/dist/blueprints/demo-media.d.ts +0 -39
  112. package/dist/blueprints/demo-media.d.ts.map +0 -1
  113. package/dist/blueprints/demo-media.js +0 -30
  114. package/dist/blueprints/demo-media.js.map +0 -1
  115. package/dist/blueprints/documentation.d.ts +0 -134
  116. package/dist/blueprints/documentation.d.ts.map +0 -1
  117. package/dist/blueprints/documentation.js +0 -678
  118. package/dist/blueprints/documentation.js.map +0 -1
  119. package/dist/blueprints/magazine.d.ts +0 -145
  120. package/dist/blueprints/magazine.d.ts.map +0 -1
  121. package/dist/blueprints/magazine.js +0 -543
  122. package/dist/blueprints/magazine.js.map +0 -1
  123. package/dist/blueprints/menus.d.ts +0 -25
  124. package/dist/blueprints/menus.d.ts.map +0 -1
  125. package/dist/blueprints/menus.js +0 -33
  126. package/dist/blueprints/menus.js.map +0 -1
  127. package/dist/blueprints/photo-assets.d.ts +0 -3
  128. package/dist/blueprints/photo-assets.d.ts.map +0 -1
  129. package/dist/blueprints/photo-assets.js +0 -33
  130. package/dist/blueprints/photo-assets.js.map +0 -1
  131. package/dist/blueprints/portfolio.d.ts +0 -141
  132. package/dist/blueprints/portfolio.d.ts.map +0 -1
  133. package/dist/blueprints/portfolio.js +0 -700
  134. package/dist/blueprints/portfolio.js.map +0 -1
  135. package/dist/blueprints/restaurant.d.ts +0 -124
  136. package/dist/blueprints/restaurant.d.ts.map +0 -1
  137. package/dist/blueprints/restaurant.js +0 -457
  138. package/dist/blueprints/restaurant.js.map +0 -1
  139. package/dist/blueprints/saas.d.ts +0 -133
  140. package/dist/blueprints/saas.d.ts.map +0 -1
  141. package/dist/blueprints/saas.js +0 -551
  142. package/dist/blueprints/saas.js.map +0 -1
  143. package/dist/blueprints/site-settings-seed.d.ts +0 -17
  144. package/dist/blueprints/site-settings-seed.d.ts.map +0 -1
  145. package/dist/blueprints/site-settings-seed.js +0 -45
  146. package/dist/blueprints/site-settings-seed.js.map +0 -1
  147. package/dist/blueprints/starting-skins.d.ts +0 -19
  148. package/dist/blueprints/starting-skins.d.ts.map +0 -1
  149. package/dist/blueprints/starting-skins.js +0 -301
  150. package/dist/blueprints/starting-skins.js.map +0 -1
  151. package/dist/blueprints/store.d.ts +0 -173
  152. package/dist/blueprints/store.d.ts.map +0 -1
  153. package/dist/blueprints/store.js +0 -643
  154. package/dist/blueprints/store.js.map +0 -1
  155. package/dist/blueprints/vitrine.d.ts +0 -178
  156. package/dist/blueprints/vitrine.d.ts.map +0 -1
  157. package/dist/blueprints/vitrine.js +0 -529
  158. package/dist/blueprints/vitrine.js.map +0 -1
  159. package/dist/demo-art/compositions.d.ts +0 -48
  160. package/dist/demo-art/compositions.d.ts.map +0 -1
  161. package/dist/demo-art/compositions.js +0 -690
  162. package/dist/demo-art/compositions.js.map +0 -1
  163. package/dist/demo-art/index.d.ts +0 -8
  164. package/dist/demo-art/index.d.ts.map +0 -1
  165. package/dist/demo-art/index.js +0 -5
  166. package/dist/demo-art/index.js.map +0 -1
  167. package/dist/demo-art/oklch.d.ts +0 -39
  168. package/dist/demo-art/oklch.d.ts.map +0 -1
  169. package/dist/demo-art/oklch.js +0 -79
  170. package/dist/demo-art/oklch.js.map +0 -1
  171. package/dist/demo-art/png.d.ts +0 -24
  172. package/dist/demo-art/png.d.ts.map +0 -1
  173. package/dist/demo-art/png.js +0 -110
  174. package/dist/demo-art/png.js.map +0 -1
  175. package/dist/demo-art/render.d.ts +0 -228
  176. package/dist/demo-art/render.d.ts.map +0 -1
  177. package/dist/demo-art/render.js +0 -478
  178. package/dist/demo-art/render.js.map +0 -1
@@ -1,543 +0,0 @@
1
- import { CogentaError } from '@cogenta/core';
2
- import { createContentStore, defineCollection, f, validateCollectionSet, } from '@cogenta/schema';
3
- import { avatarArt, coverArt, heroArt, logoArt } from '../demo-art/compositions.js';
4
- import { definePageCollection, SEO_FIELDS, toBlockZoneEntry, } from './content-pack.js';
5
- import { STARTING_SKINS } from './starting-skins.js';
6
- /**
7
- * The `magazine` blueprint's content model (L9 task 8, richened for the L25
8
- * pro pass, D4).
9
- *
10
- * Editorial content grouped into sections — one collection (`article`), one
11
- * grouping field (`section`) — rather than a separate taxonomy on top of it
12
- * (`blog` already covers "posts plus a real category taxonomy"; a
13
- * magazine's twist is section-grouped editorial, not a second
14
- * classification system). `section` stays a plain `f.select`, deliberately
15
- * **not** a taxonomy: `@cogenta/theme-magazine`'s `collectionList` cards read
16
- * it as a raw entry field (`entrySection`, `render/blocks/collection-list.
17
- * ts`) so a rubric label shows on a card with no resolve step a theme's
18
- * synchronous `renderBlock` has no way to perform — a taxonomy relation
19
- * would store a term id there instead of a readable label. The one place
20
- * this loses out on is the article page's own `renderEntryHeader` eyebrow
21
- * (contract D `theme@1.4`'s `PageEntryMeta.terms` only resolves *taxonomy*
22
- * classifications, never an arbitrary `select` field) — a known,
23
- * deliberate trade-off, not an oversight; see the theme's own report.
24
- */
25
- export const article = defineCollection({
26
- name: 'article',
27
- labels: { singular: 'Article', plural: 'Articles' },
28
- routing: { pattern: '/articles/:slug' },
29
- fields: {
30
- title: f.text({ required: true, max: 200 }),
31
- slug: f.slug({ from: 'title', unique: true }),
32
- excerpt: f.text({ max: 300, multiline: true }),
33
- section: f.select({
34
- options: ['News', 'Culture', 'Opinion', 'Business'],
35
- required: true,
36
- }),
37
- // L25 D4: a cover image, read both by `entryImage` (`@cogenta/theme-kit`,
38
- // for every card and the entry header's cover) and directly by name
39
- // (`coverImage`) when a block needs the raw id, e.g. the hero on `home`.
40
- coverImage: f.media({ accept: ['image'] }),
41
- // Declared (`blog.ts`'s own `post` does the same, for the same reason)
42
- // so `createContentStore`'s own publish-time default (`store.ts`: only
43
- // set when the collection declares this field) actually fires — without
44
- // it the article page's `renderEntryHeader` meta line silently drops the
45
- // date, confirmed live against a real scaffolded site.
46
- publishedAt: f.datetime(),
47
- body: f.blocks({ required: true }),
48
- ...SEO_FIELDS,
49
- },
50
- indexes: [['slug'], ['section']],
51
- permissions: {
52
- read: ['public'],
53
- create: ['editor', 'admin'],
54
- update: ['editor', 'admin'],
55
- delete: ['admin'],
56
- publish: ['admin'],
57
- },
58
- });
59
- export const page = definePageCollection('/:slug');
60
- export const MAGAZINE_COLLECTIONS = [article, page];
61
- validateCollectionSet(MAGAZINE_COLLECTIONS);
62
- const BLOCK_VERSION = '1.0.0';
63
- let paragraphKey = 0;
64
- function proseParagraph(text) {
65
- paragraphKey += 1;
66
- const key = `demo-p-${paragraphKey}`;
67
- return {
68
- _key: key,
69
- _type: 'prose',
70
- _version: BLOCK_VERSION,
71
- body: [
72
- {
73
- _key: `${key}-block`,
74
- _type: 'block',
75
- style: 'normal',
76
- children: [{ _key: `${key}-span`, _type: 'span', text, marks: [] }],
77
- markDefs: [],
78
- },
79
- ],
80
- };
81
- }
82
- /**
83
- * Twelve articles across the four sections — credible headlines and copy, no
84
- * lorem ipsum. Ordered newest first within the array (the seed order also
85
- * drives `createdAt`, which is what every `collectionList` on `home` sorts
86
- * by), so `MAGAZINE_DEMO_ARTICLES[0]` is deliberately the strongest headline
87
- * — it becomes both the hero's lead story and the "Top stories" lead card.
88
- */
89
- export const MAGAZINE_DEMO_ARTICLES = [
90
- {
91
- title: 'City council approves the transit line after a decade of delay',
92
- slug: 'transit-line-approved-after-a-decade',
93
- excerpt: 'The vote was 6-3. Construction starts next spring, on a route that has changed four times since it was first proposed.',
94
- section: 'News',
95
- body: [
96
- proseParagraph('The council chamber was fuller than usual on Tuesday night, and for once the crowd was not there to complain about parking. After ten years of studies, redrawn routes and two cancelled funding rounds, the transit line finally has a start date.'),
97
- proseParagraph('Residents along the corridor have heard this before. A 2019 version of the plan died in committee; a 2021 version lost its federal match. What changed this time, according to two council members who spoke on background, was less about the merits of the route and more about a construction firm willing to fix the price for five years.'),
98
- proseParagraph("The three no votes came from the same three council members who blocked the 2021 attempt, all citing the same worry: a fixed-price contract protects the budget but locks the city into a single contractor with no real competition once ground is broken. The city's own transportation office estimates the corridor will lose roughly forty parking spaces to construction staging by next summer, with a phased schedule meant to keep at least one traffic lane open in each direction for the length of the project."),
99
- proseParagraph('For the businesses along the route, the news landed as a mix of relief and dread. Rosa Delgado, who has run the hardware store on the corner of 4th and Vine for eleven years, said she remembers the first version of the plan well enough to have kept the original public notice taped inside a drawer. "I\'ll believe the ribbon-cutting when I\'m standing at it," she said, "but at least now there\'s a date to not believe."'),
100
- proseParagraph('Construction is scheduled to begin in April, with the first phase — utility relocation along the northern half of the corridor — expected to run through the following winter. City engineers say the line itself will not carry passengers until at least 2029, a timeline three council members quietly noted is already three years behind the one voters were shown in 2019.'),
101
- ],
102
- },
103
- {
104
- title: 'What the census numbers actually say about who is leaving',
105
- slug: 'census-numbers-who-is-leaving',
106
- excerpt: 'Not the story the headlines told. A closer read of who moved out this year, and why.',
107
- section: 'News',
108
- body: [
109
- proseParagraph('The easy version of this story is that young families are fleeing for cheaper suburbs. The numbers, read closely, tell a stranger and more specific story: it is renters in their sixties, not families with children, who left in the largest numbers this year.'),
110
- proseParagraph("The city's own planning department pulled the figures from the latest American Community Survey release and cross-referenced them against utility hookups, the more reliable of the two datasets for tracking actual moves rather than mailing-address changes. Of the roughly 2,400 households that left the city core between the two survey years, just under a third were headed by someone sixty or older — nearly double their share of the overall population."),
111
- proseParagraph('Grace Tanaka, a demographer at the regional planning council who reviewed the numbers at The Ledger\'s request, said the pattern tracks with something planners have quietly worried about for years: older renters priced out not by rising rents alone, but by buildings converting from long-term rental to short-term and corporate leasing. "The families-fleeing-to-suburbs story is real somewhere," she said. "It just isn\'t the dominant story here, and chasing it means missing the one that is."'),
112
- proseParagraph("None of the three council members who cited affordability in this week's transit vote (see above) mentioned the renter numbers specifically, though two have co-sponsored a tenant-protection ordinance aimed at buildings converting out of long-term rental — a bill that has sat in committee since March."),
113
- ],
114
- },
115
- {
116
- title: 'A new season, a new lineup at the community radio station',
117
- slug: 'new-season-new-lineup',
118
- excerpt: 'Three shows are gone, four are new, and the overnight slot finally has a host again.',
119
- section: 'News',
120
- body: [
121
- proseParagraph('For the first time since the pandemic, the overnight slot at WKLR-LP has a name attached to it. Marcus Webb, a night-shift nurse who has been filling in unannounced for two years whenever the automated playlist glitched, was offered the 1 a.m. to 5 a.m. slot on a real schedule this month — four hours a week, unpaid like every other slot at the station, but his.'),
122
- proseParagraph('The overnight assignment is the smallest change in a season that is otherwise dropping three long-running shows: the Tuesday jazz hour, a decade-old classic-rock request line, and a call-in sports show that station manager Priya Anand said had not taken a caller in eleven months. "We kept it on the schedule out of loyalty to the host," Anand said, "and loyalty does not pay for the transmitter."'),
123
- proseParagraph("In their place: a Spanish-language news roundup produced by two students from the community college's journalism program, a Thursday slot dedicated entirely to local bands who send in their own recordings, an hour of first-generation-immigrant oral histories, and Webb's overnight shift, which he plans to fill mostly with the vinyl collection a retired DJ donated to the station in 2019 that nobody has had time to catalogue since."),
124
- proseParagraph('The station, which broadcasts from a converted storage room above the community center, runs on a budget just under forty thousand dollars a year, most of it from a single annual pledge drive. Anand said the new lineup was built around one rule: no show gets a slot unless at least one other volunteer is trained to cover it. "We lost two shows the hard way, when the only person who knew how to run them left town," she said. "This season we\'re not doing that again."'),
125
- ],
126
- },
127
- {
128
- title: 'Three exhibitions worth the trip this month',
129
- slug: 'three-exhibitions-worth-the-trip',
130
- excerpt: 'A short, opinionated guide to what is actually showing right now, not what opened six months ago.',
131
- section: 'Culture',
132
- body: [
133
- proseParagraph("At the university gallery, a retrospective of the printmaker Odette Marchetti closes at the end of the month, and it is worth crossing town for even if her name means nothing to you. The show's strongest room is its smallest: eleven studies she made in the final year of her life, hung at the height she worked at them — in a wheelchair, after a stroke took the use of her right hand."),
134
- proseParagraph("Downtown, the photography co-op's group show on the old textile mills is less polished but more urgent — a dozen photographers, most of them under thirty, documenting buildings the city has scheduled for demolition next spring. Half the images are already the only record of interiors that no longer exist; the mill on Canal Street burned in an unrelated fire three weeks after it was photographed for the show."),
135
- proseParagraph('The third recommendation is the one most people will skip: a single-room installation at the small nonprofit space behind the co-op grocery, built entirely from donated household objects and sound recordings collected from residents of the senior living complex two blocks over. It runs only on weekends, carries no wall text beyond a hand-lettered sign at the door, and is the most quietly devastating thing on this list.'),
136
- proseParagraph("All three shows are free. None of them will still be up by the time next month's issue comes out, which is, as it happens, the whole point of this column existing."),
137
- ],
138
- },
139
- {
140
- title: 'The archive nobody asked to save survived anyway',
141
- slug: 'the-archive-nobody-asked-to-save',
142
- excerpt: 'A retired projectionist kept forty years of programme notes in his garage. Now a university wants them.',
143
- section: 'Culture',
144
- body: [
145
- proseParagraph('For four decades, every film that played at the old downtown cinema got a single typed page: title, date, a line or two of notes for whoever ran the projector next. Nobody thought to ask what would happen to them.'),
146
- proseParagraph("Frank Delury kept the pages anyway. When the cinema closed in 2003, he asked the owner if he could take the filing cabinet home rather than see it go to the dumpster behind the building; the owner, mid-argument with the landlord over a security deposit, said sure, take whatever you want. The cabinet has sat in the same corner of Delury's garage for twenty-one years."),
147
- proseParagraph('“Nobody writes down the failures,” said film archivist Teodora Vukić, who spent three weekends this spring cataloguing the collection. What makes it unusual, she said, is not the notes on the films everyone remembers — those exist in plenty of other archives — but the notes on the ones that flopped, ran two nights, and vanished from every other record. “He accidentally wrote down forty years of them.”'),
148
- proseParagraph('The university library has offered to digitize and house the full collection, with Delury retaining the physical originals for his lifetime. He set one condition, which the library agreed to without much debate: the finding aid has to list every projectionist by name, not just every film.'),
149
- ],
150
- },
151
- {
152
- title: 'Why local theatre is having its best year in a decade',
153
- slug: 'local-theatre-best-year-in-a-decade',
154
- excerpt: 'Three companies that nearly folded in the same year are now turning away ticket buyers.',
155
- section: 'Culture',
156
- body: [
157
- proseParagraph('Nobody planned this as a comeback story. Two of the three companies now selling out their runs were, eighteen months ago, one bad season away from returning their lease.'),
158
- proseParagraph("The turnaround has no single cause the three artistic directors agree on. The Riverside troupe points to a scheduling change — moving its main season to Thursday-through-Sunday runs instead of the traditional Friday-through-Monday, which cut against the industry's own conventional wisdom but happened to match when their actual audience, a lot of them shift workers, has evenings free."),
159
- proseParagraph('“We didn’t do anything,” said Loft Company artistic director Femi Adeyemi. “The internet did it, and then we had to actually be good enough that they’d come back.” A single clip from a preview performance, posted to a video app by a cast member, brought in an audience two decades younger than the Loft’s usual subscriber base — and, more surprisingly, most of them returned for a second show.'),
160
- proseParagraph('The third company, Blackbox Collective, simply raised its ticket prices for the first time in six years, expecting to lose a chunk of its base. It did not. "People had been telling us for years the tickets were too cheap to be a real theatre," said managing director Wren Okafor. "We didn\'t believe them until we tested it."'),
161
- ],
162
- },
163
- {
164
- title: 'Why the small stories matter most',
165
- slug: 'why-the-small-stories-matter-most',
166
- excerpt: "An editor's take on what gets left out of the bigger headlines, and what that costs a city over time.",
167
- section: 'Opinion',
168
- body: [
169
- proseParagraph('Every year around budget season, this paper runs at least one story about the transit line, the stadium proposal, or whichever fight is consuming the council chamber that month. Those stories get read, shared, and argued about in every local social media group. They are also, by a wide margin, not the stories that change how people actually feel about living here.'),
170
- proseParagraph('The story that generated the most letters to this desk last year was not about the transit line. It was a four-hundred-word piece about a crossing guard who had worked the same corner for thirty-one years and was retiring without so much as a plaque from the school district. We ran it on page eleven. It should have run on page one.'),
171
- proseParagraph('There is a reason small stories get buried, and it is not laziness — it is that a council vote has a hearing, a press release and a clear news hook, while a retiring crossing guard has none of those things until a reporter decides to notice. The bigger stories assign themselves. The small ones require someone to go looking.'),
172
- proseParagraph('This is an argument for more of the second kind, not less of the first — a city’s big fights matter, and we will keep covering them. But a newsroom that measures its worth only by how many people it made angry about the stadium is missing most of what actually holds a place together, one corner at a time.'),
173
- ],
174
- },
175
- {
176
- title: 'The commute is not the problem you think it is',
177
- slug: 'the-commute-is-not-the-problem',
178
- excerpt: 'Everyone blames the drive. The data points somewhere quieter.',
179
- section: 'Opinion',
180
- body: [
181
- proseParagraph('Ask anyone here what they would fix first and most will say the commute. Ask them to actually time it for a week and the number is almost always smaller than the complaint.'),
182
- proseParagraph('This is not a defense of the drive. It is an observation, made after asking eleven people to track their actual commute time for five consecutive days rather than estimate it from memory. The average estimate, before tracking, was forty-one minutes each way. The average measured time was twenty-six.'),
183
- proseParagraph('What people are actually measuring when they say "the commute is terrible" is closer to friction than duration: the unpredictability of a light that is sometimes ninety seconds and sometimes four minutes, the one intersection with no protected turn lane, the two weeks a year when a parade or a marathon reroutes everything with too little warning. Fix those and the complaint might fall even if the average time barely moves.'),
184
- proseParagraph('None of the eleven people in this informal experiment changed their opinion of their commute after seeing their own numbers. Two insisted the tracking app must have been wrong. That, more than the numbers themselves, might be the actual finding here.'),
185
- ],
186
- },
187
- {
188
- title: 'Stop calling every closure a tragedy',
189
- slug: 'stop-calling-every-closure-a-tragedy',
190
- excerpt: 'Some businesses close because a neighbourhood changed for the better. That is a harder story to tell.',
191
- section: 'Opinion',
192
- body: [
193
- proseParagraph('Every storefront that goes dark gets the same eulogy: rising rents, a changing neighbourhood, the death of something irreplaceable. Sometimes that is true. Sometimes the owner simply retired and nobody wanted to say so.'),
194
- proseParagraph('The corner bakery on 9th closed in March, and the neighbourhood association’s newsletter ran a full page on "another casualty of the rent crisis." The bakery’s own owner, reached for this piece, laughed at the framing. She is sixty-eight, her children have no interest in the business, and she had been trying to sell it for three years before simply locking the door and walking away.'),
195
- proseParagraph("This is not an argument that rising rents are a myth — ask any of the four businesses that actually did close over a lease renewal this year, all of whom agreed to be named, all of whom are furious, correctly. It is an argument that lumping every closure into the same narrative erases the difference between a landlord's greed and a person's plans, and makes it harder to see which businesses are actually in trouble."),
196
- proseParagraph('A neighbourhood that treats every empty storefront as evidence of decline will eventually stop noticing the ones that are real. That is the actual cost of the reflex, and it is a cost the neighbourhood association’s newsletter is paying without knowing it.'),
197
- ],
198
- },
199
- {
200
- title: 'The bakery that turned down three buyout offers',
201
- slug: 'bakery-turned-down-three-buyout-offers',
202
- excerpt: 'A regional chain wanted the corner. The owner wanted her name on the door for one more decade.',
203
- section: 'Business',
204
- body: [
205
- proseParagraph('The first offer came by letter. The second came with a lawyer attached. By the third, the owner had stopped opening the envelopes and started telling the story at the counter instead.'),
206
- proseParagraph('The regional chain making the offers, Continental Baking Group, has bought out four independent bakeries in the metro area in the past two years, keeping the original name on each storefront while switching the supply chain to a central commissary within six months. Owner Delphine Okonkwo-Reyes learned about that pattern from a former competitor two towns over, not from the company itself.'),
207
- proseParagraph('The final offer, according to two people with direct knowledge of the negotiation, was north of six hundred thousand dollars — more than four times what Okonkwo-Reyes paid for the building and the business combined when she took it over from her mother in 2009. She turned it down without countering. "They kept explaining the number to me like I hadn\'t heard it the first time," she said. "I heard it. I want my name on the door when I\'m seventy."'),
208
- proseParagraph('Continental Baking Group did not respond to three requests for comment for this story. The block where the bakery sits has had three ownership changes among its other storefronts in the same period; the bakery is now the only business on the block that has not changed hands since before the pandemic.'),
209
- ],
210
- },
211
- {
212
- title: 'What the new licensing rules mean for small landlords',
213
- slug: 'new-licensing-rules-small-landlords',
214
- excerpt: 'A plain-language walk-through of the ordinance that takes effect this fall, and who it actually targets.',
215
- section: 'Business',
216
- body: [
217
- proseParagraph('Most of the coverage so far has focused on the fine print aimed at large portfolio owners. The rule that will actually change daily life for most landlords in this city is a much smaller one, buried in section 4.'),
218
- proseParagraph('Section 4 requires any landlord renting out more than one unit, regardless of portfolio size, to register each unit individually and pay a forty-dollar annual inspection fee — a rule aimed at absentee owners of large buildings that will, as written, also apply to the roughly 1,200 residents who rent out a basement suite or a converted garage in a home they otherwise live in.'),
219
- proseParagraph('City council staff acknowledged the overlap in a memo obtained by this paper, calling it "an acceptable tradeoff for closing the registration gap," but stopped short of estimating how many small landlords would simply stop renting rather than register. Two housing advocates interviewed for this story gave sharply different numbers for what that could mean for the city’s already tight rental supply — one called the effect negligible, the other called it "a quiet way to shrink affordable housing that nobody will notice happened."'),
220
- proseParagraph('The ordinance takes effect November 1. A city hotline set up to answer landlord questions has, according to a staffer who answers it, fielded more calls in its first two weeks about the forty-dollar fee than about any other provision in the sixty-page rule.'),
221
- ],
222
- },
223
- {
224
- title: 'Inside the co-op grocery that outgrew its building twice',
225
- slug: 'co-op-grocery-outgrew-its-building-twice',
226
- excerpt: 'From a folding table in a church basement to a second expansion in six years.',
227
- section: 'Business',
228
- body: [
229
- proseParagraph('It started as a folding table of bulk grains once a month. Six years and two moves later, the waiting list for a membership is longer than the one for the parking lot it just bought next door.'),
230
- proseParagraph('The co-op now has 640 member-households, up from the thirty founding members who put down seventy-five dollars each to buy the original folding table and a hand-cranked grain mill. Membership is currently capped, with a waiting list of just over two hundred households and no firm date for when it will reopen.'),
231
- proseParagraph('The second move, in 2022, tripled the co-op’s floor space but came with a mortgage the founding members never anticipated carrying — a fact board chair Yusuf Bakhtiari says he is candid about at every annual meeting. "We are a grocery store with a nonprofit’s cash flow and a small business’s debt," he said. "It works because everyone who shops here also owns a piece of the debt, and most of them know it."'),
232
- proseParagraph('The parking lot purchase, finalized last month, was funded entirely by a member bond drive that raised the full $310,000 asking price in eleven weeks — faster, Bakhtiari noted, than the co-op’s own initial capital campaign took to hit a tenth of that amount in 2018.'),
233
- ],
234
- },
235
- ];
236
- /**
237
- * The blueprint's own starting skin (`starting-skins.js`) — asserted present
238
- * with a real check, not a `!`, the same guard `blog.ts`'s `blogPalette()`
239
- * uses: `STARTING_SKINS` is keyed by blueprint id and TypeScript cannot see
240
- * that this particular key is always populated.
241
- */
242
- function magazinePalette() {
243
- const skin = STARTING_SKINS.magazine;
244
- if (skin === undefined) {
245
- throw new CogentaError({
246
- code: 'BLUEPRINT_REGISTRY_CORRUPT',
247
- message: 'STARTING_SKINS.magazine is missing.',
248
- hint: 'The "magazine" entry must stay declared in starting-skins.ts for this blueprint to render its demo art.',
249
- });
250
- }
251
- return skin.color;
252
- }
253
- /**
254
- * Procedural visuals this blueprint seeds (L25 D4): one cover per demo
255
- * article (keyed by the article's own slug — the hero on `home` reuses the
256
- * lead article's own cover rather than rendering a second, unrelated image),
257
- * a reader avatar for the quote block, and five neutral wordmark stand-ins
258
- * for the "Partners" strip.
259
- */
260
- /**
261
- * Bundled photography (`assets/photos/magazine/`), keyed by article slug —
262
- * three distinct photos per section (`news`/`culture`/`opinion`/`business`),
263
- * so three articles from the same section never share one image side by
264
- * side in the "Top stories" grid.
265
- */
266
- const MAGAZINE_ARTICLE_PHOTOS = {
267
- 'transit-line-approved-after-a-decade': 'magazine/news.jpg',
268
- 'census-numbers-who-is-leaving': 'magazine/news-2.jpg',
269
- 'new-season-new-lineup': 'magazine/news-3.jpg',
270
- 'three-exhibitions-worth-the-trip': 'magazine/culture.jpg',
271
- 'the-archive-nobody-asked-to-save': 'magazine/culture-2.jpg',
272
- 'local-theatre-best-year-in-a-decade': 'magazine/culture-3.jpg',
273
- 'why-the-small-stories-matter-most': 'magazine/opinion.jpg',
274
- 'the-commute-is-not-the-problem': 'magazine/opinion-2.jpg',
275
- 'stop-calling-every-closure-a-tragedy': 'magazine/opinion-3.jpg',
276
- 'bakery-turned-down-three-buyout-offers': 'magazine/business.jpg',
277
- 'new-licensing-rules-small-landlords': 'magazine/business-2.jpg',
278
- 'co-op-grocery-outgrew-its-building-twice': 'magazine/business-3.jpg',
279
- };
280
- export const MAGAZINE_MEDIA_SPECS = [
281
- {
282
- name: 'quote-avatar',
283
- spec: avatarArt(magazinePalette(), 4),
284
- alt: 'Abstract avatar mark for a reader quote',
285
- },
286
- // L26 D3: the `about` page had no image at all — a masthead-style abstract
287
- // composition rather than a bundled photo, since none of the twelve
288
- // bundled photos (all tied to a specific article's own subject) fits a
289
- // page about the publication itself.
290
- {
291
- name: 'about-cover',
292
- spec: heroArt(magazinePalette(), 'bands', 7),
293
- alt: 'Abstract masthead composition for the About page',
294
- },
295
- ...[1, 2, 3, 4, 5].map((n) => ({
296
- name: `logo-${n}`,
297
- spec: logoArt(n),
298
- alt: `Neutral wordmark placeholder ${n}`,
299
- })),
300
- ...MAGAZINE_DEMO_ARTICLES.map((demo, index) => {
301
- const photo = MAGAZINE_ARTICLE_PHOTOS[demo.slug];
302
- return {
303
- name: `article-${demo.slug}`,
304
- spec: coverArt(magazinePalette(), index + 1),
305
- alt: `Cover art for "${demo.title}"`,
306
- ...(photo === undefined ? {} : { photo }),
307
- };
308
- }),
309
- ];
310
- /**
311
- * Header/footer navigation and the header call-to-action button (L25 D4).
312
- * The header names the four sections plus "About", each linking to that
313
- * section's own rail on `home` (the id `renderCollectionList`
314
- * (`@cogenta/theme-magazine`) never assigns, so this — like `blog.ts`'s own
315
- * `/#newsletter`/`/archive` links — is a same-page anchor a browser resolves
316
- * to the top of the page when the fragment is absent, never a broken link).
317
- */
318
- export const MAGAZINE_MENUS = {
319
- header: [
320
- { label: 'News', url: '/#news' },
321
- { label: 'Culture', url: '/#culture' },
322
- { label: 'Opinion', url: '/#opinion' },
323
- { label: 'Business', url: '/#business' },
324
- { label: 'About', url: '/about' },
325
- ],
326
- footer: [
327
- { label: 'Sections', url: '/' },
328
- { label: 'About', url: '/about' },
329
- { label: 'Legal', url: '/legal' },
330
- ],
331
- headerAction: { label: 'Subscribe', url: '/#newsletter' },
332
- };
333
- export const MAGAZINE_SITE_SETTINGS = {
334
- 'general.tagline': 'Reporting, essays and the stories behind the headlines.',
335
- 'general.socialLinks': [
336
- { label: 'X', url: 'https://x.com/example' },
337
- { label: 'Instagram', url: 'https://instagram.com/example' },
338
- { label: 'LinkedIn', url: 'https://linkedin.com/company/example' },
339
- ],
340
- 'general.footerNote': 'An independent magazine, scaffolded by create-cogenta.',
341
- };
342
- export const MAGAZINE_RECOMMENDED_AGENTS = [
343
- {
344
- name: 'contentAgent',
345
- package: '@cogenta/agents-builtin',
346
- reason: 'Flags terminology drift and topic gaps across sections written by different editors.',
347
- },
348
- {
349
- name: 'seoAgent',
350
- package: '@cogenta/agents-builtin',
351
- reason: 'Audits published articles for on-page SEO issues and internal-linking gaps.',
352
- },
353
- ];
354
- /**
355
- * `home` (a nine-block front page: the lead story's own `hero`, a
356
- * "Top stories" front-page grid, one rubric rail per section, a newsletter
357
- * `cta`, a reader `quote` and a "Partners" `logoStrip`) and `about`. `media`
358
- * (`SeedContext.media`, L25 task A0b) supplies every cover and the quote
359
- * avatar; a function of it rather than a static const for the same reason
360
- * `blog.ts`'s `buildBlogDemoPages` is.
361
- */
362
- export function buildMagazineDemoPages(media) {
363
- // The front page opens on the *editor's pick* — the Culture feature —
364
- // while "Top stories" below leads with the newest article: with both
365
- // pointing at the same story the home page opened on the same headline
366
- // and cover twice in a row (seen live at 1280px).
367
- const lead = MAGAZINE_DEMO_ARTICLES.find((article) => article.section === 'Culture');
368
- if (lead === undefined) {
369
- throw new CogentaError({
370
- code: 'BLUEPRINT_REGISTRY_CORRUPT',
371
- message: 'MAGAZINE_DEMO_ARTICLES is empty.',
372
- hint: 'The magazine blueprint needs a Culture demo article to lead its front page with.',
373
- });
374
- }
375
- const logoItems = [1, 2, 3, 4, 5]
376
- .filter((n) => media[`logo-${n}`] !== undefined)
377
- .map((n) => ({ _key: `demo-logo-${n}`, media: media[`logo-${n}`] }));
378
- const sectionRail = (section, key) => ({
379
- _key: key,
380
- _type: 'collectionList',
381
- _version: BLOCK_VERSION,
382
- title: section,
383
- collection: 'article',
384
- filter: { section },
385
- sort: { field: 'createdAt', direction: 'desc' },
386
- limit: 4,
387
- layout: 'list',
388
- });
389
- return [
390
- {
391
- title: 'Home',
392
- slug: 'home',
393
- blocks: [
394
- {
395
- _key: 'demo-home-hero',
396
- _type: 'hero',
397
- _version: BLOCK_VERSION,
398
- eyebrow: lead.section,
399
- title: lead.title,
400
- subtitle: lead.excerpt,
401
- ...(media[`article-${lead.slug}`] === undefined
402
- ? {}
403
- : { media: media[`article-${lead.slug}`] }),
404
- actions: [{ label: 'Read the story', target: { href: `/articles/${lead.slug}` } }],
405
- },
406
- {
407
- _key: 'demo-home-top-stories',
408
- _type: 'collectionList',
409
- _version: BLOCK_VERSION,
410
- title: 'Top stories',
411
- collection: 'article',
412
- sort: { field: 'createdAt', direction: 'desc' },
413
- limit: 7,
414
- layout: 'grid',
415
- },
416
- sectionRail('News', 'demo-home-rail-news'),
417
- sectionRail('Culture', 'demo-home-rail-culture'),
418
- sectionRail('Opinion', 'demo-home-rail-opinion'),
419
- sectionRail('Business', 'demo-home-rail-business'),
420
- {
421
- _key: 'demo-home-newsletter',
422
- _type: 'cta',
423
- _version: BLOCK_VERSION,
424
- title: 'Get the morning briefing',
425
- text: 'One email, every weekday morning, before the news gets loud.',
426
- actions: [{ label: 'Subscribe', target: { href: '/#newsletter' }, emphasis: 'primary' }],
427
- },
428
- {
429
- _key: 'demo-home-quote',
430
- _type: 'quote',
431
- _version: BLOCK_VERSION,
432
- text: "This is the first local paper I've read cover to cover in years — the small stories are the ones I actually talk about at dinner.",
433
- author: 'R. Okoye',
434
- role: 'Subscriber since issue one',
435
- ...(media['quote-avatar'] === undefined ? {} : { avatar: media['quote-avatar'] }),
436
- },
437
- // Omitted entirely, rather than sent with an empty `logos` array,
438
- // when no logo mark was actually ingested (e.g. `seedDemoContent`
439
- // called with `media: {}`) — contract B requires at least one item.
440
- ...(logoItems.length === 0
441
- ? []
442
- : [
443
- {
444
- _key: 'demo-home-partners',
445
- _type: 'logoStrip',
446
- _version: BLOCK_VERSION,
447
- caption: 'Partners',
448
- logos: logoItems,
449
- },
450
- ]),
451
- ],
452
- },
453
- {
454
- title: 'About',
455
- slug: 'about',
456
- blocks: [
457
- // L26 D3: the About page had no image at all — a masthead-style
458
- // abstract composition (`about-cover`, `MAGAZINE_MEDIA_SPECS`),
459
- // omitted entirely when `seedDemoContent` is called with `media: {}`
460
- // (`mediaFigure.media` is required, same reasoning as `logoStrip`
461
- // and the hero above).
462
- ...(media['about-cover'] === undefined
463
- ? []
464
- : [
465
- {
466
- _key: 'demo-about-cover',
467
- _type: 'mediaFigure',
468
- _version: BLOCK_VERSION,
469
- media: media['about-cover'],
470
- caption: "The Ledger's newsroom occupies half a floor above a hardware store downtown — the same corner Rosa Delgado has run her shop from for eleven years.",
471
- ratio: '16:9',
472
- align: 'wide',
473
- },
474
- ]),
475
- // L26 D1: rewritten from generic filler to name what the paper
476
- // actually covers, in its own editorial voice — the demo disclosure
477
- // that follows (a deliberate cross-blueprint convention, see
478
- // `blog.ts`'s own About page) is kept, not removed.
479
- proseParagraph('The Ledger covers one city, in four sections: News, Culture, Opinion and Business. It publishes weekday mornings, keeps its archive open without a paywall, and answers its letters — most of them, eventually, in print.'),
480
- proseParagraph('This is a demo magazine, scaffolded by create-cogenta from the "magazine" blueprint. Its articles and this page were seeded by the installer so there is real content to look at from the first run.'),
481
- proseParagraph('Everything here — the schema, the content, the skin — is a normal part of the site and is meant to be edited, renamed or deleted the moment the defaults stop fitting.'),
482
- {
483
- _key: 'demo-about-quote',
484
- _type: 'quote',
485
- _version: BLOCK_VERSION,
486
- text: 'A magazine is a promise about what you will not have to read: everything we decided was not worth your evening.',
487
- author: 'Noor Hassani',
488
- role: 'Editor',
489
- },
490
- ],
491
- },
492
- ];
493
- }
494
- /**
495
- * Inserts the `magazine` blueprint's demo content through the real
496
- * `ContentStore` — never mocked (house rule).
497
- */
498
- async function seedMagazineDemoContent(ctx) {
499
- const { db, defaultLocale, adminId, media } = ctx;
500
- const articleStore = createContentStore({ db, collection: article, defaultLocale });
501
- const pageStore = createContentStore({ db, collection: page, defaultLocale });
502
- // Inserted in reverse order on purpose: every `collectionList` on `home`
503
- // sorts `createdAt desc` (the correct choice for a real site — the newest
504
- // article should lead), which means whichever article is created *last*
505
- // gets the newest `createdAt` and sorts first. `MAGAZINE_DEMO_ARTICLES[0]`
506
- // is the article `buildMagazineDemoPages`'s `hero` names as the lead
507
- // story, so it must be the *last* one written here — otherwise the hero
508
- // and the "Top stories" grid's own lead card would show two different
509
- // articles, confirmed live against a real scaffolded site.
510
- for (const demo of [...MAGAZINE_DEMO_ARTICLES].reverse()) {
511
- const cover = media[`article-${demo.slug}`];
512
- await articleStore.create({
513
- status: 'published',
514
- createdBy: adminId,
515
- values: {
516
- title: demo.title,
517
- slug: demo.slug,
518
- excerpt: demo.excerpt,
519
- section: demo.section,
520
- ...(cover === undefined ? {} : { coverImage: cover }),
521
- },
522
- blocks: { body: demo.body.map(toBlockZoneEntry) },
523
- });
524
- }
525
- for (const demo of buildMagazineDemoPages(media)) {
526
- await pageStore.create({
527
- status: 'published',
528
- createdBy: adminId,
529
- values: { title: demo.title, slug: demo.slug },
530
- blocks: { blocks: demo.blocks.map(toBlockZoneEntry) },
531
- });
532
- }
533
- }
534
- export const magazineContentPack = {
535
- collections: MAGAZINE_COLLECTIONS,
536
- recommendedAgents: MAGAZINE_RECOMMENDED_AGENTS,
537
- seedDemoContent: seedMagazineDemoContent,
538
- defaultTheme: '@cogenta/theme-magazine',
539
- menus: MAGAZINE_MENUS,
540
- siteSettings: MAGAZINE_SITE_SETTINGS,
541
- mediaSpecs: MAGAZINE_MEDIA_SPECS,
542
- };
543
- //# sourceMappingURL=magazine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"magazine.js","sourceRoot":"","sources":["../../src/blueprints/magazine.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAEL,kBAAkB,EAClB,gBAAgB,EAChB,CAAC,EACD,qBAAqB,GACtB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAgB,MAAM,6BAA6B,CAAA;AACjG,OAAO,EAEL,oBAAoB,EAEpB,UAAU,EAEV,gBAAgB,GACjB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAC;IACtC,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE;IACnD,OAAO,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE;IACvC,MAAM,EAAE;QACN,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC3C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC7C,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;YAChB,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC;YACnD,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,0EAA0E;QAC1E,oEAAoE;QACpE,yEAAyE;QACzE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,yEAAyE;QACzE,uDAAuD;QACvD,WAAW,EAAE,CAAC,CAAC,QAAQ,EAAE;QACzB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAClC,GAAG,UAAU;KACd;IACD,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAChC,WAAW,EAAE;QACX,IAAI,EAAE,CAAC,QAAQ,CAAC;QAChB,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;QAC3B,MAAM,EAAE,CAAC,OAAO,CAAC;QACjB,OAAO,EAAE,CAAC,OAAO,CAAC;KACnB;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAA;AAElD,MAAM,CAAC,MAAM,oBAAoB,GAAoC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAEpF,qBAAqB,CAAC,oBAAoB,CAAC,CAAA;AAE3C,MAAM,aAAa,GAAG,OAAO,CAAA;AAE7B,IAAI,YAAY,GAAG,CAAC,CAAA;AAEpB,SAAS,cAAc,CAAC,IAAY;IAClC,YAAY,IAAI,CAAC,CAAA;IACjB,MAAM,GAAG,GAAG,UAAU,YAAY,EAAE,CAAA;IACpC,OAAO;QACL,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,aAAa;QACvB,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE,GAAG,GAAG,QAAQ;gBACpB,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;gBACnE,QAAQ,EAAE,EAAE;aACb;SACF;KACiB,CAAA;AACtB,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAmC;IACpE;QACE,KAAK,EAAE,gEAAgE;QACvE,IAAI,EAAE,sCAAsC;QAC5C,OAAO,EACL,wHAAwH;QAC1H,OAAO,EAAE,MAAM;QACf,IAAI,EAAE;YACJ,cAAc,CACZ,qPAAqP,CACtP;YACD,cAAc,CACZ,gVAAgV,CACjV;YACD,cAAc,CACZ,6fAA6f,CAC9f;YACD,cAAc,CACZ,saAAsa,CACva;YACD,cAAc,CACZ,kXAAkX,CACnX;SACF;KACF;IACD;QACE,KAAK,EAAE,2DAA2D;QAClE,IAAI,EAAE,+BAA+B;QACrC,OAAO,EAAE,sFAAsF;QAC/F,OAAO,EAAE,MAAM;QACf,IAAI,EAAE;YACJ,cAAc,CACZ,mQAAmQ,CACpQ;YACD,cAAc,CACZ,ucAAuc,CACxc;YACD,cAAc,CACZ,+eAA+e,CAChf;YACD,cAAc,CACZ,+SAA+S,CAChT;SACF;KACF;IACD;QACE,KAAK,EAAE,2DAA2D;QAClE,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,sFAAsF;QAC/F,OAAO,EAAE,MAAM;QACf,IAAI,EAAE;YACJ,cAAc,CACZ,6WAA6W,CAC9W;YACD,cAAc,CACZ,+YAA+Y,CAChZ;YACD,cAAc,CACZ,kbAAkb,CACnb;YACD,cAAc,CACZ,udAAud,CACxd;SACF;KACF;IACD;QACE,KAAK,EAAE,6CAA6C;QACpD,IAAI,EAAE,kCAAkC;QACxC,OAAO,EACL,mGAAmG;QACrG,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;YACJ,cAAc,CACZ,kYAAkY,CACnY;YACD,cAAc,CACZ,6ZAA6Z,CAC9Z;YACD,cAAc,CACZ,waAAwa,CACza;YACD,cAAc,CACZ,qKAAqK,CACtK;SACF;KACF;IACD;QACE,KAAK,EAAE,kDAAkD;QACzD,IAAI,EAAE,kCAAkC;QACxC,OAAO,EACL,yGAAyG;QAC3G,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;YACJ,cAAc,CACZ,uNAAuN,CACxN;YACD,cAAc,CACZ,kXAAkX,CACnX;YACD,cAAc,CACZ,sZAAsZ,CACvZ;YACD,cAAc,CACZ,mSAAmS,CACpS;SACF;KACF;IACD;QACE,KAAK,EAAE,uDAAuD;QAC9D,IAAI,EAAE,qCAAqC;QAC3C,OAAO,EACL,yFAAyF;QAC3F,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;YACJ,cAAc,CACZ,2KAA2K,CAC5K;YACD,cAAc,CACZ,oYAAoY,CACrY;YACD,cAAc,CACZ,2YAA2Y,CAC5Y;YACD,cAAc,CACZ,uUAAuU,CACxU;SACF;KACF;IACD;QACE,KAAK,EAAE,mCAAmC;QAC1C,IAAI,EAAE,mCAAmC;QACzC,OAAO,EACL,uGAAuG;QACzG,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;YACJ,cAAc,CACZ,gXAAgX,CACjX;YACD,cAAc,CACZ,+UAA+U,CAChV;YACD,cAAc,CACZ,uUAAuU,CACxU;YACD,cAAc,CACZ,oTAAoT,CACrT;SACF;KACF;IACD;QACE,KAAK,EAAE,gDAAgD;QACvD,IAAI,EAAE,gCAAgC;QACtC,OAAO,EAAE,+DAA+D;QACxE,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;YACJ,cAAc,CACZ,8KAA8K,CAC/K;YACD,cAAc,CACZ,8SAA8S,CAC/S;YACD,cAAc,CACZ,4aAA4a,CAC7a;YACD,cAAc,CACZ,4PAA4P,CAC7P;SACF;KACF;IACD;QACE,KAAK,EAAE,sCAAsC;QAC7C,IAAI,EAAE,sCAAsC;QAC5C,OAAO,EACL,uGAAuG;QACzG,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE;YACJ,cAAc,CACZ,6NAA6N,CAC9N;YACD,cAAc,CACZ,mYAAmY,CACpY;YACD,cAAc,CACZ,oaAAoa,CACra;YACD,cAAc,CACZ,kQAAkQ,CACnQ;SACF;KACF;IACD;QACE,KAAK,EAAE,iDAAiD;QACxD,IAAI,EAAE,wCAAwC;QAC9C,OAAO,EACL,gGAAgG;QAClG,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE;YACJ,cAAc,CACZ,yLAAyL,CAC1L;YACD,cAAc,CACZ,0YAA0Y,CAC3Y;YACD,cAAc,CACZ,ocAAoc,CACrc;YACD,cAAc,CACZ,+SAA+S,CAChT;SACF;KACF;IACD;QACE,KAAK,EAAE,uDAAuD;QAC9D,IAAI,EAAE,qCAAqC;QAC3C,OAAO,EACL,0GAA0G;QAC5G,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE;YACJ,cAAc,CACZ,sNAAsN,CACvN;YACD,cAAc,CACZ,2XAA2X,CAC5X;YACD,cAAc,CACZ,uhBAAuhB,CACxhB;YACD,cAAc,CACZ,mQAAmQ,CACpQ;SACF;KACF;IACD;QACE,KAAK,EAAE,0DAA0D;QACjE,IAAI,EAAE,0CAA0C;QAChD,OAAO,EAAE,+EAA+E;QACxF,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE;YACJ,cAAc,CACZ,kMAAkM,CACnM;YACD,cAAc,CACZ,wTAAwT,CACzT;YACD,cAAc,CACZ,0ZAA0Z,CAC3Z;YACD,cAAc,CACZ,4QAA4Q,CAC7Q;SACF;KACF;CACF,CAAA;AAQD;;;;;GAKG;AACH,SAAS,eAAe;IACtB,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAA;IACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,qCAAqC;YAC9C,IAAI,EAAE,yGAAyG;SAChH,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAA;AACnB,CAAC;AAED;;;;;;GAMG;AACH;;;;;GAKG;AACH,MAAM,uBAAuB,GAAqC;IAChE,sCAAsC,EAAE,mBAAmB;IAC3D,+BAA+B,EAAE,qBAAqB;IACtD,uBAAuB,EAAE,qBAAqB;IAC9C,kCAAkC,EAAE,sBAAsB;IAC1D,kCAAkC,EAAE,wBAAwB;IAC5D,qCAAqC,EAAE,wBAAwB;IAC/D,mCAAmC,EAAE,sBAAsB;IAC3D,gCAAgC,EAAE,wBAAwB;IAC1D,sCAAsC,EAAE,wBAAwB;IAChE,wCAAwC,EAAE,uBAAuB;IACjE,qCAAqC,EAAE,yBAAyB;IAChE,0CAA0C,EAAE,yBAAyB;CACtE,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAA6B;IAC5D;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,SAAS,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QACrC,GAAG,EAAE,yCAAyC;KAC/C;IACD,2EAA2E;IAC3E,oEAAoE;IACpE,uEAAuE;IACvE,qCAAqC;IACrC;QACE,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,OAAO,CAAC,eAAe,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,GAAG,EAAE,kDAAkD;KACxD;IACD,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CACpB,CAAC,CAAC,EAAiB,EAAE,CAAC,CAAC;QACrB,IAAI,EAAE,QAAQ,CAAC,EAAE;QACjB,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QAChB,GAAG,EAAE,gCAAgC,CAAC,EAAE;KACzC,CAAC,CACH;IACD,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAiB,EAAE;QAC3D,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChD,OAAO;YACL,IAAI,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE;YAC5B,IAAI,EAAE,QAAQ,CAAC,eAAe,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC;YAC5C,GAAG,EAAE,kBAAkB,IAAI,CAAC,KAAK,GAAG;YACpC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;SAC1C,CAAA;IACH,CAAC,CAAC;CACH,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,MAAM,EAAE;QACN,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE;QAChC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE;QACtC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE;QACtC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE;QACxC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE;KAClC;IACD,MAAM,EAAE;QACN,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE;QAC/B,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE;QACjC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE;KAClC;IACD,YAAY,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE;CAC1D,CAAA;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAsC;IACvE,iBAAiB,EAAE,yDAAyD;IAC5E,qBAAqB,EAAE;QACrB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,uBAAuB,EAAE;QAC5C,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,+BAA+B,EAAE;QAC5D,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,sCAAsC,EAAE;KACnE;IACD,oBAAoB,EAAE,wDAAwD;CAC/E,CAAA;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAoC;IAC1E;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,yBAAyB;QAClC,MAAM,EAAE,sFAAsF;KAC/F;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,yBAAyB;QAClC,MAAM,EAAE,6EAA6E;KACtF;CACF,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAuC;IAEvC,sEAAsE;IACtE,qEAAqE;IACrE,uEAAuE;IACvE,kDAAkD;IAClD,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAA;IACpF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,YAAY,CAAC;YACrB,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,kCAAkC;YAC3C,IAAI,EAAE,kFAAkF;SACzF,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC;SAC/C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAW,EAAE,CAAC,CAAC,CAAA;IAEhF,MAAM,WAAW,GAAG,CAAC,OAAwB,EAAE,GAAW,EAAmB,EAAE,CAAC,CAAC;QAC/E,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,gBAAgB;QACvB,QAAQ,EAAE,aAAa;QACvB,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,SAAS;QACrB,MAAM,EAAE,EAAE,OAAO,EAAE;QACnB,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE;QAC/C,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,MAAM;KACf,CAAC,CAAA;IAEF,OAAO;QACL;YACE,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE;gBACN;oBACE,IAAI,EAAE,gBAAgB;oBACtB,KAAK,EAAE,MAAM;oBACb,QAAQ,EAAE,aAAa;oBACvB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,QAAQ,EAAE,IAAI,CAAC,OAAO;oBACtB,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS;wBAC7C,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;oBAC7C,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC;iBAChE;gBACpB;oBACE,IAAI,EAAE,uBAAuB;oBAC7B,KAAK,EAAE,gBAAgB;oBACvB,QAAQ,EAAE,aAAa;oBACvB,KAAK,EAAE,aAAa;oBACpB,UAAU,EAAE,SAAS;oBACrB,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE;oBAC/C,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,MAAM;iBACf;gBACD,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC;gBAC1C,WAAW,CAAC,SAAS,EAAE,wBAAwB,CAAC;gBAChD,WAAW,CAAC,SAAS,EAAE,wBAAwB,CAAC;gBAChD,WAAW,CAAC,UAAU,EAAE,yBAAyB,CAAC;gBAClD;oBACE,IAAI,EAAE,sBAAsB;oBAC5B,KAAK,EAAE,KAAK;oBACZ,QAAQ,EAAE,aAAa;oBACvB,KAAK,EAAE,0BAA0B;oBACjC,IAAI,EAAE,8DAA8D;oBACpE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;iBACzF;gBACD;oBACE,IAAI,EAAE,iBAAiB;oBACvB,KAAK,EAAE,OAAO;oBACd,QAAQ,EAAE,aAAa;oBACvB,IAAI,EAAE,mIAAmI;oBACzI,MAAM,EAAE,UAAU;oBAClB,IAAI,EAAE,4BAA4B;oBAClC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;iBAClF;gBACD,kEAAkE;gBAClE,kEAAkE;gBAClE,oEAAoE;gBACpE,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;oBACxB,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC;wBACE;4BACE,IAAI,EAAE,oBAAoB;4BAC1B,KAAK,EAAE,WAAW;4BAClB,QAAQ,EAAE,aAAa;4BACvB,OAAO,EAAE,UAAU;4BACnB,KAAK,EAAE,SAAS;yBACE;qBACrB,CAAC;aACP;SACF;QACD;YACE,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,OAAO;YACb,MAAM,EAAE;gBACN,gEAAgE;gBAChE,gEAAgE;gBAChE,qEAAqE;gBACrE,kEAAkE;gBAClE,uBAAuB;gBACvB,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,SAAS;oBACpC,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC;wBACE;4BACE,IAAI,EAAE,kBAAkB;4BACxB,KAAK,EAAE,aAAa;4BACpB,QAAQ,EAAE,aAAa;4BACvB,KAAK,EAAE,KAAK,CAAC,aAAa,CAAC;4BAC3B,OAAO,EACL,oJAAoJ;4BACtJ,KAAK,EAAE,MAAM;4BACb,KAAK,EAAE,MAAM;yBACK;qBACrB,CAAC;gBACN,+DAA+D;gBAC/D,oEAAoE;gBACpE,6DAA6D;gBAC7D,oDAAoD;gBACpD,cAAc,CACZ,2NAA2N,CAC5N;gBACD,cAAc,CACZ,sMAAsM,CACvM;gBACD,cAAc,CACZ,wKAAwK,CACzK;gBACD;oBACE,IAAI,EAAE,kBAAkB;oBACxB,KAAK,EAAE,OAAO;oBACd,QAAQ,EAAE,aAAa;oBACvB,IAAI,EAAE,iHAAiH;oBACvH,MAAM,EAAE,cAAc;oBACtB,IAAI,EAAE,QAAQ;iBACf;aACF;SACF;KACF,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,uBAAuB,CAAC,GAAgB;IACrD,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAA;IACjD,MAAM,YAAY,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAA;IACnF,MAAM,SAAS,GAAG,kBAAkB,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;IAE7E,yEAAyE;IACzE,0EAA0E;IAC1E,wEAAwE;IACxE,2EAA2E;IAC3E,qEAAqE;IACrE,wEAAwE;IACxE,sEAAsE;IACtE,2DAA2D;IAC3D,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,sBAAsB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;QAC3C,MAAM,YAAY,CAAC,MAAM,CAAC;YACxB,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,OAAO;YAClB,MAAM,EAAE;gBACN,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;aACtD;YACD,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE;SAClD,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,SAAS,CAAC,MAAM,CAAC;YACrB,MAAM,EAAE,WAAW;YACnB,SAAS,EAAE,OAAO;YAClB,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAC9C,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE;SACtD,CAAC,CAAA;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAyB;IACvD,WAAW,EAAE,oBAAoB;IACjC,iBAAiB,EAAE,2BAA2B;IAC9C,eAAe,EAAE,uBAAuB;IACxC,YAAY,EAAE,yBAAyB;IACvC,KAAK,EAAE,cAAc;IACrB,YAAY,EAAE,sBAAsB;IACpC,UAAU,EAAE,oBAAoB;CACjC,CAAA"}
@@ -1,25 +0,0 @@
1
- import type { DatabaseHandle } from '@cogenta/core';
2
- /**
3
- * A blueprint's declarative navigation (L25 task A0b, D4): header, footer,
4
- * and an optional single call-to-action button — seeded through the real
5
- * `MenuStore` (`@cogenta/schema`), at the same locations `cogenta serve`'s
6
- * theme rendering already reads (`DEFAULT_HEADER_MENU_LOCATION` = `primary`,
7
- * `DEFAULT_FOOTER_MENU_LOCATION` = `footer`, and `header-action` — a
8
- * blueprint has no dependency on `@cogenta/cli` to name these, so the three
9
- * location strings are duplicated here rather than imported).
10
- */
11
- export interface MenuItemSpec {
12
- readonly label: string;
13
- /** Omitted only for the site's own `home` item — every other item needs a real path. */
14
- readonly url?: string;
15
- readonly openInNewTab?: boolean;
16
- }
17
- export interface BlueprintMenus {
18
- readonly header: readonly MenuItemSpec[];
19
- readonly footer: readonly MenuItemSpec[];
20
- /** A single button rendered in the header, distinct from the nav list — `ChromeInput.headerAction` (`theme@1.4`). */
21
- readonly headerAction?: MenuItemSpec;
22
- }
23
- /** Seeds a blueprint's header/footer/header-action menus, one call, real `MenuStore`. Returns the total number of items seeded. */
24
- export declare function seedBlueprintMenus(db: DatabaseHandle, defaultLocale: string, menus: BlueprintMenus): Promise<number>;
25
- //# sourceMappingURL=menus.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"menus.d.ts","sourceRoot":"","sources":["../../src/blueprints/menus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAGnD;;;;;;;;GAQG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,wFAAwF;IACxF,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAA;IACxC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAA;IACxC,qHAAqH;IACrH,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAA;CACrC;AA0BD,mIAAmI;AACnI,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,cAAc,EAClB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,MAAM,CAAC,CAYjB"}