origam 2.23.1 → 2.24.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.
Files changed (37) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/src/assets/css/main.css +1 -1
  3. package/dist/src/assets/css/tokens/dark.css +24 -10
  4. package/dist/src/assets/css/tokens/light.css +12 -5
  5. package/dist/src/assets/css/tokens/origam-utilities.css +84 -0
  6. package/dist/src/assets/css/tokens/primitive.css +1 -0
  7. package/dist/src/assets/scss/tokens/_dark.scss +24 -10
  8. package/dist/src/assets/scss/tokens/_light.scss +12 -5
  9. package/dist/src/assets/scss/tokens/_origam-utilities.scss +84 -0
  10. package/dist/src/assets/scss/tokens/_primitive.scss +1 -0
  11. package/dist/src/components/Breadcrumb/OrigamBreadcrumbItem.vue +1 -1
  12. package/dist/src/components/Skeleton/OrigamSkeleton.vue +89 -125
  13. package/dist/src/components/Skeleton/OrigamSkeletonGroup.vue +52 -0
  14. package/dist/src/components/Skeleton/index.cjs +7 -0
  15. package/dist/src/components/Skeleton/index.d.ts +1 -0
  16. package/dist/src/components/Skeleton/index.js +1 -0
  17. package/dist/src/consts/Skeleton/skeleton.const.cjs +7 -0
  18. package/dist/src/consts/Skeleton/skeleton.const.d.ts +11 -0
  19. package/dist/src/consts/Skeleton/skeleton.const.js +1 -0
  20. package/dist/src/consts/index.cjs +11 -0
  21. package/dist/src/consts/index.d.ts +1 -0
  22. package/dist/src/consts/index.js +1 -0
  23. package/dist/src/enums/Skeleton/skeleton.enum.cjs +9 -2
  24. package/dist/src/enums/Skeleton/skeleton.enum.d.ts +27 -4
  25. package/dist/src/enums/Skeleton/skeleton.enum.js +7 -0
  26. package/dist/src/interfaces/Skeleton/skeleton-group.interface.cjs +1 -0
  27. package/dist/src/interfaces/Skeleton/skeleton-group.interface.d.ts +34 -0
  28. package/dist/src/interfaces/Skeleton/skeleton-group.interface.js +0 -0
  29. package/dist/src/interfaces/Skeleton/skeleton.interface.d.ts +27 -10
  30. package/dist/src/interfaces/index.cjs +11 -0
  31. package/dist/src/interfaces/index.d.ts +1 -0
  32. package/dist/src/interfaces/index.js +1 -0
  33. package/dist/src/themes/origam.theme.cjs +2 -4
  34. package/dist/src/themes/origam.theme.js +2 -2
  35. package/dist/src/types/Skeleton/skeleton.type.d.ts +4 -1
  36. package/dist/src/types/tokens.type.d.ts +1 -1
  37. package/package.json +1 -1
@@ -2486,13 +2486,20 @@
2486
2486
  --origam-grid---justify-items: stretch;
2487
2487
  --origam-grid---align-content: normal;
2488
2488
  --origam-grid---justify-content: normal;
2489
- --origam-skeleton---background-color: var(--origam-color__surface---overlay);
2489
+ --origam-skeleton---background-color: color-mix(in srgb, currentColor 13%, transparent);
2490
+ --origam-skeleton---highlight-color: color-mix(in srgb, currentColor 6.5%, transparent);
2490
2491
  --origam-skeleton---border-radius: var(--origam-radius---sm);
2491
2492
  --origam-skeleton---border-radius-circular: var(--origam-radius---full);
2492
- --origam-skeleton---animation-duration: var(--origam-motion__duration---xslow);
2493
- --origam-skeleton---opacity-min: 0.4;
2494
- --origam-skeleton---opacity-max: 0.8;
2495
- --origam-skeleton---text-height: 1.2em;
2493
+ --origam-skeleton---border-radius-pill: var(--origam-radius---full);
2494
+ --origam-skeleton---animation-duration: var(--origam-motion__duration---loop);
2495
+ --origam-skeleton---animation-iterations: 6;
2496
+ --origam-skeleton---opacity-min: 0.55;
2497
+ --origam-skeleton---opacity-max: 1;
2498
+ --origam-skeleton---text-height: 0.7em;
2499
+ --origam-skeleton---text-margin-block: 0.35em;
2500
+ --origam-skeleton---circular-size: 36px;
2501
+ --origam-skeleton---pill-height: 1.5em;
2502
+ --origam-skeleton---pill-width: 4em;
2496
2503
  --origam-skeleton---gap: var(--origam-space---3);
