@apptegy/nuxt-navigation 0.1.125 → 0.2.0-alpha.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.
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div
3
3
  class="help-btn-wrapper"
4
- :class="{ collapsed }"
4
+ :class="[isBeaconNavEnabled ? 'beacon' : 'classic', { collapsed }]"
5
5
  >
6
6
  <button
7
7
  v-if="schoolWebsite"
@@ -83,8 +83,9 @@
83
83
  </template>
84
84
 
85
85
  <script setup>
86
- import { useSidebar, navigateTo, useAuth } from "#imports";
86
+ import { useSidebar, navigateTo, useAuth, useNuxtApp } from "#imports";
87
87
  import { ref, computed, onMounted } from "vue";
88
+ const { $ld } = useNuxtApp();
88
89
  const { userProfile } = useAuth();
89
90
  const props = defineProps({
90
91
  helpArticleOptions: { type: Array, required: true, default: () => [] },
@@ -105,6 +106,9 @@ const userRoomsRole = computed(() => {
105
106
  return userProfile.value?.roles?.rooms;
106
107
  });
107
108
  const hasArticles = computed(() => !!props.helpArticleOptions?.values?.length);
109
+ const isBeaconNavEnabled = computed(() => {
110
+ return Boolean($ld?.flags?.beaconNavEnabled);
111
+ });
108
112
  onMounted(() => {
109
113
  isDropdown.value = !!props.helpArticleOptions?.values?.length;
110
114
  dropdownScrollHeight.value = helpBtnActions.value?.scrollHeight + 12;
@@ -122,7 +126,7 @@ async function goToWebsite() {
122
126
  </script>
123
127
 
124
128
  <style scoped>
125
- .help-btn-wrapper {
129
+ .help-btn-wrapper.classic {
126
130
  display: flex;
127
131
  flex-direction: row;
128
132
  align-items: center;
@@ -131,12 +135,12 @@ async function goToWebsite() {
131
135
  text-transform: uppercase;
132
136
  padding-left: 8px;
133
137
  }
134
- .help-btn-wrapper.collapsed {
138
+ .help-btn-wrapper.classic.collapsed {
135
139
  justify-content: center;
136
140
  flex-direction: column;
137
141
  padding-left: 0;
138
142
  }
139
- .help-btn-wrapper .help-articles-btn {
143
+ .help-btn-wrapper.classic .help-articles-btn {
140
144
  cursor: pointer;
141
145
  display: flex;
142
146
  align-items: center;
@@ -145,31 +149,31 @@ async function goToWebsite() {
145
149
  border: none;
146
150
  text-transform: inherit;
147
151
  }
148
- .help-btn-wrapper .help-articles-btn:focus-visible {
152
+ .help-btn-wrapper.classic .help-articles-btn:focus-visible {
149
153
  outline: var(--orange) solid 2px;
150
154
  outline-offset: 0;
151
155
  box-shadow: inset 0 0 0 3px var(--primary-white);
152
156
  border-radius: 3px;
153
157
  }
154
- .help-btn-wrapper .help-articles-btn .help-center-btn-icon {
158
+ .help-btn-wrapper.classic .help-articles-btn .help-center-btn-icon {
155
159
  min-width: 32px;
156
160
  width: 32px;
157
161
  }
158
- .help-btn-wrapper .help-articles-btn.collapsed {
162
+ .help-btn-wrapper.classic .help-articles-btn.collapsed {
159
163
  padding: 10px 0px;
160
164
  }
161
- .help-btn-wrapper .help-btn-actions {
165
+ .help-btn-wrapper.classic .help-btn-actions {
162
166
  visibility: hidden;
163
167
  max-height: 0px;
164
168
  overflow-y: hidden;
165
169
  transition: all 0.5s ease-in-out;
166
170
  }
167
- .help-btn-wrapper .help-btn-actions.expanded {
171
+ .help-btn-wrapper.classic .help-btn-actions.expanded {
168
172
  visibility: visible;
169
173
  margin-top: -8px;
170
174
  padding-bottom: 6px;
171
175
  }
172
- .help-btn-wrapper .help-btn-action {
176
+ .help-btn-wrapper.classic .help-btn-action {
173
177
  border: none;
174
178
  padding: 0;
175
179
  background: none;
@@ -180,7 +184,7 @@ async function goToWebsite() {
180
184
  position: relative;
181
185
  padding: 6px 51px 6px 45px;
182
186
  }
183
- .help-btn-wrapper .help-btn-action:hover:before {
187
+ .help-btn-wrapper.classic .help-btn-action:hover:before {
184
188
  content: "";
185
189
  z-index: -1;
186
190
  position: absolute;
@@ -190,19 +194,106 @@ async function goToWebsite() {
190
194
  left: -45px;
191
195
  background-color: var(--nav-background-color, var(--purple-70));
192
196
  }
193
- .help-btn-wrapper .caret-icon {
197
+ .help-btn-wrapper.classic .caret-icon {
194
198
  margin-left: auto;
195
199
  transition: transform 0.2s ease-in-out;
196
200
  background: none;
197
201
  }
198
- .help-btn-wrapper .caret-icon.collapse {
202
+ .help-btn-wrapper.classic .caret-icon.collapse {
199
203
  transform: rotate(0.5turn);
200
204
  }
201
- .help-btn-wrapper svg {
205
+ .help-btn-wrapper.classic svg {
202
206
  border-radius: 4px;
203
207
  color: var(--nav-icon-color, #662e80);
204
208
  }
205
- .help-btn-wrapper span {
209
+ .help-btn-wrapper.classic span {
210
+ color: var(--nav-text-color, var(--primary-white));
211
+ margin-left: 8px;
212
+ font-size: 12px;
213
+ letter-spacing: 0.4px;
214
+ line-height: 16px;
215
+ }
216
+ .help-btn-wrapper.beacon {
217
+ display: flex;
218
+ flex-direction: row;
219
+ align-items: center;
220
+ justify-content: flex-start;
221
+ width: 100%;
222
+ text-transform: uppercase;
223
+ padding-left: 8px;
224
+ }
225
+ .help-btn-wrapper.beacon.collapsed {
226
+ justify-content: center;
227
+ flex-direction: column;
228
+ padding-left: 0;
229
+ }
230
+ .help-btn-wrapper.beacon .help-articles-btn {
231
+ cursor: pointer;
232
+ display: flex;
233
+ align-items: center;
234
+ background: none;
235
+ padding: 10px 0px 10px 8px;
236
+ border: none;
237
+ text-transform: inherit;
238
+ }
239
+ .help-btn-wrapper.beacon .help-articles-btn:focus-visible {
240
+ outline: var(--orange) solid 2px;
241
+ outline-offset: 0;
242
+ box-shadow: inset 0 0 0 3px var(--primary-white);
243
+ border-radius: 3px;
244
+ }
245
+ .help-btn-wrapper.beacon .help-articles-btn .help-center-btn-icon {
246
+ min-width: 32px;
247
+ width: 32px;
248
+ }
249
+ .help-btn-wrapper.beacon .help-articles-btn.collapsed {
250
+ padding: 10px 0px;
251
+ }
252
+ .help-btn-wrapper.beacon .help-btn-actions {
253
+ visibility: hidden;
254
+ max-height: 0px;
255
+ overflow-y: hidden;
256
+ transition: all 0.5s ease-in-out;
257
+ }
258
+ .help-btn-wrapper.beacon .help-btn-actions.expanded {
259
+ visibility: visible;
260
+ margin-top: -8px;
261
+ padding-bottom: 6px;
262
+ }
263
+ .help-btn-wrapper.beacon .help-btn-action {
264
+ border: none;
265
+ padding: 0;
266
+ background: none;
267
+ color: var(--nav-text-color, var(--primary-white));
268
+ cursor: pointer;
269
+ font-size: 14px;
270
+ text-align: left;
271
+ position: relative;
272
+ padding: 6px 51px 6px 45px;
273
+ }
274
+ .help-btn-wrapper.beacon .help-btn-action:hover:before {
275
+ content: "";
276
+ z-index: -1;
277
+ position: absolute;
278
+ top: 0px;
279
+ bottom: 0px;
280
+ right: 0px;
281
+ left: -45px;
282
+ background-color: var(--nav-background-color, var(--purple-70));
283
+ }
284
+ .help-btn-wrapper.beacon .caret-icon {
285
+ margin-left: auto;
286
+ transition: transform 0.2s ease-in-out;
287
+ background: none;
288
+ }
289
+ .help-btn-wrapper.beacon .caret-icon.collapse {
290
+ transform: rotate(0.5turn);
291
+ }
292
+ .help-btn-wrapper.beacon svg {
293
+ border-radius: 4px;
294
+ color: inherit;
295
+ }
296
+ .help-btn-wrapper.beacon span {
206
297
  color: var(--nav-text-color, var(--primary-white));
207
298
  margin-left: 8px;
208
299
  font-size: 12px;
@@ -3,127 +3,95 @@
3
3
  class="notification-item"
4
4
  :class="{ 'notification-item--in-badge': showBadgeActions }"
5
5
  >
6
- <div class="notification-item__header">
6
+ <div
7
+ class="notification-item__main"
8
+ role="button"
9
+ tabindex="0"
10
+ @click="handleClick"
11
+ @keydown.enter.prevent="handleClick"
12
+ >
7
13
  <div
8
- class="notification-item__main"
9
- role="button"
10
- tabindex="0"
11
- @click="handleClick"
12
- @keydown.enter.prevent="handleClick"
14
+ class="notification-item__avatar"
15
+ :style="{ '--type-accent': typeAccent }"
13
16
  >
14
- <div
15
- class="notification-item__avatar"
16
- :style="{ '--type-accent': typeAccent }"
17
- >
18
- <div class="notification-item__avatar-ring">
19
- <NavAvatar
20
- :name="primaryActor.name"
21
- :src="primaryActor.avatarUrl"
22
- class="notification-item__avatar-image"
23
- />
24
- </div>
25
- <span
26
- v-if="groupBadgeLabel"
27
- class="notification-item__group-badge"
28
- aria-hidden="true"
29
- >
30
- {{ groupBadgeLabel }}
31
- </span>
32
- <span
33
- v-else
34
- class="notification-item__type-badge"
35
- aria-hidden="true"
36
- >
37
- <component :is="typeIcon" />
38
- </span>
39
- </div>
40
-
41
- <div class="notification-item__content">
42
- <p class="notification-item__message">
43
- {{ item.actionText }}
44
- </p>
45
- <p class="notification-item__meta">
46
- <span>{{ item.timestampLabel }}</span>
47
- <template v-if="item.contextLabel">
48
- <span
49
- class="notification-item__meta-separator"
50
- aria-hidden="true"
51
- >·</span
52
- >
53
- <span>{{ item.contextLabel }}</span>
54
- </template>
55
- </p>
56
- <Tag
57
- v-if="item.stateLabel"
58
- :value="item.stateLabel"
59
- severity="secondary"
60
- class="notification-item__state-chip"
17
+ <div class="notification-item__avatar-ring">
18
+ <NavAvatar
19
+ :name="primaryActor.name"
20
+ :src="primaryActor.avatarUrl"
21
+ class="notification-item__avatar-image"
61
22
  />
62
23
  </div>
63
- </div>
64
-
65
- <div class="notification-item__actions">
66
24
  <span
67
- v-if="showBadgeActions"
68
- class="notification-item__unread-dot"
25
+ v-if="groupBadgeLabel"
26
+ class="notification-item__group-badge"
69
27
  aria-hidden="true"
70
- />
71
- <Button
72
- v-if="showBadgeActions"
73
- type="button"
74
- severity="secondary"
75
- text
76
- rounded
77
- class="notification-item__dismiss"
78
- :aria-label="$t('navigation.notificationsPanel.dismiss')"
79
- @click="handleDismiss"
80
28
  >
81
- <svg
82
- xmlns="http://www.w3.org/2000/svg"
83
- width="16"
84
- height="16"
85
- viewBox="0 0 24 24"
86
- fill="none"
87
- stroke="currentColor"
88
- stroke-width="2"
89
- stroke-linecap="round"
90
- stroke-linejoin="round"
91
- aria-hidden="true"
92
- >
93
- <path d="M18 6 6 18" />
94
- <path d="m6 6 12 12" />
95
- </svg>
96
- </Button>
29
+ {{ groupBadgeLabel }}
30
+ </span>
31
+ <span
32
+ class="notification-item__type-badge"
33
+ aria-hidden="true"
34
+ >
35
+ <component :is="typeIcon" />
36
+ </span>
37
+ </div>
38
+
39
+ <div class="notification-item__content">
40
+ <p class="notification-item__message">
41
+ {{ item.actionText }}
42
+ </p>
43
+ <p class="notification-item__meta">
44
+ <span>{{ item.timestampLabel }}</span>
45
+ <template v-if="item.contextLabel">
46
+ <span
47
+ class="notification-item__meta-separator"
48
+ aria-hidden="true"
49
+ >·</span
50
+ >
51
+ <span>{{ item.contextLabel }}</span>
52
+ </template>
53
+ </p>
54
+ <Tag
55
+ v-if="item.stateLabel"
56
+ :value="item.stateLabel"
57
+ severity="secondary"
58
+ class="notification-item__state-chip"
59
+ />
97
60
  </div>
98
61
  </div>
99
62
 
100
- <div
101
- v-if="item.summary"
102
- class="notification-item__summary"
103
- role="button"
104
- tabindex="0"
105
- @click="handleClick"
106
- @keydown.enter.prevent="handleClick"
107
- >
108
- <template v-if="reactionEmojis.length">
109
- <span
110
- class="notification-item__reactions"
63
+ <div class="notification-item__actions">
64
+ <span
65
+ v-if="showBadgeActions"
66
+ class="notification-item__unread-dot"
67
+ aria-hidden="true"
68
+ />
69
+ <Button
70
+ v-if="showBadgeActions"
71
+ type="button"
72
+ severity="secondary"
73
+ text
74
+ rounded
75
+ class="notification-item__dismiss"
76
+ :aria-label="$t('navigation.notificationsPanel.dismiss')"
77
+ @click="handleDismiss"
78
+ >
79
+ <svg
80
+ xmlns="http://www.w3.org/2000/svg"
81
+ width="16"
82
+ height="16"
83
+ viewBox="0 0 24 24"
84
+ fill="none"
85
+ stroke="currentColor"
86
+ stroke-width="2"
87
+ stroke-linecap="round"
88
+ stroke-linejoin="round"
111
89
  aria-hidden="true"
112
90
  >
113
- <span
114
- v-for="(emoji, index) in reactionEmojis"
115
- :key="`${emoji}-${index}`"
116
- class="notification-item__reaction"
117
- >{{ emoji }}</span>
118
- </span>
119
- <span class="notification-item__summary-on">
120
- {{ " " }}{{ $t("navigation.notificationsPanel.summaryOn") }}{{ " " }}
121
- </span>
122
- </template>
123
- <span class="notification-item__summary-text">
124
- <template v-if="reactionEmojis.length">"{{ item.summary }}"</template>
125
- <template v-else>{{ item.summary }}</template>
126
- </span>
91
+ <path d="M18 6 6 18" />
92
+ <path d="m6 6 12 12" />
93
+ </svg>
94
+ </Button>
127
95
  </div>
128
96
  </div>
129
97
  </template>
@@ -140,7 +108,6 @@ const emit = defineEmits(["dismiss", "select"]);
140
108
  const primaryActor = computed(() => props.item.actors[0] || { name: "" });
141
109
  const typeAccent = computed(() => getTypeAccent(props.item.type));
142
110
  const showBadgeActions = computed(() => isInBadge(props.item));
143
- const reactionEmojis = computed(() => props.item.reactionEmojis ?? []);
144
111
  const groupBadgeLabel = computed(() => {
145
112
  const count = props.item.groupCount ?? Math.max(props.item.actors.length - 1, 0);
146
113
  return count > 0 ? `+${count}` : "";
@@ -222,8 +189,10 @@ function handleDismiss(event) {
222
189
 
223
190
  <style scoped>
224
191
  .notification-item {
225
- display: flex;
226
- flex-direction: column;
192
+ display: grid;
193
+ grid-template-columns: 1fr auto;
194
+ gap: 12px;
195
+ align-items: start;
227
196
  width: 100%;
228
197
  padding: 12px;
229
198
  border: 1px solid rgb(232, 232, 236);
@@ -234,12 +203,6 @@ function handleDismiss(event) {
234
203
  box-shadow: none;
235
204
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
236
205
  }
237
- .notification-item__header {
238
- display: grid;
239
- grid-template-columns: 1fr auto;
240
- gap: 12px;
241
- align-items: start;
242
- }
243
206
  .notification-item__main {
244
207
  display: grid;
245
208
  grid-template-columns: auto 1fr;
@@ -345,38 +308,6 @@ function handleDismiss(event) {
345
308
  .notification-item__state-chip {
346
309
  margin-top: 8px;
347
310
  }
348
- .notification-item__summary {
349
- margin-top: 12px;
350
- padding-top: 12px;
351
- border-top: 1px solid rgb(232, 232, 236);
352
- cursor: pointer;
353
- font-size: 13px;
354
- line-height: 18px;
355
- color: var(--grey-70, #4b5563);
356
- }
357
- .notification-item__summary:focus-visible {
358
- outline: 2px solid var(--purple-60, #662e80);
359
- outline-offset: 2px;
360
- border-radius: 4px;
361
- }
362
- .notification-item__reactions {
363
- display: inline;
364
- white-space: nowrap;
365
- }
366
- .notification-item__reaction {
367
- font-size: 14px;
368
- line-height: 1;
369
- }
370
- .notification-item__summary-on {
371
- margin-inline: 0.25em;
372
- color: var(--grey-50, #747474);
373
- }
374
- .notification-item__summary-text {
375
- font-style: italic;
376
- color: var(--grey-70, #4b5563);
377
- white-space: normal;
378
- overflow-wrap: anywhere;
379
- }
380
311
  .notification-item__actions {
381
312
  display: flex;
382
313
  align-items: center;
@@ -3,10 +3,10 @@ type __VLS_Props = {
3
3
  item: INotificationItem;
4
4
  };
5
5
  declare const _default: import("vue").DefineComponent<__VLS_Props, void, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
6
- select: (item: INotificationItem) => any;
7
6
  dismiss: (id: string) => any;
7
+ select: (item: INotificationItem) => any;
8
8
  }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
9
- onSelect?: ((item: INotificationItem) => any) | undefined;
10
9
  onDismiss?: ((id: string) => any) | undefined;
10
+ onSelect?: ((item: INotificationItem) => any) | undefined;
11
11
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
12
12
  export default _default;
@@ -13,11 +13,6 @@ type __VLS_Props = {
13
13
  mobile?: boolean;
14
14
  };
15
15
  declare const _default: import("vue").DefineComponent<__VLS_Props, void, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
16
- select: (payload: {
17
- item: INotificationsPanelData["groups"][number]["notifications"][number];
18
- tabId: string;
19
- filterId: string;
20
- }) => any;
21
16
  "update:activeTabId": (id: string) => any;
22
17
  "update:activeFilterId": (id: string) => any;
23
18
  "update:filterCatalog": (filters: INotificationFilter[]) => any;
@@ -31,13 +26,13 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, void, {}, {},
31
26
  tabId: string;
32
27
  filterId: string;
33
28
  }) => any;
34
- close: () => any;
35
- }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
36
- onSelect?: ((payload: {
29
+ select: (payload: {
37
30
  item: INotificationsPanelData["groups"][number]["notifications"][number];
38
31
  tabId: string;
39
32
  filterId: string;
40
- }) => any) | undefined;
33
+ }) => any;
34
+ close: () => any;
35
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
41
36
  "onUpdate:activeTabId"?: ((id: string) => any) | undefined;
42
37
  "onUpdate:activeFilterId"?: ((id: string) => any) | undefined;
43
38
  "onUpdate:filterCatalog"?: ((filters: INotificationFilter[]) => any) | undefined;
@@ -51,6 +46,11 @@ declare const _default: import("vue").DefineComponent<__VLS_Props, void, {}, {},
51
46
  tabId: string;
52
47
  filterId: string;
53
48
  }) => any) | undefined;
49
+ onSelect?: ((payload: {
50
+ item: INotificationsPanelData["groups"][number]["notifications"][number];
51
+ tabId: string;
52
+ filterId: string;
53
+ }) => any) | undefined;
54
54
  onClose?: (() => any) | undefined;
55
55
  }>, {
56
56
  loading: boolean;