@aglyn/plugins-mui 1.0.0-beta.215 → 1.0.0-beta.216

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 (57) hide show
  1. package/package.json +7 -7
  2. package/src/lib/components/collection-author-links.d.ts +41 -0
  3. package/src/lib/components/collection-author-links.js +135 -0
  4. package/src/lib/components/collection-author-links.js.map +1 -0
  5. package/src/lib/components/collection-author-profile.d.ts +67 -0
  6. package/src/lib/components/collection-author-profile.js +269 -0
  7. package/src/lib/components/collection-author-profile.js.map +1 -0
  8. package/src/lib/components/collection-categories.d.ts +52 -0
  9. package/src/lib/components/collection-categories.js +163 -0
  10. package/src/lib/components/collection-categories.js.map +1 -0
  11. package/src/lib/components/collection-common.d.ts +104 -0
  12. package/src/lib/components/collection-common.js +95 -0
  13. package/src/lib/components/collection-common.js.map +1 -0
  14. package/src/lib/components/collection-entries.d.ts +137 -0
  15. package/src/lib/components/collection-entries.js +358 -0
  16. package/src/lib/components/collection-entries.js.map +1 -0
  17. package/src/lib/components/collection-entry-author.d.ts +81 -0
  18. package/src/lib/components/collection-entry-author.js +259 -0
  19. package/src/lib/components/collection-entry-author.js.map +1 -0
  20. package/src/lib/components/collection-entry-body.d.ts +44 -0
  21. package/src/lib/components/collection-entry-body.js +328 -0
  22. package/src/lib/components/collection-entry-body.js.map +1 -0
  23. package/src/lib/components/collection-entry-meta.d.ts +88 -0
  24. package/src/lib/components/collection-entry-meta.js +331 -0
  25. package/src/lib/components/collection-entry-meta.js.map +1 -0
  26. package/src/lib/components/collection-presets.d.ts +18 -0
  27. package/src/lib/components/collection-presets.js +328 -0
  28. package/src/lib/components/collection-presets.js.map +1 -0
  29. package/src/lib/components/collection-related.d.ts +101 -0
  30. package/src/lib/components/collection-related.js +536 -0
  31. package/src/lib/components/collection-related.js.map +1 -0
  32. package/src/lib/components/collection-search-box.d.ts +92 -0
  33. package/src/lib/components/collection-search-box.js +334 -0
  34. package/src/lib/components/collection-search-box.js.map +1 -0
  35. package/src/lib/components/collection-search-fuse.d.ts +28 -0
  36. package/src/lib/components/collection-search-fuse.js +28 -0
  37. package/src/lib/components/collection-search-fuse.js.map +1 -0
  38. package/src/lib/components/collection-search.d.ts +62 -0
  39. package/src/lib/components/collection-search.js +140 -0
  40. package/src/lib/components/collection-search.js.map +1 -0
  41. package/src/lib/components/collection-share.d.ts +31 -0
  42. package/src/lib/components/collection-share.js +154 -0
  43. package/src/lib/components/collection-share.js.map +1 -0
  44. package/src/lib/components/collection.d.ts +19 -497
  45. package/src/lib/components/collection.js +19 -2982
  46. package/src/lib/components/collection.js.map +1 -1
  47. package/src/lib/components/image-list.d.ts +2 -2
  48. package/src/lib/components/image-list.js +4 -6
  49. package/src/lib/components/image-list.js.map +1 -1
  50. package/src/lib/element-tier.d.ts +9 -1
  51. package/src/lib/element-tier.js +12 -1
  52. package/src/lib/element-tier.js.map +1 -1
  53. package/src/lib/plugin.js +20 -12
  54. package/src/lib/plugin.js.map +1 -1
  55. package/src/lib/utils/to-count.d.ts +25 -0
  56. package/src/lib/utils/to-count.js +30 -0
  57. package/src/lib/utils/to-count.js.map +1 -0