2497
2504
  --origam-kbd---background-color: var(--origam-color__surface---overlay);
2498
2505
  --origam-kbd---color: var(--origam-color__text---primary);
@@ -5498,13 +5505,20 @@
5498
5505
  --origam-grid---justify-items: stretch;
5499
5506
  --origam-grid---align-content: normal;
5500
5507
  --origam-grid---justify-content: normal;
5501
- --origam-skeleton---background-color: var(--origam-color__surface---overlay);
5508
+ --origam-skeleton---background-color: color-mix(in srgb, currentColor 13%, transparent);
5509
+ --origam-skeleton---highlight-color: color-mix(in srgb, currentColor 6.5%, transparent);
5502
5510
  --origam-skeleton---border-radius: var(--origam-radius---sm);
5503
5511
  --origam-skeleton---border-radius-circular: var(--origam-radius---full);
5504
- --origam-skeleton---animation-duration: var(--origam-motion__duration---xslow);
5505
- --origam-skeleton---opacity-min: 0.4;
5506
- --origam-skeleton---opacity-max: 0.8;
5507
- --origam-skeleton---text-height: 1.2em;
5512
+ --origam-skeleton---border-radius-pill: var(--origam-radius---full);
5513
+ --origam-skeleton---animation-duration: var(--origam-motion__duration---loop);
5514
+ --origam-skeleton---animation-iterations: 6;
5515
+ --origam-skeleton---opacity-min: 0.55;
5516
+ --origam-skeleton---opacity-max: 1;
5517
+ --origam-skeleton---text-height: 0.7em;
5518
+ --origam-skeleton---text-margin-block: 0.35em;
5519
+ --origam-skeleton---circular-size: 36px;
5520
+ --origam-skeleton---pill-height: 1.5em;
5521
+ --origam-skeleton---pill-width: 4em;
5508
5522
  --origam-skeleton---gap: var(--origam-space---3);
5509
5523
  --origam-kbd---background-color: var(--origam-color__surface---overlay);
5510
5524
  --origam-kbd---color: var(--origam-color__text---primary);
@@ -2400,13 +2400,20 @@
2400
2400
  --origam-grid---justify-items: stretch;
2401
2401
  --origam-grid---align-content: normal;
2402
2402
  --origam-grid---justify-content: normal;
2403
- --origam-skeleton---background-color: var(--origam-color__surface---overlay);
2403
+ --origam-skeleton---background-color: color-mix(in srgb, currentColor 10%, transparent);
2404
+ --origam-skeleton---highlight-color: color-mix(in srgb, currentColor 5%, transparent);
2404
2405
  --origam-skeleton---border-radius: var(--origam-radius---sm);
2405
2406
  --origam-skeleton---border-radius-circular: var(--origam-radius---full);
2406
- --origam-skeleton---animation-duration: var(--origam-motion__duration---xslow);
2407
- --origam-skeleton---opacity-min: 0.4;
2408
- --origam-skeleton---opacity-max: 0.8;
2409
- --origam-skeleton---text-height: 1.2em;
2407
+ --origam-skeleton---border-radius-pill: var(--origam-radius---full);
2408
+ --origam-skeleton---animation-duration: var(--origam-motion__duration---loop);
2409
+ --origam-skeleton---animation-iterations: 6;
2410
+ --origam-skeleton---opacity-min: 0.55;
2411
+ --origam-skeleton---opacity-max: 1;
2412
+ --origam-skeleton---text-height: 0.7em;
2413
+ --origam-skeleton---text-margin-block: 0.35em;
2414
+ --origam-skeleton---circular-size: 36px;
2415
+ --origam-skeleton---pill-height: 1.5em;
2416
+ --origam-skeleton---pill-width: 4em;
2410
2417
  --origam-skeleton---gap: var(--origam-space---3);
2411
2418
  --origam-kbd---background-color: var(--origam-color__surface---overlay);
2412
2419
  --origam-kbd---color: var(--origam-color__text---primary);
