@aglyn/aglyn 1.0.0-beta.250 → 1.0.0-beta.253

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 (47) hide show
  1. package/package.json +11 -11
  2. package/src/lib/app-utils/activity-labels.js +1 -0
  3. package/src/lib/app-utils/activity-labels.js.map +1 -1
  4. package/src/lib/app-utils/ad-audience.d.ts +42 -0
  5. package/src/lib/app-utils/ad-audience.js +42 -0
  6. package/src/lib/app-utils/ad-audience.js.map +1 -0
  7. package/src/lib/app-utils/business-profile.d.ts +4 -0
  8. package/src/lib/app-utils/business-profile.js +2 -0
  9. package/src/lib/app-utils/business-profile.js.map +1 -1
  10. package/src/lib/app-utils/console-routes.d.ts +9 -0
  11. package/src/lib/app-utils/console-routes.js +6 -0
  12. package/src/lib/app-utils/console-routes.js.map +1 -1
  13. package/src/lib/app-utils/docs-help-sections.generated.js +455 -451
  14. package/src/lib/app-utils/docs-help-sections.generated.js.map +1 -1
  15. package/src/lib/app-utils/docs-help.generated.d.ts +27 -3
  16. package/src/lib/app-utils/docs-help.generated.js +78 -13
  17. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  18. package/src/lib/app-utils/docs-index.generated.js +193 -67
  19. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  20. package/src/lib/app-utils/email-block-starters.d.ts +39 -0
  21. package/src/lib/app-utils/email-block-starters.js +122 -0
  22. package/src/lib/app-utils/email-block-starters.js.map +1 -0
  23. package/src/lib/app-utils/health-report.js +11 -0
  24. package/src/lib/app-utils/health-report.js.map +1 -1
  25. package/src/lib/app-utils/image-edit.d.ts +77 -0
  26. package/src/lib/app-utils/image-edit.js +116 -0
  27. package/src/lib/app-utils/image-edit.js.map +1 -0
  28. package/src/lib/app-utils/operator-alerts.js +14 -0
  29. package/src/lib/app-utils/operator-alerts.js.map +1 -1
  30. package/src/lib/app-utils/release-flags.d.ts +1 -1
  31. package/src/lib/app-utils/release-flags.js +10 -0
  32. package/src/lib/app-utils/release-flags.js.map +1 -1
  33. package/src/lib/app-utils/screen-route.d.ts +1 -130
  34. package/src/lib/app-utils/screen-route.js +2 -151
  35. package/src/lib/app-utils/screen-route.js.map +1 -1
  36. package/src/lib/app-utils/screen-slug.d.ts +146 -0
  37. package/src/lib/app-utils/screen-slug.js +173 -0
  38. package/src/lib/app-utils/screen-slug.js.map +1 -0
  39. package/src/lib/app-utils/site-theme.d.ts +11 -0
  40. package/src/lib/app-utils/site-theme.js +32 -1
  41. package/src/lib/app-utils/site-theme.js.map +1 -1
  42. package/src/lib/app-utils/template-slug.d.ts +101 -0
  43. package/src/lib/app-utils/template-slug.js +150 -0
  44. package/src/lib/app-utils/template-slug.js.map +1 -0
  45. package/src/lib/plugin-manager/feature-plugins.d.ts +39 -0
  46. package/src/lib/plugin-manager/feature-plugins.js +13 -1
  47. package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /** The email plugin's bundle id: the `pluginId` of every element in its bands. */
