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
@@ -39,40 +39,6 @@
39
39
  header: true,
40
40
  label: 'Marketing'
41
41
  },
42
- {
43
- label: 'Notifications',
44
- href: null,
45
- icon: 'bell',
46
- dropdown: [
47
- {
48
- label: 'All Notifications',
49
- href: '/admin/notifications',
50
- icon: 'list'
51
- },
52
- {
53
- label: 'Send New',
54
- href: '/admin/notifications/new',
55
- icon: 'paper-plane'
56
- }
57
- ]
58
- },
59
- {
60
- label: 'Newsletters',
61
- href: null,
62
- icon: 'envelope',
63
- dropdown: [
64
- {
65
- label: 'All Newsletters',
66
- href: '/admin/newsletters',
67
- icon: 'list'
68
- },
69
- {
70
- label: 'Send New',
71
- href: '/admin/newsletters/new',
72
- icon: 'plus'
73
- }
74
- ]
75
- },
76
42
  {
77
43
  label: 'Calendar',
78
44
  href: '/admin/calendar',
@@ -6,40 +6,6 @@
6
6
  ['data-wm-bind', '@show auth.user'],
7
7
  ['hidden', '']
8
8
  ],
9
- dropdown: [
10
- {
11
- label: 'Account',
12
- href: '/account#profile',
13
- icon: 'user-gear'
14
- },
15
- {
16
- label: 'Dashboard',
17
- href: '/dashboard',
18
- icon: 'gauge-high'
19
- },
20
- {
21
- divider: true,
22
- attributes: [
23
- ['data-wm-bind', '@show auth.account.roles.admin']
24
- ]
25
- },
26
- {
27
- label: 'Admin Panel',
28
- href: '/admin',
29
- icon: 'shield-halved',
30
- attributes: [
31
- ['data-wm-bind', '@show auth.account.roles.admin']
32
- ]
33
- },
34
- {
35
- divider: true,
36
- },
37
- {
38
- label: 'Sign Out',
39
- icon: 'arrow-right-from-bracket',
40
- class: 'auth-signout-btn text-danger'
41
- },
42
- ]
43
9
  }
44
10
  ]
45
11
  }
@@ -114,78 +114,7 @@
114
114
  </div>
115
115
  {% elsif action.type == 'account' %}
116
116
  <!-- Account Dropdown -->
