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.
Files changed (30) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/CLAUDE.md +64 -1
  3. package/TODO.md +13 -0
  4. package/dist/assets/css/pages/admin/calendar/index.scss +212 -18
  5. package/dist/assets/js/pages/admin/calendar/calendar-core.js +535 -95
  6. package/dist/assets/js/pages/admin/calendar/calendar-events.js +631 -124
  7. package/dist/assets/js/pages/admin/calendar/calendar-renderer.js +238 -69
  8. package/dist/assets/js/pages/admin/calendar/campaign-preview.js +100 -0
  9. package/dist/assets/js/pages/admin/calendar/index.js +3 -16
  10. package/dist/assets/js/pages/contact/index.js +5 -1
  11. package/dist/defaults/dist/_includes/admin/sections/sidebar.json +0 -34
  12. package/dist/defaults/dist/_includes/admin/sections/topbar.json +0 -34
  13. package/dist/defaults/dist/_includes/themes/classy/backend/sections/topbar.html +1 -72
  14. package/dist/defaults/dist/_includes/themes/classy/frontend/sections/nav.html +7 -140
  15. package/dist/defaults/dist/_includes/themes/classy/global/sections/account.html +72 -0
  16. package/dist/defaults/dist/_layouts/blueprint/admin/calendar/index.html +442 -159
  17. package/dist/defaults/src/_includes/backend/sections/topbar.json +0 -34
  18. package/dist/defaults/src/_includes/frontend/sections/nav.json +0 -34
  19. package/dist/defaults/src/_includes/global/sections/account.json +36 -0
  20. package/package.json +2 -1
  21. package/dist/assets/js/pages/admin/notifications/index.js +0 -53
  22. package/dist/assets/js/pages/admin/notifications/new/index.js +0 -492
  23. package/dist/defaults/dist/_layouts/blueprint/admin/newsletters/index.html +0 -59
  24. package/dist/defaults/dist/_layouts/blueprint/admin/newsletters/new.html +0 -46
  25. package/dist/defaults/dist/_layouts/blueprint/admin/notifications/index.html +0 -103
  26. package/dist/defaults/dist/_layouts/blueprint/admin/notifications/new.html +0 -399
  27. package/dist/defaults/dist/pages/admin/newsletters/index.html +0 -7
  28. package/dist/defaults/dist/pages/admin/newsletters/new.html +0 -7
  29. package/dist/defaults/dist/pages/admin/notifications/index.html +0 -7
  30. 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]/frontend/sections/` read and render this data
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
- #calendar-event-modal:not(.show) {
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
- min-width: 1.5rem;
133
- min-height: 1.5rem;
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
- // Color Swatches
446
+ // Campaign Status & Recurrence Styles
435
447
  // ============================================
436
- .color-swatch {
437
- width: 28px;
438
- height: 28px;
439
- border-radius: 50%;
440
- border: 2px solid transparent;
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
- transition: transform 0.15s, border-color 0.15s;
443
- padding: 0;
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
- transform: scale(1.15);
630
+ background-color: var(--bs-tertiary-bg);
447
631
  }
448
632
 
449
- &.active {
450
- border-color: var(--bs-body-color);
451
- transform: scale(1.15);
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
  // ============================================