@aglyn/plugins-mui 1.0.0-beta.143

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 (177) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +22 -0
  3. package/package.json +47 -0
  4. package/src/index.d.ts +21 -0
  5. package/src/index.js +22 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/components/accordion.d.ts +96 -0
  8. package/src/lib/components/accordion.js +392 -0
  9. package/src/lib/components/accordion.js.map +1 -0
  10. package/src/lib/components/app-bar.d.ts +32 -0
  11. package/src/lib/components/app-bar.js +86 -0
  12. package/src/lib/components/app-bar.js.map +1 -0
  13. package/src/lib/components/blocks.d.ts +46 -0
  14. package/src/lib/components/blocks.js +1007 -0
  15. package/src/lib/components/blocks.js.map +1 -0
  16. package/src/lib/components/box.d.ts +47 -0
  17. package/src/lib/components/box.js +125 -0
  18. package/src/lib/components/box.js.map +1 -0
  19. package/src/lib/components/breadcrumbs.d.ts +44 -0
  20. package/src/lib/components/breadcrumbs.js +172 -0
  21. package/src/lib/components/breadcrumbs.js.map +1 -0
  22. package/src/lib/components/button.d.ts +89 -0
  23. package/src/lib/components/button.js +272 -0
  24. package/src/lib/components/button.js.map +1 -0
  25. package/src/lib/components/card.d.ts +61 -0
  26. package/src/lib/components/card.js +336 -0
  27. package/src/lib/components/card.js.map +1 -0
  28. package/src/lib/components/collection.d.ts +514 -0
  29. package/src/lib/components/collection.js +2999 -0
  30. package/src/lib/components/collection.js.map +1 -0
  31. package/src/lib/components/container.d.ts +42 -0
  32. package/src/lib/components/container.js +169 -0
  33. package/src/lib/components/container.js.map +1 -0
  34. package/src/lib/components/custom-html.d.ts +78 -0
  35. package/src/lib/components/custom-html.js +219 -0
  36. package/src/lib/components/custom-html.js.map +1 -0
  37. package/src/lib/components/data-table.d.ts +57 -0
  38. package/src/lib/components/data-table.js +216 -0
  39. package/src/lib/components/data-table.js.map +1 -0
  40. package/src/lib/components/document-root.d.ts +77 -0
  41. package/src/lib/components/document-root.js +118 -0
  42. package/src/lib/components/document-root.js.map +1 -0
  43. package/src/lib/components/drawer.d.ts +93 -0
  44. package/src/lib/components/drawer.js +566 -0
  45. package/src/lib/components/drawer.js.map +1 -0
  46. package/src/lib/components/function-controls.d.ts +66 -0
  47. package/src/lib/components/function-controls.js +207 -0
  48. package/src/lib/components/function-controls.js.map +1 -0
  49. package/src/lib/components/function-scope.d.ts +110 -0
  50. package/src/lib/components/function-scope.js +478 -0
  51. package/src/lib/components/function-scope.js.map +1 -0
  52. package/src/lib/components/function-widget.d.ts +75 -0
  53. package/src/lib/components/function-widget.js +307 -0
  54. package/src/lib/components/function-widget.js.map +1 -0
  55. package/src/lib/components/grid.d.ts +91 -0
  56. package/src/lib/components/grid.js +322 -0
  57. package/src/lib/components/grid.js.map +1 -0
  58. package/src/lib/components/icon.d.ts +54 -0
  59. package/src/lib/components/icon.js +163 -0
  60. package/src/lib/components/icon.js.map +1 -0
  61. package/src/lib/components/image-list.d.ts +58 -0
  62. package/src/lib/components/image-list.js +336 -0
  63. package/src/lib/components/image-list.js.map +1 -0
  64. package/src/lib/components/image.d.ts +154 -0
  65. package/src/lib/components/image.js +451 -0
  66. package/src/lib/components/image.js.map +1 -0
  67. package/src/lib/components/inline-text.d.ts +74 -0
  68. package/src/lib/components/inline-text.js +407 -0
  69. package/src/lib/components/inline-text.js.map +1 -0
  70. package/src/lib/components/language-switcher.d.ts +35 -0
  71. package/src/lib/components/language-switcher.js +179 -0
  72. package/src/lib/components/language-switcher.js.map +1 -0
  73. package/src/lib/components/layout-slot.d.ts +68 -0
  74. package/src/lib/components/layout-slot.js +192 -0
  75. package/src/lib/components/layout-slot.js.map +1 -0
  76. package/src/lib/components/link-box-accessible-name.d.ts +79 -0
  77. package/src/lib/components/link-box-accessible-name.js +158 -0
  78. package/src/lib/components/link-box-accessible-name.js.map +1 -0
  79. package/src/lib/components/link-box.d.ts +66 -0
  80. package/src/lib/components/link-box.js +212 -0
  81. package/src/lib/components/link-box.js.map +1 -0
  82. package/src/lib/components/list-item-text.d.ts +22 -0
  83. package/src/lib/components/list-item-text.js +86 -0
  84. package/src/lib/components/list-item-text.js.map +1 -0
  85. package/src/lib/components/list-item.d.ts +32 -0
  86. package/src/lib/components/list-item.js +127 -0
  87. package/src/lib/components/list-item.js.map +1 -0
  88. package/src/lib/components/list.d.ts +34 -0
  89. package/src/lib/components/list.js +108 -0
  90. package/src/lib/components/list.js.map +1 -0
  91. package/src/lib/components/markdown.d.ts +129 -0
  92. package/src/lib/components/markdown.js +853 -0
  93. package/src/lib/components/markdown.js.map +1 -0
  94. package/src/lib/components/nav-menu.d.ts +68 -0
  95. package/src/lib/components/nav-menu.js +683 -0
  96. package/src/lib/components/nav-menu.js.map +1 -0
  97. package/src/lib/components/pagination.d.ts +59 -0
  98. package/src/lib/components/pagination.js +243 -0
  99. package/src/lib/components/pagination.js.map +1 -0
  100. package/src/lib/components/paper.d.ts +47 -0
  101. package/src/lib/components/paper.js +202 -0
  102. package/src/lib/components/paper.js.map +1 -0
  103. package/src/lib/components/plugin-frame.d.ts +64 -0
  104. package/src/lib/components/plugin-frame.js +335 -0
  105. package/src/lib/components/plugin-frame.js.map +1 -0
  106. package/src/lib/components/plugin.d.ts +95 -0
  107. package/src/lib/components/plugin.js +304 -0
  108. package/src/lib/components/plugin.js.map +1 -0
  109. package/src/lib/components/product.d.ts +40 -0
  110. package/src/lib/components/product.js +287 -0
  111. package/src/lib/components/product.js.map +1 -0
  112. package/src/lib/components/reusable-instance.d.ts +57 -0
  113. package/src/lib/components/reusable-instance.js +126 -0
  114. package/src/lib/components/reusable-instance.js.map +1 -0
  115. package/src/lib/components/screen-link.d.ts +85 -0
  116. package/src/lib/components/screen-link.js +324 -0
  117. package/src/lib/components/screen-link.js.map +1 -0
  118. package/src/lib/components/search-box.d.ts +41 -0
  119. package/src/lib/components/search-box.js +125 -0
  120. package/src/lib/components/search-box.js.map +1 -0
  121. package/src/lib/components/section.d.ts +56 -0
  122. package/src/lib/components/section.js +132 -0
  123. package/src/lib/components/section.js.map +1 -0
  124. package/src/lib/components/stack.d.ts +55 -0
  125. package/src/lib/components/stack.js +309 -0
  126. package/src/lib/components/stack.js.map +1 -0
  127. package/src/lib/components/tabs.d.ts +288 -0
  128. package/src/lib/components/tabs.js +788 -0
  129. package/src/lib/components/tabs.js.map +1 -0
  130. package/src/lib/components/theme-mode-switcher.d.ts +38 -0
  131. package/src/lib/components/theme-mode-switcher.js +168 -0
  132. package/src/lib/components/theme-mode-switcher.js.map +1 -0
  133. package/src/lib/components/toolbar.d.ts +37 -0
  134. package/src/lib/components/toolbar.js +117 -0
  135. package/src/lib/components/toolbar.js.map +1 -0
  136. package/src/lib/components/typography.d.ts +33 -0
  137. package/src/lib/components/typography.js +433 -0
  138. package/src/lib/components/typography.js.map +1 -0
  139. package/src/lib/components/video-lightbox-controls.d.ts +131 -0
  140. package/src/lib/components/video-lightbox-controls.js +536 -0
  141. package/src/lib/components/video-lightbox-controls.js.map +1 -0
  142. package/src/lib/components/video-lightbox.d.ts +60 -0
  143. package/src/lib/components/video-lightbox.js +247 -0
  144. package/src/lib/components/video-lightbox.js.map +1 -0
  145. package/src/lib/components/video-playback-beacon.d.ts +80 -0
  146. package/src/lib/components/video-playback-beacon.js +128 -0
  147. package/src/lib/components/video-playback-beacon.js.map +1 -0
  148. package/src/lib/components/video-player-frame.d.ts +58 -0
  149. package/src/lib/components/video-player-frame.js +51 -0
  150. package/src/lib/components/video-player-frame.js.map +1 -0
  151. package/src/lib/components/video.d.ts +220 -0
  152. package/src/lib/components/video.js +874 -0
  153. package/src/lib/components/video.js.map +1 -0
  154. package/src/lib/constants/bundle-common.d.ts +17 -0
  155. package/src/lib/constants/bundle-common.js +18 -0
  156. package/src/lib/constants/bundle-common.js.map +1 -0
  157. package/src/lib/constants/field-presets.d.ts +93 -0
  158. package/src/lib/constants/field-presets.js +248 -0
  159. package/src/lib/constants/field-presets.js.map +1 -0
  160. package/src/lib/plugin.d.ts +80 -0
  161. package/src/lib/plugin.js +599 -0
  162. package/src/lib/plugin.js.map +1 -0
  163. package/src/lib/utils/author-html-label.d.ts +73 -0
  164. package/src/lib/utils/author-html-label.js +89 -0
  165. package/src/lib/utils/author-html-label.js.map +1 -0
  166. package/src/lib/utils/drop-cleared-props.d.ts +18 -0
  167. package/src/lib/utils/drop-cleared-props.js +74 -0
  168. package/src/lib/utils/drop-cleared-props.js.map +1 -0
  169. package/src/lib/utils/element-picker.d.ts +99 -0
  170. package/src/lib/utils/element-picker.js +140 -0
  171. package/src/lib/utils/element-picker.js.map +1 -0
  172. package/src/lib/utils/generate-preset-id.d.ts +19 -0
  173. package/src/lib/utils/generate-preset-id.js +25 -0
  174. package/src/lib/utils/generate-preset-id.js.map +1 -0
  175. package/src/lib/utils/link-target-props.d.ts +53 -0
  176. package/src/lib/utils/link-target-props.js +53 -0
  177. package/src/lib/utils/link-target-props.js.map +1 -0
