@openreachtech/furo-vue 1.3.2 → 1.4.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 (65) hide show
  1. package/lib/assets/css/furo/0035.variables-semantic-dimension.css +4 -1
  2. package/lib/components/atoms/FuroButton/FuroButton.vue +9 -2
  3. package/lib/components/atoms/FuroButton/FuroButtonContext.js +1 -1
  4. package/lib/components/atoms/FuroCheckbox/FuroCheckboxContext.js +3 -3
  5. package/lib/components/atoms/FuroFileField/FuroFileFieldContext.js +1 -1
  6. package/lib/components/atoms/FuroRadio/FuroRadio.vue +1 -1
  7. package/lib/components/atoms/FuroRadio/FuroRadioContext.js +2 -2
  8. package/lib/components/atoms/FuroSwitch/FuroSwitch.vue +1 -1
  9. package/lib/components/atoms/FuroSwitch/FuroSwitchContext.js +2 -2
  10. package/lib/components/atoms/FuroTextarea/FuroTextareaContext.js +3 -3
  11. package/lib/components/atoms/FuroToggle/FuroToggle.vue +1 -1
  12. package/lib/components/atoms/FuroToggle/FuroToggleContext.js +2 -2
  13. package/lib/components/molecules/FuroAccordion/FuroAccordion.vue +1 -1
  14. package/lib/components/molecules/FuroAccordion/FuroAccordionContext.js +2 -2
  15. package/lib/components/molecules/FuroAttachment/FuroAttachmentContext.js +2 -2
  16. package/lib/components/molecules/FuroAutocompleteField/FuroAutocompleteField.vue +9 -0
  17. package/lib/components/molecules/FuroAutocompleteField/FuroAutocompleteFieldContext.js +34 -7
  18. package/lib/components/molecules/FuroBreadcrumb/FuroBreadcrumb.vue +1 -1
  19. package/lib/components/molecules/FuroCollapsible/FuroCollapsible.vue +1 -1
  20. package/lib/components/molecules/FuroCollapsible/FuroCollapsibleContext.js +2 -2
  21. package/lib/components/molecules/FuroDatePicker/FuroDatePicker.vue +6 -6
  22. package/lib/components/molecules/FuroDatePicker/FuroDatePickerContext.js +3 -3
  23. package/lib/components/molecules/FuroDateTimePicker/FuroDateTimePickerContext.js +3 -3
  24. package/lib/components/molecules/FuroDropdownMenu/FuroDropdownMenu.vue +1 -1
  25. package/lib/components/molecules/FuroDropdownMenu/FuroDropdownMenuContext.js +3 -3
  26. package/lib/components/molecules/FuroEditableField/FuroEditableField.vue +2 -0
  27. package/lib/components/molecules/FuroEditableField/FuroEditableFieldContext.js +2 -2
  28. package/lib/components/molecules/FuroPagination/FuroPagination.vue +2 -2
  29. package/lib/components/molecules/FuroPagination/FuroPaginationContext.js +2 -2
  30. package/lib/components/molecules/FuroPopover/FuroPopover.vue +3 -2
  31. package/lib/components/molecules/FuroPopover/FuroPopoverContext.js +1 -1
  32. package/lib/components/molecules/FuroSelect/FuroSelectContext.js +3 -3
  33. package/lib/components/molecules/FuroSkeleton/FuroSkeleton.vue +17 -7
  34. package/lib/components/molecules/FuroSkeleton/FuroSkeletonContext.js +2 -2
  35. package/lib/components/molecules/FuroSplitter/FuroSplitter.vue +1 -1
  36. package/lib/components/molecules/FuroSplitter/FuroSplitterContext.js +2 -2
  37. package/lib/components/molecules/FuroTimeField/FuroTimeField.vue +1 -1
  38. package/lib/components/molecules/FuroTimeField/FuroTimeFieldContext.js +3 -3
  39. package/lib/components/molecules/FuroToggleGroup/FuroToggleGroup.vue +2 -2
  40. package/lib/components/molecules/FuroToggleGroup/FuroToggleGroupContext.js +2 -2
  41. package/lib/components/molecules/FuroTooltip/FuroTooltip.vue +1 -1
  42. package/lib/components/molecules/FuroTooltip/FuroTooltipContext.js +1 -1
  43. package/lib/components/organisms/FuroAlertDialog/FuroAlertDialog.vue +2 -1
  44. package/lib/components/organisms/FuroAlertDialog/FuroAlertDialogContext.js +17 -4
  45. package/lib/components/organisms/FuroDialog/FuroDialog.vue +3 -2
  46. package/lib/components/organisms/FuroDialog/FuroDialogContext.js +15 -2
  47. package/lib/components/organisms/FuroDrawer/FuroDrawer.vue +2 -2
  48. package/lib/components/organisms/FuroDrawer/FuroDrawerContext.js +4 -4
  49. package/lib/components/organisms/FuroEditor/FuroEditor.vue +1 -1
  50. package/lib/components/organisms/FuroSidebar/FuroSidebar.vue +2 -2
  51. package/lib/components/organisms/FuroStepper/FuroStepper.vue +1 -1
  52. package/lib/components/organisms/FuroStepper/FuroStepperContext.js +2 -2
  53. package/lib/components/organisms/FuroTable/FuroTable.vue +6 -5
  54. package/lib/components/organisms/FuroTable/FuroTableContext.js +6 -6
  55. package/lib/components/organisms/FuroTabs/FuroTabs.vue +3 -3
  56. package/lib/components/organisms/FuroTabs/FuroTabsContext.js +2 -2
  57. package/lib/components/organisms/FuroToast/FuroToast.vue +2 -2
  58. package/lib/components/organisms/FuroToast/FuroToastContext.js +2 -2
  59. package/package.json +12 -11
  60. package/public/furo-vue/components.json +11 -4
  61. package/types/generated/components/molecules/FuroAutocompleteField/FuroAutocompleteField.vue.d.ts +3 -0
  62. package/types/generated/components/molecules/FuroAutocompleteField/FuroAutocompleteFieldContext.d.ts +18 -0
  63. package/types/generated/components/molecules/FuroSkeleton/FuroSkeletonContext.d.ts +2 -2
  64. package/types/generated/components/organisms/FuroAlertDialog/FuroAlertDialogContext.d.ts +6 -0
  65. package/types/generated/components/organisms/FuroDialog/FuroDialogContext.d.ts +6 -0