@@ -153,3 +153,87 @@
153
153
  .origam--backdrop-blur-md { backdrop-filter: blur(var(--origam-blur---md)); -webkit-backdrop-filter: blur(var(--origam-blur---md)); }
154
154
  .origam--backdrop-blur-lg { backdrop-filter: blur(var(--origam-blur---lg)); -webkit-backdrop-filter: blur(var(--origam-blur---lg)); }
155
155
  .origam--backdrop-blur-xl { backdrop-filter: blur(var(--origam-blur---xl)); -webkit-backdrop-filter: blur(var(--origam-blur---xl)); }
156
+
157
+ /* --- Skeleton (host placeholder state) ------------------- */
158
+ /* */
159
+ /* The shared mechanism that lets ANY element paint ITSELF as */
160
+ /* a loading placeholder — no node is added, no component is */
161
+ /* mounted. Put `.origam--skeleton` on the element; its */
162
+ /* geometry (size, radius) stays whatever the element already */
163
+ /* has, so the placeholder keeps the real silhouette. */
164
+ /* */
165
+ /* fill ::after colour = --origam-skeleton---background-color */
166
+ /* shimmer ::before only with `.origam--skeleton-wave` */
167
+ /* content hidden: glyphs via text-fill, children via */
168
+ /* visibility — the layout box is untouched */
169
+ /* */
170
+ /* ⛔ CONSTRAINTS, read before using it on a new host: */
171
+ /* - a pseudo-element is not rendered on replaced elements: */
172
+ /* `<input>`, `<textarea>`, `<select>`, images: can NOT be */
173
+ /* a host (measured: the ::after never paints on <input>, */
174
+ /* <textarea> or <select>, although getComputedStyle still */
175
+ /* reports it). */
176
+ /* Put the class on the wrapper that draws the field. */
177
+ /* - the host's own ::before / ::after are taken over. */
178
+ /* - the host becomes `position: relative` when it is static */
179
+ /* (a component's own scoped `position` still wins). */
180
+ /* - it is purely visual: the host still has to carry */
181
+ /* `aria-busy="true"` (and `aria-disabled` on a control). */
182
+ /* */
183
+ /* The fill is currentColor mixed with transparent, so it */
184
+ /* follows themes, modes and surfaces with no extra token. */
185
+ /* Motion: pulse by default, capped by */
186
+ /* --origam-skeleton---animation-iterations (WCAG 2.2.2), */
187
+ /* and switched off under prefers-reduced-motion. */
188
+ .origam--skeleton {
189
+ position: relative;
190
+ -webkit-text-fill-color: transparent;
191
+ text-shadow: none;
192
+ pointer-events: none;
193
+ user-select: none;
194
+ }
195
+ .origam--skeleton > * { visibility: hidden; }
196
+ .origam--skeleton::after {
197
+ content: "";
198
+ position: absolute;
199
+ inset: 0;
200
+ border-radius: inherit;
201
+ background-color: var(--origam-skeleton---background-color);
202
+ animation: origam-skeleton-pulse var(--origam-skeleton---animation-duration) ease-in-out var(--origam-skeleton---animation-iterations);
203
+ }
204
+ .origam--skeleton-none::after { animation: none; }
205
+ .origam--skeleton-wave { overflow: hidden; }
206
+ .origam--skeleton-wave::after { animation: none; }
207
+ .origam--skeleton-wave::before {
208
+ content: "";
209
+ position: absolute;
210
+ inset: 0;
211
+ z-index: 1;
212
+ background: linear-gradient(105deg, transparent 35%, var(--origam-skeleton---highlight-color) 50%, transparent 65%);
213
+ transform: translateX(-100%);
214
+ animation: origam-skeleton-wave var(--origam-skeleton---animation-duration) ease-in-out var(--origam-skeleton---animation-iterations);
215
+ }
216
+
217
+ /* A group is ONE animation clock: the container pulses, its */
218
+ /* blocks do not, so blocks mounted at different moments still */
219
+ /* breathe together. */
220
+ .origam--skeleton-group-pulse {
221
+ animation: origam-skeleton-pulse var(--origam-skeleton---animation-duration) ease-in-out var(--origam-skeleton---animation-iterations);
222
+ }
223
+ .origam--skeleton-group-pulse .origam--skeleton::after { animation: none; }
224
+
225
+ @keyframes origam-skeleton-pulse {
226
+ 0%, 100% { opacity: var(--origam-skeleton---opacity-max); }
227
+ 50% { opacity: var(--origam-skeleton---opacity-min); }
228
+ }
229
+ @keyframes origam-skeleton-wave {
230
+ to { transform: translateX(100%); }
231
+ }
232
+
233
+ /* Last on purpose: same specificity as the rules above, so */
234
+ /* source order makes this one win (#1074). */
235
+ @media (prefers-reduced-motion: reduce) {
236
+ .origam--skeleton::after,
237
+ .origam--skeleton::before,
238
+ .origam--skeleton-group-pulse { animation: none; }
239
+ }
@@ -139,6 +139,7 @@
139
139
  --origam-motion__duration---medium: 200ms;