@@ -0,0 +1,331 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ import { _ as _object_without_properties_loose } from "@swc/helpers/_/_object_without_properties_loose";
3
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
4
+ /**
5
+ * @license
6
+ * Copyright 2026 Aglyn LLC
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ */ import * as Aglyn from "@aglyn/aglyn";
20
+ import { mdiTagOutline } from "@aglyn/shared-data-mdi";
21
+ import { AppLink } from "@aglyn/shared-ui-jsx";
22
+ import Box from "@mui/material/Box";
23
+ import Chip from "@mui/material/Chip";
24
+ import MuiStack from "@mui/material/Stack";
25
+ import Typography from "@mui/material/Typography";
26
+ import { forwardRef, useContext } from "react";
27
+ import { BUNDLE_ID } from "../constants/bundle-common.js";
28
+ import { UNRESOLVED_TOKEN, ENTRY_SAMPLE_PUBLISHED_AT, ENTRY_SAMPLE_AUTHOR, ENTRY_SAMPLE_CATEGORY, ENTRY_SAMPLE_TAGS, samplePortraitSx, metaValue, SAFE_AUTHOR_HREF } from "./collection-common.js";
29
+ // Persisted component id (AGL-551/582); the compose pipeline references it
30
+ // through the @aglyn/aglyn constant. Never rename.
31
+ export const ENTRY_META_ID = Aglyn.COLLECTION_ENTRY_META_COMPONENT_ID;
32
+ /** Byline avatar, from the article frame (Figma 170:190). */ const ENTRY_AVATAR_SIZE = 36;
33
+ /**
34
+ * "{{entry.date}} · {{entry.category}}" meta line plus tag chips
35
+ * (AGL-582). Values arrive through entry tokens on entry renders; on other
36
+ * surfaces unresolved tokens collapse to nothing instead of leaking.
37
+ *
38
+ * On an entry template the tenant now also FILLS the three values from the
39
+ * routed entry when nothing is bound (`expandCollectionEntryMeta`, AGL-1385).
40
+ * Before that, a block dragged from the palette rather than dropped as the
41
+ * preset had no values at all — three "Show" switches gating nothing — and
42
+ * rendered as the empty `<Box>` below, at height 0.
43
+ */ const CollectionEntryMeta = /*#__PURE__*/ forwardRef((props, ref)=>{
44
+ const { date, // Compose-time (AGL-1459): read by `expandCollectionEntryMeta`, which has
45
+ // the timestamp. Destructured so it never reaches the DOM.
46
+ dateFormat: _dateFormat, author, authorPageUrl, linkAuthor, category, tags, avatarImage, showDate, showAuthor, showCategory, showTags, showAvatar } = props, rest = _object_without_properties_loose(props, [
47
+ "date",
48
+ "dateFormat",
49
+ "author",
50
+ "authorPageUrl",
51
+ "linkAuthor",
52
+ "category",
53
+ "tags",
54
+ "avatarImage",
55
+ "showDate",
56
+ "showAuthor",
57
+ "showCategory",
58
+ "showTags",
59
+ "showAvatar"
60
+ ]);
61
+ // Node styles ride the renderer-merged sx; recompose (stack.ts pattern).
62
+ const nodeSx = Array.isArray(props['sx']) ? props['sx'] : [
63
+ props['sx']
64
+ ];
65
+ const { suppressNavigation } = useContext(Aglyn.ScreenLinkContext);
66
+ // The resolver every other surface shares (AGL-1215), so one media
67
+ // reference keeps working across sites. A hook — before any early return.
68
+ const { hostId } = Aglyn.useSite();
69
+ const dateValue = showDate !== false ? metaValue(date, suppressNavigation) : '';
70
+ const authorValue = showAuthor !== false ? metaValue(author, suppressNavigation) : '';
71
+ const categoryValue = showCategory !== false ? metaValue(category, suppressNavigation) : '';
72
+ const tagsValue = showTags !== false ? metaValue(tags, suppressNavigation) : '';
73
+ const tagList = tagsValue.split(',').map((tag)=>tag.trim()).filter(Boolean);
74
+ // An unresolved token empties on EVERY surface here, unlike the text
75
+ // fields: a literal `{{…}}` in a src is a broken image in the canvas, and a
76
+ // byline that renders a broken avatar on every post is worse than no
77
+ // avatar at all.
78
+ const avatarRaw = (avatarImage != null ? avatarImage : '').trim();
79
+ const avatarSrc = showAvatar !== false && avatarRaw && !UNRESOLVED_TOKEN.test(avatarRaw) ? Aglyn.resolveMediaSrc(avatarRaw, {
80
+ hostId
81
+ }) : '';
82
+ // Author leads, so the frame's "The Aglyn Team · Jul 2026" reads in that
83
+ // order. With no author the join is character-for-character what it was.
84
+ const filledLine = [
85
+ authorValue,
86
+ dateValue,
87
+ categoryValue
88
+ ].filter(Boolean).join(' · ');
89
+ /*
90
+ The rest of the line, WITHOUT the author (AGL-2519).
91
+
92
+ The row is one string everywhere else, which is what a `·`-joined byline
93
+ wants — but a link is an element, so the author has to come out of the
94
+ join to be one. Split rather than reassembled from parts, so the
95
+ separator, the order and the empty-field collapsing all stay in the one
96
+ expression above: the linked row and the plain row cannot render a
97
+ different sentence.
98
+ */ const authorHrefRaw = metaValue(authorPageUrl, suppressNavigation);
99
+ const authorHref = linkAuthor !== false && SAFE_AUTHOR_HREF.test(authorHrefRaw) ? authorHrefRaw : '';
100
+ const trailingLine = [
101
+ dateValue,
102
+ categoryValue
103
+ ].filter(Boolean).join(' · ');
104
+ // Nothing to show and nothing to route from: an editing surface previews
105
+ // the block's own markup at the author's own settings, and a published page
106
+ // renders nothing at all (AGL-2486). The switches are honoured here exactly
107
+ // as they are below, so a row with Show date off previews without one.
108
+ const sample = !filledLine && !tagList.length && !avatarSrc && suppressNavigation;
109
+ const line = sample ? [
110
+ showAuthor !== false ? ENTRY_SAMPLE_AUTHOR : '',
111
+ showDate !== false ? Aglyn.formatCollectionEntryDate(ENTRY_SAMPLE_PUBLISHED_AT, Aglyn.normalizeCollectionEntryDateFormat(_dateFormat)) : '',
112
+ showCategory !== false ? ENTRY_SAMPLE_CATEGORY : ''
113
+ ].filter(Boolean).join(' · ') : filledLine;
114
+ const chips = sample ? showTags !== false ? ENTRY_SAMPLE_TAGS.split(',').map((tag)=>tag.trim()) : [] : tagList;
115
+ // The portrait an entry's own author record supplies arrives at compose
116
+ // time, so on the canvas there is none to resolve — the slot is drawn
117
+ // instead, which is what a byline's spacing is actually built around.
118
+ const samplePortrait = sample && showAvatar !== false;
119
+ if (!line && !chips.length && !avatarSrc && !samplePortrait) {
120
+ return /*#__PURE__*/ _jsx(Box, _extends({
121
+ ref: ref
122
+ }, rest));
123
+ }
124
+ return /*#__PURE__*/ _jsxs(MuiStack, _extends({
125
+ ref: ref,
126
+ direction: "row",
127
+ spacing: 1
128
+ }, rest, {
129
+ // MERGE, never replace (AGL-1450, same class as AGL-1284). `rest.sx`
130
+ // is the ARRAY `mergeSxProps` builds in leaf.tsx, so spreading it into
131
+ // an object produced `{0: …, 1: …, 2: …}` — numeric keys emotion emits
132
+ // as invalid selectors — and discarded EVERY authored property while
133
+ // these two defaults still applied. The block looked deliberately
134
+ // styled, so nothing suggested the value had been dropped. Defaults
135
+ // go first; the node's slice comes after and can override them.
136
+ sx: [
137
+ {
138
+ alignItems: 'center',
139
+ flexWrap: 'wrap'
140
+ },
141
+ ...nodeSx
142
+ ],
143
+ children: [
144
+ avatarSrc ? /*#__PURE__*/ _jsx(Box, _extends({
145
+ component: "img",
146
+ src: avatarSrc,
147
+ // Decorative: the byline names the author in text right beside it,
148
+ // so a screen reader announcing the mark again is noise.
149
+ alt: "",
150
+ sx: {
151
+ display: 'block',
152
+ width: ENTRY_AVATAR_SIZE,
153
+ height: ENTRY_AVATAR_SIZE,
154
+ borderRadius: '50%',
155
+ objectFit: 'cover'
156
+ }
157
+ }, Aglyn.DEFERRED_IMAGE_ATTRIBUTES)) : samplePortrait ? /*#__PURE__*/ _jsx(Box, {
158
+ "aria-hidden": true,
159
+ sx: samplePortraitSx(ENTRY_AVATAR_SIZE)
160
+ }) : null,
161
+ line ? /*#__PURE__*/ _jsx(Typography, {
162
+ variant: "caption",
163
+ sx: {
164
+ color: 'text.secondary'
165
+ },
166
+ children: // Linked only on the real byline, never on the canvas sample: a
167
+ // preview whose placeholder name navigates is a trap, and the
168
+ // sample author has no page to go to.
169
+ authorHref && authorValue && !sample ? /*#__PURE__*/ _jsxs(_Fragment, {
170
+ children: [
171
+ /*#__PURE__*/ _jsx(AppLink, {
172
+ href: authorHref,
173
+ sx: {
174
+ color: 'inherit'
175
+ },
176
+ underline: "hover",
177
+ children: authorValue
178
+ }),
179
+ trailingLine ? ` · ${trailingLine}` : ''
180
+ ]
181
+ }) : line
182
+ }) : null,
183
+ chips.map((tag)=>/*#__PURE__*/ _jsx(Chip, {
184
+ label: tag,
185
+ size: "small",
186
+ variant: "outlined"
187
+ }, tag))
188
+ ]
189
+ }));
190
+ });
191
+ CollectionEntryMeta.displayName = 'AglynCollectionEntryMeta';
192
+ export const collectionEntryMetaSchema = {
193
+ $id: ENTRY_META_ID,
194
+ pluginId: BUNDLE_ID,
195
+ displayName: 'Entry Meta',
196
+ description: 'The byline row for an entry — author, date, category and tags.',
197
+ category: Aglyn.ComponentCategory.TEXT,
198
+ icon: {
199
+ path: mdiTagOutline.path,
200
+ sx: {
201
+ color: 'secondary.main'
202
+ }
203
+ },
204
+ flags: {
205
+ selfClosing: Aglyn.FEATURE_FLAG.ENABLED
206
+ },
207
+ attributes: [
208
+ {
209
+ name: 'date',
210
+ label: 'Date',
211
+ description: 'Blank shows the entry’s own published date on entry templates. ' + 'Type here (or bind {{entry.date}}) only to override it.',
212
+ component: Aglyn.FieldComponentType.TEXT_FIELD
213
+ },
214
+ {
215
+ name: 'dateFormat',
216
+ label: 'Date format',
217
+ description: 'How the published date reads. Site default is the format this ' + 'block has always used; it has no effect on a Date you typed in ' + 'yourself.',
218
+ component: Aglyn.FieldComponentType.SELECT,
219
+ // The formats the pure layer knows how to produce, so the list cannot
220
+ // offer a shape nothing renders. Every value is REAL — including the
221
+ // do-nothing one (AGL-1451/AGL-1453): `''` cannot survive a save, so
222
+ // an author who tried a format would have no route back.
223
+ options: [
224
+ ...Aglyn.COLLECTION_ENTRY_DATE_FORMAT_OPTIONS
225
+ ]
226
+ },
227
+ {
228
+ name: 'author',
229
+ label: 'Author',
230
+ description: 'Blank shows the entry’s own author. Type here (or bind ' + '{{entry.author}}) only to override it.',
231
+ component: Aglyn.FieldComponentType.TEXT_FIELD
232
+ },
233
+ {
234
+ name: 'category',
235
+ label: 'Category',
236
+ description: 'Blank shows the entry’s own category. Type here (or bind ' + '{{entry.category}}) only to override it.',
237
+ component: Aglyn.FieldComponentType.TEXT_FIELD
238
+ },
239
+ {
240
+ name: 'tags',
241
+ label: 'Tags',
242
+ description: 'Comma-separated. Blank shows the entry’s own tags; type here (or ' + 'bind {{entry.tags}}) only to override them.',
243
+ component: Aglyn.FieldComponentType.TEXT_FIELD
244
+ },
245
+ {
246
+ name: 'avatarImage',
247
+ label: 'Avatar',
248
+ description: 'Round image before the byline — your brand mark, or any image ' + 'from the media library. Blank shows no avatar.',
249
+ component: Aglyn.FieldComponentType.TEXT_FIELD
250
+ },
251
+ {
252
+ name: 'showDate',
253
+ label: 'Show date',
254
+ description: 'Off hides the published date from the line without clearing what ' + 'the Date field would have shown.',
255
+ component: Aglyn.FieldComponentType.SWITCH,
256
+ // Unset means SHOWN in the renderer above, so the switch has to
257
+ // OPEN in that position or it lies about the block in front of
258
+ // the author — and the first click, which writes the `true` that
259
+ // was already in effect, changes nothing and reads as a dead
260
+ // control (AGL-2506).
261
+ initialValue: true
262
+ },
263
+ {
264
+ name: 'showCategory',
265
+ label: 'Show category',
266
+ description: 'Off drops the category from the line. The entry keeps its ' + 'category — this is about the byline, not the taxonomy.',
267
+ component: Aglyn.FieldComponentType.SWITCH,
268
+ // Unset means SHOWN in the renderer above, so the switch has to
269
+ // OPEN in that position or it lies about the block in front of
270
+ // the author — and the first click, which writes the `true` that
271
+ // was already in effect, changes nothing and reads as a dead
272
+ // control (AGL-2506).
273
+ initialValue: true
274
+ },
275
+ {
276
+ name: 'showTags',
277
+ label: 'Show tags',
278
+ description: 'Off hides the tag chips below the line. Leave it on and the ' + 'other three off for a tags-only row.',
279
+ component: Aglyn.FieldComponentType.SWITCH,
280
+ // Unset means SHOWN in the renderer above, so the switch has to
281
+ // OPEN in that position or it lies about the block in front of
282
+ // the author — and the first click, which writes the `true` that
283
+ // was already in effect, changes nothing and reads as a dead
284
+ // control (AGL-2506).
285
+ initialValue: true
286
+ },
287
+ {
288
+ name: 'authorPageUrl',
289
+ label: 'Author links to',
290
+ description: 'Blank sends the byline to the author’s page on this site. Type ' + 'here (or bind {{entry.authorPageUrl}}) only to override it.',
291
+ component: Aglyn.FieldComponentType.TEXT_FIELD
292
+ },
293
+ {
294
+ name: 'linkAuthor',
295
+ label: 'Link author',
296
+ description: 'Off leaves the byline as plain text even when the author has a ' + 'page. On, the name links there and the date and category beside ' + 'it do not.',
297
+ component: Aglyn.FieldComponentType.SWITCH,
298
+ // Unset means LINKED in the renderer above, so the switch has to open
299
+ // in that position or it lies about the block in front of the author
300
+ // (AGL-2506).
301
+ initialValue: true
302
+ },
303
+ {
304
+ name: 'showAuthor',
305
+ label: 'Show author',
306
+ description: 'Off hides the byline. The avatar follows it: a block with no ' + 'author shown never fills in the author’s portrait.',
307
+ component: Aglyn.FieldComponentType.SWITCH,
308
+ // Unset means SHOWN in the renderer above, so the switch has to
309
+ // OPEN in that position or it lies about the block in front of
310
+ // the author — and the first click, which writes the `true` that
311
+ // was already in effect, changes nothing and reads as a dead
312
+ // control (AGL-2506).
313
+ initialValue: true
314
+ },
315
+ {
316
+ name: 'showAvatar',
317
+ label: 'Show avatar',
318
+ description: 'Off hides the round image in front of the byline, including an ' + 'author’s own portrait.',
319
+ component: Aglyn.FieldComponentType.SWITCH,
320
+ // Unset means SHOWN in the renderer above, so the switch has to
321
+ // OPEN in that position or it lies about the block in front of
322
+ // the author — and the first click, which writes the `true` that
323
+ // was already in effect, changes nothing and reads as a dead
324
+ // control (AGL-2506).
325
+ initialValue: true
326
+ }
327
+ ]
328
+ };
329
+ export { CollectionEntryMeta };
330
+
331
+ //# sourceMappingURL=collection-entry-meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/mui/src/lib/components/collection-entry-meta.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { mdiTagOutline } from '@aglyn/shared-data-mdi'\nimport { AppLink } from '@aglyn/shared-ui-jsx'\nimport Box from '@mui/material/Box'\nimport Chip from '@mui/material/Chip'\nimport MuiStack, { type StackProps } from '@mui/material/Stack'\nimport Typography from '@mui/material/Typography'\nimport { forwardRef, useContext } from 'react'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport {\n UNRESOLVED_TOKEN,\n ENTRY_SAMPLE_PUBLISHED_AT,\n ENTRY_SAMPLE_AUTHOR,\n ENTRY_SAMPLE_CATEGORY,\n ENTRY_SAMPLE_TAGS,\n samplePortraitSx,\n metaValue,\n SAFE_AUTHOR_HREF,\n} from './collection-common'\n\n// Persisted component id (AGL-551/582); the compose pipeline references it\n// through the @aglyn/aglyn constant. Never rename.\nexport const ENTRY_META_ID: Aglyn.ComponentId =\n Aglyn.COLLECTION_ENTRY_META_COMPONENT_ID\n\nexport interface CollectionEntryMetaProps extends StackProps {\n /**\n * Published date. Server-filled from the routed entry on entry templates\n * (`expandCollectionEntryMeta`, AGL-1385); set it — or bind\n * `{{entry.date}}` — only to override.\n */\n date?: string\n /**\n * How {@link date} reads when the server fills it in (AGL-1459) — a\n * COMPOSE-TIME prop, like Related Posts' `limit`: it is answered where the\n * timestamp still exists (`expandCollectionEntryMeta`) and never reaches the\n * DOM. Blank, or `default`, is the locale date the block has always emitted.\n */\n dateFormat?: Aglyn.CollectionEntryDateFormat\n /**\n * Byline (AGL-1459). Server-filled from the entry's own author on entry\n * templates, exactly like {@link date}; set it — or bind `{{entry.author}}`\n * — only to override.\n */\n author?: string\n /** Category; server-filled, or bind `{{entry.category}}` to override. */\n category?: string\n /** Comma-joined tags; server-filled, or bind `{{entry.tags}}`. */\n tags?: string\n /**\n * Round avatar shown before the byline (AGL-1459) — a media-picker target,\n * so it holds a media reference (AGL-1215) as well as any URL form.\n *\n * A block-level pick, deliberately, and NOT a per-author image: entries\n * carry an author NAME (`authorName`) and no portrait field, so a per-author\n * avatar would need a schema decision on the entry model plus an editor\n * field to fill it. Until then this is the site's brand mark, chosen once on\n * the template — which is what the article frame actually asks for. Left\n * unset it renders nothing at all, never a broken image.\n */\n avatarImage?: string\n showDate?: boolean\n showAuthor?: boolean\n /**\n * Where the byline's NAME links — the author's page on this site\n * (AGL-2519). Server-filled from the routed entry's author, like the\n * avatar beside it; blank renders the name as plain text.\n *\n * Distinct from the author's own `url`, which the Entry Author card offers\n * as a link row: this is \"everything they wrote here\", that is \"their\n * site\", and a byline that conflated them would send a reader off-site from\n * every article.\n */\n authorPageUrl?: string\n /** Off leaves the byline as plain text even when the author has a page. */\n linkAuthor?: boolean\n showCategory?: boolean\n showTags?: boolean\n showAvatar?: boolean\n}\n\n/** Byline avatar, from the article frame (Figma 170:190). */\nconst ENTRY_AVATAR_SIZE = 36\n\n/**\n * \"{{entry.date}} · {{entry.category}}\" meta line plus tag chips\n * (AGL-582). Values arrive through entry tokens on entry renders; on other\n * surfaces unresolved tokens collapse to nothing instead of leaking.\n *\n * On an entry template the tenant now also FILLS the three values from the\n * routed entry when nothing is bound (`expandCollectionEntryMeta`, AGL-1385).\n * Before that, a block dragged from the palette rather than dropped as the\n * preset had no values at all — three \"Show\" switches gating nothing — and\n * rendered as the empty `<Box>` below, at height 0.\n */\nconst CollectionEntryMeta = forwardRef<\n HTMLDivElement,\n CollectionEntryMetaProps\n>((props, ref) => {\n const {\n date,\n // Compose-time (AGL-1459): read by `expandCollectionEntryMeta`, which has\n // the timestamp. Destructured so it never reaches the DOM.\n dateFormat: _dateFormat,\n author,\n authorPageUrl,\n linkAuthor,\n category,\n tags,\n avatarImage,\n showDate,\n showAuthor,\n showCategory,\n showTags,\n showAvatar,\n ...rest\n } = props\n // Node styles ride the renderer-merged sx; recompose (stack.ts pattern).\n const nodeSx = Array.isArray(props['sx']) ? props['sx'] : [props['sx']]\n const { suppressNavigation } = useContext(Aglyn.ScreenLinkContext)\n // The resolver every other surface shares (AGL-1215), so one media\n // reference keeps working across sites. A hook — before any early return.\n const { hostId } = Aglyn.useSite()\n const dateValue = showDate !== false ? metaValue(date, suppressNavigation) : ''\n const authorValue =\n showAuthor !== false ? metaValue(author, suppressNavigation) : ''\n const categoryValue =\n showCategory !== false ? metaValue(category, suppressNavigation) : ''\n const tagsValue = showTags !== false ? metaValue(tags, suppressNavigation) : ''\n const tagList = tagsValue\n .split(',')\n .map((tag) => tag.trim())\n .filter(Boolean)\n // An unresolved token empties on EVERY surface here, unlike the text\n // fields: a literal `{{…}}` in a src is a broken image in the canvas, and a\n // byline that renders a broken avatar on every post is worse than no\n // avatar at all.\n const avatarRaw = (avatarImage ?? '').trim()\n const avatarSrc =\n showAvatar !== false && avatarRaw && !UNRESOLVED_TOKEN.test(avatarRaw)\n ? Aglyn.resolveMediaSrc(avatarRaw, { hostId })\n : ''\n // Author leads, so the frame's \"The Aglyn Team · Jul 2026\" reads in that\n // order. With no author the join is character-for-character what it was.\n const filledLine = [authorValue, dateValue, categoryValue]\n .filter(Boolean)\n .join(' · ')\n /*\n The rest of the line, WITHOUT the author (AGL-2519).\n\n The row is one string everywhere else, which is what a `·`-joined byline\n wants — but a link is an element, so the author has to come out of the\n join to be one. Split rather than reassembled from parts, so the\n separator, the order and the empty-field collapsing all stay in the one\n expression above: the linked row and the plain row cannot render a\n different sentence.\n */\n const authorHrefRaw = metaValue(authorPageUrl, suppressNavigation)\n const authorHref =\n linkAuthor !== false && SAFE_AUTHOR_HREF.test(authorHrefRaw)\n ? authorHrefRaw\n : ''\n const trailingLine = [dateValue, categoryValue].filter(Boolean).join(' · ')\n // Nothing to show and nothing to route from: an editing surface previews\n // the block's own markup at the author's own settings, and a published page\n // renders nothing at all (AGL-2486). The switches are honoured here exactly\n // as they are below, so a row with Show date off previews without one.\n const sample = !filledLine && !tagList.length && !avatarSrc && suppressNavigation\n const line = sample\n ? [\n showAuthor !== false ? ENTRY_SAMPLE_AUTHOR : '',\n showDate !== false\n ? Aglyn.formatCollectionEntryDate(\n ENTRY_SAMPLE_PUBLISHED_AT,\n Aglyn.normalizeCollectionEntryDateFormat(_dateFormat),\n )\n : '',\n showCategory !== false ? ENTRY_SAMPLE_CATEGORY : '',\n ]\n .filter(Boolean)\n .join(' · ')\n : filledLine\n const chips = sample\n ? showTags !== false\n ? ENTRY_SAMPLE_TAGS.split(',').map((tag) => tag.trim())\n : []\n : tagList\n // The portrait an entry's own author record supplies arrives at compose\n // time, so on the canvas there is none to resolve — the slot is drawn\n // instead, which is what a byline's spacing is actually built around.\n const samplePortrait = sample && showAvatar !== false\n if (!line && !chips.length && !avatarSrc && !samplePortrait) {\n return <Box ref={ref} {...rest} />\n }\n return (\n <MuiStack\n ref={ref}\n direction=\"row\"\n spacing={1}\n {...rest}\n // MERGE, never replace (AGL-1450, same class as AGL-1284). `rest.sx`\n // is the ARRAY `mergeSxProps` builds in leaf.tsx, so spreading it into\n // an object produced `{0: …, 1: …, 2: …}` — numeric keys emotion emits\n // as invalid selectors — and discarded EVERY authored property while\n // these two defaults still applied. The block looked deliberately\n // styled, so nothing suggested the value had been dropped. Defaults\n // go first; the node's slice comes after and can override them.\n sx={[{ alignItems: 'center', flexWrap: 'wrap' }, ...nodeSx]}\n >\n {avatarSrc ? (\n <Box\n component=\"img\"\n src={avatarSrc}\n // Decorative: the byline names the author in text right beside it,\n // so a screen reader announcing the mark again is noise.\n alt=\"\"\n sx={{\n display: 'block',\n width: ENTRY_AVATAR_SIZE,\n height: ENTRY_AVATAR_SIZE,\n borderRadius: '50%',\n objectFit: 'cover',\n // No background plate: a brand mark with a transparent ground\n // would sit on a grey disc nobody asked for.\n }}\n // `lazy` alone, same as Related Posts' rail (AGL-2486). A\n // byline avatar is decorative and tiny; it has no business\n // outranking anything.\n {...Aglyn.DEFERRED_IMAGE_ATTRIBUTES}\n />\n ) : samplePortrait ? (\n <Box aria-hidden sx={samplePortraitSx(ENTRY_AVATAR_SIZE)} />\n ) : null}\n {line ? (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {\n // Linked only on the real byline, never on the canvas sample: a\n // preview whose placeholder name navigates is a trap, and the\n // sample author has no page to go to.\n authorHref && authorValue && !sample ? (\n <>\n <AppLink\n href={authorHref}\n sx={{ color: 'inherit' }}\n underline=\"hover\"\n >\n {authorValue}\n </AppLink>\n {trailingLine ? ` · ${trailingLine}` : ''}\n </>\n ) : (\n line\n )\n }\n </Typography>\n ) : null}\n {chips.map((tag) => (\n <Chip key={tag} label={tag} size=\"small\" variant=\"outlined\" />\n ))}\n </MuiStack>\n )\n})\nCollectionEntryMeta.displayName = 'AglynCollectionEntryMeta'\n\nexport const collectionEntryMetaSchema: Aglyn.ComponentSchema<CollectionEntryMetaProps> =\n {\n $id: ENTRY_META_ID,\n pluginId: BUNDLE_ID,\n displayName: 'Entry Meta',\n description:\n 'The byline row for an entry — author, date, category and tags.',\n category: Aglyn.ComponentCategory.TEXT,\n icon: { path: mdiTagOutline.path, sx: { color: 'secondary.main' } },\n flags: { selfClosing: Aglyn.FEATURE_FLAG.ENABLED },\n attributes: [\n {\n name: 'date',\n label: 'Date',\n description:\n 'Blank shows the entry’s own published date on entry templates. ' +\n 'Type here (or bind {{entry.date}}) only to override it.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n {\n name: 'dateFormat',\n label: 'Date format',\n description:\n 'How the published date reads. Site default is the format this ' +\n 'block has always used; it has no effect on a Date you typed in ' +\n 'yourself.',\n component: Aglyn.FieldComponentType.SELECT,\n // The formats the pure layer knows how to produce, so the list cannot\n // offer a shape nothing renders. Every value is REAL — including the\n // do-nothing one (AGL-1451/AGL-1453): `''` cannot survive a save, so\n // an author who tried a format would have no route back.\n options: [...Aglyn.COLLECTION_ENTRY_DATE_FORMAT_OPTIONS],\n },\n {\n name: 'author',\n label: 'Author',\n description:\n 'Blank shows the entry’s own author. Type here (or bind ' +\n '{{entry.author}}) only to override it.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n {\n name: 'category',\n label: 'Category',\n description:\n 'Blank shows the entry’s own category. Type here (or bind ' +\n '{{entry.category}}) only to override it.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n {\n name: 'tags',\n label: 'Tags',\n description:\n 'Comma-separated. Blank shows the entry’s own tags; type here (or ' +\n 'bind {{entry.tags}}) only to override them.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n {\n name: 'avatarImage',\n label: 'Avatar',\n description:\n 'Round image before the byline — your brand mark, or any image ' +\n 'from the media library. Blank shows no avatar.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n {\n name: 'showDate',\n label: 'Show date',\n description:\n 'Off hides the published date from the line without clearing what ' +\n 'the Date field would have shown.',\n component: Aglyn.FieldComponentType.SWITCH,\n // Unset means SHOWN in the renderer above, so the switch has to\n // OPEN in that position or it lies about the block in front of\n // the author — and the first click, which writes the `true` that\n // was already in effect, changes nothing and reads as a dead\n // control (AGL-2506).\n initialValue: true,\n },\n {\n name: 'showCategory',\n label: 'Show category',\n description:\n 'Off drops the category from the line. The entry keeps its ' +\n 'category — this is about the byline, not the taxonomy.',\n component: Aglyn.FieldComponentType.SWITCH,\n // Unset means SHOWN in the renderer above, so the switch has to\n // OPEN in that position or it lies about the block in front of\n // the author — and the first click, which writes the `true` that\n // was already in effect, changes nothing and reads as a dead\n // control (AGL-2506).\n initialValue: true,\n },\n {\n name: 'showTags',\n label: 'Show tags',\n description:\n 'Off hides the tag chips below the line. Leave it on and the ' +\n 'other three off for a tags-only row.',\n component: Aglyn.FieldComponentType.SWITCH,\n // Unset means SHOWN in the renderer above, so the switch has to\n // OPEN in that position or it lies about the block in front of\n // the author — and the first click, which writes the `true` that\n // was already in effect, changes nothing and reads as a dead\n // control (AGL-2506).\n initialValue: true,\n },\n {\n name: 'authorPageUrl',\n label: 'Author links to',\n description:\n 'Blank sends the byline to the author’s page on this site. Type ' +\n 'here (or bind {{entry.authorPageUrl}}) only to override it.',\n component: Aglyn.FieldComponentType.TEXT_FIELD,\n },\n {\n name: 'linkAuthor',\n label: 'Link author',\n description:\n 'Off leaves the byline as plain text even when the author has a ' +\n 'page. On, the name links there and the date and category beside ' +\n 'it do not.',\n component: Aglyn.FieldComponentType.SWITCH,\n // Unset means LINKED in the renderer above, so the switch has to open\n // in that position or it lies about the block in front of the author\n // (AGL-2506).\n initialValue: true,\n },\n {\n name: 'showAuthor',\n label: 'Show author',\n description:\n 'Off hides the byline. The avatar follows it: a block with no ' +\n 'author shown never fills in the author’s portrait.',\n component: Aglyn.FieldComponentType.SWITCH,\n // Unset means SHOWN in the renderer above, so the switch has to\n // OPEN in that position or it lies about the block in front of\n // the author — and the first click, which writes the `true` that\n // was already in effect, changes nothing and reads as a dead\n // control (AGL-2506).\n initialValue: true,\n },\n {\n name: 'showAvatar',\n label: 'Show avatar',\n description:\n 'Off hides the round image in front of the byline, including an ' +\n 'author’s own portrait.',\n component: Aglyn.FieldComponentType.SWITCH,\n // Unset means SHOWN in the renderer above, so the switch has to\n // OPEN in that position or it lies about the block in front of\n // the author — and the first click, which writes the `true` that\n // was already in effect, changes nothing and reads as a dead\n // control (AGL-2506).\n initialValue: true,\n },\n ],\n }\n\nexport { CollectionEntryMeta }\n"],"names":["Aglyn","mdiTagOutline","AppLink","Box","Chip","MuiStack","Typography","forwardRef","useContext","BUNDLE_ID","UNRESOLVED_TOKEN","ENTRY_SAMPLE_PUBLISHED_AT","ENTRY_SAMPLE_AUTHOR","ENTRY_SAMPLE_CATEGORY","ENTRY_SAMPLE_TAGS","samplePortraitSx","metaValue","SAFE_AUTHOR_HREF","ENTRY_META_ID","COLLECTION_ENTRY_META_COMPONENT_ID","ENTRY_AVATAR_SIZE","CollectionEntryMeta","props","ref","date","dateFormat","_dateFormat","author","authorPageUrl","linkAuthor","category","tags","avatarImage","showDate","showAuthor","showCategory","showTags","showAvatar","rest","nodeSx","Array","isArray","suppressNavigation","ScreenLinkContext","hostId","useSite","dateValue","authorValue","categoryValue","tagsValue","tagList","split","map","tag","trim","filter","Boolean","avatarRaw","avatarSrc","test","resolveMediaSrc","filledLine","join","authorHrefRaw","authorHref","trailingLine","sample","length","line","formatCollectionEntryDate","normalizeCollectionEntryDateFormat","chips","samplePortrait","direction","spacing","sx","alignItems","flexWrap","component","src","alt","display","width","height","borderRadius","objectFit","DEFERRED_IMAGE_ATTRIBUTES","aria-hidden","variant","color","href","underline","label","size","displayName","collectionEntryMetaSchema","$id","pluginId","description","ComponentCategory","TEXT","icon","path","flags","selfClosing","FEATURE_FLAG","ENABLED","attributes","name","FieldComponentType","TEXT_FIELD","SELECT","options","COLLECTION_ENTRY_DATE_FORMAT_OPTIONS","SWITCH","initialValue"],"mappings":"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"}
@@ -0,0 +1,18 @@
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
+ export declare const collectionPresets: Aglyn.PresetSchema[];