@@ -43,12 +43,14 @@
43
43
  --size-screen-height: 100dvh;
44
44
  --size-header-height: 4.5rem;
45
45
  --size-footer-height: 6rem;
46
+ --size-table-cell-inline: 1rem;
47
+ --size-table-cell-block: 0;
46
48
  --size-sidebar-width: 16rem;
47
49
  --size-sidebar-width-collapsed: 4rem;
48
50
  /* Deprecated, removed in the next minor. Read --size-sidebar-width, which
49
51
  carries the width the rail actually renders. */
50
52
  --size-nav-width: var(--size-sidebar-width);
51
- --size-focus-ring-spread: 0.1875rem;
53
+ --size-focus-ring-spread: 0.125rem;
52
54
 
53
55
  /* Typography */
54
56
  --font-family: 'Noto Sans JP', system-ui, -apple-system, 'Segoe UI', roboto, helvetica, arial, sans-serif;
@@ -93,6 +95,7 @@
93
95
 
94
96
  /* Motion */
95
97
  --transition-timer: 0.2s;
98
+ --transition-timer-spin: 0.75s;
96
99
 
97
100
  /* Constants */
98
101
  --value-golden-ratio: 1.618;
@@ -138,7 +138,7 @@ export default defineComponent({
138
138
 
139
139
  .unit-button:focus-visible {
140
140
  outline: none;
141
- box-shadow: 0 0 0 0.125rem var(--color-ring);
141
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
142
142
  }
143
143
 
144
144
  .unit-button:active:not(.disabled):not(.loading) {
@@ -191,7 +191,7 @@ export default defineComponent({
191
191
 
192
192
  .unit-button > .content-root > .loading-overlay > .loading-icon,
193
193
  .unit-button > .content-root > .loading-overlay > :deep(.loading-icon) {
194
- animation: furo-button-spin var(--transition-timer) linear infinite;
194
+ animation: furo-button-spin var(--transition-timer-spin) linear infinite;
195
195
  }
196
196
 
197
197
  .unit-button.default {
@@ -297,5 +297,12 @@ export default defineComponent({
297
297
  transform: rotate(360deg);
298
298
  }
299
299
  }
300
+
301
+ @media (prefers-reduced-motion: reduce) {
302
+ .unit-button > .content-root > .loading-overlay > .loading-icon,
303
+ .unit-button > .content-root > .loading-overlay > :deep(.loading-icon) {
304
+ animation: none;
305
+ }
306
+ }
300
307
  }
301
308
  </style>
@@ -79,7 +79,7 @@ export default class FuroButtonContext extends BaseFuroContext {
79
79
  */
80
80
  static get EMIT_EVENT_HASH () {
81
81
  return {
82
- [this.EMIT_EVENT_NAME.CLICK]: payload => {},
82
+ [this.EMIT_EVENT_NAME.CLICK]: payload => true,
83
83
  }
84
84
  }
85
85
 
@@ -108,9 +108,9 @@ export default class FuroCheckboxContext extends BaseFuroContext {
108
108
  */
109
109
  static get EMIT_EVENT_HASH () {
110
110
  return {
111
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
112
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
113
- [this.EMIT_EVENT_NAME.UPDATE_INDETERMINATE]: indeterminate => {},
111
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
112
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
113
+ [this.EMIT_EVENT_NAME.UPDATE_INDETERMINATE]: indeterminate => true,
114
114
  }
115
115
  }
116
116
 
@@ -67,7 +67,7 @@ export default class FuroFileFieldContext extends BaseFuroContext {
67
67
  */
68
68
  static get EMIT_EVENT_HASH () {
69
69
  return {
70
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
70
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
71
71
  }
72
72
  }
73
73
 
@@ -156,7 +156,7 @@ export default defineComponent({
156
156
 
157
157
  .unit-form-control.radio-group > .option > .radio:focus-visible {
158
158
  outline: none;
159
- box-shadow: 0 0 0 0.125rem var(--color-ring);
159
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
160
160
  }
161
161
 
162
162
  .unit-form-control.radio-group.invalid > .option > .radio {
@@ -105,8 +105,8 @@ export default class FuroRadioContext extends BaseFuroContext {
105
105
  */
106
106
  static get EMIT_EVENT_HASH () {
107
107
  return {
108
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
109
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
108
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
109
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
110
110
  }
111
111
  }
112
112
 
@@ -131,7 +131,7 @@ export default defineComponent({
131
131
  .unit-form-control.switch:focus-visible {
132
132
  outline: none;
133
133
 
134
- box-shadow: 0 0 0 0.125rem var(--color-ring);
134
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
135
135
  }
136
136
 
137
137
  /* The design gives the disabled track a colour of its own rather than dimming
@@ -107,8 +107,8 @@ export default class FuroSwitchContext extends BaseFuroContext {
107
107
  */
108
108
  static get EMIT_EVENT_HASH () {
109
109
  return {
110
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
111
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
110
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
111
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
112
112
  }
113
113
  }
114
114
 
@@ -84,9 +84,9 @@ export default class FuroTextareaContext extends BaseFuroContext {
84
84
  */
85
85
  static get EMIT_EVENT_HASH () {
86
86
  return {
87
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
88
- [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => {},
89
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: payload => {},
87
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
88
+ [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => true,
89
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: payload => true,
90
90
  }
91
91
  }
92
92
 
@@ -110,7 +110,7 @@ export default defineComponent({
110
110
 
111
111
  .unit-toggle:focus-visible {
112
112
  outline: none;
113
- box-shadow: 0 0 0 0.125rem var(--color-ring);
113
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
114
114
  }
115
115
 
116
116
  .unit-toggle.disabled {
@@ -103,8 +103,8 @@ export default class FuroToggleContext extends BaseFuroContext {
103
103
  */
104
104
  static get EMIT_EVENT_HASH () {
105
105
  return {
106
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
107
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
106
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
107
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
108
108
  }
109
109
  }
110
110
 
@@ -165,7 +165,7 @@ export default defineComponent({
165
165
 
166
166
  .unit-accordion > .unit-accordion-item > .header > .trigger:focus-visible {
167
167
  outline: none;
168
- box-shadow: inset 0 0 0 0.125rem var(--color-ring);
168
+ box-shadow: inset 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
169
169
  }
170
170
 
171
171
  .unit-accordion > .unit-accordion-item.disabled > .header > .trigger {
@@ -110,8 +110,8 @@ export default class FuroAccordionContext extends BaseFuroContext {
110
110
  */
111
111
  static get EMIT_EVENT_HASH () {
112
112
  return {
113
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
114
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
113
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
114
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
115
115
  }
116
116
  }
117
117
 
@@ -115,8 +115,8 @@ export default class FuroAttachmentContext extends BaseFuroContext {
115
115
  */
116
116
  static get EMIT_EVENT_HASH () {
117
117
  return {
118
- [this.EMIT_EVENT_NAME.DOWNLOAD]: payload => {},
119
- [this.EMIT_EVENT_NAME.REMOVE]: payload => {},
118
+ [this.EMIT_EVENT_NAME.DOWNLOAD]: payload => true,
119
+ [this.EMIT_EVENT_NAME.REMOVE]: payload => true,
120
120
  }
121
121
  }
122
122
 
@@ -43,6 +43,14 @@ export default defineComponent({
43
43
  ],
44
44
  default: null,
45
45
  },
46
+ inputParcel: {
47
+ /** @type {PropType<FuroAutocompleteFieldContext['inputParcel']>} */
48
+ type: [
49
+ Object,
50
+ null,
51
+ ],
52
+ default: null,
53
+ },
46
54
  },
47
55
 
48
56
  slots: /** @type {FuroAutocompleteFieldSlots} */ (Object),
@@ -139,6 +147,7 @@ export default defineComponent({
139
147
  </template>
140
148
 
141
149
  <ComboboxInput
150
+ v-bind="context.extractInputAttributes()"
142
151
  class="input"
143
152
  :placeholder="context.extractPlaceholderText()"
144
153
  :display-value="(value) => context.extractDisplayValue({ option: value })"
@@ -134,13 +134,13 @@ export default class FuroAutocompleteFieldContext extends BaseFuroContext {
134
134
  */
135
135
  static get EMIT_EVENT_HASH () {
136
136
  return {
137
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
138
- [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => {},
139
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
140
- [this.EMIT_EVENT_NAME.UPDATE_SEARCH_KEYWORD]: searchKeyword => {},
141
- [this.EMIT_EVENT_NAME.SEARCH_KEYWORD]: payload => {},
142
- [this.EMIT_EVENT_NAME.UPDATE_OPEN]: isOpen => {},
143
- [this.EMIT_EVENT_NAME.CREATE_OPTION]: payload => {},
137
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
138
+ [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => true,
139
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
140
+ [this.EMIT_EVENT_NAME.UPDATE_SEARCH_KEYWORD]: searchKeyword => true,
141
+ [this.EMIT_EVENT_NAME.SEARCH_KEYWORD]: payload => true,
142
+ [this.EMIT_EVENT_NAME.UPDATE_OPEN]: isOpen => true,
143
+ [this.EMIT_EVENT_NAME.CREATE_OPTION]: payload => true,
144
144
  }
145
145
  }
146
146
 
@@ -225,6 +225,16 @@ export default class FuroAutocompleteFieldContext extends BaseFuroContext {
225
225
  }
226
226
  }
227
227
 
228
+ /**
229
+ * get: attributes bound onto the inner combobox input.
230
+ *
231
+ * @returns {Props['inputParcel']}
232
+ */
233
+ get inputParcel () {
234
+ return this.props.inputParcel
235
+ ?? null
236
+ }
237
+
228
238
  /**
229
239
  * Get loading.
230
240
  *
@@ -1373,6 +1383,15 @@ export default class FuroAutocompleteFieldContext extends BaseFuroContext {
1373
1383
  return this.parcel?.placeholder
1374
1384
  ?? 'Select an option'
1375
1385
  }
1386
+
1387
+ /**
1388
+ * Extract the attributes bound onto the inner combobox input.
1389
+ *
1390
+ * @returns {Props['inputParcel']}
1391
+ */
1392
+ extractInputAttributes () {
1393
+ return this.inputParcel
1394
+ }
1376
1395
  }
1377
1396
 
1378
1397
  /**
@@ -1407,9 +1426,17 @@ export default class FuroAutocompleteFieldContext extends BaseFuroContext {
1407
1426
  /**
1408
1427
  * @typedef {import('vue').HTMLAttributes & {
1409
1428
  * parcel?: FuroAutocompleteFieldParcel | null
1429
+ * inputParcel?: FuroAutocompleteFieldInputParcel | null
1410
1430
  * }} Props
1411
1431
  */
1412
1432
 
1433
+ /**
1434
+ * Attributes for the inner `<input role="combobox">` (`id`, `name`, `aria-*`, `required`, …).
1435
+ * The component keeps `placeholder`, the display text and the search keyword for itself.
1436
+ *
1437
+ * @typedef {Omit<import('vue').InputHTMLAttributes, 'placeholder' | 'value'>} FuroAutocompleteFieldInputParcel
1438
+ */
1439
+
1413
1440
  /**
1414
1441
  * Closed-set Furo behavior for `<FuroAutocompleteField>`.
1415
1442
  * JSON-serializable only. Not an open passthrough to the internal combobox library.
@@ -194,7 +194,7 @@ export default defineComponent({
194
194
  .unit-breadcrumb > .trail > .entry > a.crumb:focus-visible {
195
195
  outline: none;
196
196
  border-radius: var(--size-border-radius-2x-small);
197
- box-shadow: 0 0 0 0.125rem var(--color-ring);
197
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
198
198
  }
199
199
 
200
200
  .unit-breadcrumb > .trail > .entry > .crumb.disabled {
@@ -124,7 +124,7 @@ export default defineComponent({
124
124
  .unit-collapsible > .trigger:focus-visible {
125
125
  outline: none;
126
126
  border-radius: var(--size-border-radius-medium);
127
- box-shadow: 0 0 0 0.125rem var(--color-ring);
127
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
128
128
  }
129
129
 
130
130
  .unit-collapsible.disabled > .trigger {
@@ -105,8 +105,8 @@ export default class FuroCollapsibleContext extends BaseFuroContext {
105
105
  */
106
106
  static get EMIT_EVENT_HASH () {
107
107
  return {
108
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
109
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
108
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
109
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
110
110
  }
111
111
  }
112
112
 
@@ -363,7 +363,7 @@ export default defineComponent({
363
363
 
364
364
  .unit-form-control.date-picker > .field > .field-input:focus-visible {
365
365
  outline: none;
366
- box-shadow: 0 0 0 0.125rem var(--color-ring);
366
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
367
367
  }
368
368
 
369
369
  .unit-form-control.date-picker > .field > .trigger {
@@ -390,7 +390,7 @@ export default defineComponent({
390
390
  }
391
391
 
392
392
  .unit-form-control.date-picker > .field > .trigger:focus-visible {
393
- outline: 0.125rem solid var(--color-ring);
393
+ outline: var(--size-focus-ring-spread) solid var(--color-ring);
394
394
  outline-offset: 0.0625rem;
395
395
  border-radius: var(--size-border-radius-small);
396
396
  }
@@ -525,7 +525,7 @@ export default defineComponent({
525
525
  }
526
526
 
527
527
  .unit-date-picker-content > .calendar > .calendar-header > .calendar-nav-button:focus-visible {
528
- outline: 0.125rem solid var(--color-ring);
528
+ outline: var(--size-focus-ring-spread) solid var(--color-ring);
529
529
  outline-offset: 0.0625rem;
530
530
  }
531
531
 
@@ -564,7 +564,7 @@ export default defineComponent({
564
564
  }
565
565
 
566
566
  .unit-date-picker-content > .calendar > .calendar-header > .calendar-caption > .caption-select:focus-visible {
567
- outline: 0.125rem solid var(--color-ring);
567
+ outline: var(--size-focus-ring-spread) solid var(--color-ring);
568
568
  outline-offset: 0.0625rem;
569
569
  border-color: var(--color-ring);
570
570
  }
@@ -618,7 +618,7 @@ export default defineComponent({
618
618
  .unit-date-picker-content > .calendar > .calendar-grids > .calendar-grid > tbody > .calendar-row > .calendar-cell > .calendar-cell-trigger[data-focused]:not([data-selected]) {
619
619
  background-color: var(--color-accent);
620
620
  color: var(--color-accent-foreground);
621
- outline: 0.125rem solid var(--color-ring);
621
+ outline: var(--size-focus-ring-spread) solid var(--color-ring);
622
622
  outline-offset: 0.0625rem;
623
623
  }
624
624
 
@@ -628,7 +628,7 @@ export default defineComponent({
628
628
  }
629
629
 
630
630
  .unit-date-picker-content > .calendar > .calendar-grids > .calendar-grid > tbody > .calendar-row > .calendar-cell > .calendar-cell-trigger[data-selected][data-focused] {
631
- outline: 0.125rem solid var(--color-primary-foreground);
631
+ outline: var(--size-focus-ring-spread) solid var(--color-primary-foreground);
632
632
  outline-offset: -0.1875rem;
633
633
  }
634
634
 
@@ -143,9 +143,9 @@ export default class FuroDatePickerContext extends BaseFuroContext {
143
143
  */
144
144
  static get EMIT_EVENT_HASH () {
145
145
  return {
146
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
147
- [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => {},
148
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
146
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
147
+ [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => true,
148
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
149
149
  }
150
150
  }
151
151
 
@@ -131,9 +131,9 @@ export default class FuroDateTimePickerContext extends BaseFuroContext {
131
131
  */
132
132
  static get EMIT_EVENT_HASH () {
133
133
  return {
134
- [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => {},
135
- [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => {},
136
- [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => {},
134
+ [this.EMIT_EVENT_NAME.CHANGE_VALUE]: payload => true,
135
+ [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => true,
136
+ [this.EMIT_EVENT_NAME.UPDATE_VALUE]: value => true,
137
137
  }
138
138
  }
139
139
 
@@ -168,7 +168,7 @@ export default defineComponent({
168
168
 
169
169
  .unit-dropdown-menu > .unit-button:focus-visible {
170
170
  outline: none;
171
- box-shadow: 0 0 0 0.125rem var(--color-ring);
171
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
172
172
  }
173
173
 
174
174
  .unit-dropdown-menu > .unit-button:active:not(.disabled):not(.loading):not([data-disabled]) {
@@ -126,9 +126,9 @@ export default class FuroDropdownMenuContext extends BaseFuroContext {
126
126
  */
127
127
  static get EMIT_EVENT_HASH () {
128
128
  return {
129
- [this.EMIT_EVENT_NAME.OPEN_CHANGE]: payload => {},
130
- [this.EMIT_EVENT_NAME.OPTION_SELECT]: payload => {},
131
- [this.EMIT_EVENT_NAME.OPTION_CHECKED_CHANGE]: payload => {},
129
+ [this.EMIT_EVENT_NAME.OPEN_CHANGE]: payload => true,
130
+ [this.EMIT_EVENT_NAME.OPTION_SELECT]: payload => true,
131
+ [this.EMIT_EVENT_NAME.OPTION_CHECKED_CHANGE]: payload => true,
132
132
  }
133
133
  }
134
134
 
@@ -298,6 +298,8 @@ export default defineComponent({
298
298
  align-items: center;
299
299
  justify-content: center;
300
300
  flex-shrink: 0;
301
+
302
+ font: inherit;
301
303
  }
302
304
 
303
305
  .unit-form-control.editable > .contents > .editor > .actions > .action {
@@ -153,8 +153,8 @@ export default class FuroEditableFieldContext extends BaseFuroContext {
153
153
  */
154
154
  static get EMIT_EVENT_HASH () {
155
155
  return {
156
- [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => {},
157
- [this.EMIT_EVENT_NAME.UPDATE_EDITING_STATE]: editing => {},
156
+ [this.EMIT_EVENT_NAME.COMMIT_VALUE]: payload => true,
157
+ [this.EMIT_EVENT_NAME.UPDATE_EDITING_STATE]: editing => true,
158
158
  }
159
159
  }
160
160
 
@@ -186,7 +186,7 @@ export default defineComponent({
186
186
 
187
187
  .unit-pagination .page:focus-visible {
188
188
  outline: none;
189
- box-shadow: 0 0 0 0.125rem var(--color-ring);
189
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
190
190
  }
191
191
 
192
192
  .unit-pagination :where(.previous, .next) {
@@ -218,7 +218,7 @@ export default defineComponent({
218
218
 
219
219
  .unit-pagination :where(.previous, .next):focus-visible {
220
220
  outline: none;
221
- box-shadow: 0 0 0 0.125rem var(--color-ring);
221
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
222
222
  }
223
223
 
224
224
  .unit-pagination :where(.previous, .next):disabled {
@@ -100,8 +100,8 @@ export default class FuroPaginationContext extends BaseFuroContext {
100
100
  */
101
101
  static get EMIT_EVENT_HASH () {
102
102
  return {
103
- [this.EMIT_EVENT_NAME.PAGE_CHANGE]: payload => {},
104
- [this.EMIT_EVENT_NAME.UPDATE_PAGE]: payload => {},
103
+ [this.EMIT_EVENT_NAME.PAGE_CHANGE]: payload => true,
104
+ [this.EMIT_EVENT_NAME.UPDATE_PAGE]: payload => true,
105
105
  }
106
106
  }
107
107
 
@@ -103,7 +103,7 @@ export default defineComponent({
103
103
 
104
104
  .unit-popover-trigger:focus-visible {
105
105
  outline: none;
106
- box-shadow: 0 0 0 0.125rem var(--color-ring);
106
+ box-shadow: 0 0 0 var(--size-focus-ring-spread) var(--color-ring);
107
107
  }
108
108
 
109
109
  .unit-popover-content {
@@ -136,7 +136,7 @@ export default defineComponent({
136
136
  }
137
137
 
138
138
  .unit-popover-content[data-state="closed"] {
139
- animation: furo-popover-content-out 100ms ease;
139
+ animation: furo-popover-content-out 100ms ease forwards;
140
140
  }
141
141
 
142
142
  @keyframes furo-popover-content-in {
@@ -158,6 +158,7 @@ export default defineComponent({
158
158
  to {
159
159
  opacity: 0;
160
160
  transform: scale(0.95);
161
+ visibility: hidden;
161
162
  }
162
163
  }
163
164
 
@@ -94,7 +94,7 @@ export default class FuroPopoverContext extends BaseFuroContext {
94
94
  */
95
95
  static get EMIT_EVENT_HASH () {
96
96
  return {
97
- [this.EMIT_EVENT_NAME.OPEN_CHANGE]: payload => {},
97
+ [this.EMIT_EVENT_NAME.OPEN_CHANGE]: payload => true,
98
98
  }
99
99
  }
100
100
 
@@ -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
 
@@ -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