140
140
  --origam-motion__duration---slow: 280ms;
141
141
  --origam-motion__duration---xslow: 400ms;
142
+ --origam-motion__duration---loop: 1600ms;
142
143
  --origam-motion__easing---standard: cubic-bezier(0.4, 0, 0.2, 1);
143
144
  --origam-motion__easing---decelerate: cubic-bezier(0, 0, 0.2, 1);
144
145
  --origam-motion__easing---accelerate: cubic-bezier(0.4, 0, 1, 1);
@@ -2486,13 +2486,20 @@
2486
2486
  --origam-grid---justify-items: stretch;
2487
2487
  --origam-grid---align-content: normal;
2488
2488
  --origam-grid---justify-content: normal;
2489
- --origam-skeleton---background-color: var(--origam-color__surface---overlay);
2489
+ --origam-skeleton---background-color: color-mix(in srgb, currentColor 13%, transparent);
2490
+ --origam-skeleton---highlight-color: color-mix(in srgb, currentColor 6.5%, transparent);
2490
2491
  --origam-skeleton---border-radius: var(--origam-radius---sm);
2491
2492
  --origam-skeleton---border-radius-circular: var(--origam-radius---full);
2492
- --origam-skeleton---animation-duration: var(--origam-motion__duration---xslow);
2493
- --origam-skeleton---opacity-min: 0.4;
2494
- --origam-skeleton---opacity-max: 0.8;
2495
- --origam-skeleton---text-height: 1.2em;
2493
+ --origam-skeleton---border-radius-pill: var(--origam-radius---full);
2494
+ --origam-skeleton---animation-duration: var(--origam-motion__duration---loop);
2495
+ --origam-skeleton---animation-iterations: 6;
2496
+ --origam-skeleton---opacity-min: 0.55;
2497
+ --origam-skeleton---opacity-max: 1;
2498
+ --origam-skeleton---text-height: 0.7em;
2499
+ --origam-skeleton---text-margin-block: 0.35em;
2500
+ --origam-skeleton---circular-size: 36px;
2501
+ --origam-skeleton---pill-height: 1.5em;
2502
+ --origam-skeleton---pill-width: 4em;
2496
2503
  --origam-skeleton---gap: var(--origam-space---3);
2497
2504
  --origam-kbd---background-color: var(--origam-color__surface---overlay);
2498
2505
  --origam-kbd---color: var(--origam-color__text---primary);
@@ -5498,13 +5505,20 @@
5498
5505
  --origam-grid---justify-items: stretch;
5499
5506
  --origam-grid---align-content: normal;
5500
5507
  --origam-grid---justify-content: normal;
5501
- --origam-skeleton---background-color: var(--origam-color__surface---overlay);
5508
+ --origam-skeleton---background-color: color-mix(in srgb, currentColor 13%, transparent);
5509
+ --origam-skeleton---highlight-color: color-mix(in srgb, currentColor 6.5%, transparent);
5502
5510
  --origam-skeleton---border-radius: var(--origam-radius---sm);
5503
5511
  --origam-skeleton---border-radius-circular: var(--origam-radius---full);