117
- {% capture action_attributes %}{% if action.attributes %}{% for attr in action.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
118
- <div class="dropdown" data-wm-bind="@show auth.user" hidden>
119
- <button class="p-0 border-0 bg-transparent" type="button" data-bs-toggle="dropdown" {{ action_attributes }} aria-expanded="false">
120
- <div class="d-flex align-items-center">
121
- <span class="position-relative d-inline-block">
122
- <span class="avatar avatar-md rounded-circle bg-secondary bg-opacity-10 border d-flex align-items-center justify-content-center overflow-hidden">
123
- <img src="{{ site.uj.placeholder.src }}" data-wm-bind="@attr src auth.user.photoURL" alt="{{ site.brand.name }} profile picture"/>
124
- </span>
125
- <!-- Active status indicator -->
126
- <span class="position-absolute bottom-0 end-0 p-1 bg-success border border-2 border-white avatar avatar-2xs rounded-circle">
127
- <span class="visually-hidden">Active status</span>
128
- </span>
129
- </span>
130
- <!-- <span class="ms-2 d-none d-md-inline-block">
131
- <div class="small fw-semibold text-body" data-wm-bind="@text auth.user.displayName">User</div>
132
- </span> -->
133
- </div>
134
- </button>
135
- <ul class="dropdown-menu dropdown-menu-end shadow" style="min-width: 280px;">
136
- <!-- User info header -->
137
- <li>
138
- <a href="/account#profile" class="dropdown-item px-3 py-2 text-decoration-none">
139
- <div class="d-flex align-items-center">
140
- <div class="position-relative me-3">
141
- <div class="avatar avatar-md rounded-circle bg-secondary bg-opacity-10 border d-flex align-items-center justify-content-center overflow-hidden">
142
- <img src="{{ site.uj.placeholder.src }}" data-wm-bind="@attr src auth.user.photoURL" alt="{{ site.brand.name }} profile picture"/>
143
- </div>
144
- <span class="position-absolute bottom-0 end-0 p-1 bg-success border border-2 border-white avatar avatar-2xs rounded-circle">
145
- <span class="visually-hidden">Active status</span>
146
- </span>
147
- </div>
148
- <div class="flex-grow-1 overflow-hidden">
149
- <div class="fw-semibold text-truncate text-body" data-wm-bind="@text auth.user.displayName">User</div>
150
- <div class="small text-muted text-truncate" data-wm-bind="@text auth.user.email">email@example.com</div>
151
- </div>
152
- </div>
153
- </a>
154
- </li>
155
-
156
- <!-- Dropdown items -->
157
- {% if action.dropdown %}
158
- {% for child in action.dropdown %}
159
- {% capture child_attributes %}{% if child.attributes %}{% for attr in child.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
160
- {% capture child_active %}{% urlmatches child.href, "active" %}{% endcapture %}
161
- {% capture child_class %}dropdown-item d-flex align-items-center text-body {{ child_active }} {% if child.class %}{{ child.class }}{% endif %}{% endcapture %}
162
- {% capture child_content %}
163
- {% if child.icon %}
164
- {% uj_icon child.icon, "fa-md me-3" %}
165
- {% endif %}
166
- <span>{{ child.label }}</span>
167
- {% endcapture %}
168
-
169
- {% if child.divider %}
170
- <li><hr class="dropdown-divider" {{ child_attributes }}/></li>
171
- {% else %}
172
- <li>
173
- {% iftruthy child.href %}
174
- <a class="{{ child_class }}" href="{{ child.href }}" {{ child_attributes }}>
175
- {{ child_content }}
176
- </a>
177
- {% endiftruthy %}
178
- {% iffalsy child.href %}
179
- <button class="{{ child_class }}" type="button" {{ child_attributes }}>
180
- {{ child_content }}
181
- </button>
182
- {% endiffalsy %}
183
- </li>
184
- {% endif %}
185
- {% endfor %}
186
- {% endif %}
187
- </ul>
188
- </div>
117
+ {% include themes/classy/global/sections/account.html size="md" attributes=action.attributes %}
189
118
  {% elsif action.dropdown %}
190
119
  <!-- Generic Dropdown -->
191
120
  {% capture action_class %}btn {% if action.size %}btn-{{ action.size }}{% endif %} {% if action.class %}{{ action.class }}{% else %}btn-adaptive{% endif %}{% endcapture %}
@@ -32,74 +32,9 @@
32
32
 
33
33
  <!-- Mobile account dropdown (directly to the right of toggler) -->
34
34
  {% for action in data.actions %}
35
- {% if action.type == 'account' and action.dropdown %}
36
- {% capture action_attributes %}{% if action.attributes %}{% for attr in action.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
37
- <div class="dropdown animation-slide-up ms-2 d-inline-flex" data-wm-bind="@show auth.user" hidden>
38
- <button class="p-0 border-0 bg-transparent" type="button" data-bs-toggle="dropdown" {{ action_attributes }} aria-expanded="false">
39
- <span class="d-flex align-items-center">
40
- <span class="position-relative d-inline-flex">
41
- <span class="avatar avatar-sm rounded-circle bg-secondary bg-opacity-10 border d-flex align-items-center justify-content-center overflow-hidden d-inline-flex">
42
- <img src="{{ site.uj.placeholder.src }}" data-wm-bind="@attr src auth.user.photoURL" alt="{{ site.brand.name }} profile picture"/>
43
- </span>
44
- <!-- Active status indicator -->
45
- <span class="position-absolute bottom-0 end-0 p-1 bg-success border border-2 border-white avatar avatar-2xs rounded-circle mb-0">
46
- <span class="visually-hidden">Active status</span>
47
- </span>
48
- </span>
49
- </span>
50
- </button>
51
- <ul class="dropdown-menu dropdown-menu-end shadow" style="min-width: 280px;">
52
- <!-- User info header (clickable) -->
53
- <li>
54
- <a href="/account#profile" class="dropdown-item px-3 py-2 text-decoration-none">
55
- <div class="d-flex align-items-center">
56
- <div class="position-relative me-3">
57
- <div class="avatar avatar-md rounded-circle bg-secondary bg-opacity-10 border d-flex align-items-center justify-content-center overflow-hidden">
58
- <img src="{{ site.uj.placeholder.src }}" data-wm-bind="@attr src auth.user.photoURL" alt="{{ site.brand.name }} profile picture"/>
59
- </div>
60
- <!-- Active status indicator -->
61
- <span class="position-absolute bottom-0 end-0 p-1 bg-success border border-2 border-white avatar avatar-2xs rounded-circle mb-0">
62
- <span class="visually-hidden">Active status</span>
63
- </span>
64
- </div>
65
- <div class="flex-grow-1 overflow-hidden">
66
- <div class="fw-semibold text-truncate text-body" data-wm-bind="@text auth.user.displayName">User</div>
67
- <div class="small text-muted text-truncate" data-wm-bind="@text auth.user.email">email@example.com</div>
68
- </div>
69
- </div>
70
- </a>
71
- </li>
72
-
73
- <!-- Dropdown items -->
74
- {% for child in action.dropdown %}
75
- {% capture child_attributes %}{% if child.attributes %}{% for attr in child.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
76
- {% capture child_active %}{% urlmatches child.href, "active" %}{% endcapture %}
77
- {% capture child_class %}dropdown-item d-flex align-items-center text-body {{ child_active }} {% if child.class %}{{ child.class }}{% endif %}{% endcapture %}
78
- {% capture child_content %}
79
- {% if child.icon %}
80
- {% uj_icon child.icon, "fa-md me-3" %}
81
- {% endif %}
82
- <span>{{ child.label }}</span>
83
- {% endcapture %}
84
-
85
- {% if child.divider %}
86
- <li><hr class="dropdown-divider" {{ child_attributes }}/></li>
87
- {% else %}
88
- <li>
89
- {% iftruthy child.href %}
90
- <a class="{{ child_class }}" href="{{ child.href }}" {{ child_attributes }}>
91
- {{ child_content }}
92
- </a>
93
- {% endiftruthy %}
94
- {% iffalsy child.href %}
95
- <button class="{{ child_class }}" type="button" {{ child_attributes }}>
96
- {{ child_content }}
97
- </button>
98
- {% endiffalsy %}
99
- </li>
100
- {% endif %}
101
- {% endfor %}
102
- </ul>
35
+ {% if action.type == 'account' %}
36
+ <div class="ms-2">
37
+ {% include themes/classy/global/sections/account.html size="sm" attributes=action.attributes %}
103
38
  </div>
104
39
  {% endif %}
105
40
  {% endfor %}
@@ -187,77 +122,10 @@
187
122
  <!-- Right-aligned Actions (desktop only) -->
188
123
  <div class="d-none d-lg-inline-flex align-items-center gap-3">
189
124
  {% for action in data.actions %}
190
- {% if action.dropdown %}
191
- {% if action.type == 'account' %}
192
- <!-- Account dropdown with profile picture (desktop) -->
193
- {% capture action_attributes %}{% if action.attributes %}{% for attr in action.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
194
- <div class="dropdown animation-slide-up d-inline-flex" data-wm-bind="@show auth.user" hidden>
195
- <button class="p-0 border-0 bg-transparent" type="button" data-bs-toggle="dropdown" {{ action_attributes }} aria-expanded="false">
196
- <span class="d-flex align-items-center">
197
- <span class="position-relative d-inline-flex">
198
- <span class="avatar avatar-md rounded-circle bg-secondary bg-opacity-10 border d-flex align-items-center justify-content-center overflow-hidden d-inline-flex">
199
- <img src="{{ site.uj.placeholder.src }}" data-wm-bind="@attr src auth.user.photoURL" alt="{{ site.brand.name }} profile picture"/>
200
- </span>
201
- <!-- Active status indicator -->
202
- <span class="position-absolute bottom-0 end-0 p-1 bg-success border border-2 border-white avatar avatar-2xs rounded-circle mb-0">
203
- <span class="visually-hidden">Active status</span>
204
- </span>
205
- </span>
206
- </span>
207
- </button>
208
- <ul class="dropdown-menu dropdown-menu-end shadow" style="min-width: 280px;">
209
- <!-- User info header (clickable) -->
210
- <li>
211
- <a href="/account#profile" class="dropdown-item px-3 py-2 text-decoration-none">
212
- <div class="d-flex align-items-center">
213
- <div class="position-relative me-3">
214
- <div class="avatar avatar-md rounded-circle bg-secondary bg-opacity-10 border d-flex align-items-center justify-content-center overflow-hidden">
215
- <img src="{{ site.uj.placeholder.src }}" data-wm-bind="@attr src auth.user.photoURL" alt="{{ site.brand.name }} profile picture"/>
216
- </div>
217
- <!-- Active status indicator -->
218
- <span class="position-absolute bottom-0 end-0 p-1 bg-success border border-2 border-white avatar avatar-2xs rounded-circle mb-0">
219
- <span class="visually-hidden">Active status</span>
220
- </span>
221
- </div>
222
- <div class="flex-grow-1 overflow-hidden">
223
- <div class="fw-semibold text-truncate text-body" data-wm-bind="@text auth.user.displayName">User</div>
224
- <div class="small text-muted text-truncate" data-wm-bind="@text auth.user.email">email@example.com</div>
225
- </div>
226
- </div>
227
- </a>
228
- </li>
229
- <!-- Dropdown items -->
230
- {% for child in action.dropdown %}
231
- {% capture child_attributes %}{% if child.attributes %}{% for attr in child.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
232
- {% capture child_active %}{% urlmatches child.href, "active" %}{% endcapture %}
233
- {% capture child_class %}dropdown-item d-flex align-items-center text-body {{ child_active }} {% if child.class %}{{ child.class }}{% endif %}{% endcapture %}
234
- {% capture child_content %}
235
- {% if child.icon %}
236
- {% uj_icon child.icon, "fa-md me-3" %}
237
- {% endif %}
238
- <span>{{ child.label }}</span>
239
- {% endcapture %}
240
-
241
- {% if child.divider %}
242
- <li><hr class="dropdown-divider" {{ child_attributes }}/></li>
243
- {% else %}
244
- <li>
245
- {% iftruthy child.href %}
246
- <a class="{{ child_class }}" href="{{ child.href }}" {{ child_attributes }}>
247
- {{ child_content }}
248
- </a>
249
- {% endiftruthy %}
250
- {% iffalsy child.href %}
251
- <button class="{{ child_class }}" type="button" {{ child_attributes }}>
252
- {{ child_content }}
253
- </button>
254
- {% endiffalsy %}
255
- </li>
256
- {% endif %}
257
- {% endfor %}
258
- </ul>
259
- </div>
260
- {% else %}
125
+ {% if action.type == 'account' %}
126
+ <!-- Account dropdown with profile picture (desktop) -->
127
+ {% include themes/classy/global/sections/account.html size="md" attributes=action.attributes %}
128
+ {% elsif action.dropdown %}
261
129
  <!-- Regular button dropdown -->
262
130
  {% capture action_class %}btn dropdown-toggle {% if action.class %}{{ action.class }}{% endif %}{% endcapture %}
263
131
  {% capture action_attributes %}{% if action.attributes %}{% for attr in action.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
@@ -303,7 +171,6 @@
303
171
  {% endfor %}
304
172
  </ul>
305
173
  </div>
306
- {% endif %}
307
174
  {% else %}
308
175
  {% capture action_class %}btn {% if action.class %}{{ action.class }}{% endif %}{% endcapture %}
309
176
  {% capture action_attributes %}{% if action.attributes %}{% for attr in action.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
@@ -0,0 +1,72 @@
1
+ <!-- Account Dropdown (shared across frontend nav, backend topbar, admin topbar) -->
2
+ {% assign account_data = site.data._includes.global.sections.account %}
3
+ {% assign avatar_size = include.size | default: "md" %}
4
+
5
+ {% capture action_attributes %}{% if include.attributes %}{% for attr in include.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
6
+
7
+ <div class="dropdown animation-slide-up d-inline-flex" data-wm-bind="@show auth.user" hidden>
8
+ <button class="p-0 border-0 bg-transparent" type="button" data-bs-toggle="dropdown" {{ action_attributes }} aria-expanded="false">
9
+ <span class="d-flex align-items-center">
10
+ <span class="position-relative d-inline-flex">
11
+ <span class="avatar avatar-{{ avatar_size }} rounded-circle bg-secondary bg-opacity-10 border d-flex align-items-center justify-content-center overflow-hidden d-inline-flex">
12
+ <img src="{{ site.uj.placeholder.src }}" data-wm-bind="@attr src auth.user.photoURL" alt="{{ site.brand.name }} profile picture"/>
13
+ </span>
14
+ <!-- Active status indicator -->
15
+ <span class="position-absolute bottom-0 end-0 p-1 bg-success border border-2 border-white avatar avatar-2xs rounded-circle mb-0">
16
+ <span class="visually-hidden">Active status</span>
17
+ </span>
18
+ </span>
19
+ </span>
20
+ </button>
21
+ <ul class="dropdown-menu dropdown-menu-end shadow" style="min-width: 280px;">
22
+ <!-- User info header (clickable) -->
23
+ <li>
24
+ <a href="/account#profile" class="dropdown-item px-3 py-2 text-decoration-none">
25
+ <div class="d-flex align-items-center">
26
+ <div class="position-relative me-3">
27
+ <div class="avatar avatar-md rounded-circle bg-secondary bg-opacity-10 border d-flex align-items-center justify-content-center overflow-hidden">
28
+ <img src="{{ site.uj.placeholder.src }}" data-wm-bind="@attr src auth.user.photoURL" alt="{{ site.brand.name }} profile picture"/>
29
+ </div>
30
+ <!-- Active status indicator -->
31
+ <span class="position-absolute bottom-0 end-0 p-1 bg-success border border-2 border-white avatar avatar-2xs rounded-circle mb-0">
32
+ <span class="visually-hidden">Active status</span>
33
+ </span>
34
+ </div>
35
+ <div class="flex-grow-1 overflow-hidden">
36
+ <div class="fw-semibold text-truncate text-body" data-wm-bind="@text auth.user.displayName">User</div>
37
+ <div class="small text-muted text-truncate" data-wm-bind="@text auth.user.email">email@example.com</div>
38
+ </div>
39
+ </div>
40
+ </a>
41
+ </li>
42
+ <!-- Dropdown items -->
43
+ {% for child in account_data.dropdown %}
44
+ {% capture child_attributes %}{% if child.attributes %}{% for attr in child.attributes %} {{ attr[0] }}="{{ attr[1] }}"{% endfor %}{% endif %}{% endcapture %}
45
+ {% capture child_active %}{% urlmatches child.href, "active" %}{% endcapture %}
46
+ {% capture child_class %}dropdown-item d-flex align-items-center text-body {{ child_active }} {% if child.class %}{{ child.class }}{% endif %}{% endcapture %}
47
+ {% capture child_content %}
48
+ {% if child.icon %}
49
+ {% uj_icon child.icon, "fa-md me-3" %}
50
+ {% endif %}
51
+ <span>{{ child.label }}</span>
52
+ {% endcapture %}
53
+
54
+ {% if child.divider %}
55
+ <li><hr class="dropdown-divider" {{ child_attributes }}/></li>
56
+ {% else %}
57
+ <li>
58
+ {% iftruthy child.href %}
59
+ <a class="{{ child_class }}" href="{{ child.href }}" {{ child_attributes }}>
60
+ {{ child_content }}
61
+ </a>
62
+ {% endiftruthy %}
63
+ {% iffalsy child.href %}
64
+ <button class="{{ child_class }}" type="button" {{ child_attributes }}>
65
+ {{ child_content }}
66
+ </button>
67
+ {% endiffalsy %}
68
+ </li>
69
+ {% endif %}
70
+ {% endfor %}
71
+ </ul>
72
+ </div>