ultimate-jekyll-manager 1.0.2 → 1.0.4
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 +4 -0
- package/CLAUDE.md +64 -1
- package/TODO.md +13 -0
- package/dist/assets/css/pages/admin/calendar/index.scss +212 -18
- package/dist/assets/js/pages/admin/calendar/calendar-core.js +535 -95
- package/dist/assets/js/pages/admin/calendar/calendar-events.js +631 -124
- package/dist/assets/js/pages/admin/calendar/calendar-renderer.js +238 -69
- package/dist/assets/js/pages/admin/calendar/campaign-preview.js +100 -0
- package/dist/assets/js/pages/admin/calendar/index.js +3 -16
- package/dist/assets/js/pages/contact/index.js +5 -1
- package/dist/defaults/dist/_includes/admin/sections/sidebar.json +0 -34
- package/dist/defaults/dist/_includes/admin/sections/topbar.json +0 -34
- package/dist/defaults/dist/_includes/themes/classy/backend/sections/topbar.html +1 -72
- package/dist/defaults/dist/_includes/themes/classy/frontend/sections/nav.html +7 -140
- package/dist/defaults/dist/_includes/themes/classy/global/sections/account.html +72 -0
- package/dist/defaults/dist/_layouts/blueprint/admin/calendar/index.html +442 -159
- package/dist/defaults/src/_includes/backend/sections/topbar.json +0 -34
- package/dist/defaults/src/_includes/frontend/sections/nav.json +0 -34
- package/dist/defaults/src/_includes/global/sections/account.json +36 -0
- package/package.json +2 -1
- package/dist/assets/js/pages/admin/notifications/index.js +0 -53
- package/dist/assets/js/pages/admin/notifications/new/index.js +0 -492
- package/dist/defaults/dist/_layouts/blueprint/admin/newsletters/index.html +0 -59
- package/dist/defaults/dist/_layouts/blueprint/admin/newsletters/new.html +0 -46
- package/dist/defaults/dist/_layouts/blueprint/admin/notifications/index.html +0 -103
- package/dist/defaults/dist/_layouts/blueprint/admin/notifications/new.html +0 -399
- package/dist/defaults/dist/pages/admin/newsletters/index.html +0 -7
- package/dist/defaults/dist/pages/admin/newsletters/new.html +0 -7
- package/dist/defaults/dist/pages/admin/notifications/index.html +0 -7
- package/dist/defaults/dist/pages/admin/notifications/new.html +0 -7
package/CHANGELOG.md
CHANGED
|
@@ -15,6 +15,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
|
15
15
|
- `Security` in case of vulnerabilities.
|
|
16
16
|
|
|
17
17
|
---
|
|
18
|
+
## [1.0.3] - 2026-03-16
|
|
19
|
+
### Added
|
|
20
|
+
- Ensure consuming projects have `"private": true` in package.json during setup to prevent accidental npm publishes
|
|
21
|
+
|
|
18
22
|
## [1.0.1] - 2026-03-15
|
|
19
23
|
### Changed
|
|
20
24
|
- Upgrade `node-powertools` from ^2.3.2 to ^3.0.0
|
package/CLAUDE.md
CHANGED
|
@@ -131,10 +131,11 @@ UJ provides JSON configuration files for common sections like navigation and foo
|
|
|
131
131
|
**Configuration Files:**
|
|
132
132
|
- `src/defaults/src/_includes/frontend/sections/nav.json` - Navigation configuration
|
|
133
133
|
- `src/defaults/src/_includes/frontend/sections/footer.json` - Footer configuration
|
|
134
|
+
- `src/defaults/src/_includes/global/sections/account.json` - Account dropdown configuration (shared across frontend nav, backend topbar, admin topbar)
|
|
134
135
|
|
|
135
136
|
**How It Works:**
|
|
136
137
|
1. JSON files contain structured data (links, labels, settings)
|
|
137
|
-
2. HTML templates in `src/defaults/dist/_includes/themes/[theme-id]
|
|
138
|
+
2. HTML templates in `src/defaults/dist/_includes/themes/[theme-id]/` read and render this data
|
|
138
139
|
3. The build process converts `.json` → data loaded by `.html` templates
|
|
139
140
|
|
|
140
141
|
**Customizing Navigation/Footer:**
|
|
@@ -143,6 +144,68 @@ Consuming projects should create their own JSON files in `src/_includes/frontend
|
|
|
143
144
|
- `src/_includes/frontend/sections/nav.json`
|
|
144
145
|
- `src/_includes/frontend/sections/footer.json`
|
|
145
146
|
|
|
147
|
+
### Account Dropdown (Shared Component)
|
|
148
|
+
|
|
149
|
+
The account dropdown (avatar + user info + menu items) is a shared component used across the frontend nav, backend topbar, and admin topbar. It is defined once and included everywhere.
|
|
150
|
+
|
|
151
|
+
**Data Source:** `src/defaults/src/_includes/global/sections/account.json`
|
|
152
|
+
|
|
153
|
+
This is the single source of truth for account dropdown menu items. Consuming projects can override it by creating `src/_includes/global/sections/account.json`.
|
|
154
|
+
|
|
155
|
+
**Example: account.json**
|
|
156
|
+
```json5
|
|
157
|
+
{
|
|
158
|
+
dropdown: [
|
|
159
|
+
{ label: 'Account', href: '/account#profile', icon: 'user-gear' },
|
|
160
|
+
{ label: 'Dashboard', href: '/dashboard', icon: 'gauge-high' },
|
|
161
|
+
{ divider: true, attributes: [['data-wm-bind', '@show auth.account.roles.admin']] },
|
|
162
|
+
{ label: 'Admin Panel', href: '/admin/dashboard', icon: 'shield-halved', attributes: [['data-wm-bind', '@show auth.account.roles.admin']] },
|
|
163
|
+
{ divider: true },
|
|
164
|
+
{ label: 'Sign Out', icon: 'arrow-right-from-bracket', class: 'auth-signout-btn text-danger' }
|
|
165
|
+
]
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Include:** `src/defaults/dist/_includes/themes/classy/global/sections/account.html`
|
|
170
|
+
|
|
171
|
+
This renders the full account dropdown: avatar button with profile photo, user info header (displayName + email), and the menu items from `account.json`.
|
|
172
|
+
|
|
173
|
+
**Parameters:**
|
|
174
|
+
|
|
175
|
+
| Parameter | Default | Description |
|
|
176
|
+
|-----------|---------|-------------|
|
|
177
|
+
| `size` | `md` | Avatar size class (`sm`, `md`, `lg`) |
|
|
178
|
+
| `attributes` | none | Array of `[name, value]` attribute pairs for the dropdown wrapper |
|
|
179
|
+
|
|
180
|
+
**Usage in templates:**
|
|
181
|
+
```liquid
|
|
182
|
+
{% include themes/classy/global/sections/account.html size="md" attributes=action.attributes %}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**How it's wired into nav/topbar:**
|
|
186
|
+
|
|
187
|
+
In `nav.json` or `topbar.json`, set `type: 'account'` on an action — the rendering templates detect this type and include the shared account dropdown automatically. No `dropdown` array is needed on the action:
|
|
188
|
+
|
|
189
|
+
```json5
|
|
190
|
+
{
|
|
191
|
+
type: 'account',
|
|
192
|
+
attributes: [
|
|
193
|
+
['data-wm-bind', '@show auth.user'],
|
|
194
|
+
['hidden', '']
|
|
195
|
+
],
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**File Locations:**
|
|
200
|
+
|
|
201
|
+
| Purpose | Path |
|
|
202
|
+
|---------|------|
|
|
203
|
+
| Account data (SSOT) | `src/defaults/src/_includes/global/sections/account.json` |
|
|
204
|
+
| Account include | `src/defaults/dist/_includes/themes/classy/global/sections/account.html` |
|
|
205
|
+
| Frontend nav (uses include) | `src/defaults/dist/_includes/themes/classy/frontend/sections/nav.html` |
|
|
206
|
+
| Backend topbar (uses include) | `src/defaults/dist/_includes/themes/classy/backend/sections/topbar.html` |
|
|
207
|
+
| Admin topbar (wraps backend) | `src/defaults/dist/_includes/themes/classy/admin/sections/topbar.html` |
|
|
208
|
+
|
|
146
209
|
**Example: Footer Configuration**
|
|
147
210
|
|
|
148
211
|
```json
|
package/TODO.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
Next, we need to enable a way in the front-end and backend to enable CHANGING PLANS
|
|
2
|
+
* it obviously depends on the processor, but I WOULD LIKE TO FULLY SUPPORT CHANING BETWEEN ALL TYPES OF PLANS AND BILLING CYCLES
|
|
3
|
+
* so for example, a user on the plus plan monthly can change to plus annually, or pro annually
|
|
4
|
+
* im not sure what would be the easiest place to put the interface.... it would eithe rbe
|
|
5
|
+
* a button to a new page
|
|
6
|
+
* a button to the same checout page with a query param
|
|
7
|
+
* all happens inside the billing account page with a simple modal and a confirm button
|
|
8
|
+
* what happens if the user is on a trial? can they change plans?
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
1
14
|
|
|
2
15
|
NEW TODO
|
|
3
16
|
- service working failing to load scripts??
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
// Admin Calendar Styles
|
|
1
|
+
// Admin Marketing Calendar Styles
|
|
2
2
|
|
|
3
3
|
// Current time / today accent color
|
|
4
4
|
$calendar-now-color: #F44336;
|
|
5
5
|
|
|
6
|
+
// Campaign type colors (match JS constants)
|
|
7
|
+
$campaign-email-color: #2196F3;
|
|
8
|
+
$campaign-push-color: #4CAF50;
|
|
9
|
+
|
|
6
10
|
// ============================================
|
|
7
11
|
// Fix: viewport-locked layout sets display:flex on all direct children,
|
|
8
12
|
// which overrides Bootstrap modal's default display:none.
|
|
9
13
|
// Restore Bootstrap's default: hidden unless .show is present.
|
|
10
14
|
// ============================================
|
|
11
|
-
#
|
|
15
|
+
#campaign-editor-modal:not(.show),
|
|
16
|
+
#campaign-results-modal:not(.show) {
|
|
12
17
|
display: none !important;
|
|
13
18
|
}
|
|
14
19
|
|
|
@@ -129,8 +134,8 @@ $calendar-now-color: #F44336;
|
|
|
129
134
|
display: inline-flex;
|
|
130
135
|
align-items: center;
|
|
131
136
|
justify-content: center;
|
|
132
|
-
|
|
133
|
-
|
|
137
|
+
width: 1.5rem;
|
|
138
|
+
height: 1.5rem;
|
|
134
139
|
}
|
|
135
140
|
|
|
136
141
|
.calendar-cell-events {
|
|
@@ -305,8 +310,6 @@ $calendar-now-color: #F44336;
|
|
|
305
310
|
position: relative;
|
|
306
311
|
}
|
|
307
312
|
|
|
308
|
-
// Day events reuse week event styles via shared class in renderer
|
|
309
|
-
|
|
310
313
|
// ============================================
|
|
311
314
|
// Year View
|
|
312
315
|
// ============================================
|
|
@@ -386,6 +389,7 @@ $calendar-now-color: #F44336;
|
|
|
386
389
|
|
|
387
390
|
// ============================================
|
|
388
391
|
// Event Pills (Month View)
|
|
392
|
+
// CSS uses "event" as a calendar UI term; the data model uses "campaign"
|
|
389
393
|
// ============================================
|
|
390
394
|
.calendar-event {
|
|
391
395
|
display: flex;
|
|
@@ -395,6 +399,9 @@ $calendar-now-color: #F44336;
|
|
|
395
399
|
border-radius: 3px;
|
|
396
400
|
font-size: 0.7rem;
|
|
397
401
|
line-height: 1.3;
|
|
402
|
+
height: 1.25rem;
|
|
403
|
+
box-sizing: border-box;
|
|
404
|
+
border: 1px solid transparent;
|
|
398
405
|
white-space: nowrap;
|
|
399
406
|
overflow: hidden;
|
|
400
407
|
text-overflow: ellipsis;
|
|
@@ -425,33 +432,220 @@ $calendar-now-color: #F44336;
|
|
|
425
432
|
flex-shrink: 0;
|
|
426
433
|
}
|
|
427
434
|
|
|
435
|
+
.calendar-event-type-icon {
|
|
436
|
+
flex-shrink: 0;
|
|
437
|
+
opacity: 0.8;
|
|
438
|
+
}
|
|
439
|
+
|
|
428
440
|
.calendar-event-title {
|
|
429
441
|
overflow: hidden;
|
|
430
442
|
text-overflow: ellipsis;
|
|
431
443
|
}
|
|
432
444
|
|
|
433
445
|
// ============================================
|
|
434
|
-
//
|
|
446
|
+
// Campaign Status & Recurrence Styles
|
|
435
447
|
// ============================================
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
448
|
+
|
|
449
|
+
// Sent campaigns: faded with strikethrough-like visual
|
|
450
|
+
.calendar-event--sent {
|
|
451
|
+
cursor: default;
|
|
452
|
+
|
|
453
|
+
.calendar-event-title {
|
|
454
|
+
text-decoration: line-through;
|
|
455
|
+
text-decoration-thickness: 1px;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// Failed campaigns: red border accent
|
|
460
|
+
.calendar-event--failed {
|
|
441
461
|
cursor: pointer;
|
|
442
|
-
|
|
443
|
-
|
|
462
|
+
border-left: 3px solid $calendar-now-color !important;
|
|
463
|
+
background-color: $calendar-now-color !important;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// Virtual recurring occurrences: dashed border, slightly transparent
|
|
467
|
+
.calendar-event--virtual {
|
|
468
|
+
border-style: dashed;
|
|
469
|
+
border-color: rgba(255, 255, 255, 0.5);
|
|
470
|
+
opacity: 0.7;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// Recurring template/history: subtle left border indicator
|
|
474
|
+
.calendar-event--recurring {
|
|
475
|
+
border-left: 3px solid rgba(255, 255, 255, 0.6) !important;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// ============================================
|
|
479
|
+
// Campaign Preview (Email)
|
|
480
|
+
// ============================================
|
|
481
|
+
.email-preview {
|
|
482
|
+
max-width: 600px;
|
|
483
|
+
margin: 0 auto;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
.email-preview-header {
|
|
487
|
+
border-bottom: 1px solid var(--bs-border-color);
|
|
488
|
+
padding-bottom: 0.75rem;
|
|
489
|
+
margin-bottom: 1rem;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
.email-preview-subject {
|
|
493
|
+
font-size: 1.1rem;
|
|
494
|
+
font-weight: 600;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
.email-preview-preheader {
|
|
498
|
+
font-size: 0.85rem;
|
|
499
|
+
color: var(--bs-secondary-color);
|
|
500
|
+
margin-top: 0.25rem;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
.email-preview-body {
|
|
504
|
+
font-size: 0.9rem;
|
|
505
|
+
line-height: 1.6;
|
|
506
|
+
|
|
507
|
+
h1, h2, h3, h4, h5, h6 {
|
|
508
|
+
margin-top: 1rem;
|
|
509
|
+
margin-bottom: 0.5rem;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
h1 { font-size: 1.5rem; }
|
|
513
|
+
h2 { font-size: 1.25rem; }
|
|
514
|
+
h3 { font-size: 1.1rem; }
|
|
515
|
+
|
|
516
|
+
p { margin-bottom: 0.75rem; }
|
|
517
|
+
|
|
518
|
+
a { color: var(--bs-primary); }
|
|
519
|
+
|
|
520
|
+
ul, ol {
|
|
521
|
+
padding-left: 1.5rem;
|
|
522
|
+
margin-bottom: 0.75rem;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
blockquote {
|
|
526
|
+
border-left: 3px solid var(--bs-border-color);
|
|
527
|
+
padding-left: 1rem;
|
|
528
|
+
color: var(--bs-secondary-color);
|
|
529
|
+
margin: 0.75rem 0;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
code {
|
|
533
|
+
background-color: var(--bs-tertiary-bg);
|
|
534
|
+
padding: 0.125rem 0.375rem;
|
|
535
|
+
border-radius: 3px;
|
|
536
|
+
font-size: 0.85em;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
pre {
|
|
540
|
+
background-color: var(--bs-tertiary-bg);
|
|
541
|
+
padding: 0.75rem;
|
|
542
|
+
border-radius: 6px;
|
|
543
|
+
overflow-x: auto;
|
|
544
|
+
|
|
545
|
+
code {
|
|
546
|
+
background: none;
|
|
547
|
+
padding: 0;
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
img {
|
|
552
|
+
max-width: 100%;
|
|
553
|
+
height: auto;
|
|
554
|
+
border-radius: 4px;
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
.email-preview-disclaimer {
|
|
559
|
+
border-top: 1px solid var(--bs-border-color);
|
|
560
|
+
padding-top: 0.75rem;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
// ============================================
|
|
564
|
+
// Campaign Preview (Push Notification)
|
|
565
|
+
// ============================================
|
|
566
|
+
.push-preview-frame {
|
|
567
|
+
border: 1px solid var(--bs-border-color);
|
|
568
|
+
border-radius: 0.75rem;
|
|
569
|
+
padding: 0.5rem;
|
|
570
|
+
background-color: var(--bs-dark);
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
.push-preview-screen {
|
|
574
|
+
border-radius: 0.5rem;
|
|
575
|
+
padding: 0.5rem;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
.push-preview-status-bar {
|
|
579
|
+
display: flex;
|
|
580
|
+
justify-content: space-between;
|
|
581
|
+
font-size: 0.75rem;
|
|
582
|
+
color: rgba(255, 255, 255, 0.5);
|
|
583
|
+
margin-bottom: 0.5rem;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
.push-preview-notification {
|
|
587
|
+
background-color: var(--bs-secondary-bg);
|
|
588
|
+
border-radius: 0.5rem;
|
|
589
|
+
padding: 0.75rem;
|
|
590
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
|
591
|
+
cursor: pointer;
|
|
592
|
+
|
|
593
|
+
&:hover {
|
|
594
|
+
opacity: 0.9;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// ============================================
|
|
599
|
+
// List View
|
|
600
|
+
// ============================================
|
|
601
|
+
.calendar-list {
|
|
602
|
+
flex-grow: 1;
|
|
603
|
+
overflow-y: auto;
|
|
604
|
+
min-height: 0;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
.calendar-list table {
|
|
608
|
+
width: 100%;
|
|
609
|
+
margin-bottom: 0;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
.calendar-list-date-header td {
|
|
613
|
+
font-weight: 600;
|
|
614
|
+
font-size: 0.8rem;
|
|
615
|
+
text-transform: uppercase;
|
|
616
|
+
color: var(--bs-secondary-color);
|
|
617
|
+
padding: 0.75rem 0.5rem 0.25rem;
|
|
618
|
+
border-bottom: 2px solid var(--bs-border-color);
|
|
619
|
+
position: sticky;
|
|
620
|
+
top: 0;
|
|
621
|
+
background-color: var(--bs-body-bg);
|
|
622
|
+
z-index: 1;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
.calendar-list-row {
|
|
626
|
+
cursor: pointer;
|
|
627
|
+
transition: background-color 0.15s;
|
|
444
628
|
|
|
445
629
|
&:hover {
|
|
446
|
-
|
|
630
|
+
background-color: var(--bs-tertiary-bg);
|
|
447
631
|
}
|
|
448
632
|
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
633
|
+
td {
|
|
634
|
+
padding: 0.5rem;
|
|
635
|
+
border-bottom: 1px solid var(--bs-border-color-translucent);
|
|
636
|
+
font-size: 0.85rem;
|
|
637
|
+
vertical-align: middle;
|
|
452
638
|
}
|
|
453
639
|
}
|
|
454
640
|
|
|
641
|
+
.calendar-list-empty {
|
|
642
|
+
display: flex;
|
|
643
|
+
align-items: center;
|
|
644
|
+
justify-content: center;
|
|
645
|
+
flex-grow: 1;
|
|
646
|
+
color: var(--bs-secondary-color);
|
|
647
|
+
}
|
|
648
|
+
|
|
455
649
|
// ============================================
|
|
456
650
|
// Responsive
|
|
457
651
|
// ============================================
|