srcdev-nuxt-components 9.4.6 → 9.4.8

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 (109) hide show
  1. package/.claude/commands/migrate-component.md +34 -3
  2. package/.claude/component-ledger/audit.json +1 -1
  3. package/.claude/component-ledger/build.mjs +27 -0
  4. package/.claude/component-ledger/output.html +8 -3
  5. package/.claude/component-ledger/template.html +7 -2
  6. package/.claude/skills/component-dynamic-slots.md +1 -1
  7. package/.claude/skills/components/column-flow-grid.md +93 -0
  8. package/.claude/skills/components/entry-animation.md +88 -0
  9. package/.claude/skills/components/header-block.md +92 -0
  10. package/.claude/skills/components/input-copy.md +2 -0
  11. package/.claude/skills/components/input-text-core.md +186 -0
  12. package/.claude/skills/components/masonry-grid.md +153 -0
  13. package/.claude/skills/components/pop-over.md +100 -0
  14. package/.claude/skills/components/rotating-carousel-image.md +101 -0
  15. package/.claude/skills/components/skip-links.md +82 -0
  16. package/.claude/skills/components/tabs-core.md +187 -0
  17. package/.claude/skills/index.md +10 -1
  18. package/.vscode/srcdev-component-column-flow-grid.code-snippets +39 -0
  19. package/.vscode/srcdev-component-entry-animation.code-snippets +29 -0
  20. package/.vscode/srcdev-component-header-block.code-snippets +41 -0
  21. package/.vscode/srcdev-component-input-text.code-snippets +107 -0
  22. package/.vscode/srcdev-component-masonry-grid.code-snippets +51 -0
  23. package/.vscode/srcdev-component-pop-over.code-snippets +44 -0
  24. package/.vscode/srcdev-component-rotating-carousel-image.code-snippets +74 -0
  25. package/.vscode/srcdev-component-skip-links.code-snippets +55 -0
  26. package/.vscode/srcdev-component-tabs-core.code-snippets +78 -0
  27. package/app/assets/styles/setup/05.typography/02.utility-classes/_font-classes-page-heading.css +2 -1
  28. package/app/components/01.atoms/animations/entry/EntryAnimation.vue +7 -1
  29. package/app/components/01.atoms/animations/entry/stories/EntryAnimation.stories.ts +47 -0
  30. package/app/components/01.atoms/animations/entry/tests/EntryAnimation.spec.ts +57 -0
  31. package/app/components/01.atoms/animations/rotating-carousel-image/CONSUMER-STYLING.md +54 -0
  32. package/app/components/01.atoms/animations/rotating-carousel-image/RotatingCarouselImage.vue +315 -0
  33. package/app/components/01.atoms/animations/rotating-carousel-image/stories/RotatingCarouselImage.stories.ts +156 -0
  34. package/app/components/01.atoms/animations/rotating-carousel-image/tests/RotatingCarouselImage.spec.ts +230 -0
  35. package/app/components/01.atoms/animations/rotating-carousel-image/tests/__snapshots__/RotatingCarouselImage.spec.ts.snap +19 -0
  36. package/app/components/01.atoms/canvas-switcher/stories/CanvasSwitcher.stories.ts +9 -10
  37. package/app/components/01.atoms/content-wrappers/docs-pages/stories/ContentDocs.stories.ts +12 -13
  38. package/app/components/01.atoms/grids/column-flow-grid/CONSUMER-STYLING.md +33 -0
  39. package/app/components/01.atoms/grids/column-flow-grid/ColumnFlowGrid.vue +55 -0
  40. package/app/components/01.atoms/grids/column-flow-grid/stories/ColumnFlowGrid.stories.ts +178 -0
  41. package/app/components/01.atoms/grids/column-flow-grid/tests/ColumnFlowGrid.spec.ts +75 -0
  42. package/app/components/01.atoms/grids/masonry-grid/CONSUMER-STYLING.md +35 -0
  43. package/app/components/01.atoms/grids/masonry-grid/MasonryGrid.vue +178 -0
  44. package/app/components/01.atoms/grids/masonry-grid/stories/MasonryGrid.stories.ts +199 -0
  45. package/app/components/01.atoms/grids/masonry-grid/tests/MasonryGrid.spec.ts +158 -0
  46. package/app/components/01.atoms/navigation/skip-links/CONSUMER-STYLING.md +31 -0
  47. package/app/components/01.atoms/navigation/skip-links/SkipLinks.vue +92 -0
  48. package/app/components/01.atoms/navigation/skip-links/stories/SkipLinks.stories.ts +113 -0
  49. package/app/components/01.atoms/navigation/skip-links/tests/SkipLinks.spec.ts +71 -0
  50. package/app/components/01.atoms/navigation/skip-links/tests/__snapshots__/SkipLinks.spec.ts.snap +15 -0
  51. package/app/components/01.atoms/navigation/tabs/CONSUMER-STYLING.md +99 -0
  52. package/app/components/01.atoms/navigation/tabs/TabsCore.vue +272 -0
  53. package/app/components/01.atoms/navigation/tabs/stories/TabsCore.stories.ts +199 -0
  54. package/app/components/01.atoms/navigation/tabs/tests/TabsCore.spec.ts +274 -0
  55. package/app/components/01.atoms/pop-over/CONSUMER-STYLING.md +54 -0
  56. package/app/components/01.atoms/pop-over/PopOver.vue +201 -0
  57. package/app/components/01.atoms/pop-over/stories/PopOver.stories.ts +141 -0
  58. package/app/components/01.atoms/pop-over/tests/PopOver.spec.ts +195 -0
  59. package/app/components/01.atoms/pop-over/tests/__snapshots__/PopOver.spec.ts.snap +11 -0
  60. package/app/components/01.atoms/text-blocks/header-block/CONSUMER-STYLING.md +43 -0
  61. package/app/components/01.atoms/text-blocks/header-block/HeaderBlock.vue +50 -0
  62. package/app/components/01.atoms/text-blocks/header-block/stories/HeaderBlock.stories.ts +111 -0
  63. package/app/components/01.atoms/text-blocks/header-block/tests/HeaderBlock.spec.ts +119 -0
  64. package/app/components/01.atoms/text-blocks/header-block/tests/__snapshots__/HeaderBlock.spec.ts.snap +5 -0
  65. package/app/components/02.molecules/action-menu/stories/ActionMenu.stories.ts +8 -2
  66. package/app/components/02.molecules/input-copy/InputCopy.vue +14 -0
  67. package/app/components/02.molecules/input-copy/stories/InputCopy.stories.ts +15 -0
  68. package/app/components/02.molecules/input-copy/tests/InputCopy.spec.ts +41 -0
  69. package/app/components/03.organisms/site-header/SiteHeader.vue +1 -1
  70. package/app/components/03.organisms/site-header/tests/SiteHeader.spec.ts +1 -1
  71. package/app/components/03.organisms/site-header/tests/__snapshots__/SiteHeader.spec.ts.snap +3 -3
  72. package/app/components/05.forms/input-select/InputSelectCore.vue +1 -1
  73. package/app/components/05.forms/input-text/InputTextCore.vue +6 -0
  74. package/app/components/05.forms/input-text/stories/InputPasswordWithLabel.stories.ts +49 -20
  75. package/app/components/05.forms/input-text/stories/InputTextAsNumberWithLabel.stories.ts +41 -22
  76. package/app/components/05.forms/input-text/stories/InputTextCore.stories.ts +48 -22
  77. package/app/components/05.forms/input-text/stories/InputTextWithLabel.stories.ts +43 -17
  78. package/app/components/05.forms/input-text/tests/InputPasswordWithLabel.spec.ts +56 -0
  79. package/app/components/05.forms/input-text/tests/InputTextAsNumberWithLabel.spec.ts +61 -0
  80. package/app/components/05.forms/input-text/tests/InputTextCore.spec.ts +60 -0
  81. package/app/components/05.forms/input-text/tests/InputTextWithLabel.spec.ts +46 -0
  82. package/app/components/05.forms/input-text/variants/InputPasswordWithLabel.vue +7 -1
  83. package/app/components/05.forms/input-text/variants/InputTextAsNumberWithLabel.vue +8 -2
  84. package/app/components/05.forms/input-text/variants/InputTextWithLabel.vue +6 -0
  85. package/app/components/05.forms/input-textarea/stories/InputTextareaCore.stories.ts +20 -20
  86. package/app/components/05.forms/input-textarea/stories/InputTextareaWithLabel.stories.ts +32 -26
  87. package/app/composables/useTabs.ts +225 -207
  88. package/app/types/components/index.ts +2 -0
  89. package/app/types/components/rotating-carousel-image.d.ts +4 -0
  90. package/app/types/components/skip-links.d.ts +4 -0
  91. package/app/types/forms/types.forms.d.ts +1 -1
  92. package/package.json +1 -1
  93. package/app/components/01.atoms/grids/data-grid/tests/__snapshots__/DataGrid.spec.ts.snap +0 -11
  94. package/app/components/masonry-grid/MasonryGrid.vue +0 -68
  95. package/app/components/masonry-grid-ordered/MasonryGridOrdered.vue +0 -163
  96. package/app/components/masonry-grid-ordered/MasonryGridOrderedGridExperiment.vue +0 -259
  97. package/app/components/masonry-grid-ordered/stories/MasonryGridOrdered.stories.ts +0 -354
  98. package/app/components/masonry-grid-sorted/MasonryGridSorted.vue +0 -120
  99. package/app/components/pop-over/PopOver.vue +0 -90
  100. package/app/components/rotating-carousel/RotatingCarouselImage.vue +0 -216
  101. package/app/components/skip-links/SkipLinks.vue +0 -60
  102. package/app/components/tabs/TabsCore.vue +0 -306
  103. package/app/components/typography/HeaderBlock.vue +0 -35
  104. package/app/layouts/default.vue +0 -308
  105. package/app/layouts/site-navigation-demo.vue +0 -188
  106. /package/app/components/01.atoms/grids/{data-grid → auto-grid}/AutoGrid.vue +0 -0
  107. /package/app/components/01.atoms/grids/{data-grid → auto-grid}/stories/AutoGrid.stories.ts +0 -0
  108. /package/app/components/01.atoms/grids/{data-grid → auto-grid}/tests/AutoGrid.spec.ts +0 -0
  109. /package/app/components/01.atoms/grids/{data-grid → auto-grid}/tests/__snapshots__/AutoGrid.spec.ts.snap +0 -0
