@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.
- package/package.json +11 -11
- package/src/lib/app-utils/activity-labels.js +1 -0
- package/src/lib/app-utils/activity-labels.js.map +1 -1
- package/src/lib/app-utils/ad-audience.d.ts +42 -0
- package/src/lib/app-utils/ad-audience.js +42 -0
- package/src/lib/app-utils/ad-audience.js.map +1 -0
- package/src/lib/app-utils/business-profile.d.ts +4 -0
- package/src/lib/app-utils/business-profile.js +2 -0
- package/src/lib/app-utils/business-profile.js.map +1 -1
- package/src/lib/app-utils/console-routes.d.ts +9 -0
- package/src/lib/app-utils/console-routes.js +6 -0
- package/src/lib/app-utils/console-routes.js.map +1 -1
- package/src/lib/app-utils/docs-help-sections.generated.js +455 -451
- package/src/lib/app-utils/docs-help-sections.generated.js.map +1 -1
- package/src/lib/app-utils/docs-help.generated.d.ts +27 -3
- package/src/lib/app-utils/docs-help.generated.js +78 -13
- package/src/lib/app-utils/docs-help.generated.js.map +1 -1
- package/src/lib/app-utils/docs-index.generated.js +193 -67
- package/src/lib/app-utils/docs-index.generated.js.map +1 -1
- package/src/lib/app-utils/email-block-starters.d.ts +39 -0
- package/src/lib/app-utils/email-block-starters.js +122 -0
- package/src/lib/app-utils/email-block-starters.js.map +1 -0
- package/src/lib/app-utils/health-report.js +11 -0
- package/src/lib/app-utils/health-report.js.map +1 -1
- package/src/lib/app-utils/image-edit.d.ts +77 -0
- package/src/lib/app-utils/image-edit.js +116 -0
- package/src/lib/app-utils/image-edit.js.map +1 -0
- package/src/lib/app-utils/operator-alerts.js +14 -0
- package/src/lib/app-utils/operator-alerts.js.map +1 -1
- package/src/lib/app-utils/release-flags.d.ts +1 -1
- package/src/lib/app-utils/release-flags.js +10 -0
- package/src/lib/app-utils/release-flags.js.map +1 -1
- package/src/lib/app-utils/screen-route.d.ts +1 -130
- package/src/lib/app-utils/screen-route.js +2 -151
- package/src/lib/app-utils/screen-route.js.map +1 -1
- package/src/lib/app-utils/screen-slug.d.ts +146 -0
- package/src/lib/app-utils/screen-slug.js +173 -0
- package/src/lib/app-utils/screen-slug.js.map +1 -0
- package/src/lib/app-utils/site-theme.d.ts +11 -0
- package/src/lib/app-utils/site-theme.js +32 -1
- package/src/lib/app-utils/site-theme.js.map +1 -1
- package/src/lib/app-utils/template-slug.d.ts +101 -0
- package/src/lib/app-utils/template-slug.js +150 -0
- package/src/lib/app-utils/template-slug.js.map +1 -0
- package/src/lib/plugin-manager/feature-plugins.d.ts +39 -0
- package/src/lib/plugin-manager/feature-plugins.js +13 -1
- 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',
|