ultimate-jekyll-manager 1.4.2 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/CLAUDE-ATTRIBUTION.md +215 -0
- package/CLAUDE.md +7 -6
- package/README.md +1 -0
- package/dist/assets/css/pages/test/libraries/layers/index.scss +28 -0
- package/dist/assets/js/core/auth.js +24 -39
- package/dist/assets/js/modules/redirect.js +5 -4
- package/dist/assets/js/pages/download/index.js +1 -1
- package/dist/assets/js/pages/feedback/index.js +7 -1
- package/dist/assets/js/pages/test/libraries/layers/index.js +11 -0
- package/dist/assets/themes/_template/README.md +50 -0
- package/dist/assets/themes/_template/_config.scss +60 -0
- package/dist/assets/themes/_template/_theme.js +13 -4
- package/dist/assets/themes/_template/_theme.scss +16 -4
- package/dist/assets/themes/_template/css/base/_root.scss +19 -0
- package/dist/assets/themes/_template/css/components/_components.scss +23 -0
- package/dist/assets/themes/classy/README.md +18 -6
- package/dist/assets/themes/neobrutalism/README.md +98 -0
- package/dist/assets/themes/neobrutalism/_config.scss +139 -0
- package/dist/assets/themes/neobrutalism/_theme.js +27 -0
- package/dist/assets/themes/neobrutalism/_theme.scss +33 -0
- package/dist/assets/themes/neobrutalism/css/base/_mixins.scss +46 -0
- package/dist/assets/themes/neobrutalism/css/base/_root.scss +80 -0
- package/dist/assets/themes/neobrutalism/css/base/_typography.scss +77 -0
- package/dist/assets/themes/neobrutalism/css/base/_utilities.scss +25 -0
- package/dist/assets/themes/neobrutalism/css/components/_buttons.scss +148 -0
- package/dist/assets/themes/neobrutalism/css/components/_cards.scss +69 -0
- package/dist/assets/themes/neobrutalism/css/components/_forms.scss +88 -0
- package/dist/assets/themes/neobrutalism/css/components/_infinite-scroll.scss +94 -0
- package/dist/assets/themes/neobrutalism/css/layout/_general.scss +200 -0
- package/dist/assets/themes/neobrutalism/css/layout/_navigation.scss +153 -0
- package/dist/assets/themes/neobrutalism/js/initialize-tooltips.js +20 -0
- package/dist/assets/themes/neobrutalism/js/navbar-scroll.js +29 -0
- package/dist/assets/themes/neobrutalism/pages/index.scss +227 -0
- package/dist/assets/themes/neobrutalism/pages/pricing/index.scss +267 -0
- package/dist/assets/themes/neobrutalism/pages/test/libraries/layers/index.js +9 -0
- package/dist/assets/themes/neobrutalism/pages/test/libraries/layers/index.scss +7 -0
- package/dist/build.js +2 -5
- package/dist/commands/install.js +1 -1
- package/dist/commands/setup.js +41 -0
- package/dist/defaults/CLAUDE.md +5 -1
- package/dist/defaults/dist/_alternatives/example-competitor.md +6 -6
- package/dist/defaults/dist/_includes/admin/sections/sidebar.json +2 -2
- package/dist/defaults/dist/_includes/core/head.html +17 -0
- package/dist/defaults/dist/_includes/themes/classy/backend/sections/topbar.html +1 -1
- package/dist/defaults/dist/_includes/themes/classy/frontend/sections/footer.html +9 -6
- package/dist/defaults/dist/_layouts/blueprint/admin/calendar/index.html +13 -13
- package/dist/defaults/dist/_layouts/blueprint/admin/firebase/index.html +1 -1
- package/dist/defaults/dist/_layouts/blueprint/admin/users/index.html +1 -1
- package/dist/defaults/dist/_layouts/blueprint/admin/users/new.html +5 -5
- package/dist/defaults/dist/_layouts/blueprint/auth/oauth2.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/backend/pages/dashboard/index.html +12 -12
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/about.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/alternatives/alternative.html +4 -4
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/alternatives/index.html +5 -5
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/download.html +4 -2
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/feedback.html +7 -3
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/payment/confirmation.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/pricing.html +3 -3
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/team/index.html +2 -2
- package/dist/defaults/dist/_layouts/themes/neobrutalism/frontend/core/base.html +31 -0
- package/dist/defaults/dist/_layouts/themes/neobrutalism/frontend/pages/index.html +345 -0
- package/dist/defaults/dist/_layouts/themes/neobrutalism/frontend/pages/pricing.html +483 -0
- package/dist/defaults/dist/_updates/v0.0.1.md +3 -0
- package/dist/defaults/dist/pages/test/account/dashboard.html +1 -1
- package/dist/defaults/dist/pages/test/libraries/ads.html +9 -9
- package/dist/defaults/dist/pages/test/libraries/bootstrap.html +6 -6
- package/dist/defaults/dist/pages/test/libraries/firestore.html +1 -1
- package/dist/defaults/dist/pages/test/libraries/form-manager.html +2 -2
- package/dist/defaults/dist/pages/test/libraries/layers.html +57 -0
- package/dist/defaults/dist/pages/test/libraries/lazy-loading.html +8 -8
- package/dist/defaults/dist/sitemap.html +2 -2
- package/dist/defaults/src/_config.yml +2 -0
- package/dist/defaults/test/_init.js +10 -0
- package/dist/gulp/tasks/defaults.js +8 -0
- package/dist/gulp/tasks/imagemin.js +30 -5
- package/dist/gulp/tasks/sass.js +43 -2
- package/dist/gulp/tasks/translation.js +11 -0
- package/dist/gulp/tasks/utils/manage-test-layers.js +97 -0
- package/dist/index.js +30 -4
- package/dist/test/runner.js +62 -0
- package/dist/test/suites/build/manager.test.js +11 -4
- package/dist/test/suites/build/mode-helpers.test.js +54 -2
- package/dist/utils/attach-log-file.js +24 -16
- package/dist/utils/mode-helpers.js +65 -40
- package/docs/assets.md +6 -1
- package/docs/environment-detection.md +85 -0
- package/docs/test-framework.md +48 -3
- package/docs/themes.md +451 -0
- package/package.json +2 -1
- package/docs/cross-context-helpers.md +0 -75
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// /test — Theme (neobrutalism) page CSS — the #theme layer.
|
|
2
|
+
// Loads AFTER the universal layer and turns the "css-theme" dot green.
|
|
3
|
+
// Compiles standalone, so no theme tokens are needed here — just the proof.
|
|
4
|
+
|
|
5
|
+
.layer-dot[data-layer="css-theme"] {
|
|
6
|
+
background: #30a46c; // green
|
|
7
|
+
}
|
package/dist/build.js
CHANGED
|
@@ -110,11 +110,8 @@ Manager.actLikeProduction = function () {
|
|
|
110
110
|
}
|
|
111
111
|
Manager.prototype.actLikeProduction = Manager.actLikeProduction;
|
|
112
112
|
|
|
113
|
-
// getEnvironment
|
|
114
|
-
|
|
115
|
-
return Manager.isServer() ? 'production' : 'development';
|
|
116
|
-
}
|
|
117
|
-
Manager.prototype.getEnvironment = Manager.getEnvironment;
|
|
113
|
+
// getEnvironment() is the SSOT and lives in src/utils/mode-helpers.js (alongside the is*()
|
|
114
|
+
// family). It's mixed onto the Manager via the attachTo() call below, same as in EM/BXM.
|
|
118
115
|
|
|
119
116
|
// getConfig: requires and parses config.yml
|
|
120
117
|
Manager.getConfig = function (type) {
|
package/dist/commands/install.js
CHANGED
package/dist/commands/setup.js
CHANGED
|
@@ -39,6 +39,7 @@ module.exports = async function (options) {
|
|
|
39
39
|
options.checkLocality = options.checkLocality !== 'false';
|
|
40
40
|
options.publishGitHubToken = options.publishGitHubToken !== 'false';
|
|
41
41
|
options.deduplicatePosts = options.deduplicatePosts !== 'false';
|
|
42
|
+
options.removeLegacyTeamMembers = options.removeLegacyTeamMembers !== 'false';
|
|
42
43
|
options.migrate = options.migrate !== 'false';
|
|
43
44
|
|
|
44
45
|
// Quick mode: skip slow/network operations
|
|
@@ -137,6 +138,11 @@ module.exports = async function (options) {
|
|
|
137
138
|
if (options.deduplicatePosts) {
|
|
138
139
|
await deduplicatePosts();
|
|
139
140
|
}
|
|
141
|
+
|
|
142
|
+
// Remove legacy default team members (first-name-only format, e.g. team/alex)
|
|
143
|
+
if (options.removeLegacyTeamMembers) {
|
|
144
|
+
await removeLegacyTeamMembers();
|
|
145
|
+
}
|
|
140
146
|
};
|
|
141
147
|
|
|
142
148
|
// --- Version check functions ---
|
|
@@ -527,6 +533,41 @@ async function deduplicatePosts() {
|
|
|
527
533
|
}
|
|
528
534
|
}
|
|
529
535
|
|
|
536
|
+
async function removeLegacyTeamMembers() {
|
|
537
|
+
// Legacy default team members that used the first-name-only format.
|
|
538
|
+
// These shipped before team members were renamed to first-last (e.g. team/alex -> team/alex-raeburn).
|
|
539
|
+
const legacyTeamMembers = ['alex'];
|
|
540
|
+
|
|
541
|
+
logger.log('Checking for legacy default team members to remove...');
|
|
542
|
+
|
|
543
|
+
let removedCount = 0;
|
|
544
|
+
|
|
545
|
+
legacyTeamMembers.forEach((slug) => {
|
|
546
|
+
// The _team collection file (any markdown/html extension)
|
|
547
|
+
const memberFiles = glob(`src/_team/${slug}.{md,markdown,html}`, { nodir: true });
|
|
548
|
+
|
|
549
|
+
memberFiles.forEach((filePath) => {
|
|
550
|
+
jetpack.remove(filePath);
|
|
551
|
+
logger.log(` ✓ Removed legacy team member: ${filePath}`);
|
|
552
|
+
removedCount++;
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
// The associated image directory (src/assets/images/team/<slug>)
|
|
556
|
+
const imageDir = path.join(process.cwd(), 'src', 'assets', 'images', 'team', slug);
|
|
557
|
+
|
|
558
|
+
if (jetpack.exists(imageDir)) {
|
|
559
|
+
jetpack.remove(imageDir);
|
|
560
|
+
logger.log(` ✓ Removed legacy team member image directory: team/${slug}`);
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
if (removedCount > 0) {
|
|
565
|
+
logger.log(logger.format.green(`✓ Removed ${removedCount} legacy team member(s)`));
|
|
566
|
+
} else {
|
|
567
|
+
logger.log('No legacy team members found');
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
530
571
|
// --- Migration functions ---
|
|
531
572
|
|
|
532
573
|
async function migrate() {
|
package/dist/defaults/CLAUDE.md
CHANGED
|
@@ -29,8 +29,12 @@ npm run build # production build (UJ_BUILD_MODE=true): clean → setup →
|
|
|
29
29
|
npm run deploy # build → `npu sync --message='Deploy'` (publishes _site/)
|
|
30
30
|
npx mgr test # run framework + project test suites (build / page / boot layers)
|
|
31
31
|
npx mgr audit # HTML validation + spellcheck + optional Lighthouse
|
|
32
|
+
npx mgr install dev # use LOCAL ultimate-jekyll-manager source (to test framework edits)
|
|
33
|
+
npx mgr install live # restore the published ultimate-jekyll-manager from npm
|
|
32
34
|
```
|
|
33
35
|
|
|
36
|
+
> Editing the UJM framework source while working here? Run `npx mgr install dev` so this project picks up your uncommitted framework changes (it otherwise uses its installed `node_modules/ultimate-jekyll-manager`). Run `npx mgr install live` to switch back.
|
|
37
|
+
|
|
34
38
|
## Where things live
|
|
35
39
|
|
|
36
40
|
- `src/_config.yml` — Jekyll config: brand, theme, meta, web_manager (Firebase). `Manager.getConfig('project')` reads this. **`brand.id` + `theme.id` are required.**
|
|
@@ -72,7 +76,7 @@ At build time, `require('ultimate-jekyll-manager/build')` exposes:
|
|
|
72
76
|
- `Manager.getConfig(type)` — read `_config.yml` (`'project'` or `'main'`)
|
|
73
77
|
- `Manager.getPackage(type)` — read `package.json` (`'project'` or `'main'`)
|
|
74
78
|
- `Manager.getUJMConfig()` — read `config/ultimate-jekyll-manager.json`
|
|
75
|
-
- `Manager.getEnvironment()` — `'development'
|
|
79
|
+
- `Manager.getEnvironment()` — `'development' | 'testing' | 'production'` (mutually exclusive; testing wins). Gate side effects on the intentional check (`isProduction()` for prod-only; `isDevelopment() || isTesting()` for local-or-test) — never `!isDevelopment()`.
|
|
76
80
|
- `Manager.isBuildMode()` / `isQuickMode()` / `isServer()` / `actLikeProduction()` — env-gated flags
|
|
77
81
|
- `Manager.logger(name)` — timestamped logger instance
|
|
78
82
|
- `Manager.require(path)` — escape hatch for UJM transitive deps (use sparingly)
|
|
@@ -18,25 +18,25 @@ alternative:
|
|
|
18
18
|
|
|
19
19
|
comparison:
|
|
20
20
|
features:
|
|
21
|
-
- name: "Free
|
|
21
|
+
- name: "Free plan"
|
|
22
22
|
icon: "gift"
|
|
23
23
|
ours:
|
|
24
24
|
value: true
|
|
25
25
|
theirs:
|
|
26
26
|
value: true
|
|
27
|
-
- name: "AI-
|
|
27
|
+
- name: "AI-powered features"
|
|
28
28
|
icon: "sparkles"
|
|
29
29
|
ours:
|
|
30
30
|
value: "Advanced"
|
|
31
31
|
theirs:
|
|
32
32
|
value: "Basic"
|
|
33
|
-
- name: "Real-time
|
|
33
|
+
- name: "Real-time collaboration"
|
|
34
34
|
icon: "users"
|
|
35
35
|
ours:
|
|
36
36
|
value: true
|
|
37
37
|
theirs:
|
|
38
38
|
value: false
|
|
39
|
-
- name: "API
|
|
39
|
+
- name: "API access"
|
|
40
40
|
icon: "code"
|
|
41
41
|
ours:
|
|
42
42
|
value: "Full REST API"
|
|
@@ -60,13 +60,13 @@ alternative:
|
|
|
60
60
|
value: "200+"
|
|
61
61
|
theirs:
|
|
62
62
|
value: "50+"
|
|
63
|
-
- name: "Mobile
|
|
63
|
+
- name: "Mobile app"
|
|
64
64
|
icon: "mobile"
|
|
65
65
|
ours:
|
|
66
66
|
value: true
|
|
67
67
|
theirs:
|
|
68
68
|
value: true
|
|
69
|
-
- name: "Export
|
|
69
|
+
- name: "Export formats"
|
|
70
70
|
icon: "download"
|
|
71
71
|
ours:
|
|
72
72
|
value: "PDF, CSV, JSON"
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
icon: 'users',
|
|
20
20
|
dropdown: [
|
|
21
21
|
{
|
|
22
|
-
label: 'All
|
|
22
|
+
label: 'All users',
|
|
23
23
|
href: '/admin/users',
|
|
24
24
|
icon: 'list'
|
|
25
25
|
},
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
header: true,
|
|
49
|
-
label: 'External
|
|
49
|
+
label: 'External tools'
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
label: 'Stackblitz',
|
|
@@ -26,12 +26,15 @@
|
|
|
26
26
|
|
|
27
27
|
{% iftruthy page.resolved.asset_path %}
|
|
28
28
|
{% capture page-css-path %}/assets/css/pages/{{ page.resolved.asset_path }}.bundle.css{% endcapture %}
|
|
29
|
+
{% capture page-css-theme-path %}/assets/css/pages/{{ page.resolved.asset_path }}.{{ page.resolved.theme.id }}.bundle.css{% endcapture %}
|
|
29
30
|
{% endiftruthy %}
|
|
30
31
|
{% iffalsy page.resolved.asset_path %}
|
|
31
32
|
{% if page.canonical.path == "/" %}
|
|
32
33
|
{% capture page-css-path %}/assets/css/pages/index.bundle.css{% endcapture %}
|
|
34
|
+
{% capture page-css-theme-path %}/assets/css/pages/index.{{ page.resolved.theme.id }}.bundle.css{% endcapture %}
|
|
33
35
|
{% else %}
|
|
34
36
|
{% capture page-css-path %}/assets/css/pages{{ page.canonical.path }}/index.bundle.css{% endcapture %}
|
|
37
|
+
{% capture page-css-theme-path %}/assets/css/pages{{ page.canonical.path }}/index.{{ page.resolved.theme.id }}.bundle.css{% endcapture %}
|
|
35
38
|
{% endif %}
|
|
36
39
|
{% endiffalsy %}
|
|
37
40
|
|
|
@@ -210,6 +213,20 @@
|
|
|
210
213
|
{% endif %}
|
|
211
214
|
{% endiffile %}
|
|
212
215
|
|
|
216
|
+
<!-- Then, the active theme's page-specific bundle (loaded AFTER base so it can override).
|
|
217
|
+
Only present when the theme ships page CSS for this path — otherwise nothing loads
|
|
218
|
+
and the theme's component/general styles handle the page. No fallback needed. -->
|
|
219
|
+
{% iffile page-css-theme-path %}
|
|
220
|
+
<link rel="stylesheet" type="text/css" href="{{ site.url }}{{ page-css-theme-path }}?cb={{ site.uj.cache_breaker }}"/>
|
|
221
|
+
|
|
222
|
+
<!-- Dev log -->
|
|
223
|
+
{% if jekyll.environment == "development" %}
|
|
224
|
+
<script>
|
|
225
|
+
console.info("Theme page-specific css loading: #main{{ page-css-theme-path }}");
|
|
226
|
+
</script>
|
|
227
|
+
{% endif %}
|
|
228
|
+
{% endiffile %}
|
|
229
|
+
|
|
213
230
|
<!-- Style - Scripts are Disabled -->
|
|
214
231
|
<noscript>
|
|
215
232
|
{{ page-ie-script }}
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
{% capture action_attributes %}{% if action.attributes %}{% for attr in action.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
|
|
37
37
|
<div class="dropdown">
|
|
38
38
|
<button class="btn btn-link position-relative p-2" type="button" data-bs-toggle="dropdown" {{ action_attributes }} aria-expanded="false">
|
|
39
|
-
{% uj_icon action.icon
|
|
39
|
+
{% uj_icon action.icon, "fa-lg text-body" %}
|
|
40
40
|
{% if action.badge %}
|
|
41
41
|
<span class="position-absolute top-0 start-100 translate-middle badge rounded-pill {{ action.badge.class | default: 'bg-danger' }}">
|
|
42
42
|
{{ action.badge.text }}
|
|
@@ -70,11 +70,10 @@
|
|
|
70
70
|
</div>
|
|
71
71
|
|
|
72
72
|
<!-- Bottom Section -->
|
|
73
|
-
<div class="row mt-4 pt-3 border-top">
|
|
73
|
+
<div class="row mt-4 pt-3 border-top align-items-center">
|
|
74
74
|
<div class="col-md-6 d-flex align-items-center">
|
|
75
75
|
<!-- Language Dropdown -->
|
|
76
|
-
|
|
77
|
-
<div class="d-inline-block me-3">
|
|
76
|
+
<div class="d-flex align-items-center me-3">
|
|
78
77
|
<div class="dropup uj-language-dropdown">
|
|
79
78
|
<button class="btn btn-sm btn-outline-adaptive dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
80
79
|
<i class="fa fa-sm me-1">
|
|
@@ -85,7 +84,12 @@
|
|
|
85
84
|
</span>
|
|
86
85
|
</button>
|
|
87
86
|
<ul class="dropdown-menu">
|
|
88
|
-
{% assign
|
|
87
|
+
{% assign default_language = site.translation.default | default: "en" %}
|
|
88
|
+
{% if site.translation.enabled and site.translation.languages.size > 0 %}
|
|
89
|
+
{% assign all_languages = site.translation.languages | push: default_language %}
|
|
90
|
+
{% else %}
|
|
91
|
+
{% assign all_languages = "" | split: "" | push: default_language %}
|
|
92
|
+
{% endif %}
|
|
89
93
|
{% for language in all_languages %}
|
|
90
94
|
<li>
|
|
91
95
|
{% capture lang_name %}{% uj_language language, "native" %}{% endcapture %}
|
|
@@ -98,11 +102,10 @@
|
|
|
98
102
|
</ul>
|
|
99
103
|
</div>
|
|
100
104
|
</div>
|
|
101
|
-
{% endif %}
|
|
102
105
|
|
|
103
106
|
<!-- Social Links -->
|
|
104
107
|
{% if data.socials.enabled %}
|
|
105
|
-
<div class="d-
|
|
108
|
+
<div class="d-flex align-items-center">
|
|
106
109
|
{% if data.socials.list and data.socials.list.size > 0 %}
|
|
107
110
|
{% assign social_list = data.socials.list %}
|
|
108
111
|
{% else %}
|
|
@@ -6,7 +6,7 @@ layout: themes/classy/admin/core/minimal-viewport-locked
|
|
|
6
6
|
theme:
|
|
7
7
|
header:
|
|
8
8
|
title:
|
|
9
|
-
content: "Marketing
|
|
9
|
+
content: "Marketing calendar"
|
|
10
10
|
icon: "calendar-days"
|
|
11
11
|
breadcrumbs:
|
|
12
12
|
items:
|
|
@@ -16,7 +16,7 @@ theme:
|
|
|
16
16
|
- label: "Calendar"
|
|
17
17
|
actions:
|
|
18
18
|
items:
|
|
19
|
-
- label: "Create
|
|
19
|
+
- label: "Create campaign"
|
|
20
20
|
icon: "plus"
|
|
21
21
|
color: "primary"
|
|
22
22
|
attributes:
|
|
@@ -24,7 +24,7 @@ theme:
|
|
|
24
24
|
|
|
25
25
|
### REGULAR PAGES ###
|
|
26
26
|
meta:
|
|
27
|
-
title: "Marketing
|
|
27
|
+
title: "Marketing calendar - Admin"
|
|
28
28
|
description: "Schedule and manage marketing campaigns — emails and push notifications"
|
|
29
29
|
breadcrumb: "Calendar"
|
|
30
30
|
|
|
@@ -88,7 +88,7 @@ prerender_icons:
|
|
|
88
88
|
<!-- Campaign Type -->
|
|
89
89
|
<h6 class="mb-3">
|
|
90
90
|
{% uj_icon "bullhorn", "fa-sm me-2 text-info" %}
|
|
91
|
-
Campaign
|
|
91
|
+
Campaign type
|
|
92
92
|
</h6>
|
|
93
93
|
<div class="row mb-4">
|
|
94
94
|
<div class="col-6">
|
|
@@ -102,7 +102,7 @@ prerender_icons:
|
|
|
102
102
|
<input type="radio" class="btn-check" name="campaign.type" id="campaign-type-push" value="push" autocomplete="off">
|
|
103
103
|
<label class="btn btn-outline-adaptive w-100 d-flex align-items-center justify-content-center" for="campaign-type-push">
|
|
104
104
|
{% uj_icon "bell", "fa-sm me-2" %}
|
|
105
|
-
Push
|
|
105
|
+
Push notification
|
|
106
106
|
</label>
|
|
107
107
|
</div>
|
|
108
108
|
</div>
|
|
@@ -126,7 +126,7 @@ prerender_icons:
|
|
|
126
126
|
<div class="tab-pane fade show active" id="panel-edit" role="tabpanel">
|
|
127
127
|
<div class="mb-3">
|
|
128
128
|
<label for="campaign-name" class="form-label">
|
|
129
|
-
Campaign
|
|
129
|
+
Campaign name <span class="text-danger">*</span>
|
|
130
130
|
</label>
|
|
131
131
|
<input type="text"
|
|
132
132
|
class="form-control"
|
|
@@ -221,7 +221,7 @@ prerender_icons:
|
|
|
221
221
|
|
|
222
222
|
<div class="mb-3">
|
|
223
223
|
<label for="campaign-click-action" class="form-label">
|
|
224
|
-
Click
|
|
224
|
+
Click action URL
|
|
225
225
|
</label>
|
|
226
226
|
<input type="url"
|
|
227
227
|
class="form-control"
|
|
@@ -236,7 +236,7 @@ prerender_icons:
|
|
|
236
236
|
<div class="mb-3">
|
|
237
237
|
<label for="campaign-push-tags" class="form-label">
|
|
238
238
|
{% uj_icon "tags", "fa-sm me-1 text-info" %}
|
|
239
|
-
Filter by
|
|
239
|
+
Filter by tags
|
|
240
240
|
<small class="text-muted fw-normal ms-1">(comma-separated)</small>
|
|
241
241
|
</label>
|
|
242
242
|
<input type="text"
|
|
@@ -274,7 +274,7 @@ prerender_icons:
|
|
|
274
274
|
<!-- Discount Code -->
|
|
275
275
|
<div class="mb-3">
|
|
276
276
|
<label for="campaign-discount-code" class="form-label">
|
|
277
|
-
Discount
|
|
277
|
+
Discount code
|
|
278
278
|
<small class="text-muted fw-normal ms-1">(optional)</small>
|
|
279
279
|
</label>
|
|
280
280
|
<input type="text"
|
|
@@ -332,7 +332,7 @@ prerender_icons:
|
|
|
332
332
|
<div class="col-md-3 d-flex align-items-end">
|
|
333
333
|
<button type="button" class="btn btn-sm btn-outline-primary w-100" id="btn-send-now">
|
|
334
334
|
{% uj_icon "paper-plane", "fa-sm me-1" %}
|
|
335
|
-
Send
|
|
335
|
+
Send now
|
|
336
336
|
</button>
|
|
337
337
|
</div>
|
|
338
338
|
</div>
|
|
@@ -484,7 +484,7 @@ prerender_icons:
|
|
|
484
484
|
|
|
485
485
|
<div class="mb-3">
|
|
486
486
|
<label for="campaign-exclude-segments" class="form-label">
|
|
487
|
-
Exclude
|
|
487
|
+
Exclude segments
|
|
488
488
|
<small class="text-muted fw-normal ms-1">(comma-separated IDs)</small>
|
|
489
489
|
</label>
|
|
490
490
|
<input type="text"
|
|
@@ -498,7 +498,7 @@ prerender_icons:
|
|
|
498
498
|
<h6 class="mb-3 mt-4">
|
|
499
499
|
<a class="text-decoration-none" data-bs-toggle="collapse" href="#advanced-settings" role="button" aria-expanded="false">
|
|
500
500
|
{% uj_icon "sliders", "fa-sm me-2 text-info" %}
|
|
501
|
-
Advanced
|
|
501
|
+
Advanced settings
|
|
502
502
|
<small class="text-muted fw-normal ms-1">(optional)</small>
|
|
503
503
|
</a>
|
|
504
504
|
</h6>
|
|
@@ -527,7 +527,7 @@ prerender_icons:
|
|
|
527
527
|
</div>
|
|
528
528
|
|
|
529
529
|
<div class="mb-3">
|
|
530
|
-
<label class="form-label">UTM
|
|
530
|
+
<label class="form-label">UTM overrides</label>
|
|
531
531
|
<div class="row g-2" id="utm-fields">
|
|
532
532
|
<div class="col-md-6">
|
|
533
533
|
<input type="text" class="form-control form-control-sm" name="campaign.utm.utm_source" placeholder="utm_source">
|
|
@@ -6,7 +6,7 @@ layout: themes/classy/admin/core/minimal
|
|
|
6
6
|
theme:
|
|
7
7
|
header:
|
|
8
8
|
title:
|
|
9
|
-
content: "Create
|
|
9
|
+
content: "Create user"
|
|
10
10
|
icon: "user-plus"
|
|
11
11
|
breadcrumbs:
|
|
12
12
|
items:
|
|
@@ -14,20 +14,20 @@ theme:
|
|
|
14
14
|
href: "/admin"
|
|
15
15
|
- label: "Users"
|
|
16
16
|
href: "/admin/users"
|
|
17
|
-
- label: "Create
|
|
17
|
+
- label: "Create user"
|
|
18
18
|
|
|
19
19
|
### REGULAR PAGES ###
|
|
20
20
|
meta:
|
|
21
21
|
title: "Create User - Admin"
|
|
22
22
|
description: "Create a new user account"
|
|
23
|
-
breadcrumb: "Create
|
|
23
|
+
breadcrumb: "Create user"
|
|
24
24
|
---
|
|
25
25
|
|
|
26
26
|
<!-- Back Link -->
|
|
27
27
|
<div class="mb-3">
|
|
28
28
|
<a href="/admin/users" class="text-decoration-none">
|
|
29
29
|
{% uj_icon "arrow-left", "fa-sm me-2" %}
|
|
30
|
-
Back to
|
|
30
|
+
Back to users
|
|
31
31
|
</a>
|
|
32
32
|
</div>
|
|
33
33
|
|
|
@@ -51,7 +51,7 @@ meta:
|
|
|
51
51
|
<div class="form-text">Must be at least 6 characters</div>
|
|
52
52
|
</div>
|
|
53
53
|
<div class="col-md-6 mb-3">
|
|
54
|
-
<label for="confirmPassword" class="form-label">Confirm
|
|
54
|
+
<label for="confirmPassword" class="form-label">Confirm password <span class="text-danger">*</span></label>
|
|
55
55
|
<input type="password" class="form-control" id="confirmPassword" name="user.confirmPassword" required minlength="6">
|
|
56
56
|
</div>
|
|
57
57
|
</div>
|
|
@@ -6,7 +6,7 @@ layout: themes/[ site.theme.id ]/frontend/pages/auth/oauth2
|
|
|
6
6
|
meta:
|
|
7
7
|
title: "OAuth2 Authentication - {{ site.brand.name }}"
|
|
8
8
|
description: "Connect your account using OAuth2 for secure authentication."
|
|
9
|
-
breadcrumb: "OAuth2
|
|
9
|
+
breadcrumb: "OAuth2 authentication"
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
{{ content | uj_content_format }}
|
|
@@ -16,21 +16,21 @@ theme:
|
|
|
16
16
|
- label: Dashboard
|
|
17
17
|
actions:
|
|
18
18
|
items:
|
|
19
|
-
- label: New
|
|
19
|
+
- label: New project
|
|
20
20
|
icon: plus
|
|
21
21
|
color: primary
|
|
22
22
|
- label: Reports
|
|
23
23
|
icon: chart-line
|
|
24
24
|
color: adaptive
|
|
25
25
|
dropdown:
|
|
26
|
-
- label: Sales
|
|
26
|
+
- label: Sales report
|
|
27
27
|
icon: dollar-sign
|
|
28
28
|
href: /reports/sales
|
|
29
|
-
- label: Analytics
|
|
29
|
+
- label: Analytics report
|
|
30
30
|
icon: chart-bar
|
|
31
31
|
href: /reports/analytics
|
|
32
32
|
- divider: true
|
|
33
|
-
- label: Export
|
|
33
|
+
- label: Export all
|
|
34
34
|
icon: download
|
|
35
35
|
href: /reports/export
|
|
36
36
|
|
|
@@ -43,21 +43,21 @@ meta:
|
|
|
43
43
|
### PAGE CONFIG ###
|
|
44
44
|
stats_cards:
|
|
45
45
|
- id: "total_revenue"
|
|
46
|
-
title: "Total
|
|
46
|
+
title: "Total revenue"
|
|
47
47
|
value: "$24,300"
|
|
48
48
|
change: "+12.5%"
|
|
49
49
|
change_type: "success"
|
|
50
50
|
icon: "dollar-sign"
|
|
51
51
|
|
|
52
52
|
- id: "new_users"
|
|
53
|
-
title: "New
|
|
53
|
+
title: "New users"
|
|
54
54
|
value: "1,423"
|
|
55
55
|
change: "+5.8%"
|
|
56
56
|
change_type: "success"
|
|
57
57
|
icon: "users"
|
|
58
58
|
|
|
59
59
|
- id: "active_projects"
|
|
60
|
-
title: "Active
|
|
60
|
+
title: "Active projects"
|
|
61
61
|
value: "14"
|
|
62
62
|
change: "2 pending"
|
|
63
63
|
change_type: "warning"
|
|
@@ -107,7 +107,7 @@ quick_actions:
|
|
|
107
107
|
href: "#"
|
|
108
108
|
|
|
109
109
|
- id: "upload_files"
|
|
110
|
-
label: "Upload
|
|
110
|
+
label: "Upload files"
|
|
111
111
|
icon: "upload"
|
|
112
112
|
style: "outline-adaptive"
|
|
113
113
|
href: "#"
|
|
@@ -119,7 +119,7 @@ quick_actions:
|
|
|
119
119
|
href: "#"
|
|
120
120
|
|
|
121
121
|
- id: "view_analytics"
|
|
122
|
-
label: "View
|
|
122
|
+
label: "View analytics"
|
|
123
123
|
icon: "chart-bar"
|
|
124
124
|
style: "outline-adaptive"
|
|
125
125
|
href: "/analytics"
|
|
@@ -132,17 +132,17 @@ quick_actions:
|
|
|
132
132
|
|
|
133
133
|
progress_items:
|
|
134
134
|
- id: "project_alpha"
|
|
135
|
-
name: "Project
|
|
135
|
+
name: "Project alpha"
|
|
136
136
|
progress: 75
|
|
137
137
|
color: "primary"
|
|
138
138
|
|
|
139
139
|
- id: "website_redesign"
|
|
140
|
-
name: "Website
|
|
140
|
+
name: "Website redesign"
|
|
141
141
|
progress: 50
|
|
142
142
|
color: "info"
|
|
143
143
|
|
|
144
144
|
- id: "mobile_app"
|
|
145
|
-
name: "Mobile
|
|
145
|
+
name: "Mobile app"
|
|
146
146
|
progress: 90
|
|
147
147
|
color: "success"
|
|
148
148
|
---
|
|
@@ -40,7 +40,7 @@ story:
|
|
|
40
40
|
description: "Reached customers in over 100 countries and opened international offices"
|
|
41
41
|
- year: "2023"
|
|
42
42
|
title: "Innovation award"
|
|
43
|
-
description: "Recognized as
|
|
43
|
+
description: "Recognized as industry leader and received multiple awards for innovation"
|
|
44
44
|
- year: "{{ site.uj.date.year }}"
|
|
45
45
|
title: "The future"
|
|
46
46
|
description: "Continuing to push boundaries and build the future of business technology"
|
package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/alternatives/alternative.html
CHANGED
|
@@ -31,7 +31,7 @@ alternative:
|
|
|
31
31
|
comparison:
|
|
32
32
|
superheadline:
|
|
33
33
|
icon: "scale-balanced"
|
|
34
|
-
text: "Head to
|
|
34
|
+
text: "Head to head"
|
|
35
35
|
headline: "See how we"
|
|
36
36
|
headline_accent: "compare"
|
|
37
37
|
subheadline: "A side-by-side look at {{ site.brand.name }} vs {{ page.resolved.alternative.competitor.name }}"
|
|
@@ -87,7 +87,7 @@ alternative:
|
|
|
87
87
|
stats:
|
|
88
88
|
- number: "50,000+"
|
|
89
89
|
label: "Active users"
|
|
90
|
-
sublabel: "From 120+
|
|
90
|
+
sublabel: "From 120+ countries"
|
|
91
91
|
icon: "users"
|
|
92
92
|
color: "primary"
|
|
93
93
|
- number: "4.9"
|
|
@@ -97,7 +97,7 @@ alternative:
|
|
|
97
97
|
show_stars: true
|
|
98
98
|
- number: "99.99%"
|
|
99
99
|
label: "Uptime"
|
|
100
|
-
sublabel: "Enterprise-
|
|
100
|
+
sublabel: "Enterprise-grade"
|
|
101
101
|
icon: "shield-check"
|
|
102
102
|
color: "success"
|
|
103
103
|
- number: "24/7"
|
|
@@ -130,7 +130,7 @@ alternative:
|
|
|
130
130
|
cta:
|
|
131
131
|
superheadline:
|
|
132
132
|
icon: "rocket"
|
|
133
|
-
text: "Make the
|
|
133
|
+
text: "Make the switch"
|
|
134
134
|
headline: "Ready to leave"
|
|
135
135
|
headline_accent: "{{ page.resolved.alternative.competitor.name }} behind?"
|
|
136
136
|
description: "Join thousands who chose {{ site.brand.name }}. Start your free trial today — no credit card required."
|
|
@@ -10,7 +10,7 @@ theme:
|
|
|
10
10
|
### PAGE CONFIG ###
|
|
11
11
|
# Hero Section
|
|
12
12
|
hero:
|
|
13
|
-
tagline: "Compare &
|
|
13
|
+
tagline: "Compare & choose"
|
|
14
14
|
headline: "{{ site.brand.name }} vs the"
|
|
15
15
|
headline_accent: "competition"
|
|
16
16
|
description: "Not sure if {{ site.brand.name }} is right for you? Compare us head-to-head with the most popular alternatives and see why thousands are making the switch."
|
|
@@ -48,10 +48,10 @@ value_props:
|
|
|
48
48
|
- title: "Lightning fast"
|
|
49
49
|
description: "Built on modern infrastructure for blazing performance. No more waiting around."
|
|
50
50
|
icon: "bolt"
|
|
51
|
-
- title: "AI-
|
|
51
|
+
- title: "AI-powered"
|
|
52
52
|
description: "Smart automation built into every workflow to save you hours every week."
|
|
53
53
|
icon: "sparkles"
|
|
54
|
-
- title: "24/7
|
|
54
|
+
- title: "24/7 support"
|
|
55
55
|
description: "Real humans ready to help whenever you need it. Average response time under 5 minutes."
|
|
56
56
|
icon: "headset"
|
|
57
57
|
|
|
@@ -59,7 +59,7 @@ value_props:
|
|
|
59
59
|
stats:
|
|
60
60
|
- number: "50,000+"
|
|
61
61
|
label: "Active users"
|
|
62
|
-
sublabel: "From 120+
|
|
62
|
+
sublabel: "From 120+ countries"
|
|
63
63
|
icon: "users"
|
|
64
64
|
color: "primary"
|
|
65
65
|
- number: "4.9"
|
|
@@ -69,7 +69,7 @@ stats:
|
|
|
69
69
|
show_stars: true
|
|
70
70
|
- number: "99.99%"
|
|
71
71
|
label: "Uptime"
|
|
72
|
-
sublabel: "Enterprise-
|
|
72
|
+
sublabel: "Enterprise-grade"
|
|
73
73
|
icon: "shield-check"
|
|
74
74
|
color: "success"
|
|
75
75
|
- number: "24/7"
|