@@ -1,308 +0,0 @@
1
- <template>
2
- <div class="page-layout">
3
- <SiteHeader
4
- :responsive-nav-links
5
- :gap-between-first-and-second-nav="12"
6
- page-row-variant="full"
7
- :style-class-passthrough="['header']"
8
- :nav-style-class-passthrough="['site-header-nav']"
9
- :overflow-details-summary-icons="{
10
- more: 'gravity-ui:ellipsis',
11
- burger: 'gravity-ui:bars',
12
- }"
13
- :collapse-at-main-nav-intersection="false"
14
- :allow-expand-on-gesture="false"
15
- >
16
- <template #branding>
17
- <NuxtLink to="/" class="home-link">
18
- SRCDEV
19
- <span>components</span>
20
- </NuxtLink>
21
- </template>
22
- <template #secondaryNavigation>
23
- <ul class="secondary-navigation-list">
24
- <li class="secondary-navigation-item">
25
- <NuxtLink class="secondary-navigation-link" to="/">
26
- <Icon name="material-symbols:settings-outline-rounded" class="icon" aria-hidden="true" />
27
- <span class="sr-only">Settings</span>
28
- </NuxtLink>
29
- </li>
30
- </ul>
31
- </template>
32
- </SiteHeader>
33
- <PageRow id="main-content" class="main-content" tag="main" variant="full" :is-landmark="true">
34
- <template #default>
35
- <slot name="layout-content">Page content goes here</slot>
36
- </template>
37
- </PageRow>
38
- <PageRow id="footer-content" tag="footer" variant="full" :is-landmark="true">
39
- <template #default>
40
- <p>Footer content here</p>
41
- </template>
42
- </PageRow>
43
- </div>
44
- </template>
45
-
46
- <script setup lang="ts">
47
- import type { ResponsiveHeaderProp } from "~/types/components";
48
-
49
- const responsiveNavLinks = {
50
- firstNav: [
51
- {
52
- name: "Components",
53
- iconName: "material-symbols:widgets",
54
- childLinksTitle: "UI Components",
55
- childLinks: [
56
- { name: "Wipe Away Vertical", path: "/ui/wipe-away-vertical" },
57
- { name: "Scroll Reveal Image", path: "/ui/scroll-reveal-image" },
58
- { name: "Tooltips", path: "/ui/tooltips" },
59
- { name: "Marquee Scroller", path: "/ui/marquee-scroller" },
60
- { name: "Banner", path: "/ui/display-banner" },
61
- { name: "Banner Video", path: "/banner-video" },
62
- { name: "Section Parallax", path: "/ui/section-parallax" },
63
- { name: "Animated SVG Text", path: "/ui/animated-svg-text" },
64
- { name: "Carousel (Basic)", path: "/ui/carousel-basic" },
65
- { name: "Carousel (Infinite)", path: "/ui/carousel-infinite" },
66
- { name: "Carousel (Flip)", path: "/ui/carousel-flip" },
67
- { name: "Slider Gallery", path: "/ui/slider-gallery" },
68
- { name: "Container Glow", path: "/ui/container-glow" },
69
- { name: "Accordian", path: "/ui/accordian" },
70
- { name: "Display Details", path: "/ui/display-details" },
71
- { name: "Card Core", path: "/ui/card-core" },
72
- { name: "Glowing Border", path: "/ui/glowing-border" },
73
- { name: "Display Toast", path: "/ui/display-toast" },
74
- { name: "Prompts", path: "/ui/display-prompt" },
75
- { name: "Masked Alert", path: "/ui/mask-element" },
76
- { name: "Expanding Panel", path: "/ui/expanding-panel" },
77
- { name: "Dialogs", path: "/ui/display-dialog" },
78
- { name: "Tabs X", path: "/ui/tabs" },
79
- { name: "Tabs Y", path: "/ui/tabs-y" },
80
- { name: "Rotating Carousel", path: "/ui/rotating-carousel" },
81
- { name: "Clipped Panels", path: "/ui/clipped-panels" },
82
- { name: "Display Chip", path: "/ui/display-chip" },
83
- { name: "Display Avatar", path: "/ui/display-avatar" },
84
- { name: "Display Pill", path: "/ui/display-pill" },
85
- { name: "Qr Codes", path: "/ui/qr-code/display" },
86
- { name: "Anchor Scroll", path: "/ui/anchor-scroll" },
87
- { name: "Anchor Scroll (TabNavigation)", path: "/ui/anchor-scroll-tab-navigation" },
88
- ],
89
- },
90
- {
91
- name: "Layouts",
92
- iconName: "material-symbols:responsive-layout",
93
- childLinksTitle: "UI Layouts",
94
- childLinks: [
95
- { name: "Block Decorators", path: "/ui/block-decorators" },
96
- { name: "Navigation Horizontal", path: "/ui/navigation/navigation-horizontal" },
97
- { name: "Site Navigation", path: "/ui/navigation/site-navigation" },
98
- { name: "Tab Navigation", path: "/ui/navigation/tab-navigation" },
99
- { name: "Deep Expanding Menu", path: "/ui/deep-expanding-menu" },
100
- { name: "Magnetic Navigation", path: "/ui/magnetic-navigation" },
101
- { name: "Page Row", path: "/ui/page-row" },
102
- { name: "Layout Grid A", path: "/ui/layout-grid-a" },
103
- { name: "Layout Grid B", path: "/ui/layout-grid-b" },
104
- { name: "Simple Grid", path: "/ui/simple-grid" },
105
- { name: "Layout Content Docs", path: "/ui/layout-content-docs" },
106
- { name: "Masonry Grid Simple", path: "/ui/masonry-grid" },
107
- { name: "Masonry Grid Sorted", path: "/ui/masonry-grid-sorted" },
108
- { name: "Masonry Grid Ordered", path: "/ui/masonry-grid-ordered" },
109
- { name: "Masonry Columns", path: "/ui/masonry-columns" },
110
- { name: "Page Hero Highlights", path: "/page-hero-highlights" },
111
- ],
112
- },
113
- {
114
- name: "Forms",
115
- iconName: "material-symbols:custom-typography",
116
- childLinksTitle: "Forms & Inputs",
117
- childLinks: [
118
- { name: "Buttons", path: "/forms/examples/buttons" },
119
- { name: "Example Form", path: "/forms/examples/material/text-fields" },
120
- { name: "Example Form", path: "/forms/examples/material/text-fields" },
121
- ],
122
- },
123
- {
124
- name: "Typography",
125
- iconName: "material-symbols:custom-typography",
126
- childLinksTitle: "Typography",
127
- childLinks: [
128
- { name: "Hero Text", path: "/typography/hero-text" },
129
- { name: "Page Headings", path: "/typography/page-heading" },
130
- { name: "Page Body", path: "/typography/page-body" },
131
- { name: "Page Links", path: "/typography/page-link" },
132
- ],
133
- },
134
- ],
135
- secondNav: [
136
- { name: "Some other link", iconName: "material-symbols:widgets", path: "#link-description" },
137
- {
138
- name: "Help",
139
- childLinksTitle: "Find Help",
140
- childLinks: [
141
- { name: "FAQs", path: "#" },
142
- { name: "Contact Us", path: "#" },
143
- { name: "Logout", path: "#" },
144
- ],
145
- },
146
- {
147
- name: "Account",
148
- childLinksTitle: "Manage Your Account",
149
- childLinks: [
150
- { name: "Your Profile", path: "#" },
151
- { name: "Settings", path: "/ui/settings" },
152
- { name: "Logout", path: "#" },
153
- ],
154
- },
155
- ],
156
- } as ResponsiveHeaderProp;
157
-
158
- // *** COLOR SCHEME INITIALIZATION ***
159
- onMounted(() => {
160
- const getSystemPreference = () => {
161
- return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
162
- };
163
-
164
- const applyColorScheme = (scheme: string) => {
165
- const htmlElement = document.documentElement;
166
- htmlElement.classList.remove("system", "dark", "light");
167
-
168
- // If scheme is "system", use the actual system preference
169
- const actualScheme = scheme === "system" ? getSystemPreference() : scheme;
170
- htmlElement.classList.add(actualScheme);
171
- };
172
-
173
- // Listen for system preference changes
174
- const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
175
- const handleSystemChange = () => {
176
- const storedValue = localStorage.getItem("useSettingsStore");
177
- if (storedValue) {
178
- const parsed = JSON.parse(storedValue);
179
- // Only update if user has "system" selected
180
- if (parsed.colourScheme === "system") {
181
- applyColorScheme("system");
182
- }
183
- }
184
- };
185
-
186
- mediaQuery.addEventListener("change", handleSystemChange);
187
-
188
- try {
189
- const storedValue = localStorage.getItem("useSettingsStore");
190
-
191
- if (storedValue) {
192
- const parsed = JSON.parse(storedValue);
193
- applyColorScheme(parsed.colourScheme || "system");
194
- } else {
195
- // For new users, detect and apply system preference
196
- const systemPreference = getSystemPreference();
197
- applyColorScheme(systemPreference);
198
- }
199
- } catch {
200
- // Fallback to system preference
201
- const systemPreference = getSystemPreference();
202
- applyColorScheme(systemPreference);
203
- }
204
- });
205
- </script>
206
- <style lang="css">
207
- .page-layout {
208
- display: grid;
209
- grid-template-columns: 1fr;
210
- grid-template-rows: auto 1fr auto;
211
- align-items: start;
212
-
213
- .main-content {
214
- container-type: inline-size;
215
- }
216
- }
217
-
218
- /* ─── Header row layout ─────────────────────────────────────────────────── */
219
- .header {
220
- .debug-grid {
221
- display: none !important;
222
- }
223
-
224
- width: 100%;
225
-
226
- /* SiteHeader token overrides — see .claude/skills/components/site-header.md */
227
- --site-header-gap: 2.4rem;
228
- --site-header-padding-inline: 2.4rem;
229
- --site-header-bg: #000;
230
- --site-header-position: relative;
231
- --site-header-z-index: 9;
232
-
233
- .home-link {
234
- display: flex;
235
- flex-direction: column;
236
- text-wrap-mode: nowrap;
237
- font-size: var(--step-5);
238
- letter-spacing: 0.2em;
239
- color: var(--slate-00);
240
- text-decoration: none;
241
-
242
- span {
243
- font-size: var(--step-3);
244
- letter-spacing: initial;
245
- }
246
-
247
- &:hover {
248
- border-radius: 0.4rem;
249
- outline: 2px solid var(--green-08);
250
- outline-offset: 0.4rem;
251
- }
252
- }
253
- }
254
-
255
- /* ─── ResponsiveHeader token overrides for this layout ──────────────────── */
256
- .site-header-nav {
257
- --responsive-header-margin: 1.2rem;
258
- --responsive-header-bg: #efefef05;
259
- --responsive-header-border: 1px solid transparent;
260
- --responsive-header-border-radius: 0.8rem;
261
- --responsive-header-padding-block: 1rem;
262
- --responsive-header-padding-inline: 1.2rem;
263
- --responsive-header-max-height: 6.4rem;
264
- --responsive-header-inline-size: 100%;
265
-
266
- --responsive-header-color: var(--slate-00);
267
- --responsive-header-link-color: var(--slate-00);
268
-
269
- /* Fixed (non-fluid) nav-link font-size — deliberately NOT var(--step-*).
270
- A vw-based clamp() here drifts with the scrollbar (see
271
- ResponsiveHeader.vue's token comment) without ever re-triggering the
272
- overflow-collapse ResizeObserver, silently letting one extra item fit
273
- that shouldn't. Values TBC after a visual pass. */
274
- --responsive-header-link-font-size: 1.2rem;
275
- @media (min-width: 768px) {
276
- --responsive-header-link-font-size: 1.4rem;
277
- }
278
- @media (min-width: 1024px) {
279
- --responsive-header-link-font-size: 1.5rem;
280
- }
281
-
282
- --responsive-header-sub-nav-bg: #000;
283
- --responsive-header-sub-nav-border: 1px solid #efefef75;
284
-
285
- --responsive-header-overflow-btn-bg: var(--slate-08);
286
- --responsive-header-overflow-btn-size: 3rem;
287
- --responsive-header-overflow-btn-border: 1px solid #ffffff90;
288
- --responsive-header-overflow-btn-outline: 1px solid #ffffff10;
289
- --responsive-header-overflow-btn-icon-color: var(--slate-00);
290
- --responsive-header-overflow-btn-hover-outline: 2px solid var(--green-08);
291
-
292
- --responsive-header-overflow-nav-bg: #000;
293
- --responsive-header-overflow-nav-border: 0.1rem solid #ffffff90;
294
- --responsive-header-overflow-nav-padding-block: 0;
295
-
296
- --overflow-nav-link-color: var(--slate-00);
297
- --overflow-nav-link-border-color: #efefef75;
298
- --overflow-nav-sub-item-color: var(--slate-00);
299
- --overflow-nav-sub-item-font-size: var(--step-4);
300
-
301
- --responsive-nav-decorator-indicator-color: var(--slate-00);
302
- --responsive-nav-decorator-hovered-indicator-color: var(--green-08);
303
- --responsive-nav-decorator-hovered-bg: oklch(100% 0 0 / 8%);
304
- --overflow-nav-decorator-indicator-color: var(--slate-00);
305
- --overflow-nav-decorator-hovered-indicator-color: var(--green-08);
306
- --overflow-nav-decorator-hovered-bg: oklch(100% 0 0 / 6%);
307
- }
308
- </style>
@@ -1,188 +0,0 @@
1
- <template>
2
- <div class="site-nav-demo-layout">
3
- <header class="site-nav-demo-header">
4
- <NuxtLink to="/" class="site-nav-demo-logo">SiteNav Demo</NuxtLink>
5
- <SiteNavigation :nav-item-data="navItemData" nav-align="right" />
6
- </header>
7
- <main class="site-nav-demo-main">
8
- <slot></slot>
9
- </main>
10
- </div>
11
- </template>
12
-
13
- <script setup lang="ts">
14
- import type { NavItemData } from "~/types/components/navigation-horizontal.d";
15
-
16
- const navItemData: NavItemData = {
17
- main: [
18
- { text: "Home", href: "/ui/navigation/site-navigation" },
19
- { text: "About", href: "/ui/navigation/site-navigation/about" },
20
- { text: "Services", href: "/ui/navigation/site-navigation/services" },
21
- { text: "Portfolio", href: "/ui/navigation/site-navigation/portfolio" },
22
- { text: "Contact", href: "/ui/navigation/site-navigation/contact" },
23
- ],
24
- };
25
- </script>
26
-
27
- <style lang="css">
28
- .site-nav-demo-layout {
29
- min-height: 100dvh;
30
- display: flex;
31
- flex-direction: column;
32
-
33
- .site-nav-demo-header {
34
- display: flex;
35
- align-items: center;
36
- gap: 2.4rem;
37
- padding-block: 1.2rem;
38
- padding-inline: 2.4rem;
39
- background-color: #0e0e0e;
40
- border-block-end: 1px solid oklch(100% 0 0 / 10%);
41
- position: sticky;
42
- top: 0;
43
- z-index: 10;
44
- }
45
-
46
- .site-nav-demo-logo {
47
- font-size: 1.6rem;
48
- font-weight: 600;
49
- letter-spacing: 0.05em;
50
- color: var(--warm-01, #fff);
51
- text-decoration: none;
52
- text-wrap: nowrap;
53
- flex-shrink: 0;
54
- }
55
-
56
- .site-navigation {
57
- flex: 1;
58
- min-width: 0;
59
- }
60
-
61
- .site-nav-demo-main {
62
- flex: 1;
63
- padding: 4rem 2.4rem;
64
- max-width: 80rem;
65
- margin-inline: auto;
66
- width: 100%;
67
- }
68
- }
69
-
70
- /* Shared demo page styles */
71
- .snav-demo-page {
72
- h1,
73
- h2,
74
- h3 {
75
- margin-block-end: 1.6rem;
76
- }
77
- h2 {
78
- margin-block-start: 4rem;
79
- }
80
- > p {
81
- margin-block-end: 2.4rem;
82
- line-height: 1.6;
83
- }
84
- ul {
85
- padding-inline-start: 2rem;
86
- margin-block-end: 2.4rem;
87
- line-height: 2;
88
- }
89
- }
90
-
91
- .snav-demo-hero {
92
- width: 100%;
93
- height: auto;
94
- aspect-ratio: 2 / 1;
95
- object-fit: cover;
96
- border-radius: 0.8rem;
97
- display: block;
98
- margin-block-end: 2.4rem;
99
- }
100
-
101
- .snav-demo-grid {
102
- display: grid;
103
- grid-template-columns: repeat(3, 1fr);
104
- gap: 1.6rem;
105
-
106
- @media (max-width: 600px) {
107
- grid-template-columns: repeat(2, 1fr);
108
- }
109
- }
110
-
111
- .snav-demo-grid--wide {
112
- grid-template-columns: repeat(2, 1fr);
113
-
114
- @media (max-width: 600px) {
115
- grid-template-columns: 1fr;
116
- }
117
- }
118
-
119
- .snav-demo-img {
120
- width: 100%;
121
- height: auto;
122
- aspect-ratio: 3 / 2;
123
- object-fit: cover;
124
- border-radius: 0.4rem;
125
- display: block;
126
- }
127
-
128
- .snav-demo-split {
129
- display: grid;
130
- grid-template-columns: 1fr 1fr;
131
- gap: 3.2rem;
132
- align-items: start;
133
- margin-block-end: 4rem;
134
-
135
- @media (max-width: 650px) {
136
- grid-template-columns: 1fr;
137
- }
138
- }
139
-
140
- .snav-demo-split__text {
141
- h2,
142
- h3 {
143
- margin-block-start: 2.4rem;
144
- }
145
- p {
146
- line-height: 1.6;
147
- margin-block-end: 1.6rem;
148
- }
149
- }
150
-
151
- .snav-demo-split__img {
152
- width: 100%;
153
- height: auto;
154
- aspect-ratio: 3 / 4;
155
- object-fit: cover;
156
- border-radius: 0.4rem;
157
- display: block;
158
- }
159
-
160
- .snav-demo-services {
161
- display: grid;
162
- grid-template-columns: repeat(3, 1fr);
163
- gap: 2.4rem;
164
-
165
- @media (max-width: 650px) {
166
- grid-template-columns: 1fr;
167
- }
168
- }
169
-
170
- .snav-demo-service-card {
171
- border-radius: 0.8rem;
172
- overflow: hidden;
173
- background: oklch(100% 0 0 / 5%);
174
- }
175
-
176
- .snav-demo-service-card__body {
177
- padding: 1.6rem;
178
-
179
- h3 {
180
- margin-block-end: 0.8rem;
181
- }
182
- p {
183
- font-size: 1.4rem;
184
- line-height: 1.6;
185
- opacity: 0.8;
186
- }
187
- }
188
- </style>