5504
- --origam-skeleton---animation-duration: var(--origam-motion__duration---xslow);
5505
- --origam-skeleton---opacity-min: 0.4;
5506
- --origam-skeleton---opacity-max: 0.8;
5507
- --origam-skeleton---text-height: 1.2em;
5512
+ --origam-skeleton---border-radius-pill: var(--origam-radius---full);
5513
+ --origam-skeleton---animation-duration: var(--origam-motion__duration---loop);
5514
+ --origam-skeleton---animation-iterations: 6;
5515
+ --origam-skeleton---opacity-min: 0.55;
5516
+ --origam-skeleton---opacity-max: 1;
5517
+ --origam-skeleton---text-height: 0.7em;
5518
+ --origam-skeleton---text-margin-block: 0.35em;
5519
+ --origam-skeleton---circular-size: 36px;
5520
+ --origam-skeleton---pill-height: 1.5em;
5521
+ --origam-skeleton---pill-width: 4em;
5508
5522
  --origam-skeleton---gap: var(--origam-space---3);
5509
5523
  --origam-kbd---background-color: var(--origam-color__surface---overlay);
5510
5524
  --origam-kbd---color: var(--origam-color__text---primary);
@@ -2400,13 +2400,20 @@
2400
2400
  --origam-grid---justify-items: stretch;
2401
2401
  --origam-grid---align-content: normal;
2402
2402
  --origam-grid---justify-content: normal;
2403
- --origam-skeleton---background-color: var(--origam-color__surface---overlay);
2403
+ --origam-skeleton---background-color: color-mix(in srgb, currentColor 10%, transparent);
2404
+ --origam-skeleton---highlight-color: color-mix(in srgb, currentColor 5%, transparent);
2404
2405
  --origam-skeleton---border-radius: var(--origam-radius---sm);
2405
2406
  --origam-skeleton---border-radius-circular: var(--origam-radius---full);
2406
- --origam-skeleton---animation-duration: var(--origam-motion__duration---xslow);
2407
- --origam-skeleton---opacity-min: 0.4;
2408
- --origam-skeleton---opacity-max: 0.8;
2409
- --origam-skeleton---text-height: 1.2em;
2407
+ --origam-skeleton---border-radius-pill: var(--origam-radius---full);
2408
+ --origam-skeleton---animation-duration: var(--origam-motion__duration---loop);
2409
+ --origam-skeleton---animation-iterations: 6;
2410
+ --origam-skeleton---opacity-min: 0.55;
2411
+ --origam-skeleton---opacity-max: 1;
2412
+ --origam-skeleton---text-height: 0.7em;
2413
+ --origam-skeleton---text-margin-block: 0.35em;
2414
+ --origam-skeleton---circular-size: 36px;
2415
+ --origam-skeleton---pill-height: 1.5em;
2416
+ --origam-skeleton---pill-width: 4em;
2410
2417
  --origam-skeleton---gap: var(--origam-space---3);
2411
2418
  --origam-kbd---background-color: var(--origam-color__surface---overlay);
2412
2419
  --origam-kbd---color: var(--origam-color__text---primary);
@@ -153,3 +153,87 @@
153
153
  .origam--backdrop-blur-md { backdrop-filter: blur(var(--origam-blur---md)); -webkit-backdrop-filter: blur(var(--origam-blur---md)); }
154
154
  .origam--backdrop-blur-lg { backdrop-filter: blur(var(--origam-blur---lg)); -webkit-backdrop-filter: blur(var(--origam-blur---lg)); }
155
155
  .origam--backdrop-blur-xl { backdrop-filter: blur(var(--origam-blur---xl)); -webkit-backdrop-filter: blur(var(--origam-blur---xl)); }
