ultimate-jekyll-manager 1.9.4 → 1.9.6
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/CLAUDE.md +6 -0
- package/dist/assets/css/core/_utilities.scss +5 -2
- package/dist/assets/js/libs/form-manager.js +7 -8
- package/dist/commands/install.js +2 -2
- package/dist/commands/setup.js +2 -1
- package/dist/defaults/.github/workflows/build.yml +3 -1
- package/dist/defaults/dist/_includes/core/body.html +1 -7
- package/dist/defaults/dist/_includes/themes/classy/frontend/sections/footer.html +9 -1
- package/dist/defaults/dist/_layouts/blueprint/admin/calendar/index.html +1 -1
- package/dist/defaults/dist/_layouts/blueprint/admin/firebase/index.html +2 -2
- package/dist/defaults/dist/_layouts/blueprint/admin/studio/index.html +1 -1
- package/dist/defaults/dist/_layouts/blueprint/admin/users/index.html +2 -2
- package/dist/defaults/dist/_layouts/blueprint/admin/users/new.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/account/index.html +13 -13
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/reset.html +2 -2
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signin.html +3 -3
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/auth/signup.html +3 -3
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/blog/index.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/contact.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/download.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/feedback.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/index.html +2 -6
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/payment/checkout.html +1 -1
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/portal/email-preferences.html +2 -3
- package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/status.html +1 -1
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/blog/index.html +1 -1
- package/dist/defaults/dist/_layouts/themes/newsflash/frontend/pages/contact.html +1 -1
- package/dist/defaults/dist/pages/test/libraries/form-manager.html +31 -31
- package/dist/lib/safe-install.js +13 -0
- package/package.json +8 -1
- package/.nvmrc +0 -1
- package/CHANGELOG.md +0 -792
- package/CLAUDE-ATTRIBUTION.md +0 -215
- package/PROGRESS.md +0 -27
- package/TODO-ATTRIBUTION2.md +0 -753
- package/TODO-AUTH-TESTING.md +0 -165
- package/TODO-BACKEND.md +0 -13
- package/TODO-CHAT1.md +0 -41
- package/TODO-CONSENT-LIVETEST.md +0 -201
- package/TODO-NEW.md +0 -21
- package/TODO-themes.md +0 -34
- package/TODO-tracking.md +0 -69
- package/TODO-tracking2.md +0 -103
- package/TODO.md +0 -415
- package/_notes/CLAUDE-pages.md +0 -19
- package/_notes/CLAUDE-pages2.md +0 -18
- package/_notes/LOGOS.md +0 -1
- package/_notes/NOTES-app.md +0 -92
- package/_notes/NOTES-sub-2.md +0 -42
- package/_notes/NOTES-sub-ai.md +0 -165
- package/_notes/NOTES-sub-endpoints.md +0 -44
- package/_notes/NOTES-sub-example.md +0 -92
- package/_notes/NOTES-sub-plan.md +0 -36
- package/_notes/NOTES-sub-status.md +0 -123
- package/_notes/TODO-Claude.rtf +0 -105
- package/_notes/TODO-FileStructure.md +0 -249
- package/_notes/TODO-checkout.md +0 -33
- package/_notes/TODO-frontend.md +0 -61
- package/_notes/TODO-legacy.md +0 -18
- package/_notes/TODO-template-system.md +0 -73
- package/_notes/TODO-theme.md +0 -17
- package/logs/test.log +0 -144
package/CLAUDE.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
> **Note for contributors and Claude:** This file is the architectural overview — identity, top-level conventions, and a map to deep references. The **meat** (per-subsystem APIs, page customization recipes, theming, behavior tables, defaults lists) lives in `docs/<topic>.md`. When extending or adding content, write it in the matching `docs/*.md` file and cross-link from here — do NOT inline it. If a topic doesn't have a doc yet, create one. Goal: keep this file under 250 lines.
|
|
4
4
|
|
|
5
|
+
> **Mirrored structure:** BEM, UJM, BXM, and EM CLAUDE.md files mirror each other — shared sections (Supply-Chain Security, Development Workflow, File Conventions, etc.) appear in the **same order at the same position** across all four. When adding a section that applies to multiple frameworks, insert it in the same spot in all of them.
|
|
6
|
+
|
|
5
7
|
## Identity
|
|
6
8
|
|
|
7
9
|
Ultimate Jekyll Manager (UJM) is a comprehensive framework for building modern Jekyll-powered static sites. Sister project to Electron Manager (EM) and Browser Extension Manager (BXM). Provides:
|
|
@@ -176,6 +178,10 @@ Note: `-t` short alias belongs to `translation`. The `test` command uses `--test
|
|
|
176
178
|
- **🚫 NEVER run `npm start` in a consumer project** — the user runs the dev server; running it again kills theirs. Assume it's already running; if it isn't, **instruct the user to run it** rather than running it yourself. Instead, **check `logs/dev.log`** after editing files to confirm the watcher recompiled successfully (`Reloading Browsers...` = success; `errored` = fix the error) — never tail/attach to the process. If editing multiple files, check the log once after the last edit. A change that breaks the build is not a completed change. Running `npx mgr test` is fine.
|
|
177
179
|
- **Live-test UI changes via CDP.** After code changes compile, use the `chrome-devtools` MCP tools (screenshots, click, evaluate JS, console logs) to verify the change works in the running browser. This is the primary way to confirm UI changes — type-checking and test suites verify code correctness, not feature correctness. Read the URL from the consumer's `.temp/_config_browsersync.yml`. Prefer `https://localhost:4000`; fall back to the local network IP (e.g. `https://192.168.x.x:4000`) if localhost doesn't connect. See [docs/cdp-debugging.md](docs/cdp-debugging.md) + `~/.claude/mcp-server/servers/chrome-devtools/CLAUDE.md`.
|
|
178
180
|
|
|
181
|
+
## Supply-Chain Security
|
|
182
|
+
|
|
183
|
+
All `npm install` calls in CLI commands (`npx mgr i`, `npx mgr setup`) route through the `safeInstall()` helper (`src/lib/safe-install.js`). It prefixes `sfw` (Socket Firewall) when installed — blocking confirmed malware at the network level before packages reach disk. Falls back to plain npm if sfw isn't available. CI workflows install sfw globally and run `sfw npm install`. Installs will **fail if sfw detects confirmed malware** in any package in the dependency tree; non-critical CVEs and quality warnings pass through.
|
|
184
|
+
|
|
179
185
|
## File Conventions
|
|
180
186
|
|
|
181
187
|
- **CommonJS** in build-time / Node files (gulp tasks, commands, lib/). **ESM** in `src/index.js` (frontend Manager — webpack-bundled).
|
|
@@ -13,8 +13,10 @@
|
|
|
13
13
|
.disabled,
|
|
14
14
|
[disabled],
|
|
15
15
|
:disabled,
|
|
16
|
+
[aria-disabled="true"],
|
|
16
17
|
[data-page-loading] button.btn,
|
|
17
|
-
[data-page-loading] .btn-action
|
|
18
|
+
[data-page-loading] .btn-action,
|
|
19
|
+
form[data-form-state]:not([data-form-state="ready"]) [type="submit"] {
|
|
18
20
|
cursor: not-allowed !important;
|
|
19
21
|
pointer-events: all !important;
|
|
20
22
|
|
|
@@ -26,7 +28,8 @@
|
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
[data-page-loading] button.btn,
|
|
29
|
-
[data-page-loading] .btn-action
|
|
31
|
+
[data-page-loading] .btn-action,
|
|
32
|
+
form[data-form-state]:not([data-form-state="ready"]) [type="submit"] {
|
|
30
33
|
opacity: var(--bs-btn-disabled-opacity);
|
|
31
34
|
color: var(--bs-btn-disabled-color);
|
|
32
35
|
}
|
|
@@ -93,20 +93,19 @@ export class FormManager {
|
|
|
93
93
|
* Initialize the form manager
|
|
94
94
|
*/
|
|
95
95
|
_init() {
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
//
|
|
100
|
-
//
|
|
96
|
+
// Set the form state attribute for debugging and consumer CSS hooks.
|
|
97
|
+
this.$form.setAttribute('data-form-state', this.state);
|
|
98
|
+
|
|
99
|
+
// Snapshot elements that are disabled in HTML markup. These are
|
|
100
|
+
// business-logic disabled (e.g. "coming soon" options) and must stay
|
|
101
|
+
// disabled through every state transition. Submit buttons are excluded
|
|
102
|
+
// — disabled submit buttons in HTML are loading guards that FM takes over.
|
|
101
103
|
this.$form.querySelectorAll('button, input, select, textarea').forEach(($el) => {
|
|
102
104
|
if ($el.disabled && $el.type !== 'submit') {
|
|
103
105
|
this._permanentlyDisabled.add($el);
|
|
104
106
|
}
|
|
105
107
|
});
|
|
106
108
|
|
|
107
|
-
// Disable form during initialization
|
|
108
|
-
this._setDisabled(true);
|
|
109
|
-
|
|
110
109
|
// Attach submit handler
|
|
111
110
|
this.$form.addEventListener('submit', (e) => this._handleSubmit(e));
|
|
112
111
|
|
package/dist/commands/install.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Libraries
|
|
2
2
|
const Manager = new (require('../build.js'));
|
|
3
3
|
const logger = Manager.logger('install');
|
|
4
|
-
const {
|
|
4
|
+
const { safeInstall } = require('../lib/safe-install');
|
|
5
5
|
const os = require('os');
|
|
6
6
|
|
|
7
7
|
// Load package
|
|
@@ -48,5 +48,5 @@ module.exports = async function (options) {
|
|
|
48
48
|
};
|
|
49
49
|
|
|
50
50
|
function install(command) {
|
|
51
|
-
return
|
|
51
|
+
return safeInstall(command);
|
|
52
52
|
}
|
package/dist/commands/setup.js
CHANGED
|
@@ -6,6 +6,7 @@ const jetpack = require('fs-jetpack');
|
|
|
6
6
|
const version = require('wonderful-version');
|
|
7
7
|
const fetch = require('wonderful-fetch');
|
|
8
8
|
const { execute } = require('node-powertools');
|
|
9
|
+
const { safeInstall } = require('../lib/safe-install');
|
|
9
10
|
const NPM = require('npm-api');
|
|
10
11
|
const glob = require('glob').globSync;
|
|
11
12
|
const detectGitHubRepository = require('../gulp/tasks/utils/detect-github-repo');
|
|
@@ -652,7 +653,7 @@ function npmInstall(pkg, ver, location) {
|
|
|
652
653
|
|
|
653
654
|
logger.log('Installing:', command);
|
|
654
655
|
|
|
655
|
-
return
|
|
656
|
+
return safeInstall(command)
|
|
656
657
|
.then(() => {
|
|
657
658
|
const projectUpdated = jetpack.read(path.join(process.cwd(), 'package.json'), 'json');
|
|
658
659
|
|
|
@@ -60,8 +60,10 @@ jobs:
|
|
|
60
60
|
uses: actions/setup-node@v4
|
|
61
61
|
with:
|
|
62
62
|
node-version: ${{ env.NODE_VERSION }}
|
|
63
|
+
- name: Install Socket Firewall
|
|
64
|
+
run: npm install -g sfw
|
|
63
65
|
- name: Run node install
|
|
64
|
-
run: npm install
|
|
66
|
+
run: sfw npm install
|
|
65
67
|
- name: Log dependency versions
|
|
66
68
|
run: |
|
|
67
69
|
echo "🖥️ Unix Versions: "
|
|
@@ -96,22 +96,16 @@
|
|
|
96
96
|
<script type="text/javascript">
|
|
97
97
|
(function() {
|
|
98
98
|
'use strict';
|
|
99
|
-
// Attach click listener immediately to prevent clicks on disabled elements
|
|
100
99
|
document.addEventListener('click', function(e) {
|
|
101
100
|
var target = e.target;
|
|
102
|
-
|
|
103
|
-
// Check if click is on a disabled element OR a button/form element during page load
|
|
104
101
|
if (
|
|
105
|
-
target.closest('*[disabled], *.disabled, :disabled')
|
|
102
|
+
target.closest('*[disabled], *.disabled, :disabled, [aria-disabled="true"]')
|
|
106
103
|
|| (
|
|
107
104
|
document.documentElement.hasAttribute('data-page-loading')
|
|
108
105
|
&& target.closest('button, input[type="submit"], input[type="button"], input[type="reset"], .btn-action')
|
|
109
106
|
)
|
|
110
107
|
) {
|
|
111
|
-
// Log the click for debugging
|
|
112
108
|
console.log('Click prevented (disabled):', target);
|
|
113
|
-
|
|
114
|
-
// Prevent all actions
|
|
115
109
|
e.preventDefault();
|
|
116
110
|
e.stopImmediatePropagation();
|
|
117
111
|
e.stopPropagation();
|
|
@@ -86,7 +86,15 @@
|
|
|
86
86
|
</button>
|
|
87
87
|
<ul class="dropdown-menu">
|
|
88
88
|
{% assign default_language = site.translation.default | default: "en" %}
|
|
89
|
-
{%
|
|
89
|
+
{% assign page_excluded_from_translation = false %}
|
|
90
|
+
{% for exclude in site.translation.exclude %}
|
|
91
|
+
{% assign exclude_folder = "/" | append: exclude | append: "/" %}
|
|
92
|
+
{% assign exclude_page = "/" | append: exclude %}
|
|
93
|
+
{% if page.url == exclude_page or page.url contains exclude_folder %}
|
|
94
|
+
{% assign page_excluded_from_translation = true %}
|
|
95
|
+
{% endif %}
|
|
96
|
+
{% endfor %}
|
|
97
|
+
{% if site.translation.enabled and site.translation.languages.size > 0 and page_excluded_from_translation != true %}
|
|
90
98
|
{% assign all_languages = site.translation.languages | push: default_language %}
|
|
91
99
|
{% else %}
|
|
92
100
|
{% assign all_languages = "" | split: "" | push: default_language %}
|
|
@@ -85,7 +85,7 @@ prerender_icons:
|
|
|
85
85
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
86
86
|
</div>
|
|
87
87
|
<div class="modal-body">
|
|
88
|
-
<form id="campaign-editor-form" novalidate onsubmit="return false">
|
|
88
|
+
<form id="campaign-editor-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
89
89
|
|
|
90
90
|
<!-- Campaign Type -->
|
|
91
91
|
<h6 class="mb-3">
|
|
@@ -87,7 +87,7 @@ prerender_icons:
|
|
|
87
87
|
<hr class="my-2">
|
|
88
88
|
|
|
89
89
|
<!-- Custom Collection Input -->
|
|
90
|
-
<form id="collection-form" onsubmit="return false">
|
|
90
|
+
<form id="collection-form" data-form-state="initializing" onsubmit="return false">
|
|
91
91
|
<div class="input-group input-group-sm">
|
|
92
92
|
<input type="text" class="form-control" name="collection.path" placeholder="Collection path..." aria-label="Collection path" required>
|
|
93
93
|
<button type="submit" class="btn btn-outline-adaptive">
|
|
@@ -104,7 +104,7 @@ prerender_icons:
|
|
|
104
104
|
<h6 class="mb-0">{% uj_icon "magnifying-glass", "fa-sm me-2" %} Query</h6>
|
|
105
105
|
</div>
|
|
106
106
|
<div class="card-body">
|
|
107
|
-
<form id="query-form" onsubmit="return false">
|
|
107
|
+
<form id="query-form" data-form-state="initializing" onsubmit="return false">
|
|
108
108
|
<div class="mb-2">
|
|
109
109
|
<label for="query-field" class="form-label small mb-1">Field</label>
|
|
110
110
|
<input type="text" class="form-control form-control-sm" name="query.field" id="query-field" placeholder="e.g. auth.email" required>
|
|
@@ -36,7 +36,7 @@ web_manager:
|
|
|
36
36
|
<div class="studio-clips" id="studio-clips">
|
|
37
37
|
<!-- Populated by JS from registered clips -->
|
|
38
38
|
</div>
|
|
39
|
-
<form id="studio-controls-form" class="studio-controls">
|
|
39
|
+
<form id="studio-controls-form" class="studio-controls" data-form-state="initializing" onsubmit="return false">
|
|
40
40
|
<fieldset id="studio-fieldset">
|
|
41
41
|
<!-- Aspect ratio toggle -->
|
|
42
42
|
<label class="studio-label">
|
|
@@ -101,7 +101,7 @@ prerender_icons:
|
|
|
101
101
|
</div>
|
|
102
102
|
|
|
103
103
|
<!-- Search Form -->
|
|
104
|
-
<form id="user-search-form" onsubmit="return false">
|
|
104
|
+
<form id="user-search-form" data-form-state="initializing" onsubmit="return false">
|
|
105
105
|
<div class="row mb-3">
|
|
106
106
|
<div class="col">
|
|
107
107
|
<div class="input-group">
|
|
@@ -252,7 +252,7 @@ prerender_icons:
|
|
|
252
252
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
|
253
253
|
</div>
|
|
254
254
|
<div class="modal-body">
|
|
255
|
-
<form id="user-edit-form" onsubmit="return false">
|
|
255
|
+
<form id="user-edit-form" data-form-state="initializing" onsubmit="return false">
|
|
256
256
|
<!-- UID (read-only) -->
|
|
257
257
|
<div class="mb-3">
|
|
258
258
|
<label class="form-label small text-muted">UID</label>
|
|
@@ -39,7 +39,7 @@ meta:
|
|
|
39
39
|
<h5 class="mb-0">Create new user</h5>
|
|
40
40
|
</div>
|
|
41
41
|
<div class="card-body">
|
|
42
|
-
<form id="create-user-form" novalidate onsubmit="return false">
|
|
42
|
+
<form id="create-user-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
43
43
|
<div class="mb-3">
|
|
44
44
|
<label for="email" class="form-label">Email address <span class="text-danger">*</span></label>
|
|
45
45
|
<input type="email" class="form-control" id="email" name="user.email" required autofocus>
|
|
@@ -239,7 +239,7 @@ badges:
|
|
|
239
239
|
<section id="profile-section" class="account-section d-none">
|
|
240
240
|
<h2 class="h3 mb-4" >My profile</h2>
|
|
241
241
|
|
|
242
|
-
<form id="profile-form" novalidate onsubmit="return false">
|
|
242
|
+
<form id="profile-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
243
243
|
<!-- Avatar and Edit Button -->
|
|
244
244
|
<div class="mb-4">
|
|
245
245
|
<div class="d-flex align-items-center">
|
|
@@ -799,7 +799,7 @@ badges:
|
|
|
799
799
|
</div>
|
|
800
800
|
</div>
|
|
801
801
|
<div class="flex-shrink-0">
|
|
802
|
-
<form id="signin-method-{{ method.id }}-form" class="d-grid d-sm-inline-block" novalidate onsubmit="return false">
|
|
802
|
+
<form id="signin-method-{{ method.id }}-form" class="d-grid d-sm-inline-block" novalidate data-form-state="initializing" onsubmit="return false">
|
|
803
803
|
<input type="hidden" name="method" value="{{ method.id }}">
|
|
804
804
|
{% if method.id == "password" %}
|
|
805
805
|
<button type="submit" class="btn btn-primary btn-sm" data-action="change">
|
|
@@ -841,7 +841,7 @@ badges:
|
|
|
841
841
|
<div class="card-body">
|
|
842
842
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
843
843
|
<h5 class="card-title mb-0">Active sessions</h5>
|
|
844
|
-
<form id="signout-all-sessions-form" class="d-inline" novalidate onsubmit="return false">
|
|
844
|
+
<form id="signout-all-sessions-form" class="d-inline" novalidate data-form-state="initializing" onsubmit="return false">
|
|
845
845
|
<input type="hidden" name="action" value="signout-all">
|
|
846
846
|
<button type="submit" class="btn btn-outline-danger btn-sm">
|
|
847
847
|
{% uj_icon "right-from-bracket", "me-1" %}
|
|
@@ -967,7 +967,7 @@ badges:
|
|
|
967
967
|
</div>
|
|
968
968
|
<div class="text-start text-sm-end flex-shrink-0">
|
|
969
969
|
<div>
|
|
970
|
-
<form id="connection-form-{{ connection.id }}" class="d-grid d-sm-inline-block" novalidate onsubmit="return false">
|
|
970
|
+
<form id="connection-form-{{ connection.id }}" class="d-grid d-sm-inline-block" novalidate data-form-state="initializing" onsubmit="return false">
|
|
971
971
|
<input type="hidden" name="provider" value="{{ connection.id }}">
|
|
972
972
|
<!-- Connect button -->
|
|
973
973
|
<button type="submit" class="btn btn-sm btn-primary" data-action="connect">
|
|
@@ -1109,7 +1109,7 @@ badges:
|
|
|
1109
1109
|
If you cancel, your subscription will remain active until the end of your current billing period. After that, you'll be downgraded to the free plan and will lose access to premium features. You can resubscribe at any time.
|
|
1110
1110
|
</p>
|
|
1111
1111
|
|
|
1112
|
-
<form id="cancel-subscription-form" novalidate onsubmit="return false">
|
|
1112
|
+
<form id="cancel-subscription-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
1113
1113
|
<!-- Cancellation Reasons (randomized by JS) -->
|
|
1114
1114
|
<div class="mb-3">
|
|
1115
1115
|
<label class="form-label">Why are you cancelling?</label>
|
|
@@ -1261,7 +1261,7 @@ badges:
|
|
|
1261
1261
|
<div class="card-body">
|
|
1262
1262
|
<h5 class="card-title">Email preferences</h5>
|
|
1263
1263
|
|
|
1264
|
-
<form id="marketing-emails-form" novalidate>
|
|
1264
|
+
<form id="marketing-emails-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
1265
1265
|
<div class="form-check form-switch mb-3">
|
|
1266
1266
|
<input class="form-check-input" type="checkbox" id="marketing-emails" name="enabled">
|
|
1267
1267
|
<label class="form-check-label" for="marketing-emails">
|
|
@@ -1285,7 +1285,7 @@ badges:
|
|
|
1285
1285
|
</div>
|
|
1286
1286
|
<p class="text-muted small mb-3">Receive push notifications in your browser for important updates.</p>
|
|
1287
1287
|
|
|
1288
|
-
<form id="push-subscribe-form" novalidate onsubmit="return false" style="display:none">
|
|
1288
|
+
<form id="push-subscribe-form" novalidate data-form-state="initializing" onsubmit="return false" style="display:none">
|
|
1289
1289
|
<button type="submit" class="btn btn-adaptive btn-sm" id="push-subscribe-btn">
|
|
1290
1290
|
{% uj_icon "bell", "me-1" %}
|
|
1291
1291
|
<span class="button-text">Enable push notifications</span>
|
|
@@ -1318,7 +1318,7 @@ badges:
|
|
|
1318
1318
|
<div class="card-body">
|
|
1319
1319
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
1320
1320
|
<h5 class="card-title mb-0">Your API key</h5>
|
|
1321
|
-
<form id="reset-api-key-form" class="d-inline" novalidate onsubmit="return false">
|
|
1321
|
+
<form id="reset-api-key-form" class="d-inline" novalidate data-form-state="initializing" onsubmit="return false">
|
|
1322
1322
|
<button type="submit" class="btn btn-outline-danger btn-sm" id="reset-api-key-btn">
|
|
1323
1323
|
{% uj_icon "rotate", "me-1" %}
|
|
1324
1324
|
<span class="button-text">
|
|
@@ -1619,7 +1619,7 @@ badges:
|
|
|
1619
1619
|
</h5>
|
|
1620
1620
|
<p id="data-request-status-message" class="card-text text-muted"></p>
|
|
1621
1621
|
<div id="data-request-download" class="d-none">
|
|
1622
|
-
<form id="data-request-download-form" onsubmit="return false">
|
|
1622
|
+
<form id="data-request-download-form" data-form-state="initializing" onsubmit="return false">
|
|
1623
1623
|
<button type="submit" class="btn btn-primary btn-sm" id="data-request-download-btn">
|
|
1624
1624
|
{% uj_icon "download", "fa-sm me-2" %}
|
|
1625
1625
|
<span class="button-text">Download your data</span>
|
|
@@ -1627,7 +1627,7 @@ badges:
|
|
|
1627
1627
|
</form>
|
|
1628
1628
|
</div>
|
|
1629
1629
|
<div id="data-request-cancel" class="d-none">
|
|
1630
|
-
<form id="data-request-cancel-form" onsubmit="return false">
|
|
1630
|
+
<form id="data-request-cancel-form" data-form-state="initializing" onsubmit="return false">
|
|
1631
1631
|
<button type="submit" class="btn btn-primary btn-sm" id="data-request-cancel-btn">
|
|
1632
1632
|
{% uj_icon "rotate-left", "fa-sm me-2" %}
|
|
1633
1633
|
<span class="button-text">Request withdrawal</span>
|
|
@@ -1648,7 +1648,7 @@ badges:
|
|
|
1648
1648
|
Confirm data request
|
|
1649
1649
|
</h5>
|
|
1650
1650
|
|
|
1651
|
-
<form id="data-request-form" novalidate onsubmit="return false">
|
|
1651
|
+
<form id="data-request-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
1652
1652
|
<div class="mb-3">
|
|
1653
1653
|
<div class="form-check">
|
|
1654
1654
|
<input class="form-check-input" type="checkbox" id="data-request-confirm-checkbox" name="confirm_processing_time" required>
|
|
@@ -1751,7 +1751,7 @@ badges:
|
|
|
1751
1751
|
Confirm account deletion
|
|
1752
1752
|
</h5>
|
|
1753
1753
|
|
|
1754
|
-
<form id="delete-account-form" novalidate onsubmit="return false">
|
|
1754
|
+
<form id="delete-account-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
1755
1755
|
<div class="mb-3">
|
|
1756
1756
|
<label for="delete-reason" class="form-label">Reason for leaving</label>
|
|
1757
1757
|
<textarea class="form-control" id="delete-reason" name="reason" rows="3" placeholder="Help us improve by sharing why you're leaving..."></textarea>
|
|
@@ -1879,7 +1879,7 @@ badges:
|
|
|
1879
1879
|
Confirm refund request
|
|
1880
1880
|
</h5>
|
|
1881
1881
|
|
|
1882
|
-
<form id="refund-form" novalidate onsubmit="return false">
|
|
1882
|
+
<form id="refund-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
1883
1883
|
<!-- Refund reasons (randomized by JS) -->
|
|
1884
1884
|
<div class="mb-3">
|
|
1885
1885
|
<label class="form-label">Why are you requesting a refund? <span class="text-danger">*</span></label>
|
|
@@ -25,12 +25,12 @@ layout: themes/[ site.theme.id ]/frontend/core/cover
|
|
|
25
25
|
{% capture initializing_spinner %}<span class="spinner-border spinner-border-sm me-2 form-initializing-spinner"></span>{% endcapture %}
|
|
26
26
|
|
|
27
27
|
<!-- Reset Form -->
|
|
28
|
-
<form id="auth-form" autocomplete="on" novalidate onsubmit="return false">
|
|
28
|
+
<form id="auth-form" autocomplete="on" novalidate data-form-state="initializing" onsubmit="return false">
|
|
29
29
|
<div class="mb-4 text-start">
|
|
30
30
|
<label for="email" class="form-label fw-semibold">
|
|
31
31
|
Email <span class="text-danger">*</span>
|
|
32
32
|
</label>
|
|
33
|
-
<input type="email" class="form-control form-control-md" id="email" name="email" placeholder="Enter your email" autocomplete="email" autofocus required
|
|
33
|
+
<input type="email" class="form-control form-control-md" id="email" name="email" placeholder="Enter your email" autocomplete="email" autofocus required>
|
|
34
34
|
</div>
|
|
35
35
|
|
|
36
36
|
<button type="submit" class="btn btn-success _btn-lg w-100 mb-4" data-provider="email" disabled>
|
|
@@ -40,7 +40,7 @@ social_signin:
|
|
|
40
40
|
{% capture initializing_spinner %}<span class="spinner-border spinner-border-sm me-2 form-initializing-spinner"></span>{% endcapture %}
|
|
41
41
|
|
|
42
42
|
<!-- Sign in Form -->
|
|
43
|
-
<form id="auth-form" autocomplete="on" novalidate onsubmit="return false">
|
|
43
|
+
<form id="auth-form" autocomplete="on" novalidate data-form-state="initializing" onsubmit="return false">
|
|
44
44
|
<!-- Hidden default submit button for Enter key -->
|
|
45
45
|
<button type="submit" class="d-none" data-provider="email" aria-hidden="true" tabindex="-1"></button>
|
|
46
46
|
|
|
@@ -67,7 +67,7 @@ social_signin:
|
|
|
67
67
|
<label for="email" class="form-label fw-semibold">
|
|
68
68
|
Email <span class="text-danger">*</span>
|
|
69
69
|
</label>
|
|
70
|
-
<input type="email" class="form-control form-control-md" id="email" name="email" placeholder="Enter your email" autocomplete="email" autofocus
|
|
70
|
+
<input type="email" class="form-control form-control-md" id="email" name="email" placeholder="Enter your email" autocomplete="email" autofocus>
|
|
71
71
|
</div>
|
|
72
72
|
|
|
73
73
|
<div class="mb-3 text-start">
|
|
@@ -75,7 +75,7 @@ social_signin:
|
|
|
75
75
|
Password <span class="text-danger">*</span>
|
|
76
76
|
</label>
|
|
77
77
|
<div class="input-group">
|
|
78
|
-
<input type="password" class="form-control form-control-md" id="password" name="password" placeholder="Enter your password" autocomplete="current-password"
|
|
78
|
+
<input type="password" class="form-control form-control-md" id="password" name="password" placeholder="Enter your password" autocomplete="current-password">
|
|
79
79
|
<button class="btn border uj-password-toggle px-3" type="button" aria-label="Toggle password visibility">
|
|
80
80
|
<span class="uj-password-show">{% uj_icon "eye", "fa-fw" %}</span>
|
|
81
81
|
<span class="uj-password-hide d-none">{% uj_icon "eye-slash", "fa-fw" %}</span>
|
|
@@ -40,7 +40,7 @@ social_signup:
|
|
|
40
40
|
{% capture initializing_spinner %}<span class="spinner-border spinner-border-sm me-2 form-initializing-spinner"></span>{% endcapture %}
|
|
41
41
|
|
|
42
42
|
<!-- Sign up Form -->
|
|
43
|
-
<form id="auth-form" autocomplete="on" novalidate onsubmit="return false">
|
|
43
|
+
<form id="auth-form" autocomplete="on" novalidate data-form-state="initializing" onsubmit="return false">
|
|
44
44
|
<!-- Hidden default submit button for Enter key -->
|
|
45
45
|
<button type="submit" class="d-none" data-provider="email" aria-hidden="true" tabindex="-1"></button>
|
|
46
46
|
|
|
@@ -77,7 +77,7 @@ social_signup:
|
|
|
77
77
|
<label for="email" class="form-label fw-semibold">
|
|
78
78
|
Email <span class="text-danger">*</span>
|
|
79
79
|
</label>
|
|
80
|
-
<input type="email" class="form-control form-control-md" id="email" name="email" placeholder="Enter your email" autocomplete="email" autofocus
|
|
80
|
+
<input type="email" class="form-control form-control-md" id="email" name="email" placeholder="Enter your email" autocomplete="email" autofocus>
|
|
81
81
|
</div>
|
|
82
82
|
|
|
83
83
|
<div class="mb-3 text-start">
|
|
@@ -85,7 +85,7 @@ social_signup:
|
|
|
85
85
|
Password <span class="text-danger">*</span>
|
|
86
86
|
</label>
|
|
87
87
|
<div class="input-group">
|
|
88
|
-
<input type="password" class="form-control form-control-md" id="password" name="password" placeholder="Create a strong password" autocomplete="new-password"
|
|
88
|
+
<input type="password" class="form-control form-control-md" id="password" name="password" placeholder="Create a strong password" autocomplete="new-password">
|
|
89
89
|
<button class="btn border uj-password-toggle px-3" type="button" aria-label="Toggle password visibility">
|
|
90
90
|
<span class="uj-password-show">{% uj_icon "eye", "fa-fw" %}</span>
|
|
91
91
|
<span class="uj-password-hide d-none">{% uj_icon "eye-slash", "fa-fw" %}</span>
|
|
@@ -340,7 +340,7 @@ newsletter_cta:
|
|
|
340
340
|
{% endiftruthy %}
|
|
341
341
|
|
|
342
342
|
<!-- Newsletter Form -->
|
|
343
|
-
<form id="newsletter-form" class="newsletter-form" novalidate onsubmit="return false">
|
|
343
|
+
<form id="newsletter-form" class="newsletter-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
344
344
|
<div class="row g-3 justify-content-center">
|
|
345
345
|
<div class="col-md-7">
|
|
346
346
|
<input
|
|
@@ -178,7 +178,7 @@ faqs:
|
|
|
178
178
|
{% endiftruthy %}
|
|
179
179
|
</div>
|
|
180
180
|
|
|
181
|
-
<form id="contact-form" autocomplete="on" onsubmit="return false">
|
|
181
|
+
<form id="contact-form" autocomplete="on" data-form-state="initializing" onsubmit="return false">
|
|
182
182
|
<div class="row g-3 mb-4">
|
|
183
183
|
<div class="col-md-6">
|
|
184
184
|
<label for="first_name" class="form-label fw-semibold">First name <span class="text-danger">*</span></label>
|
|
@@ -351,7 +351,7 @@ cta:
|
|
|
351
351
|
{% else %}
|
|
352
352
|
{% if platform.id == "android" or platform.id == "ios" %}
|
|
353
353
|
<div class="mb-4 text-start">
|
|
354
|
-
<form id="mobile-email-form-{{ platform.id }}" class="mobile-email-form" data-platform="{{ platform.id }}" onsubmit="return false">
|
|
354
|
+
<form id="mobile-email-form-{{ platform.id }}" class="mobile-email-form" data-platform="{{ platform.id }}" data-form-state="initializing" onsubmit="return false">
|
|
355
355
|
<label for="email-{{ platform.id }}" class="form-label">Email address</label>
|
|
356
356
|
<div class="row g-3">
|
|
357
357
|
<div class="col-12 col-md-8">
|
|
@@ -84,7 +84,7 @@ prerender_icons:
|
|
|
84
84
|
{% endiftruthy %}
|
|
85
85
|
</div>
|
|
86
86
|
|
|
87
|
-
<form id="feedback-form" autocomplete="off" onsubmit="return false">
|
|
87
|
+
<form id="feedback-form" autocomplete="off" data-form-state="initializing" onsubmit="return false">
|
|
88
88
|
<!-- Rating Selection -->
|
|
89
89
|
<div class="feedback-rating-group mb-4">
|
|
90
90
|
<input type="hidden" name="rating" id="feedback-rating-input" required>
|
|
@@ -226,7 +226,7 @@ cta:
|
|
|
226
226
|
<!-- Input Demo: Single input with button -->
|
|
227
227
|
<div class="card bg-glassy border-0 {% unless is_side_layout %}mx-auto{% endunless %} {{ demo.options.class }}">
|
|
228
228
|
<div class="card-body">
|
|
229
|
-
<form id="hero-demo-form" class="d-flex flex-column {% unless is_side_layout %}flex-sm-row justify-content-center{% endunless %} gap-3" {% iftruthy demo.options.redirect %}data-redirect="{{ demo.options.redirect }}"{% endiftruthy %} onsubmit="return false">
|
|
229
|
+
<form id="hero-demo-form" class="d-flex flex-column {% unless is_side_layout %}flex-sm-row justify-content-center{% endunless %} gap-3" {% iftruthy demo.options.redirect %}data-redirect="{{ demo.options.redirect }}"{% endiftruthy %} data-form-state="initializing" onsubmit="return false">
|
|
230
230
|
<input
|
|
231
231
|
type="{{ demo.options.input_type | default: 'text' }}"
|
|
232
232
|
name="{{ demo.options.name | default: 'input' }}"
|
|
@@ -234,7 +234,6 @@ cta:
|
|
|
234
234
|
placeholder="{{ demo.options.placeholder }}"
|
|
235
235
|
{% iftruthy demo.options.required %}required{% endiftruthy %}
|
|
236
236
|
autofocus
|
|
237
|
-
disabled
|
|
238
237
|
>
|
|
239
238
|
{% assign demo_btn_class = demo.options.button.class | default: "btn-adaptive-inverse" %}
|
|
240
239
|
<button type="submit" class="btn {{ demo_btn_class }} btn-lg text-nowrap flex-shrink-0" disabled>
|
|
@@ -250,7 +249,7 @@ cta:
|
|
|
250
249
|
{% elsif demo.type == "form" %}
|
|
251
250
|
<!-- Form Demo: Multiple fields with card styling -->
|
|
252
251
|
<div class="{% unless is_side_layout %}mx-auto{% endunless %} {{ demo.options.class }}">
|
|
253
|
-
<form id="hero-demo-form" {% iftruthy demo.options.redirect %}data-redirect="{{ demo.options.redirect }}"{% endiftruthy %} onsubmit="return false">
|
|
252
|
+
<form id="hero-demo-form" {% iftruthy demo.options.redirect %}data-redirect="{{ demo.options.redirect }}"{% endiftruthy %} data-form-state="initializing" onsubmit="return false">
|
|
254
253
|
<div class="row g-3 {% unless is_side_layout %}justify-content-center{% endunless %}">
|
|
255
254
|
{% assign autofocus_set = false %}
|
|
256
255
|
{% for field in demo.options.fields %}
|
|
@@ -273,7 +272,6 @@ cta:
|
|
|
273
272
|
name="{{ field.name }}"
|
|
274
273
|
class="form-select form-select-lg border-0"
|
|
275
274
|
{% iftruthy field.required %}required{% endiftruthy %}
|
|
276
|
-
disabled
|
|
277
275
|
>
|
|
278
276
|
<option value="" disabled selected>{{ field.placeholder }}</option>
|
|
279
277
|
{% for option in field.options %}
|
|
@@ -289,7 +287,6 @@ cta:
|
|
|
289
287
|
rows="{{ field.rows | default: 3 }}"
|
|
290
288
|
{% iftruthy field.required %}required{% endiftruthy %}
|
|
291
289
|
{% unless autofocus_set %}autofocus{% assign autofocus_set = true %}{% endunless %}
|
|
292
|
-
disabled
|
|
293
290
|
></textarea>
|
|
294
291
|
{% else %}
|
|
295
292
|
<input
|
|
@@ -300,7 +297,6 @@ cta:
|
|
|
300
297
|
placeholder="{{ field.placeholder }}"
|
|
301
298
|
{% iftruthy field.required %}required{% endiftruthy %}
|
|
302
299
|
{% unless autofocus_set %}autofocus{% assign autofocus_set = true %}{% endunless %}
|
|
303
|
-
disabled
|
|
304
300
|
>
|
|
305
301
|
{% endif %}
|
|
306
302
|
</div>
|
|
@@ -164,7 +164,7 @@ web_manager:
|
|
|
164
164
|
</div> -->
|
|
165
165
|
|
|
166
166
|
<!-- Main Checkout Form -->
|
|
167
|
-
<form id="checkout-form" autocomplete="on" novalidate onsubmit="return false">
|
|
167
|
+
<form id="checkout-form" autocomplete="on" novalidate data-form-state="initializing" onsubmit="return false">
|
|
168
168
|
<!-- Content Row -->
|
|
169
169
|
<div class="row d-lg-flex">
|
|
170
170
|
<!-- Section 1: Billing Cycle & Customer Info -->
|
package/dist/defaults/dist/_layouts/themes/classy/frontend/pages/portal/email-preferences.html
CHANGED
|
@@ -45,7 +45,7 @@ prerender_icons:
|
|
|
45
45
|
</div>
|
|
46
46
|
|
|
47
47
|
<!-- Email preferences Form -->
|
|
48
|
-
<form id="email-preferences-form" autocomplete="off" onsubmit="return false">
|
|
48
|
+
<form id="email-preferences-form" autocomplete="off" data-form-state="initializing" onsubmit="return false">
|
|
49
49
|
<!-- Action selector -->
|
|
50
50
|
<div class="mb-4">
|
|
51
51
|
<div class="d-flex gap-2">
|
|
@@ -78,8 +78,7 @@ prerender_icons:
|
|
|
78
78
|
placeholder="Type your email to confirm"
|
|
79
79
|
autocomplete="email"
|
|
80
80
|
autofocus
|
|
81
|
-
required
|
|
82
|
-
disabled>
|
|
81
|
+
required>
|
|
83
82
|
<div class="invalid-feedback"></div>
|
|
84
83
|
</div>
|
|
85
84
|
|
|
@@ -255,7 +255,7 @@ build_info:
|
|
|
255
255
|
{% endiftruthy %}
|
|
256
256
|
</div>
|
|
257
257
|
<div class="col-lg-5">
|
|
258
|
-
<form id="status-subscribe-form" class="d-flex flex-column flex-sm-row gap-2" novalidate onsubmit="return false">
|
|
258
|
+
<form id="status-subscribe-form" class="d-flex flex-column flex-sm-row gap-2" novalidate data-form-state="initializing" onsubmit="return false">
|
|
259
259
|
<input
|
|
260
260
|
type="email"
|
|
261
261
|
class="form-control flex-grow-1"
|
|
@@ -332,7 +332,7 @@ newsletter_cta:
|
|
|
332
332
|
{% endiftruthy %}
|
|
333
333
|
|
|
334
334
|
<!-- Newsletter Form -->
|
|
335
|
-
<form id="newsletter-form" class="newsletter-form" novalidate onsubmit="return false">
|
|
335
|
+
<form id="newsletter-form" class="newsletter-form" novalidate data-form-state="initializing" onsubmit="return false">
|
|
336
336
|
<div class="row g-3 justify-content-center">
|
|
337
337
|
<div class="col-md-7">
|
|
338
338
|
<input
|
|
@@ -183,7 +183,7 @@ faqs:
|
|
|
183
183
|
{% endiftruthy %}
|
|
184
184
|
</div>
|
|
185
185
|
|
|
186
|
-
<form id="contact-form" autocomplete="on" onsubmit="return false">
|
|
186
|
+
<form id="contact-form" autocomplete="on" data-form-state="initializing" onsubmit="return false">
|
|
187
187
|
<div class="row g-3 mb-4">
|
|
188
188
|
<div class="col-md-6">
|
|
189
189
|
<label for="first_name" class="form-label fw-semibold">First name <span class="text-danger">*</span></label>
|