@@ -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
+ import * as Aglyn from '@aglyn/aglyn';
18
+ import { type StackProps } from '@mui/material/Stack';
19
+ export declare const ENTRIES_ID: Aglyn.ComponentId;
20
+ export declare const ENTRY_BODY_ID: Aglyn.ComponentId;
21
+ export declare const RELATED_ID: Aglyn.ComponentId;
22
+ export declare const SHARE_ID: Aglyn.ComponentId;
23
+ export declare const ENTRY_META_ID: Aglyn.ComponentId;
24
+ export declare const ENTRY_AUTHOR_ID: Aglyn.ComponentId;
25
+ export declare const CATEGORIES_ID: Aglyn.ComponentId;
26
+ export declare const SEARCH_ID: Aglyn.ComponentId;
27
+ export declare const AUTHOR_PROFILE_ID: Aglyn.ComponentId;
28
+ export interface CollectionEntriesProps extends StackProps {
29
+ /**
30
+ * Collection to repeat over (compose-time, AGL-551). Blank = the
31
+ * collection routed by the current URL on list-template screens.
32
+ */
33
+ collectionSlug?: string;
34
+ /** Maximum entries rendered (compose-time; blank = all, capped at 100). */
35
+ entriesLimit?: number | string;
36
+ /**
37
+ * Only entries in this category repeat (compose-time, AGL-582).
38
+ * Matches the collection's category by stable id or display name.
39
+ */
40
+ filterCategory?: string;
41
+ /** Only entries carrying this tag repeat (compose-time, AGL-582). */
42
+ filterTag?: string;
43
+ /**
44
+ * Entries per page (compose-time, AGL-620). When set, the block renders one
45
+ * page window instead of the top `entriesLimit`; the built-in collection
46
+ * list uses this with the `page` from `/{collection}/page/{n}`.
47
+ */
48
+ perPage?: number | string;
49
+ /** 1-based page for `perPage` (compose-time, AGL-620). */
50
+ page?: number | string;
51
+ /**
52
+ * Render this block only on page 1 of the routed listing (compose-time,
53
+ * AGL-1871). For a LEAD card — a block with no `perPage`, showing the top
54
+ * of the set — every `/{collection}/page/{n}` past the first otherwise
55
+ * repeats the identical entry above a page of different ones.
56
+ *
57
+ * Opt-in and default off: a block that legitimately belongs on every page
58
+ * of a listing (a "popular posts" rail) has exactly the same shape.
59
+ */
60
+ firstPageOnly?: boolean;
61
+ /**
62
+ * Show a search box that filters the RENDERED entries by title/excerpt as
63
+ * the reader types (AGL-1516, Figma 494:1220). Opt-in and default off, so
64
+ * every existing instance renders exactly as before.
65
+ *
66
+ * Client-evaluated over the entries this block already holds — the page is
67
+ * ISR-cached, so a keystroke never costs a Firestore read. That set is
68
+ * whatever the expansion left the block holding, which paging, an
69
+ * `entriesLimit` or the 100-entry cap can each cut down. A truncated block
70
+ * says so under its results either way — on a miss and on a hit
71
+ * (AGL-1516, AGL-2569) — rather than pretending global search.
72
+ */
73
+ search?: boolean;
74
+ /**
75
+ * What the search box DOES with a query (AGL-1525, Figma 496:1218).
76
+ *
77
+ * - `filter` (default, and the reading of an absent value) — hides the
78
+ * non-matching cards in place. What AGL-1516 shipped.
79
+ * - `suggest` — the card grid stays exactly as it was and a floating panel
80
+ * of matching entries opens under the field, ending in a link to the
81
+ * site-wide results page. The frame's toolbar behaviour: a reader
82
+ * skimming the list is not made to lose it to a typo.
83
+ */
84
+ searchMode?: CollectionSearchMode;
85
+ /** Hint text inside the search box (blank = "Search posts…"). */
86
+ searchPlaceholder?: string;
87
+ /**
88
+ * Server-stamped matchable text per rendered entry
89
+ * (`expandCollectionEntries`, AGL-1516); never set by hand.
90
+ */
91
+ searchIndex?: Aglyn.CollectionEntrySearchItem[];
92
+ /**
93
+ * How many entries `searchIndex` was drawn from — server-stamped by
94
+ * `expandCollectionEntries` alongside it (AGL-1516), never set by hand.
95
+ * `searchIndex.length < searchTotal` is the only honest test of whether
96
+ * this block holds the whole set; `perPage` is not, because
97
+ * `entriesLimit` and the 100-entry cap truncate too.
98
+ */
99
+ searchTotal?: number;
100
+ /**
101
+ * Whether the read behind `searchTotal` reached its own bound — server-
102
+ * stamped beside it (AGL-1516), never set by hand.
103
+ *
104
+ * `searchTotal` is a count of what the server SAW, and the collection read
105
+ * is limited. Without this flag a block holding 100 of 400 posts satisfies
106
+ * `searchIndex.length === searchTotal` and renders the one empty state that
107
+ * claims to have looked everywhere.
108
+ */
109
+ searchCapped?: boolean;
110
+ }
111
+ /** The two things the toolbar search box can do (AGL-1516/AGL-1525). */
112
+ export type CollectionSearchMode = 'filter' | 'suggest';
113
+ /**
114
+ * Author-facing choices for {@link CollectionEntriesProps.searchMode}.
115
+ *
116
+ * Both values are truthy on purpose (AGL-1453): `''` cannot survive a save,
117
+ * so an author who tried the other mode would have no route back. "Filter"
118
+ * carries the absent-value reading, which is what every block published
119
+ * before AGL-1525 has.
120
+ */
121
+ export declare const COLLECTION_SEARCH_MODE_OPTIONS: ReadonlyArray<{
122
+ value: CollectionSearchMode;
123
+ label: string;
124
+ }>;
125
+ /**
126
+ * Repeats its children once per published entry of a content collection
127
+ * (AGL-551) — the collections sibling of the dataset repeatable. The tenant
128
+ * expands it at compose time with `{{entry.*}}` tokens; in the besigner the
129
+ * template renders once with literal tokens, matching the repeatable UX.
130
+ *
131
+ * Search (AGL-1516): with `search` on, a toolbar search box filters the
132
+ * rendered entry clones client-side against the server-stamped
133
+ * `searchIndex` — fuzzy, via the same Fuse the icon picker uses. The clones
134
+ * arrive as `children` in stamp order, one group of template roots per
135
+ * entry, so group N of the children IS entry N of the index. Matches keep
136
+ * the list's own order rather than Fuse's score order: a blog list is
137
+ * chronological, and search narrows it, it does not reshuffle it. In the
138
+ * besigner the field renders as an inert affordance (the template renders
139
+ * once with literal tokens and there is no index to search), matching how
140
+ * Category Pills go inert on editing surfaces.
141
+ */
142
+ declare const CollectionEntries: import("react").ForwardRefExoticComponent<Omit<CollectionEntriesProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
143
+ export declare const collectionEntriesSchema: Aglyn.ComponentSchema<CollectionEntriesProps>;
144
+ export interface CollectionEntryBodyProps {
145
+ /**
146
+ * Markdown-lite source. On entry-template screens `{{entry.body}}`
147
+ * resolves to the rendered entry's body at compose time.
148
+ */
149
+ markdown?: string;
150
+ /**
151
+ * The pixel pair of each library image this body names, keyed by the target
152
+ * as the body writes it, stamped by the composition from the assets' DAM
153
+ * records (AGL-3149) — never set by hand, and never on the template, where
154
+ * `markdown` is still the `{{entry.body}}` token and names no asset.
155
+ */
156
+ intrinsicSizes?: Record<string, {
157
+ width: number;
158
+ height: number;
159
+ }>;
160
+ }
161
+ /**
162
+ * Renders a content entry's markdown-lite body as themed MUI elements
163
+ * (AGL-551): headings, paragraphs, lists, and images pick up the site
164
+ * theme's typography instead of the old unthemed article HTML. Parsing is
165
+ * pure, so the full body server-renders (SEO keeps the article text).
166
+ */
167
+ declare const CollectionEntryBody: import("react").ForwardRefExoticComponent<CollectionEntryBodyProps & import("react").RefAttributes<HTMLDivElement>>;
168
+ export declare const collectionEntryBodySchema: Aglyn.ComponentSchema<CollectionEntryBodyProps>;
169
+ /** How the related posts are laid out (AGL-1457). */
170
+ export type CollectionRelatedLayout = 'list' | 'cards';
171
+ /** One related post as stamped by the compose pipeline (AGL-582). */
172
+ export interface CollectionRelatedProps extends StackProps {
173
+ /** Section heading; empty string hides it. */
174
+ heading?: string;
175
+ /** Compose-time: most related posts listed (default 3). */
176
+ limit?: number | string;
177
+ /**
178
+ * Emit each entry's cover image (AGL-1457). OFF is the default and the
179
+ * shipped behaviour — the block is live on every blog entry, so turning
180
+ * covers on by default would restyle published pages nobody asked about.
181
+ */
182
+ showCover?: boolean;
183
+ /**
184
+ * `list` (default) is the plain-link list that has always shipped; `cards`
185
+ * is the article frame's grid of cover + category chip + title.
186
+ */
187
+ layout?: CollectionRelatedLayout;
188
+ /** Columns in the `cards` grid (default 3, the frame's 3-up). */
189
+ columns?: number | string;
190
+ /**
191
+ * Type step the section heading reads at (default `h5`). One of the
192
+ * theme's own rungs, shared with the Typography element — a heading sized
193
+ * by hand in the Styles panel is the pixel-typing the tokens exist to stop.
194
+ */
195
+ headingVariant?: string;
196
+ /**
197
+ * Type step each card title reads at (default `subtitle1`, what the block
198
+ * has always emitted). The title is the block's own markup, so the Styles
199
+ * panel — which edits the node's root — cannot reach it; this is the only
200
+ * handle on it.
201
+ */
202
+ titleVariant?: string;
203
+ /** Show each post's published date. On is the shipped behaviour. */
204
+ showDate?: boolean;
205
+ /**
206
+ * How each card's published date reads (AGL-1459) — a COMPOSE-TIME prop
207
+ * like {@link limit}: it is answered in `expandCollectionRelated`, where
208
+ * the timestamp still exists, and never reaches the DOM. Blank, or
209
+ * `default`, is the locale date the block has always emitted.
210
+ *
211
+ * Read here too, but only to date the SAMPLE cards: an editing surface has
212
+ * no routed entry and therefore no server fill, so the picker would
213
+ * otherwise preview nothing.
214
+ */
215
+ dateFormat?: Aglyn.CollectionEntryDateFormat;
216
+ /** Show each post's category. On is the shipped behaviour. */
217
+ showCategory?: boolean;
218
+ /**
219
+ * Show each post's excerpt. OFF is the default and the shipped behaviour:
220
+ * the excerpt has been stamped onto every related item since AGL-582 and
221
+ * rendered by nothing, so turning it on by default would add a paragraph
222
+ * to every published entry nobody asked about.
223
+ */
224
+ showExcerpt?: boolean;
225
+ /**
226
+ * Server-stamped related posts (`expandCollectionRelated`); never set by
227
+ * hand — the tenant computes it from the current entry's category/tags.
228
+ */
229
+ entries?: Aglyn.CollectionRelatedItem[];
230
+ }
231
+ /**
232
+ * Lists other entries of the same collection sharing the current entry's
233
+ * category or a tag (AGL-582). The tenant stamps `entries` at compose time
234
+ * on entry renders; without them the published site renders nothing and an
235
+ * editing surface renders sample cards (AGL-2486).
236
+ *
237
+ * Two layouts (AGL-1457). `list` is the plain-link list that has always
238
+ * shipped and stays the default — the block is live on every blog entry, so
239
+ * a new default would restyle published pages nobody asked about. `cards` is
240
+ * the article frame's grid: cover, category chip, title, at an author-set
241
+ * column count.
242
+ *
243
+ * The block owns its markup, so nothing inside a card is a node the Styles
244
+ * panel can select. Every part it renders therefore needs an attribute, or
245
+ * it is unauthorable by construction — which is what the type steps and the
246
+ * `show*` switches are (AGL-2486).
247
+ */
248
+ declare const CollectionRelated: import("react").ForwardRefExoticComponent<Omit<CollectionRelatedProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
249
+ export declare const collectionRelatedSchema: Aglyn.ComponentSchema<CollectionRelatedProps>;
250
+ export interface CollectionShareProps extends StackProps {
251
+ /** Heading before the buttons; empty string hides it. */
252
+ heading?: string;
253
+ }
254
+ /**
255
+ * Share buttons for the CURRENT page URL (AGL-582): X, LinkedIn, Facebook,
256
+ * and copy-link. Pure client behavior — the URL is read at click time so
257
+ * SSR and besigner renders stay markup-identical; editing surfaces no-op.
258
+ */
259
+ declare const CollectionShare: import("react").ForwardRefExoticComponent<Omit<CollectionShareProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
260
+ export declare const collectionShareSchema: Aglyn.ComponentSchema<CollectionShareProps>;
261
+ export interface CollectionEntryMetaProps extends StackProps {
262
+ /**
263
+ * Published date. Server-filled from the routed entry on entry templates
264
+ * (`expandCollectionEntryMeta`, AGL-1385); set it — or bind
265
+ * `{{entry.date}}` — only to override.
266
+ */
267
+ date?: string;
268
+ /**
269
+ * How {@link date} reads when the server fills it in (AGL-1459) — a
270
+ * COMPOSE-TIME prop, like Related Posts' `limit`: it is answered where the
271
+ * timestamp still exists (`expandCollectionEntryMeta`) and never reaches the
272
+ * DOM. Blank, or `default`, is the locale date the block has always emitted.
273
+ */
274
+ dateFormat?: Aglyn.CollectionEntryDateFormat;
275
+ /**
276
+ * Byline (AGL-1459). Server-filled from the entry's own author on entry
277
+ * templates, exactly like {@link date}; set it — or bind `{{entry.author}}`
278
+ * — only to override.
279
+ */
280
+ author?: string;
281
+ /** Category; server-filled, or bind `{{entry.category}}` to override. */
282
+ category?: string;
283
+ /** Comma-joined tags; server-filled, or bind `{{entry.tags}}`. */
284
+ tags?: string;
285
+ /**
286
+ * Round avatar shown before the byline (AGL-1459) — a media-picker target,
287
+ * so it holds a media reference (AGL-1215) as well as any URL form.
288
+ *
289
+ * A block-level pick, deliberately, and NOT a per-author image: entries
290
+ * carry an author NAME (`authorName`) and no portrait field, so a per-author
291
+ * avatar would need a schema decision on the entry model plus an editor
292
+ * field to fill it. Until then this is the site's brand mark, chosen once on
293
+ * the template — which is what the article frame actually asks for. Left
294
+ * unset it renders nothing at all, never a broken image.
295
+ */
296
+ avatarImage?: string;
297
+ showDate?: boolean;
298
+ showAuthor?: boolean;
299
+ /**
300
+ * Where the byline's NAME links — the author's page on this site
301
+ * (AGL-2519). Server-filled from the routed entry's author, like the
302
+ * avatar beside it; blank renders the name as plain text.
303
+ *
304
+ * Distinct from the author's own `url`, which the Entry Author card offers
305
+ * as a link row: this is "everything they wrote here", that is "their
306
+ * site", and a byline that conflated them would send a reader off-site from
307
+ * every article.
308
+ */
309
+ authorPageUrl?: string;
310
+ /** Off leaves the byline as plain text even when the author has a page. */
311
+ linkAuthor?: boolean;
312
+ showCategory?: boolean;
313
+ showTags?: boolean;
314
+ showAvatar?: boolean;
315
+ }
316
+ /**
317
+ * "{{entry.date}} · {{entry.category}}" meta line plus tag chips
318
+ * (AGL-582). Values arrive through entry tokens on entry renders; on other
319
+ * surfaces unresolved tokens collapse to nothing instead of leaking.
320
+ *
321
+ * On an entry template the tenant now also FILLS the three values from the
322
+ * routed entry when nothing is bound (`expandCollectionEntryMeta`, AGL-1385).
323
+ * Before that, a block dragged from the palette rather than dropped as the
324
+ * preset had no values at all — three "Show" switches gating nothing — and
325
+ * rendered as the empty `<Box>` below, at height 0.
326
+ */
327
+ declare const CollectionEntryMeta: import("react").ForwardRefExoticComponent<Omit<CollectionEntryMetaProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
328
+ export declare const collectionEntryMetaSchema: Aglyn.ComponentSchema<CollectionEntryMetaProps>;
329
+ export interface CollectionEntryAuthorProps extends StackProps {
330
+ /**
331
+ * The byline. Server-filled from the routed entry's author record on entry
332
+ * templates (`expandCollectionEntryAuthor`), exactly like Entry Meta's
333
+ * fields; set it — or bind `{{entry.author}}` — only to override.
334
+ */
335
+ name?: string;
336
+ /**
337
+ * The author's blurb, from their record's `bio`; bind
338
+ * `{{entry.authorBio}}` to override.
339
+ */
340
+ bio?: string;
341
+ /**
342
+ * Portrait or logo — a media reference (AGL-1215) or any URL. Server-filled
343
+ * from the author record, so the face changes with the byline instead of
344
+ * being picked once on the template the way Entry Meta's avatar is.
345
+ */
346
+ image?: string;
347
+ /** The author's own site; offered as a link row beside the profile ones. */
348
+ url?: string;
349
+ /**
350
+ * The author's page on THIS site (AGL-2519), server-filled from the routed
351
+ * entry. The name links here.
352
+ *
353
+ * It wins over {@link url} for the NAME, and the ordering is the point: a
354
+ * reader who clicks a byline at the end of an article is asking "what else
355
+ * has this person written here", not "take me off this site". Their own
356
+ * url is still reachable — it is one of the link rows — so nothing is lost
357
+ * by giving the name the destination that answers the question asked.
358
+ */
359
+ pageUrl?: string;
360
+ /**
361
+ * The author's profile links, server-filled from their record (AGL-2516).
362
+ *
363
+ * Not authorable as text: each row carries a platform or a picked icon, and
364
+ * the console's author editor is where those are chosen. `Show links` is
365
+ * the template's control over them.
366
+ */
367
+ links?: Aglyn.ContentAuthorLink[];
368
+ showBio?: boolean;
369
+ showAvatar?: boolean;
370
+ showLinks?: boolean;
371
+ }
372
+ /**
373
+ * The author card that closes an article (AGL-2486) — portrait, byline, bio.
374
+ *
375
+ * Entry Meta prints a NAME beside a date, which is all an entry carried when
376
+ * it was written: one free-typed string. Custom authors made the byline a
377
+ * record with a portrait, a bio and a url, and a template that wanted the
378
+ * card the article frame draws still had to type the name and the blurb in as
379
+ * literal text — text that keeps saying whatever it said under posts somebody
380
+ * else wrote, and that no edit to the author record can ever reach. This is
381
+ * that card, filled from the record.
382
+ *
383
+ * Every field is independently overridable and every one of them collapses
384
+ * when empty: an author with no portrait renders the text alone rather than a
385
+ * gap where a face would be, and an entry with no author at all renders
386
+ * nothing — never an empty bordered box.
387
+ */
388
+ declare const CollectionEntryAuthor: import("react").ForwardRefExoticComponent<Omit<CollectionEntryAuthorProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
389
+ export declare const collectionEntryAuthorSchema: Aglyn.ComponentSchema<CollectionEntryAuthorProps>;
390
+ export interface ContentAuthorProfileProps extends StackProps {
391
+ /**
392
+ * The byline. Server-filled from the routed author on their own page
393
+ * (`expandContentAuthorProfile`); set it — or bind `{{author.name}}` —
394
+ * only to override.
395
+ */
396
+ name?: string;
397
+ /** The blurb from their record; bind `{{author.bio}}` to override. */
398
+ bio?: string;
399
+ /**
400
+ * Portrait or logo — a media reference (AGL-1215) or any URL, filled from
401
+ * the record so the face follows the person rather than the template.
402
+ */
403
+ image?: string;
404
+ /** Person only — what they do; blank on an Organization. */
405
+ jobTitle?: string;
406
+ /** Person only — who they write for. */
407
+ worksFor?: string;
408
+ /**
409
+ * Their OWN site. The name links here; blank renders it as plain text.
410
+ * This block already IS the author's page, so it does not link to itself.
411
+ */
412
+ url?: string;
413
+ /** Their profile links, server-filled from the record (AGL-2516). */
414
+ links?: Aglyn.ContentAuthorLink[];
415
+ showBio?: boolean;
416
+ showAvatar?: boolean;
417
+ showRole?: boolean;
418
+ showLinks?: boolean;
419
+ }
420
+ /**
421
+ * Who an author page is about (AGL-2518) — portrait, name, role, bio, links.
422
+ *
423
+ * The Entry Author card renders the same person as a footnote under an
424
+ * article. This renders them as the SUBJECT of a page, which is why it has
425
+ * the two fields that card has no room for: `jobTitle` and `worksFor` are
426
+ * what tell a stranger who they are looking at, and they are already on the
427
+ * record because `schema.org/Person` defines them (AGL-2486).
428
+ *
429
+ * Every field is independently overridable and every one collapses when
430
+ * empty, exactly as the card's do — an author with no portrait renders the
431
+ * text alone rather than a gap where a face would be. On an editing surface
432
+ * the block previews its own shape with sample text, because a template is
433
+ * designed before any author is routed through it.
434
+ */
435
+ declare const ContentAuthorProfile: import("react").ForwardRefExoticComponent<Omit<ContentAuthorProfileProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
436
+ export { ContentAuthorProfile };
437
+ export declare const contentAuthorProfileSchema: Aglyn.ComponentSchema<ContentAuthorProfileProps>;
438
+ export interface CollectionCategoriesProps extends StackProps {
439
+ /**
440
+ * Collection whose taxonomy renders (compose-time). Blank = the collection
441
+ * routed by the current URL on list-template screens.
442
+ */
443
+ collectionSlug?: string;
444
+ /**
445
+ * Label for the unfiltered pill (default "All"). Clearing the field
446
+ * persists `Aglyn.COLLECTION_ALL_PILL_NONE`, which omits the pill —
447
+ * `''` cannot be stored at all (AGL-1336).
448
+ */
449
+ allLabel?: string;
450
+ /**
451
+ * Server-stamped pill links (`expandCollectionCategories`); never set by
452
+ * hand — the tenant builds them from the collection's categories and the
453
+ * routed category.
454
+ */
455
+ items?: Aglyn.CollectionCategoryLink[];
456
+ }
457
+ /**
458
+ * The category filter row for a collection listing (AGL-1321): "All" plus one
459
+ * pill per category, each a REAL anchor to `/{collection}/category/{slug}`.
460
+ *
461
+ * Anchors, not click handlers, and that is the whole design. A JS-only toggle
462
+ * would be invisible to crawlers, unopenable in a new tab, unlinkable, and
463
+ * unreachable without hydration — and it could not exist anyway, since the
464
+ * filter is resolved server-side before the page is composed. The pill the
465
+ * current URL selected carries `aria-current="page"`, stamped on the server so
466
+ * it is in the HTML rather than derived after hydration.
467
+ */
468
+ declare const CollectionCategories: import("react").ForwardRefExoticComponent<Omit<CollectionCategoriesProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
469
+ export declare const collectionCategoriesSchema: Aglyn.ComponentSchema<CollectionCategoriesProps>;
470
+ export interface CollectionSearchProps extends StackProps {
471
+ /**
472
+ * Collection whose entries this box searches (compose-time). Blank = the
473
+ * collection routed by the current URL on list-template screens.
474
+ */
475
+ collectionSlug?: string;
476
+ /** Hint text inside the box (blank = "Search posts…"). */
477
+ searchPlaceholder?: string;
478
+ /**
479
+ * Server-stamped matchable text per entry (`expandCollectionSearch`);
480
+ * never set by hand.
481
+ */
482
+ searchIndex?: Aglyn.CollectionEntrySearchItem[];
483
+ /** How many entries the index was drawn from; never set by hand. */
484
+ searchTotal?: number;
485
+ /** Whether that read reached its bound; never set by hand. */
486
+ searchCapped?: boolean;
487
+ }
488
+ /**
489
+ * A search box for a collection that lives where the author puts it
490
+ * (AGL-1516, Figma 494:1220).
491
+ *
492
+ * The entries block has had a search box since AGL-1516's first half, and it
493
+ * renders inside that block — first child of its own stack. The frame puts
494
+ * the field in the listing's TOOLBAR: category pills on the left, search and
495
+ * RSS on the right, one row. That was unbuildable, and unbuildable in both
496
+ * directions — a block's own child cannot be lifted out of it, and the pills
497
+ * cannot be moved in, because every child of an entries block is cloned once
498
+ * per entry. Three passes of authoring hit the same wall.
499
+ *
500
+ * So the field became its own block. It searches the collection the listing
501
+ * beside it is drawn from, and answers with the suggestion panel (496:1218)
502
+ * — the only behaviour a standalone box can honestly have, since it owns no
503
+ * cards to hide. Enter submits to the site-wide results page, so the box
504
+ * works with no JavaScript at all.
505
+ *
506
+ * Inert on editing surfaces, like Category Pills: the besigner has no index
507
+ * to search, and a field that answered there would be answering about
508
+ * nothing.
509
+ */
510
+ declare const CollectionSearch: import("react").ForwardRefExoticComponent<Omit<CollectionSearchProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
511
+ export declare const collectionSearchSchema: Aglyn.ComponentSchema<CollectionSearchProps>;
512
+ export declare const collectionPresets: Aglyn.PresetSchema[];
513
+ export { CollectionCategories, CollectionEntries, CollectionEntryAuthor, CollectionEntryBody, CollectionEntryMeta, CollectionRelated, CollectionSearch, CollectionShare, };
514
+ export default CollectionEntries;