18
+ export declare const EMAIL_BLOCK_STARTER_PLUGIN_ID = "email";
19
+ /** One element of a nested starter tree, as an element preset's `data` holds it. */
20
+ export interface EmailBlockStarterNode {
21
+ $id: null;
22
+ componentId: string;
23
+ pluginId: string;
24
+ props: Record<string, unknown>;
25
+ nodes?: EmailBlockStarterNode[];
26
+ }
27
+ /**
28
+ * The Footer's small print, a muted gray that still reads at 5:1 on white.
29
+ * A literal on purpose: it is written into the sent mail's own HTML, where no
30
+ * theme token resolves.
31
+ */
32
+ export declare const EMAIL_FOOTER_TEXT_COLOR = "#6b6b6b";
33
+ export declare const EMAIL_BLOCK_STARTER_TREES: Readonly<Record<'header' | 'footer', EmailBlockStarterNode>>;
34
+ /**
35
+ * {@link EMAIL_BLOCK_STARTER_TREES} as JSON text: the form the native apps
36
+ * read them in (`Contracts.emailBlockStarterTreesJson`), parsed when a block
37
+ * is started.
38
+ */
39
+ export declare const EMAIL_BLOCK_STARTER_TREES_JSON: string;
@@ -0,0 +1,122 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /*
17
+ * The two email bands a Header or Footer email block starts from (AGL-3287),
18
+ * as plain data: the email plugin registers them as element presets (so an
19
+ * author can drop one into an email), the Components page starts a reusable
20
+ * block from the same trees, and the native apps start theirs from the values
21
+ * generated from here. One tree each, wherever it is started from.
22
+ *
23
+ * The words are placeholders to replace. No merge token names the company in
24
+ * both kinds of email — a campaign supplies `{{org.name}}`, and no token is
25
+ * supplied by every one of a site's own emails — while a token an email does
26
+ * not supply is blanked before sending, which would leave the header with no
27
+ * name at all.
28
+ *
29
+ * The footer carries no unsubscribe link: a campaign send appends its own,
30
+ * and a second one would do the same thing twice.
31
+ */ /** The email plugin's bundle id: the `pluginId` of every element in its bands. */ export const EMAIL_BLOCK_STARTER_PLUGIN_ID = 'email';
32
+ /**
33
+ * The Footer's small print, a muted gray that still reads at 5:1 on white.
34
+ * A literal on purpose: it is written into the sent mail's own HTML, where no
35
+ * theme token resolves.
36
+ */ export const EMAIL_FOOTER_TEXT_COLOR = '#6b6b6b';
37
+ const FOOTER_TEXT_COLOR = EMAIL_FOOTER_TEXT_COLOR;
38
+ export const EMAIL_BLOCK_STARTER_TREES = {
39
+ header: {
40
+ $id: null,
41
+ componentId: 'emailSection',
42
+ pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,
43
+ // Marks the band as the email's header, so the sender's own header is
44
+ // not drawn above it (AGL-3372).
45
+ props: {
46
+ align: 'center',
47
+ padding: 24,
48
+ emailRole: 'header'
49
+ },
50
+ nodes: [
51
+ {
52
+ $id: null,
53
+ componentId: 'emailImage',
54
+ pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,
55
+ props: {
56
+ alt: 'Your company logo',
57
+ width: 160,
58
+ align: 'center'
59
+ }
60
+ },
61
+ {
62
+ $id: null,
63
+ componentId: 'emailText',
64
+ pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,
65
+ props: {
66
+ children: 'Your company',
67
+ variant: 'subheading',
68
+ align: 'center'
69
+ }
70
+ }
71
+ ]
72
+ },
73
+ footer: {
74
+ $id: null,
75
+ componentId: 'emailSection',
76
+ pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,
77
+ // Marks the band as the email's footer, so the sender's own footer is
78
+ // not drawn under it (AGL-3372).
79
+ props: {
80
+ align: 'center',
81
+ padding: 24,
82
+ emailRole: 'footer'
83
+ },
84
+ nodes: [
85
+ {
86
+ $id: null,
87
+ componentId: 'emailDivider',
88
+ pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,
89
+ props: {}
90
+ },
91
+ {
92
+ $id: null,
93
+ componentId: 'emailText',
94
+ pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,
95
+ props: {
96
+ children: 'Your company · 123 Main St, City',
97
+ variant: 'caption',
98
+ align: 'center',
99
+ color: FOOTER_TEXT_COLOR
100
+ }
101
+ },
102
+ {
103
+ $id: null,
104
+ componentId: 'emailText',
105
+ pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,
106
+ props: {
107
+ children: "You're receiving this because you're a customer of Your company.",
108
+ variant: 'caption',
109
+ align: 'center',
110
+ color: FOOTER_TEXT_COLOR
111
+ }
112
+ }
113
+ ]
114
+ }
115
+ };
116
+ /**
117
+ * {@link EMAIL_BLOCK_STARTER_TREES} as JSON text: the form the native apps
118
+ * read them in (`Contracts.emailBlockStarterTreesJson`), parsed when a block
119
+ * is started.
120
+ */ export const EMAIL_BLOCK_STARTER_TREES_JSON = JSON.stringify(EMAIL_BLOCK_STARTER_TREES);
121
+
122
+ //# sourceMappingURL=email-block-starters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/email-block-starters.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*\n * The two email bands a Header or Footer email block starts from (AGL-3287),\n * as plain data: the email plugin registers them as element presets (so an\n * author can drop one into an email), the Components page starts a reusable\n * block from the same trees, and the native apps start theirs from the values\n * generated from here. One tree each, wherever it is started from.\n *\n * The words are placeholders to replace. No merge token names the company in\n * both kinds of email — a campaign supplies `{{org.name}}`, and no token is\n * supplied by every one of a site's own emails — while a token an email does\n * not supply is blanked before sending, which would leave the header with no\n * name at all.\n *\n * The footer carries no unsubscribe link: a campaign send appends its own,\n * and a second one would do the same thing twice.\n */\n\n/** The email plugin's bundle id: the `pluginId` of every element in its bands. */\nexport const EMAIL_BLOCK_STARTER_PLUGIN_ID = 'email'\n\n/** One element of a nested starter tree, as an element preset's `data` holds it. */\nexport interface EmailBlockStarterNode {\n $id: null\n componentId: string\n pluginId: string\n props: Record<string, unknown>\n nodes?: EmailBlockStarterNode[]\n}\n\n/**\n * The Footer's small print, a muted gray that still reads at 5:1 on white.\n * A literal on purpose: it is written into the sent mail's own HTML, where no\n * theme token resolves.\n */\nexport const EMAIL_FOOTER_TEXT_COLOR = '#6b6b6b'\nconst FOOTER_TEXT_COLOR = EMAIL_FOOTER_TEXT_COLOR\n\nexport const EMAIL_BLOCK_STARTER_TREES: Readonly<\n Record<'header' | 'footer', EmailBlockStarterNode>\n> = {\n header: {\n $id: null,\n componentId: 'emailSection',\n pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,\n // Marks the band as the email's header, so the sender's own header is\n // not drawn above it (AGL-3372).\n props: { align: 'center', padding: 24, emailRole: 'header' },\n nodes: [\n {\n $id: null,\n componentId: 'emailImage',\n pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,\n props: { alt: 'Your company logo', width: 160, align: 'center' },\n },\n {\n $id: null,\n componentId: 'emailText',\n pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,\n props: {\n children: 'Your company',\n variant: 'subheading',\n align: 'center',\n },\n },\n ],\n },\n footer: {\n $id: null,\n componentId: 'emailSection',\n pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,\n // Marks the band as the email's footer, so the sender's own footer is\n // not drawn under it (AGL-3372).\n props: { align: 'center', padding: 24, emailRole: 'footer' },\n nodes: [\n {\n $id: null,\n componentId: 'emailDivider',\n pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,\n props: {},\n },\n {\n $id: null,\n componentId: 'emailText',\n pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,\n props: {\n children: 'Your company · 123 Main St, City',\n variant: 'caption',\n align: 'center',\n color: FOOTER_TEXT_COLOR,\n },\n },\n {\n $id: null,\n componentId: 'emailText',\n pluginId: EMAIL_BLOCK_STARTER_PLUGIN_ID,\n props: {\n children:\n \"You're receiving this because you're a customer of Your company.\",\n variant: 'caption',\n align: 'center',\n color: FOOTER_TEXT_COLOR,\n },\n },\n ],\n },\n}\n\n/**\n * {@link EMAIL_BLOCK_STARTER_TREES} as JSON text: the form the native apps\n * read them in (`Contracts.emailBlockStarterTreesJson`), parsed when a block\n * is started.\n */\nexport const EMAIL_BLOCK_STARTER_TREES_JSON: string = JSON.stringify(\n EMAIL_BLOCK_STARTER_TREES,\n)\n"],"names":["EMAIL_BLOCK_STARTER_PLUGIN_ID","EMAIL_FOOTER_TEXT_COLOR","FOOTER_TEXT_COLOR","EMAIL_BLOCK_STARTER_TREES","header","$id","componentId","pluginId","props","align","padding","emailRole","nodes","alt","width","children","variant","footer","color","EMAIL_BLOCK_STARTER_TREES_JSON","JSON","stringify"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;CAeC,GAED,gFAAgF,GAChF,OAAO,MAAMA,gCAAgC,QAAO;AAWpD;;;;CAIC,GACD,OAAO,MAAMC,0BAA0B,UAAS;AAChD,MAAMC,oBAAoBD;AAE1B,OAAO,MAAME,4BAET;IACFC,QAAQ;QACNC,KAAK;QACLC,aAAa;QACbC,UAAUP;QACV,sEAAsE;QACtE,iCAAiC;QACjCQ,OAAO;YAAEC,OAAO;YAAUC,SAAS;YAAIC,WAAW;QAAS;QAC3DC,OAAO;YACL;gBACEP,KAAK;gBACLC,aAAa;gBACbC,UAAUP;gBACVQ,OAAO;oBAAEK,KAAK;oBAAqBC,OAAO;oBAAKL,OAAO;gBAAS;YACjE;YACA;gBACEJ,KAAK;gBACLC,aAAa;gBACbC,UAAUP;gBACVQ,OAAO;oBACLO,UAAU;oBACVC,SAAS;oBACTP,OAAO;gBACT;YACF;SACD;IACH;IACAQ,QAAQ;QACNZ,KAAK;QACLC,aAAa;QACbC,UAAUP;QACV,sEAAsE;QACtE,iCAAiC;QACjCQ,OAAO;YAAEC,OAAO;YAAUC,SAAS;YAAIC,WAAW;QAAS;QAC3DC,OAAO;YACL;gBACEP,KAAK;gBACLC,aAAa;gBACbC,UAAUP;gBACVQ,OAAO,CAAC;YACV;YACA;gBACEH,KAAK;gBACLC,aAAa;gBACbC,UAAUP;gBACVQ,OAAO;oBACLO,UAAU;oBACVC,SAAS;oBACTP,OAAO;oBACPS,OAAOhB;gBACT;YACF;YACA;gBACEG,KAAK;gBACLC,aAAa;gBACbC,UAAUP;gBACVQ,OAAO;oBACLO,UACE;oBACFC,SAAS;oBACTP,OAAO;oBACPS,OAAOhB;gBACT;YACF;SACD;IACH;AACF,EAAC;AAED;;;;CAIC,GACD,OAAO,MAAMiB,iCAAyCC,KAAKC,SAAS,CAClElB,2BACD"}
@@ -1465,6 +1465,17 @@ export function meteredPricingHealth(facts, ms) {
1465
1465
  graceMinutes: 90,
1466
1466
  drives: 'Sends each new account the getting-started email its stage owes it, once per crossing: confirm your email, build your site, publish your changes, your site is live, pick up where you left off (AGL-3692). If it stops, an account that stalls hears nothing after the welcome email.'
1467
1467
  },
1468
+ {
1469
+ id: 'ad-audience-sync',
1470
+ label: 'Account-holder ad audiences',
1471
+ // Nightly (AGL-3780). It beats on every scheduled POST, flag on or off,
1472
+ // so the row is watched from the first night.
1473
+ cron: '40 7 * * *',
1474
+ runner: 'cloud-scheduler',
1475
+ target: '/api/admin/ad-audience-sync',
1476
+ graceMinutes: 90,
1477
+ drives: 'Keeps the operator’s own Meta, Google and LinkedIn customer-list audiences in step with eligible US account holders, as hashed addresses (AGL-3780). If it stops, an account that was erased, banned or opted out stays in the audiences, and new sign-ups are never added.'
1478
+ },
1468
1479
  {
1469
1480
  id: 'firestore-export',
1470
1481
  label: 'Weekly Firestore export',