@openreachtech/furo-vue 1.3.2 → 1.5.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 (124) hide show
  1. package/lib/assets/css/furo/0010.variables-palette-color-scale.css +277 -275
  2. package/lib/assets/css/furo/0020.variables-z-index.css +11 -9
  3. package/lib/assets/css/furo/0030.variables-semantic-color.css +166 -164
  4. package/lib/assets/css/furo/0035.variables-semantic-dimension.css +103 -95
  5. package/lib/assets/css/furo/0040.variables-component-furo.css +26 -24
  6. package/lib/components/atoms/FuroButton/FuroButton.vue +9 -2
  7. package/lib/components/atoms/FuroButton/FuroButtonContext.js +1 -1
  8. package/lib/components/atoms/FuroCheckbox/FuroCheckboxContext.js +3 -3
  9. package/lib/components/atoms/FuroFileField/FuroFileFieldContext.js +1 -1
  10. package/lib/components/atoms/FuroRadio/FuroRadio.vue +1 -1
  11. package/lib/components/atoms/FuroRadio/FuroRadioContext.js +2 -2
  12. package/lib/components/atoms/FuroSwitch/FuroSwitch.vue +1 -1
  13. package/lib/components/atoms/FuroSwitch/FuroSwitchContext.js +2 -2
  14. package/lib/components/atoms/FuroTextarea/FuroTextareaContext.js +3 -3
  15. package/lib/components/atoms/FuroToggle/FuroToggle.vue +1 -1
  16. package/lib/components/atoms/FuroToggle/FuroToggleContext.js +2 -2
  17. package/lib/components/molecules/FuroAccordion/FuroAccordion.vue +1 -1
  18. package/lib/components/molecules/FuroAccordion/FuroAccordionContext.js +2 -2
  19. package/lib/components/molecules/FuroAttachment/FuroAttachmentContext.js +2 -2
  20. package/lib/components/molecules/FuroAutocompleteField/FuroAutocompleteField.vue +9 -0
  21. package/lib/components/molecules/FuroAutocompleteField/FuroAutocompleteFieldContext.js +34 -7
  22. package/lib/components/molecules/FuroBreadcrumb/FuroBreadcrumb.vue +1 -1
  23. package/lib/components/molecules/FuroCollapsible/FuroCollapsible.vue +1 -1
  24. package/lib/components/molecules/FuroCollapsible/FuroCollapsibleContext.js +2 -2
  25. package/lib/components/molecules/FuroDatePicker/FuroDatePicker.vue +6 -6
  26. package/lib/components/molecules/FuroDatePicker/FuroDatePickerContext.js +3 -3
  27. package/lib/components/molecules/FuroDateTimePicker/FuroDateTimePickerContext.js +3 -3
  28. package/lib/components/molecules/FuroDropdownMenu/FuroDropdownMenu.vue +2 -2
  29. package/lib/components/molecules/FuroDropdownMenu/FuroDropdownMenuContext.js +3 -3
  30. package/lib/components/molecules/FuroEditableField/FuroEditableField.vue +2 -0
  31. package/lib/components/molecules/FuroEditableField/FuroEditableFieldContext.js +2 -2
  32. package/lib/components/molecules/FuroPagination/FuroPagination.vue +2 -2
  33. package/lib/components/molecules/FuroPagination/FuroPaginationContext.js +2 -2
  34. package/lib/components/molecules/FuroPopover/FuroPopover.vue +3 -2
  35. package/lib/components/molecules/FuroPopover/FuroPopoverContext.js +1 -1
  36. package/lib/components/molecules/FuroSelect/FuroSelect.vue +145 -142
  37. package/lib/components/molecules/FuroSelect/FuroSelectContext.js +12 -3
  38. package/lib/components/molecules/FuroSkeleton/FuroSkeleton.vue +17 -7
  39. package/lib/components/molecules/FuroSkeleton/FuroSkeletonContext.js +2 -2
  40. package/lib/components/molecules/FuroSplitter/FuroSplitter.vue +1 -1
  41. package/lib/components/molecules/FuroSplitter/FuroSplitterContext.js +2 -2
  42. package/lib/components/molecules/FuroTimeField/FuroTimeField.vue +1 -1
  43. package/lib/components/molecules/FuroTimeField/FuroTimeFieldContext.js +3 -3
  44. package/lib/components/molecules/FuroToggleGroup/FuroToggleGroup.vue +2 -2
  45. package/lib/components/molecules/FuroToggleGroup/FuroToggleGroupContext.js +5 -3
  46. package/lib/components/molecules/FuroTooltip/FuroTooltip.vue +1 -1
  47. package/lib/components/molecules/FuroTooltip/FuroTooltipContext.js +1 -1
  48. package/lib/components/organisms/FuroAlertDialog/FuroAlertDialog.vue +2 -1
  49. package/lib/components/organisms/FuroAlertDialog/FuroAlertDialogContext.js +17 -4
  50. package/lib/components/organisms/FuroDialog/FuroDialog.vue +5 -4
  51. package/lib/components/organisms/FuroDialog/FuroDialogContext.js +15 -2
  52. package/lib/components/organisms/FuroDrawer/FuroDrawer.vue +4 -4
  53. package/lib/components/organisms/FuroDrawer/FuroDrawerContext.js +4 -4
  54. package/lib/components/organisms/FuroEditor/FuroEditor.vue +1 -1
  55. package/lib/components/organisms/FuroSidebar/FuroSidebar.vue +5 -2
  56. package/lib/components/organisms/FuroStepper/FuroStepper.vue +1 -1
  57. package/lib/components/organisms/FuroStepper/FuroStepperContext.js +2 -2
  58. package/lib/components/organisms/FuroTable/FuroTable.vue +6 -5
  59. package/lib/components/organisms/FuroTable/FuroTableContext.js +6 -6
  60. package/lib/components/organisms/FuroTabs/FuroTabs.vue +3 -3
  61. package/lib/components/organisms/FuroTabs/FuroTabsContext.js +2 -2
  62. package/lib/components/organisms/FuroToast/FuroToast.vue +4 -4
  63. package/lib/components/organisms/FuroToast/FuroToastContext.js +14 -2
  64. package/lib/components/organisms/FuroToast/ToastQueue.js +0 -1
  65. package/package.json +23 -22
  66. package/public/furo-vue/components.json +13 -6
  67. package/types/generated/components/atoms/FuroAvatar/FuroAvatar.vue.d.ts +81 -0
  68. package/types/generated/components/atoms/FuroBadge/FuroBadge.vue.d.ts +46 -0
  69. package/types/generated/components/atoms/FuroButton/FuroButton.vue.d.ts +54 -0
  70. package/types/generated/components/atoms/FuroCheckbox/FuroCheckbox.vue.d.ts +83 -1
  71. package/types/generated/components/atoms/FuroEmailField/FuroEmailField.vue.d.ts +3 -0
  72. package/types/generated/components/atoms/FuroFileField/FuroFileField.vue.d.ts +3 -0
  73. package/types/generated/components/atoms/FuroIcon/FuroIcon.vue.d.ts +3 -0
  74. package/types/generated/components/atoms/FuroNumberField/FuroNumberField.vue.d.ts +32 -5
  75. package/types/generated/components/atoms/FuroPasswordField/FuroPasswordField.vue.d.ts +3 -0
  76. package/types/generated/components/atoms/FuroRadio/FuroRadio.vue.d.ts +106 -0
  77. package/types/generated/components/atoms/FuroSwitch/FuroSwitch.vue.d.ts +74 -1
  78. package/types/generated/components/atoms/FuroTextField/FuroTextField.vue.d.ts +3 -0
  79. package/types/generated/components/atoms/FuroTextarea/FuroTextarea.vue.d.ts +3 -0
  80. package/types/generated/components/atoms/FuroToggle/FuroToggle.vue.d.ts +26 -0
  81. package/types/generated/components/molecules/FuroAccordion/FuroAccordion.vue.d.ts +150 -1
  82. package/types/generated/components/molecules/FuroAttachment/FuroAttachment.vue.d.ts +53 -0
  83. package/types/generated/components/molecules/FuroAutocompleteField/FuroAutocompleteField.vue.d.ts +463 -4
  84. package/types/generated/components/molecules/FuroAutocompleteField/FuroAutocompleteFieldContext.d.ts +18 -0
  85. package/types/generated/components/molecules/FuroAvatarGroup/FuroAvatarGroup.vue.d.ts +25 -0
  86. package/types/generated/components/molecules/FuroBreadcrumb/FuroBreadcrumb.vue.d.ts +55 -0
  87. package/types/generated/components/molecules/FuroCollapsible/FuroCollapsible.vue.d.ts +107 -0
  88. package/types/generated/components/molecules/FuroControlBlock/FuroControlBlock.vue.d.ts +7 -0
  89. package/types/generated/components/molecules/FuroDatePicker/FuroDatePicker.vue.d.ts +39 -0
  90. package/types/generated/components/molecules/FuroDateTimePicker/FuroDateTimePicker.vue.d.ts +9 -0
  91. package/types/generated/components/molecules/FuroDropdownMenu/FuroDropdownMenu.vue.d.ts +144 -1
  92. package/types/generated/components/molecules/FuroDropdownMenu/FuroDropdownMenuOptionRows.vue.d.ts +274 -1
  93. package/types/generated/components/molecules/FuroEditableField/FuroEditableField.vue.d.ts +139 -0
  94. package/types/generated/components/molecules/FuroEmptyState/FuroEmptyState.vue.d.ts +10 -0
  95. package/types/generated/components/molecules/FuroErrorState/FuroErrorState.vue.d.ts +10 -0
  96. package/types/generated/components/molecules/FuroPagination/FuroPagination.vue.d.ts +144 -0
  97. package/types/generated/components/molecules/FuroPopover/FuroPopover.vue.d.ts +20 -0
  98. package/types/generated/components/molecules/FuroScrollArea/FuroScrollArea.vue.d.ts +120 -0
  99. package/types/generated/components/molecules/FuroSearchField/FuroSearchField.vue.d.ts +31 -0
  100. package/types/generated/components/molecules/FuroSectionHeader/FuroSectionHeader.vue.d.ts +32 -0
  101. package/types/generated/components/molecules/FuroSelect/FuroSelect.vue.d.ts +456 -4
  102. package/types/generated/components/molecules/FuroSelect/FuroSelectContext.d.ts +6 -0
  103. package/types/generated/components/molecules/FuroSeparator/FuroSeparator.vue.d.ts +7 -0
  104. package/types/generated/components/molecules/FuroSkeleton/FuroSkeleton.vue.d.ts +3 -0
  105. package/types/generated/components/molecules/FuroSkeleton/FuroSkeletonContext.d.ts +2 -2
  106. package/types/generated/components/molecules/FuroSplitter/FuroSplitter.vue.d.ts +154 -0
  107. package/types/generated/components/molecules/FuroTimeField/FuroTimeField.vue.d.ts +76 -0
  108. package/types/generated/components/molecules/FuroToggleGroup/FuroToggleGroup.vue.d.ts +80 -0
  109. package/types/generated/components/molecules/FuroToolBar/FuroToolBar.vue.d.ts +16 -0
  110. package/types/generated/components/molecules/FuroTooltip/FuroTooltip.vue.d.ts +24 -0
  111. package/types/generated/components/organisms/FuroAlertDialog/FuroAlertDialog.vue.d.ts +227 -0
  112. package/types/generated/components/organisms/FuroAlertDialog/FuroAlertDialogContext.d.ts +6 -0
  113. package/types/generated/components/organisms/FuroDialog/FuroDialog.vue.d.ts +215 -0
  114. package/types/generated/components/organisms/FuroDialog/FuroDialogContext.d.ts +6 -0
  115. package/types/generated/components/organisms/FuroDrawer/FuroDrawer.vue.d.ts +264 -5
  116. package/types/generated/components/organisms/FuroEditor/FuroEditor.vue.d.ts +84 -1
  117. package/types/generated/components/organisms/FuroEditor/FuroEditorMentionMenu.vue.d.ts +3 -0
  118. package/types/generated/components/organisms/FuroSidebar/FuroSidebar.vue.d.ts +71 -0
  119. package/types/generated/components/organisms/FuroStepper/FuroStepper.vue.d.ts +207 -0
  120. package/types/generated/components/organisms/FuroTable/FuroTable.vue.d.ts +82 -1
  121. package/types/generated/components/organisms/FuroTabs/FuroTabs.vue.d.ts +132 -1
  122. package/types/generated/components/organisms/FuroToast/FuroToast.vue.d.ts +349 -0
  123. package/types/generated/components/organisms/FuroToast/FuroToastContext.d.ts +6 -0
  124. package/types/generated/components/organisms/FuroToast/FuroToaster.vue.d.ts +7 -0