156
+
157
+ /* --- Skeleton (host placeholder state) ------------------- */
158
+ /* */
159
+ /* The shared mechanism that lets ANY element paint ITSELF as */
160
+ /* a loading placeholder — no node is added, no component is */
161
+ /* mounted. Put `.origam--skeleton` on the element; its */
162
+ /* geometry (size, radius) stays whatever the element already */
163
+ /* has, so the placeholder keeps the real silhouette. */
164
+ /* */
165
+ /* fill ::after colour = --origam-skeleton---background-color */
166
+ /* shimmer ::before only with `.origam--skeleton-wave` */
167
+ /* content hidden: glyphs via text-fill, children via */
168
+ /* visibility — the layout box is untouched */
169
+ /* */
170
+ /* ⛔ CONSTRAINTS, read before using it on a new host: */
171
+ /* - a pseudo-element is not rendered on replaced elements: */
172
+ /* `<input>`, `<textarea>`, `<select>`, images: can NOT be */
173
+ /* a host (measured: the ::after never paints on <input>, */
174
+ /* <textarea> or <select>, although getComputedStyle still */
175
+ /* reports it). */
176
+ /* Put the class on the wrapper that draws the field. */
177
+ /* - the host's own ::before / ::after are taken over. */
178
+ /* - the host becomes `position: relative` when it is static */
179
+ /* (a component's own scoped `position` still wins). */
180
+ /* - it is purely visual: the host still has to carry */
181
+ /* `aria-busy="true"` (and `aria-disabled` on a control). */
182
+ /* */
183
+ /* The fill is currentColor mixed with transparent, so it */
184
+ /* follows themes, modes and surfaces with no extra token. */
185
+ /* Motion: pulse by default, capped by */
186
+ /* --origam-skeleton---animation-iterations (WCAG 2.2.2), */
187
+ /* and switched off under prefers-reduced-motion. */
188
+ .origam--skeleton {
189
+ position: relative;
190
+ -webkit-text-fill-color: transparent;
191
+ text-shadow: none;
192
+ pointer-events: none;
193
+ user-select: none;
194
+ }
195
+ .origam--skeleton > * { visibility: hidden; }
196
+ .origam--skeleton::after {
197
+ content: "";
198
+ position: absolute;
199
+ inset: 0;
200
+ border-radius: inherit;
201
+ background-color: var(--origam-skeleton---background-color);
202
+ animation: origam-skeleton-pulse var(--origam-skeleton---animation-duration) ease-in-out var(--origam-skeleton---animation-iterations);
203
+ }
204
+ .origam--skeleton-none::after { animation: none; }
205
+ .origam--skeleton-wave { overflow: hidden; }
206
+ .origam--skeleton-wave::after { animation: none; }
207
+ .origam--skeleton-wave::before {
208
+ content: "";
209
+ position: absolute;
210
+ inset: 0;
211
+ z-index: 1;
212
+ background: linear-gradient(105deg, transparent 35%, var(--origam-skeleton---highlight-color) 50%, transparent 65%);
213
+ transform: translateX(-100%);
214
+ animation: origam-skeleton-wave var(--origam-skeleton---animation-duration) ease-in-out var(--origam-skeleton---animation-iterations);
215
+ }
216
+
217
+ /* A group is ONE animation clock: the container pulses, its */
218
+ /* blocks do not, so blocks mounted at different moments still */
219
+ /* breathe together. */
220
+ .origam--skeleton-group-pulse {
221
+ animation: origam-skeleton-pulse var(--origam-skeleton---animation-duration) ease-in-out var(--origam-skeleton---animation-iterations);
222
+ }
223
+ .origam--skeleton-group-pulse .origam--skeleton::after { animation: none; }
224
+
225
+ @keyframes origam-skeleton-pulse {
226
+ 0%, 100% { opacity: var(--origam-skeleton---opacity-max); }
227
+ 50% { opacity: var(--origam-skeleton---opacity-min); }
228
+ }
229
+ @keyframes origam-skeleton-wave {
230
+ to { transform: translateX(100%); }
231
+ }
232
+
233
+ /* Last on purpose: same specificity as the rules above, so */
234
+ /* source order makes this one win (#1074). */
235
+ @media (prefers-reduced-motion: reduce) {
236
+ .origam--skeleton::after,
237
+ .origam--skeleton::before,
238
+ .origam--skeleton-group-pulse { animation: none; }
239
+ }
@@ -139,6 +139,7 @@
139
139
  --origam-motion__duration---medium: 200ms;
140
140
  --origam-motion__duration---slow: 280ms;
141
141
  --origam-motion__duration---xslow: 400ms;
142
+ --origam-motion__duration---loop: 1600ms;
142
143
  --origam-motion__easing---standard: cubic-bezier(0.4, 0, 0.2, 1);
143
144
  --origam-motion__easing---decelerate: cubic-bezier(0, 0, 0.2, 1);
144
145
  --origam-motion__easing---accelerate: cubic-bezier(0.4, 0, 1, 1);
@@ -5,7 +5,7 @@
5
5
  v-contrast
6
6
  :aria-current="isActive ? 'page' : undefined"
7
7
  :class="breadcrumbItemClasses"
8
- :href="link.href"
8
+ :href="link.href.value"
9
9
  :style="breadcrumbItemStyles"
10
10
  @click="link.navigate"
11
11
  @mouseenter="handleMouseenter"