@gsa-tts/graymatter-ui 0.2.8 → 0.3.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.
- package/README.md +81 -0
- package/assets/images/favicon-dark.ico +0 -0
- package/assets/images/favicon-dark.svg +7 -0
- package/assets/images/favicon-light.svg +7 -0
- package/assets/images/favicon.ico +0 -0
- package/assets/images/favicon.svg +5 -6
- package/dist/graymatter-ui.js +910 -898
- package/dist/graymatter-ui.umd.cjs +36 -32
- package/package.json +4 -4
- package/src/components/Button.svelte +27 -31
- package/src/components/Button.webcomponent.svelte +13 -11
- package/src/components/DesktopHeader.svelte +70 -53
- package/src/components/DesktopHeader.webcomponent.svelte +13 -9
- package/src/components/DesktopSideNav.svelte +200 -158
- package/src/components/DesktopSideNav.webcomponent.svelte +7 -5
- package/src/components/Head.astro +24 -2
- package/src/components/Logo.svelte +48 -41
- package/src/components/Logo.webcomponent.svelte +16 -16
- package/src/components/MobileBottomNav.svelte +102 -69
- package/src/components/MobileBottomNav.webcomponent.svelte +13 -4
- package/src/components/MobileSideMenu.svelte +70 -42
- package/src/components/MobileSideMenu.webcomponent.svelte +6 -4
- package/src/components/MobileTopNav.svelte +24 -19
- package/src/components/MobileTopNav.webcomponent.svelte +6 -6
- package/src/components/NavigationInitializer.svelte +10 -2
- package/src/components/ProfileMenu.svelte +116 -27
- package/src/components/UsaSkipNav.svelte +23 -0
- package/src/components/icons/ApiIcon.svelte +182 -33
- package/src/components/icons/ChatIcon.svelte +10 -10
- package/src/components/icons/CloseIcon.svelte +10 -10
- package/src/components/icons/ConsoleIcon.svelte +68 -13
- package/src/components/icons/DiscoverIcon.svelte +14 -14
- package/src/components/icons/HelpIcon.svelte +2 -1
- package/src/components/icons/MenuIcon.svelte +47 -7
- package/src/components/index.ts +1 -1
- package/src/layouts/BaseLayout.astro +1 -1
- package/src/components/UsaSkipNav.astro +0 -5
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
apiUrl,
|
|
34
34
|
chatUrl,
|
|
35
35
|
consoleUrl,
|
|
36
|
-
discoverUrl
|
|
36
|
+
discoverUrl,
|
|
37
37
|
} = $props();
|
|
38
38
|
|
|
39
39
|
let hydrated = false;
|
|
@@ -54,22 +54,31 @@
|
|
|
54
54
|
function isNavSelected(key: NavigationItem) {
|
|
55
55
|
return ssrOrHydrated($selectedItem === key, ssrSelectedItem === key);
|
|
56
56
|
}
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
function isNavHovered(key: string) {
|
|
59
59
|
return hoveredItem === key;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
const sideNavExpanded = $derived(() =>
|
|
63
|
-
ssrOrHydrated(
|
|
63
|
+
ssrOrHydrated(
|
|
64
|
+
$isExpanded,
|
|
65
|
+
ssrSelectedItem ? ssrSelectedItem !== 'discover' : true
|
|
66
|
+
)
|
|
64
67
|
);
|
|
65
68
|
const menuBtnDisabled = $derived(() =>
|
|
66
|
-
ssrOrHydrated(
|
|
69
|
+
ssrOrHydrated(
|
|
70
|
+
$isMenuButtonDisabled,
|
|
71
|
+
ssrSelectedItem ? ssrSelectedItem === 'discover' : false
|
|
72
|
+
)
|
|
67
73
|
);
|
|
68
74
|
const menuBtnOpen = $derived(() =>
|
|
69
|
-
ssrOrHydrated(
|
|
75
|
+
ssrOrHydrated(
|
|
76
|
+
$isExpanded,
|
|
77
|
+
ssrSelectedItem ? ssrSelectedItem !== 'discover' : true
|
|
78
|
+
)
|
|
70
79
|
);
|
|
71
|
-
const menuBtnHovered = $derived(
|
|
72
|
-
canHover && menuButtonHovered && !menuBtnDisabled()
|
|
80
|
+
const menuBtnHovered = $derived(
|
|
81
|
+
() => canHover && menuButtonHovered && !menuBtnDisabled()
|
|
73
82
|
);
|
|
74
83
|
|
|
75
84
|
onMount(() => {
|
|
@@ -89,19 +98,19 @@
|
|
|
89
98
|
mq.addEventListener('change', e => {
|
|
90
99
|
canHover = e.matches;
|
|
91
100
|
});
|
|
92
|
-
|
|
101
|
+
|
|
93
102
|
// Listen for layout transitions
|
|
94
103
|
const handleLayoutTransition = (event: Event) => {
|
|
95
104
|
const customEvent = event as CustomEvent;
|
|
96
105
|
const { isMobile } = customEvent.detail;
|
|
97
|
-
|
|
106
|
+
|
|
98
107
|
if (isMobile) {
|
|
99
108
|
// Switching to mobile: close navigation
|
|
100
109
|
navigationStore.setExpanded(false);
|
|
101
110
|
} else {
|
|
102
111
|
// Switching to desktop: open navigation if on non-discover page
|
|
103
112
|
const currentItem = $selectedItem;
|
|
104
|
-
|
|
113
|
+
|
|
105
114
|
if (currentItem && currentItem !== 'discover') {
|
|
106
115
|
navigationStore.setExpanded(true);
|
|
107
116
|
} else {
|
|
@@ -109,9 +118,9 @@
|
|
|
109
118
|
}
|
|
110
119
|
}
|
|
111
120
|
};
|
|
112
|
-
|
|
121
|
+
|
|
113
122
|
window.addEventListener('layoutTransition', handleLayoutTransition);
|
|
114
|
-
|
|
123
|
+
|
|
115
124
|
// Add Escape key handler for nav collapse, but ignore if focus is in profile context menu
|
|
116
125
|
const handleEscape = (e: KeyboardEvent) => {
|
|
117
126
|
const active = document.activeElement;
|
|
@@ -124,7 +133,7 @@
|
|
|
124
133
|
}
|
|
125
134
|
};
|
|
126
135
|
window.addEventListener('keydown', handleEscape);
|
|
127
|
-
|
|
136
|
+
|
|
128
137
|
return () => {
|
|
129
138
|
window.removeEventListener('layoutTransition', handleLayoutTransition);
|
|
130
139
|
window.removeEventListener('keydown', handleEscape);
|
|
@@ -138,62 +147,77 @@
|
|
|
138
147
|
onNavToggle?.({ expanded: $isExpanded });
|
|
139
148
|
}
|
|
140
149
|
|
|
141
|
-
function handleNavItemClick(item: NavigationItem) {
|
|
150
|
+
function handleNavItemClick(item: NavigationItem) {
|
|
142
151
|
// Set navigation flag immediately to prevent header restoration
|
|
143
152
|
if (item !== 'discover' && typeof window !== 'undefined') {
|
|
144
153
|
sessionStorage.setItem('navigatingToMainNav', 'true');
|
|
145
154
|
}
|
|
146
|
-
|
|
155
|
+
|
|
147
156
|
navigationStore.setSelectedItem(item);
|
|
148
|
-
|
|
157
|
+
|
|
149
158
|
// Clear header state for main navigation items (including discover)
|
|
150
159
|
if (item !== 'discover') {
|
|
151
160
|
try {
|
|
152
|
-
import('@gsa-tts/graymatter-ui/stores/navigationStore')
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
if (
|
|
169
|
-
|
|
161
|
+
import('@gsa-tts/graymatter-ui/stores/navigationStore')
|
|
162
|
+
.then(({ selectedSubNavItemTitle }) => {
|
|
163
|
+
// Clear the store value immediately
|
|
164
|
+
selectedSubNavItemTitle.set('');
|
|
165
|
+
if (typeof window !== 'undefined') {
|
|
166
|
+
sessionStorage.removeItem('subNav-selectedTitle');
|
|
167
|
+
sessionStorage.removeItem('subNav-selectedId');
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Set default header from first submenu item after a short delay
|
|
171
|
+
setTimeout(() => {
|
|
172
|
+
const mainContent = document.getElementById('main-content');
|
|
173
|
+
if (mainContent) {
|
|
174
|
+
const firstSection = mainContent.querySelector(
|
|
175
|
+
'h2[id], h3[id], h4[id], h5[id], h6[id]'
|
|
176
|
+
);
|
|
177
|
+
if (firstSection && firstSection.textContent) {
|
|
178
|
+
const firstSectionTitle = firstSection.textContent.trim();
|
|
179
|
+
selectedSubNavItemTitle.set(firstSectionTitle);
|
|
180
|
+
if (typeof window !== 'undefined') {
|
|
181
|
+
sessionStorage.setItem(
|
|
182
|
+
'subNav-selectedTitle',
|
|
183
|
+
JSON.stringify(firstSectionTitle)
|
|
184
|
+
);
|
|
185
|
+
}
|
|
170
186
|
}
|
|
171
187
|
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
188
|
+
}, 200); // Delay to ensure page content is loaded
|
|
189
|
+
})
|
|
190
|
+
.catch(err => {
|
|
191
|
+
console.log('[DesktopSideNav] Error clearing header state:', err);
|
|
192
|
+
});
|
|
177
193
|
} catch (err) {
|
|
178
194
|
console.log('[DesktopSideNav] Import failed for clearing state:', err);
|
|
179
195
|
}
|
|
180
196
|
} else {
|
|
181
197
|
// Clear header state for Discover page
|
|
182
198
|
try {
|
|
183
|
-
import('@gsa-tts/graymatter-ui/stores/navigationStore')
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
199
|
+
import('@gsa-tts/graymatter-ui/stores/navigationStore')
|
|
200
|
+
.then(({ selectedSubNavItemTitle }) => {
|
|
201
|
+
selectedSubNavItemTitle.set('');
|
|
202
|
+
if (typeof window !== 'undefined') {
|
|
203
|
+
sessionStorage.removeItem('subNav-selectedTitle');
|
|
204
|
+
sessionStorage.removeItem('subNav-selectedId');
|
|
205
|
+
}
|
|
206
|
+
})
|
|
207
|
+
.catch(err => {
|
|
208
|
+
console.log(
|
|
209
|
+
'[DesktopSideNav] Error clearing header state for Discover:',
|
|
210
|
+
err
|
|
211
|
+
);
|
|
212
|
+
});
|
|
192
213
|
} catch (err) {
|
|
193
|
-
console.log(
|
|
214
|
+
console.log(
|
|
215
|
+
'[DesktopSideNav] Import failed for clearing Discover state:',
|
|
216
|
+
err
|
|
217
|
+
);
|
|
194
218
|
}
|
|
195
219
|
}
|
|
196
|
-
|
|
220
|
+
|
|
197
221
|
onNavItemClick?.({ item, expanded: $isExpanded });
|
|
198
222
|
}
|
|
199
223
|
|
|
@@ -244,7 +268,9 @@
|
|
|
244
268
|
onmouseleave={() => (menuButtonHovered = false)}
|
|
245
269
|
onfocus={() => (menuButtonHovered = true)}
|
|
246
270
|
onblur={() => (menuButtonHovered = false)}
|
|
247
|
-
aria-label={sideNavExpanded()
|
|
271
|
+
aria-label={sideNavExpanded()
|
|
272
|
+
? 'Close navigation menu'
|
|
273
|
+
: 'Open navigation menu'}
|
|
248
274
|
aria-expanded={sideNavExpanded() ? 'true' : 'false'}
|
|
249
275
|
>
|
|
250
276
|
<div class="icon-container" part="icon-container">
|
|
@@ -260,97 +286,109 @@
|
|
|
260
286
|
</div>
|
|
261
287
|
|
|
262
288
|
{#if showAppIcons}
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
289
|
+
<div class="nav-items" part="nav-items">
|
|
290
|
+
<a
|
|
291
|
+
href={discoverUrl || urls.discover}
|
|
292
|
+
class="nav-item discover-item"
|
|
293
|
+
class:selected={isNavSelected('discover')}
|
|
294
|
+
class:hovered={isNavHovered('discover')}
|
|
295
|
+
onclick={() => handleNavItemClick('discover')}
|
|
296
|
+
onkeydown={e => {
|
|
297
|
+
handleKeyDown(e, 'discover');
|
|
298
|
+
handleNavKeyDown(e, 0);
|
|
299
|
+
}}
|
|
300
|
+
onmouseenter={() => (hoveredItem = 'discover')}
|
|
301
|
+
onmouseleave={() => (hoveredItem = null)}
|
|
302
|
+
aria-current={isNavSelected('discover') ? 'page' : undefined}
|
|
303
|
+
part="discover-item"
|
|
304
|
+
bind:this={discoverNavRef}
|
|
305
|
+
>
|
|
306
|
+
<div class="icon-container" part="discover-icon-container">
|
|
307
|
+
<div class="icon-wrapper">
|
|
308
|
+
<DiscoverIcon isSelected={isNavSelected('discover')} />
|
|
309
|
+
</div>
|
|
280
310
|
</div>
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
311
|
+
<span class="nav-text">Discover</span>
|
|
312
|
+
</a>
|
|
313
|
+
<a
|
|
314
|
+
href={chatUrl || urls.chat}
|
|
315
|
+
class="nav-item chat-item"
|
|
316
|
+
class:selected={isNavSelected('chat')}
|
|
317
|
+
class:hovered={isNavHovered('chat')}
|
|
318
|
+
onclick={() => handleNavItemClick('chat')}
|
|
319
|
+
onkeydown={e => {
|
|
320
|
+
handleKeyDown(e, 'chat');
|
|
321
|
+
handleNavKeyDown(e, 1);
|
|
322
|
+
}}
|
|
323
|
+
onmouseenter={() => (hoveredItem = 'chat')}
|
|
324
|
+
onmouseleave={() => (hoveredItem = null)}
|
|
325
|
+
aria-current={isNavSelected('chat') ? 'page' : undefined}
|
|
326
|
+
part="chat-item"
|
|
327
|
+
bind:this={chatNavRef}
|
|
328
|
+
>
|
|
329
|
+
<div class="icon-container" part="chat-icon-container">
|
|
330
|
+
<div class="icon-wrapper">
|
|
331
|
+
<ChatIcon isSelected={isNavSelected('chat') as boolean} />
|
|
332
|
+
</div>
|
|
300
333
|
</div>
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
334
|
+
<span class="nav-text">Chat</span>
|
|
335
|
+
</a>
|
|
336
|
+
|
|
337
|
+
<a
|
|
338
|
+
href={consoleUrl || urls.console}
|
|
339
|
+
class="nav-item console-item"
|
|
340
|
+
class:selected={isNavSelected('console')}
|
|
341
|
+
class:hovered={isNavHovered('console')}
|
|
342
|
+
onclick={() => handleNavItemClick('console')}
|
|
343
|
+
onkeydown={e => {
|
|
344
|
+
handleKeyDown(e, 'console');
|
|
345
|
+
handleNavKeyDown(e, 2);
|
|
346
|
+
}}
|
|
347
|
+
onmouseenter={() => (hoveredItem = 'console')}
|
|
348
|
+
onmouseleave={() => (hoveredItem = null)}
|
|
349
|
+
aria-current={isNavSelected('console') ? 'page' : undefined}
|
|
350
|
+
part="console-item"
|
|
351
|
+
bind:this={consoleNavRef}
|
|
352
|
+
>
|
|
353
|
+
<div class="icon-container" part="console-icon-container">
|
|
354
|
+
<div class="icon-wrapper">
|
|
355
|
+
<ConsoleIcon isSelected={isNavSelected('console') as boolean} />
|
|
356
|
+
</div>
|
|
321
357
|
</div>
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
358
|
+
<span class="nav-text">Console</span>
|
|
359
|
+
</a>
|
|
360
|
+
|
|
361
|
+
<a
|
|
362
|
+
href={apiUrl || urls.api}
|
|
363
|
+
class="nav-item api-item"
|
|
364
|
+
class:selected={isNavSelected('api')}
|
|
365
|
+
class:hovered={isNavHovered('api')}
|
|
366
|
+
onclick={() => handleNavItemClick('api')}
|
|
367
|
+
onkeydown={e => {
|
|
368
|
+
handleKeyDown(e, 'api');
|
|
369
|
+
handleNavKeyDown(e, 3);
|
|
370
|
+
}}
|
|
371
|
+
onmouseenter={() => (hoveredItem = 'api')}
|
|
372
|
+
onmouseleave={() => (hoveredItem = null)}
|
|
373
|
+
aria-current={isNavSelected('api') ? 'page' : undefined}
|
|
374
|
+
part="api-item"
|
|
375
|
+
bind:this={apiNavRef}
|
|
376
|
+
>
|
|
377
|
+
<div class="icon-container" part="api-icon-container">
|
|
378
|
+
<div class="icon-wrapper">
|
|
379
|
+
<ApiIcon isSelected={isNavSelected('api')} />
|
|
380
|
+
</div>
|
|
342
381
|
</div>
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
</
|
|
346
|
-
</div>
|
|
382
|
+
<span class="nav-text">API</span>
|
|
383
|
+
</a>
|
|
384
|
+
</div>
|
|
347
385
|
{/if}
|
|
348
386
|
</div>
|
|
349
387
|
|
|
350
388
|
{#if profileMenuData}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
389
|
+
<div class="nav-footer" part="nav-footer">
|
|
390
|
+
<!-- TODO: Add help icon back in when we have decided on full functionality-->
|
|
391
|
+
<!-- <div class="nav-footer-icon-container">
|
|
354
392
|
<button
|
|
355
393
|
type="button"
|
|
356
394
|
class="nav-footer-icon-inner"
|
|
@@ -366,19 +404,23 @@
|
|
|
366
404
|
</div>
|
|
367
405
|
</button>
|
|
368
406
|
</div> -->
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
407
|
+
<div class="nav-footer-profile-container">
|
|
408
|
+
<ProfileMenu
|
|
409
|
+
userMeta={profileMenuData?.userMeta}
|
|
410
|
+
menuItems={profileMenuData?.menuItems}
|
|
411
|
+
ariaLabel="Open profile menu"
|
|
412
|
+
menuAlign="desktop"
|
|
413
|
+
/>
|
|
414
|
+
</div>
|
|
376
415
|
</div>
|
|
377
|
-
</div>
|
|
378
416
|
{/if}
|
|
379
417
|
</div>
|
|
380
418
|
|
|
381
|
-
<div
|
|
419
|
+
<div
|
|
420
|
+
class="expanded-content drawer-anim"
|
|
421
|
+
class:open={sideNavExpanded()}
|
|
422
|
+
part="expanded-content"
|
|
423
|
+
>
|
|
382
424
|
{#if sideNavExpanded()}
|
|
383
425
|
<div class="drawer-content" part="drawer-content">
|
|
384
426
|
<nav aria-label="Sub navigation" part="sub-navigation">
|
|
@@ -394,8 +436,7 @@
|
|
|
394
436
|
max-width: 0;
|
|
395
437
|
overflow: hidden;
|
|
396
438
|
pointer-events: none;
|
|
397
|
-
transition:
|
|
398
|
-
max-width 0.2s cubic-bezier(.4, 0, .2, 1);
|
|
439
|
+
transition: max-width var(--ai-duration-fast) cubic-bezier(0.4, 0, 0.2, 1);
|
|
399
440
|
}
|
|
400
441
|
|
|
401
442
|
.expanded-content.drawer-anim.open {
|
|
@@ -425,7 +466,7 @@
|
|
|
425
466
|
background: none;
|
|
426
467
|
cursor: pointer;
|
|
427
468
|
border-radius: var(--ai-size-8);
|
|
428
|
-
transition: background-color
|
|
469
|
+
transition: background-color var(--ai-transition-ease-fast);
|
|
429
470
|
}
|
|
430
471
|
|
|
431
472
|
.menu-button:disabled,
|
|
@@ -434,7 +475,7 @@
|
|
|
434
475
|
opacity: 0.5;
|
|
435
476
|
background-color: transparent;
|
|
436
477
|
}
|
|
437
|
-
|
|
478
|
+
|
|
438
479
|
.side-nav-container {
|
|
439
480
|
display: flex;
|
|
440
481
|
flex-shrink: 0;
|
|
@@ -506,7 +547,6 @@
|
|
|
506
547
|
margin-top: auto;
|
|
507
548
|
}
|
|
508
549
|
|
|
509
|
-
|
|
510
550
|
.menu-section {
|
|
511
551
|
display: flex;
|
|
512
552
|
padding: var(--ai-size-4);
|
|
@@ -524,7 +564,7 @@
|
|
|
524
564
|
border: none;
|
|
525
565
|
cursor: pointer;
|
|
526
566
|
opacity: 1;
|
|
527
|
-
transition: opacity
|
|
567
|
+
transition: opacity var(--ai-transition-ease-fast);
|
|
528
568
|
will-change: opacity;
|
|
529
569
|
}
|
|
530
570
|
|
|
@@ -586,8 +626,9 @@
|
|
|
586
626
|
flex-shrink: 0;
|
|
587
627
|
position: relative;
|
|
588
628
|
contain: layout style;
|
|
589
|
-
transition:
|
|
590
|
-
|
|
629
|
+
transition:
|
|
630
|
+
background-color var(--ai-transition-ease-medium),
|
|
631
|
+
border-radius var(--ai-transition-ease-medium);
|
|
591
632
|
}
|
|
592
633
|
|
|
593
634
|
.icon-wrapper {
|
|
@@ -600,7 +641,7 @@
|
|
|
600
641
|
aspect-ratio: 1/1;
|
|
601
642
|
position: relative;
|
|
602
643
|
overflow: hidden;
|
|
603
|
-
transition: transform
|
|
644
|
+
transition: transform var(--ai-transition-ease-medium);
|
|
604
645
|
}
|
|
605
646
|
|
|
606
647
|
.icon-wrapper :global(svg) {
|
|
@@ -611,15 +652,16 @@
|
|
|
611
652
|
top: 50%;
|
|
612
653
|
left: 50%;
|
|
613
654
|
transform: translate(-50%, -50%);
|
|
614
|
-
transition: all
|
|
655
|
+
transition: all var(--ai-transition-ease-medium);
|
|
615
656
|
}
|
|
616
657
|
|
|
617
658
|
.icon-wrapper :global(svg path) {
|
|
618
659
|
stroke-width: 1.5;
|
|
619
660
|
vector-effect: non-scaling-stroke;
|
|
620
|
-
transition:
|
|
621
|
-
|
|
622
|
-
|
|
661
|
+
transition:
|
|
662
|
+
stroke var(--ai-transition-ease-medium),
|
|
663
|
+
fill var(--ai-transition-ease-medium),
|
|
664
|
+
stroke-width var(--ai-transition-ease-medium);
|
|
623
665
|
}
|
|
624
666
|
|
|
625
667
|
.nav-text {
|
|
@@ -654,7 +696,7 @@
|
|
|
654
696
|
padding: var(--ai-size-4);
|
|
655
697
|
text-decoration: none;
|
|
656
698
|
color: var(--ai-color-neutral-600);
|
|
657
|
-
transition: color
|
|
699
|
+
transition: color var(--ai-transition-ease-fast);
|
|
658
700
|
height: 100%;
|
|
659
701
|
}
|
|
660
702
|
|
|
@@ -692,7 +734,7 @@
|
|
|
692
734
|
background: none;
|
|
693
735
|
border: none;
|
|
694
736
|
cursor: pointer;
|
|
695
|
-
transition: background-color
|
|
737
|
+
transition: background-color var(--ai-transition-ease-medium), border-radius var(--ai-transition-ease-medium);
|
|
696
738
|
} */
|
|
697
739
|
/* .nav-footer-icon-inner:hover,
|
|
698
740
|
.nav-footer-icon-inner:focus {
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
<svelte:options
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
<svelte:options
|
|
2
|
+
customElement={{
|
|
3
|
+
tag: 'graymatter-desktop-side-nav',
|
|
4
|
+
}}
|
|
5
|
+
/>
|
|
4
6
|
|
|
5
7
|
<script lang="ts">
|
|
6
8
|
import DesktopSideNav from './DesktopSideNav.svelte';
|
|
@@ -10,12 +12,12 @@
|
|
|
10
12
|
ssrSelectedItem,
|
|
11
13
|
onNavToggle,
|
|
12
14
|
onNavItemClick,
|
|
13
|
-
showAppIcons = true,
|
|
15
|
+
showAppIcons = true,
|
|
14
16
|
profileMenuData,
|
|
15
17
|
apiUrl,
|
|
16
18
|
chatUrl,
|
|
17
19
|
consoleUrl,
|
|
18
|
-
discoverUrl
|
|
20
|
+
discoverUrl,
|
|
19
21
|
} = $props();
|
|
20
22
|
</script>
|
|
21
23
|
|
|
@@ -5,8 +5,30 @@ import { getUrlFromBase } from '@gsa-tts/graymatter-ui/helpers';
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
<meta name="viewport" content="width=device-width" />
|
|
8
|
-
<link
|
|
9
|
-
|
|
8
|
+
<link
|
|
9
|
+
rel="icon"
|
|
10
|
+
sizes="any"
|
|
11
|
+
href=`${getUrlFromBase('/assets/images/favicon-light.ico')}`
|
|
12
|
+
media="(prefers-color-scheme: light)"
|
|
13
|
+
/>
|
|
14
|
+
<link
|
|
15
|
+
rel="icon"
|
|
16
|
+
type="image/svg+xml"
|
|
17
|
+
href=`${getUrlFromBase('/assets/images/favicon-light.svg')}`
|
|
18
|
+
media="(prefers-color-scheme: light)"
|
|
19
|
+
/>
|
|
20
|
+
<link
|
|
21
|
+
rel="icon"
|
|
22
|
+
sizes="any"
|
|
23
|
+
href=`${getUrlFromBase('/assets/images/favicon-dark.ico')}`
|
|
24
|
+
media="(prefers-color-scheme: dark)"
|
|
25
|
+
/>
|
|
26
|
+
<link
|
|
27
|
+
rel="icon"
|
|
28
|
+
type="image/svg+xml"
|
|
29
|
+
href=`${getUrlFromBase('/assets/images/favicon-dark.svg')}`
|
|
30
|
+
media="(prefers-color-scheme: dark)"
|
|
31
|
+
/>
|
|
10
32
|
<meta name="generator" content={Astro.generator} />
|
|
11
33
|
<title>{title}</title>
|
|
12
34
|
<script is:inline>
|