@@ -19,6 +19,7 @@ export default defineComponent({
19
19
  SelectTrigger: RekaSelect['Trigger'],
20
20
  SelectValue: RekaSelect['Value'],
21
21
  SelectIcon: RekaSelect['Icon'],
22
+ SelectPortal: RekaSelect['Portal'],
22
23
  SelectContent: RekaSelect['Content'],
23
24
  SelectViewport: RekaSelect['Viewport'],
24
25
  SelectScrollUpButton: RekaSelect['ScrollUpButton'],
@@ -150,163 +151,165 @@ export default defineComponent({
150
151
  </slot>
151
152
  </SelectTrigger>
152
153
 
153
- <SelectContent
154
- class="unit-select-content"
155
- :side-offset="4"
156
- v-bind="context.extractContentAttributes()"
157
- >
158
- <slot name="content-before" />
159
-
160
- <SelectScrollUpButton class="scroll-up-button">
161
- <slot name="scroll-up-button">
162
- <FuroIcon name="ph:caret-up" />
163
- </slot>
164
- </SelectScrollUpButton>
165
-
166
- <SelectViewport class="viewport">
167
- <template
168
- v-for="(option, index) in context.parcel?.options"
169
- :key="index"
170
- >
171
- <template v-if="context.shouldShowGroupOption({ option })">
172
- <SelectGroup
173
- class="group"
174
- :disabled="option.disabled"
175
- >
176
- <slot
177
- name="group"
178
- :group="option"
179
- :group-index="index"
180
- >
181
- <SelectLabel class="label">
182
- <slot
183
- name="group-label"
184
- :group="option"
185
- :group-index="index"
186
- >
187
- {{ context.resolveOptionLabel({ option }) }}
188
- </slot>
189
- </SelectLabel>
154
+ <SelectPortal v-bind="context.extractPortalAttributes()">
155
+ <SelectContent
156
+ class="unit-select-content"
157
+ :side-offset="4"
158
+ v-bind="context.extractContentAttributes()"
159
+ >
160
+ <slot name="content-before" />
161
+
162
+ <SelectScrollUpButton class="scroll-up-button">
163
+ <slot name="scroll-up-button">
164
+ <FuroIcon name="ph:caret-up" />
165
+ </slot>
166
+ </SelectScrollUpButton>
190
167
 
191
- <template
192
- v-for="(groupChildOption, groupChildIndex) in context.extractGroupOptions({ option })"
193
- :key="groupChildIndex"
168
+ <SelectViewport class="viewport">
169
+ <template
170
+ v-for="(option, index) in context.parcel?.options"
171
+ :key="index"
172
+ >
173
+ <template v-if="context.shouldShowGroupOption({ option })">
174
+ <SelectGroup
175
+ class="group"
176
+ :disabled="option.disabled"
177
+ >
178
+ <slot
179
+ name="group"
180
+ :group="option"
181
+ :group-index="index"
194
182
  >
195
- <SelectOption
196
- class="option"
197
- :value="context.resolveOptionValue({ option: groupChildOption })"
198
- :disabled="groupChildOption.disabled || option.disabled"
199
- >
183
+ <SelectLabel class="label">
200
184
  <slot
201
- name="option"
185
+ name="group-label"
202
186
  :group="option"
203
187
  :group-index="index"
204
- :option="groupChildOption"
205
- :option-index="groupChildIndex"
206
188
  >
207
- <SelectOptionText>
208
- <slot
209
- name="option-text"
210
- :option="groupChildOption"
211
- :option-index="groupChildIndex"
212
- >
213
- {{ context.resolveOptionLabel({ option: groupChildOption }) }}
214
- </slot>
215
- </SelectOptionText>
216
-
217
- <SelectOptionIndicator class="select-indicator">
218
- <slot
219
- name="option-indicator"
220
- :option="groupChildOption"
221
- :option-index="groupChildIndex"
222
- >
223
- <FuroIcon name="ph:check" />
224
- </slot>
225
- </SelectOptionIndicator>
189
+ {{ context.resolveOptionLabel({ option }) }}
226
190
  </slot>
227
- </SelectOption>
191
+ </SelectLabel>
228
192
 
229
- <slot
230
- v-if="groupChildOption.separator"
231
- name="separator"
232
- :option="groupChildOption"
233
- :option-index="groupChildIndex"
193
+ <template
194
+ v-for="(groupChildOption, groupChildIndex) in context.extractGroupOptions({ option })"
195
+ :key="groupChildIndex"
234
196
  >
235
- <SelectSeparator class="separator" />
236
- </slot>
237
- </template>
238
- </slot>
239
- </SelectGroup>
240
- </template>
197
+ <SelectOption
198
+ class="option"
199
+ :value="context.resolveOptionValue({ option: groupChildOption })"
200
+ :disabled="groupChildOption.disabled || option.disabled"
201
+ >
202
+ <slot
203
+ name="option"
204
+ :group="option"
205
+ :group-index="index"
206
+ :option="groupChildOption"
207
+ :option-index="groupChildIndex"
208
+ >
209
+ <SelectOptionText>
210
+ <slot
211
+ name="option-text"
212
+ :option="groupChildOption"
213
+ :option-index="groupChildIndex"
214
+ >
215
+ {{ context.resolveOptionLabel({ option: groupChildOption }) }}
216
+ </slot>
217
+ </SelectOptionText>
218
+
219
+ <SelectOptionIndicator class="select-indicator">
220
+ <slot
221
+ name="option-indicator"
222
+ :option="groupChildOption"
223
+ :option-index="groupChildIndex"
224
+ >
225
+ <FuroIcon name="ph:check" />
226
+ </slot>
227
+ </SelectOptionIndicator>
228
+ </slot>
229
+ </SelectOption>
241
230
 
242
- <template v-else>
243
- <SelectOption
244
- :value="context.resolveOptionValue({ option })"
245
- class="option"
246
- :disabled="option.disabled"
247
- >
248
- <slot
249
- name="option"
250
- :option="option"
251
- :option-index="index"
231
+ <slot
232
+ v-if="groupChildOption.separator"
233
+ name="separator"
234
+ :option="groupChildOption"
235
+ :option-index="groupChildIndex"
236
+ >
237
+ <SelectSeparator class="separator" />
238
+ </slot>
239
+ </template>
240
+ </slot>
241
+ </SelectGroup>
242
+ </template>
243
+
244
+ <template v-else>
245
+ <SelectOption
246
+ :value="context.resolveOptionValue({ option })"
247
+ class="option"
248
+ :disabled="option.disabled"
252
249
  >
253
- <SelectOptionText>
254
- <slot
255
- name="option-text"
256
- :option="option"
257
- :option-index="index"
258
- >
259
- {{ context.resolveOptionLabel({ option }) }}
260
- </slot>
261
- </SelectOptionText>
262
-
263
- <SelectOptionIndicator class="select-indicator">
264
- <slot
265
- name="option-indicator"
266
- :option="option"
267
- :option-index="index"
268
- >
269
- <FuroIcon
270
- name="ph:check"
271
- />
272
- </slot>
273
- </SelectOptionIndicator>
274
- </slot>
275
- </SelectOption>
250
+ <slot
251
+ name="option"
252
+ :option="option"
253
+ :option-index="index"
254
+ >
255
+ <SelectOptionText>
256
+ <slot
257
+ name="option-text"
258
+ :option="option"
259
+ :option-index="index"
260
+ >
261
+ {{ context.resolveOptionLabel({ option }) }}
262
+ </slot>
263
+ </SelectOptionText>
264
+
265
+ <SelectOptionIndicator class="select-indicator">
266
+ <slot
267
+ name="option-indicator"
268
+ :option="option"
269
+ :option-index="index"
270
+ >
271
+ <FuroIcon
272
+ name="ph:check"
273
+ />
274
+ </slot>
275
+ </SelectOptionIndicator>
276
+ </slot>
277
+ </SelectOption>
278
+ </template>
279
+
280
+ <slot
281
+ v-if="option.separator"
282
+ name="separator"
283
+ :option="option"
284
+ :option-index="index"
285
+ >
286
+ <SelectSeparator class="separator" />
287
+ </slot>
276
288
  </template>
277
289
 
278
- <slot
279
- v-if="option.separator"
280
- name="separator"
281
- :option="option"
282
- :option-index="index"
290
+ <SelectOption
291
+ v-if="context.hasEmptyOptions()"
292
+ :value="null"
293
+ class="option"
294
+ @select.stop.prevent
283
295
  >
284
- <SelectSeparator class="separator" />
296
+ <SelectOptionText class="empty-text">
297
+ <slot name="empty">
298
+ No options
299
+ </slot>
300
+ </SelectOptionText>
301
+ </SelectOption>
302
+ </SelectViewport>
303
+
304
+ <SelectScrollDownButton class="scroll-down-button">
305
+ <slot name="scroll-down-button">
306
+ <FuroIcon name="ph:caret-down" />
285
307
  </slot>
286
- </template>
308
+ </SelectScrollDownButton>
287
309
 
288
- <SelectOption
289
- v-if="context.hasEmptyOptions()"
290
- :value="null"
291
- class="option"
292
- @select.stop.prevent
293
- >
294
- <SelectOptionText class="empty-text">
295
- <slot name="empty">
296
- No options
297
- </slot>
298
- </SelectOptionText>
299
- </SelectOption>
300
- </SelectViewport>
301
-
302
- <SelectScrollDownButton class="scroll-down-button">
303
- <slot name="scroll-down-button">
304
- <FuroIcon name="ph:caret-down" />
305
- </slot>
306
- </SelectScrollDownButton>
307
-
308
- <slot name="content-after" />
309
- </SelectContent>
310
+ <slot name="content-after" />
311
+ </SelectContent>
312
+ </SelectPortal>
310
313
  </SelectRoot>
311
314
  </div>
312
315
  </template>
@@ -426,7 +429,7 @@ export default defineComponent({
426
429
  padding-block: 0.25rem;
427
430
  padding-inline: 0.375rem;
428
431
 
429
- min-height: calc(var(--size-input-height) - 0.5rem);
432
+ min-height: var(--size-option-height);
430
433
 
431
434
  font: var(--font-body-medium);
432
435
  user-select: none;
@@ -97,9 +97,9 @@ export default class FuroSelectContext extends BaseFuroContext {
97
97
  */
98
98
  static get EMIT_EVENT_HASH () {
99
99
  return {
100
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
101
- [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => {},
102
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
100
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
101
+ [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => true,
102
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
103
103
  }
104
104
  }
105
105
 
@@ -369,6 +369,15 @@ export default class FuroSelectContext extends BaseFuroContext {
369
369
  return this.triggerParcel
370
370
  }
371
371
 
372
+ /**
373
+ * Extract portal attributes.
374
+ *
375
+ * @returns {Props['portalParcel']}
376
+ */
377
+ extractPortalAttributes () {
378
+ return this.portalParcel
379
+ }
380
+
372
381
  /**
373
382
  * Extract content attributes.
374
383
  *
@@ -78,22 +78,32 @@ export default defineComponent({
78
78
  }
79
79
 
80
80
  .unit-skeleton.animated {
81
- animation: furo-skeleton-pulse 1.5s ease-in-out infinite;
81
+ background-image: linear-gradient(
82
+ 90deg,
83
+ transparent 0%,
84
+ var(--color-background) 50%,
85
+ transparent 100%
86
+ );
87
+ background-repeat: no-repeat;
88
+ background-size: 200% 100%;
89
+
90
+ animation: furo-skeleton-shimmer 1.8s ease-in-out infinite;
82
91
  }
83
92
 
84
- @keyframes furo-skeleton-pulse {
85
- 0%,
86
- 100% {
87
- opacity: 1;
93
+ @keyframes furo-skeleton-shimmer {
94
+ from {
95
+ background-position: 200% 0;
88
96
  }
89
97
 
90
- 50% {
91
- opacity: 0.4;
98
+ to {
99
+ background-position: -200% 0;
92
100
  }
93
101
  }
94
102
 
95
103
  @media (prefers-reduced-motion: reduce) {
96
104
  .unit-skeleton.animated {
105
+ background-image: none;
106
+
97
107
  animation: none;
98
108
  }
99
109
  }
@@ -5,7 +5,7 @@ import BaseFuroContext from '../../../contexts/BaseFuroContext.js'
5
5
  *
6
6
  * Presentational loading placeholder shown while real content is fetching.
7
7
  * Carries no value and emits nothing — shape comes from the variant, size from
8
- * optional width / height, and a pulse animation signals the loading state.
8
+ * optional width / height, and a shimmer animation signals the loading state.
9
9
  *
10
10
  * @extends {BaseFuroContext<null, Props, null>}
11
11
  */
@@ -59,7 +59,7 @@ export default class FuroSkeletonContext extends BaseFuroContext {
59
59
  }
60
60
 
61
61
  /**
62
- * Whether the pulse animation runs. Reduced-motion users still get a static
62
+ * Whether the shimmer animation runs. Reduced-motion users still get a static
63
63
  * placeholder via the CSS media query.
64
64
  *
65
65
  * @returns {boolean} true when animated; defaults to true.
@@ -206,7 +206,7 @@ export default defineComponent({
206
206
 
207
207
  /* Keyboard focus ring (arrow keys resize the focused handle). */
208
208
  .unit-splitter-handle:focus-visible {
209
- box-shadow: 0 0 0 0.125rem var(--color-ring);
209
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
210
210
  }
211
211
 
212
212
  .unit-splitter-handle[data-disabled] {
@@ -120,8 +120,8 @@ export default class FuroSplitterContext extends BaseFuroContext {
120
120
  */
121
121
  static get EMIT_EVENT_HASH () {
122
122
  return {
123
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
124
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: layout => {},
123
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
124
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: layout => true,
125
125
  }
126
126
  }
127
127
 
@@ -245,7 +245,7 @@ export default defineComponent({
245
245
 
246
246
  .unit-form-control.time-field > .field > .field-input:focus-visible {
247
247
  outline: none;
248
- box-shadow: 0 0 0 0.125rem var(--color-ring);
248
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
249
249
  }
250
250
  }
251
251
  </style>
@@ -132,9 +132,9 @@ export default class FuroTimeFieldContext extends BaseFuroContext {
132
132
  */
133
133
  static get EMIT_EVENT_HASH () {
134
134
  return {
135
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
136
- [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => {},
137
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
135
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
136
+ [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => true,
137
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
138
138
  }
139
139
  }
140
140
 
@@ -141,7 +141,7 @@ export default defineComponent({
141
141
 
142
142
  .unit-toggle-group-item:focus-visible {
143
143
  outline: none;
144
- box-shadow: 0 0 0 0.125rem var(--color-ring);
144
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
145
145
  }
146
146
 
147
147
  .unit-toggle-group-item.disabled {
@@ -180,7 +180,7 @@ export default defineComponent({
180
180
  .unit-toggle-group-item.outline[data-state="on"]:focus-visible {
181
181
  box-shadow:
182
182
  inset 0 0 0 0.0625rem var(--color-border),
183
- 0 0 0 0.125rem var(--color-ring);
183
+ 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
184
184
  }
185
185
 
186
186
  .unit-toggle-group-item.default[data-state="on"]:hover,
@@ -106,8 +106,8 @@ export default class FuroToggleGroupContext extends BaseFuroContext {
106
106
  */
107
107
  static get EMIT_EVENT_HASH () {
108
108
  return {
109
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
110
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
109
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
110
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
111
111
  }
112
112
  }
113
113
 
@@ -437,7 +437,9 @@ export default class FuroToggleGroupContext extends BaseFuroContext {
437
437
  const value = rawValue
438
438
  ?? this.resolveDefaultValue()
439
439
 
440
- this.internalValueRef.value = value
440
+ if (!this.isControlled()) {
441
+ this.internalValueRef.value = value
442
+ }
441
443
 
442
444
  const customEvent = this.buildCustomEvent({
443
445
  name: this.EMIT_EVENT_NAME.CHANGE_VALUE,
@@ -116,7 +116,7 @@ export default defineComponent({
116
116
 
117
117
  .unit-tooltip-trigger:focus-visible {
118
118
  outline: none;
119
- box-shadow: 0 0 0 0.125rem var(--color-ring);
119
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
120
120
  }
121
121
 
122
122
  .unit-tooltip-content {
@@ -93,7 +93,7 @@ export default class FuroTooltipContext extends BaseFuroContext {
93
93
  */
94
94
  static get EMIT_EVENT_HASH () {
95
95
  return {
96
- [this.EMIT_EVENT_NAME.OPEN_CHANGE]: payload => {},
96
+ [this.EMIT_EVENT_NAME.OPEN_CHANGE]: payload => true,
97
97
  }
98
98
  }
99
99
 
@@ -87,6 +87,7 @@ export default defineComponent({
87
87
  <AlertDialogOverlay class="unit-alert-dialog-overlay" />
88
88
 
89
89
  <AlertDialogContent
90
+ v-bind="context.extractContentAttributes()"
90
91
  :class="context.extractContentClassNames()"
91
92
  @interact-outside="context.onInteractOutside({
92
93
  rawEvent: $event,
@@ -229,7 +230,7 @@ export default defineComponent({
229
230
 
230
231
  .unit-alert-dialog-content:focus-visible {
231
232
  outline: none;
232
- box-shadow: 0 0 0 0.125rem var(--color-ring);
233
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
233
234
  }
234
235
 
235
236
  .unit-alert-dialog-content > .header {
@@ -120,10 +120,10 @@ export default class FuroAlertDialogContext extends BaseFuroContext {
120
120
  */
121
121
  static get EMIT_EVENT_HASH () {
122
122
  return {
123
- [this.EMIT_EVENT_NAME.CONFIRM]: () => {},
124
- [this.EMIT_EVENT_NAME.CANCEL]: () => {},
125
- [this.EMIT_EVENT_NAME.OPEN_CHANGE]: payload => {},
126
- [this.EMIT_EVENT_NAME.UPDATE_OPEN]: payload => {},
123
+ [this.EMIT_EVENT_NAME.CONFIRM]: () => true,
124
+ [this.EMIT_EVENT_NAME.CANCEL]: () => true,
125
+ [this.EMIT_EVENT_NAME.OPEN_CHANGE]: payload => true,
126
+ [this.EMIT_EVENT_NAME.UPDATE_OPEN]: payload => true,
127
127
  }
128
128
  }
129
129
 
@@ -268,6 +268,19 @@ export default class FuroAlertDialogContext extends BaseFuroContext {
268
268
  ])
269
269
  }
270
270
 
271
+ /**
272
+ * Extract attributes forwarded to the content element.
273
+ *
274
+ * @returns {Record<string, undefined>} `aria-describedby` cleared when no description renders.
275
+ */
276
+ extractContentAttributes () {
277
+ return this.hasDescription()
278
+ ? {}
279
+ : {
280
+ 'aria-describedby': undefined,
281
+ }
282
+ }
283
+
271
284
  /**
272
285
  * CSS selector (scoped to dialog content) for the element to focus on open.
273
286
  *
@@ -86,6 +86,7 @@ export default defineComponent({
86
86
  />
87
87
 
88
88
  <DialogContent
89
+ v-bind="context.extractContentAttributes()"
89
90
  :class="context.extractContentClassNames()"
90
91
  @interact-outside="context.onInteractOutside({
91
92
  rawEvent: $event,
@@ -225,7 +226,7 @@ export default defineComponent({
225
226
 
226
227
  .unit-dialog-content:focus-visible {
227
228
  outline: none;
228
- box-shadow: 0 0 0 0.125rem var(--color-ring);
229
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
229
230
  }
230
231
 
231
232
  .unit-dialog-content > .header {
@@ -277,8 +278,8 @@ export default defineComponent({
277
278
  align-items: center;
278
279
  justify-content: center;
279
280
 
280
- width: 1.75rem;
281
- height: 1.75rem;
281
+ width: var(--size-close-button-medium);
282
+ height: var(--size-close-button-medium);
282
283
 
283
284
  border: none;
284
285
  border-radius: var(--size-border-radius-small);
@@ -301,7 +302,7 @@ export default defineComponent({
301
302
 
302
303
  .unit-dialog-content > .built-in-close:focus-visible {
303
304
  outline: none;
304
- box-shadow: 0 0 0 0.125rem var(--color-ring);
305
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
305
306
  }
306
307
 
307
308
  .unit-dialog-content > .built-in-close:disabled {
@@ -112,8 +112,8 @@ export default class FuroDialogContext extends BaseFuroContext {
112
112
  */
113
113
  static get EMIT_EVENT_HASH () {
114
114
  return {
115
- [this.EMIT_EVENT_NAME.OPEN_CHANGE]: payload => {},
116
- [this.EMIT_EVENT_NAME.UPDATE_OPEN]: payload => {},
115
+ [this.EMIT_EVENT_NAME.OPEN_CHANGE]: payload => true,
116
+ [this.EMIT_EVENT_NAME.UPDATE_OPEN]: payload => true,
117
117
  }
118
118
  }
119
119
 
@@ -267,6 +267,19 @@ export default class FuroDialogContext extends BaseFuroContext {
267
267
  ])
268
268
  }
269
269
 
270
+ /**
271
+ * Extract attributes forwarded to the content element.
272
+ *
273
+ * @returns {Record<string, undefined>} `aria-describedby` cleared when no description renders.
274
+ */
275
+ extractContentAttributes () {
276
+ return this.hasDescription()
277
+ ? {}
278
+ : {
279
+ 'aria-describedby': undefined,
280
+ }
281
+ }
282
+
270
283
  /**
271
284
  * CSS selector (scoped to dialog content) for the element to focus on open.
272
285
  *