origam 2.17.1 → 2.18.1

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 (215) hide show
  1. package/CHANGELOG.md +895 -0
  2. package/dist/src/assets/css/main.css +1 -1
  3. package/dist/src/assets/css/tokens/dark.css +193 -26
  4. package/dist/src/assets/css/tokens/light.css +78 -11
  5. package/dist/src/assets/locales/en.json +21 -6
  6. package/dist/src/assets/locales/fr.json +21 -6
  7. package/dist/src/assets/scss/main.scss +10 -2
  8. package/dist/src/assets/scss/tokens/_dark.scss +2914 -13
  9. package/dist/src/assets/scss/tokens/_light.scss +78 -11
  10. package/dist/src/components/Alert/OrigamAlert.vue +6 -6
  11. package/dist/src/components/Avatar/OrigamAvatar.vue +15 -2
  12. package/dist/src/components/Badge/OrigamBadge.vue +7 -7
  13. package/dist/src/components/Breadcrumb/OrigamBreadcrumbItem.vue +23 -4
  14. package/dist/src/components/Btn/OrigamBtn.vue +22 -16
  15. package/dist/src/components/Btn/OrigamBtnGroup.vue +1 -1
  16. package/dist/src/components/Calendar/OrigamCalendar.vue +1 -1
  17. package/dist/src/components/Card/OrigamCard.vue +2 -0
  18. package/dist/src/components/Card/OrigamCardHeader.vue +7 -7
  19. package/dist/src/components/Carousel/OrigamCarousel.vue +14 -1
  20. package/dist/src/components/Chart/OrigamChartBoxPlot.vue +1 -1
  21. package/dist/src/components/Chart/OrigamChartBullet.vue +3 -2
  22. package/dist/src/components/Chart/OrigamChartCandlestick.vue +2 -2
  23. package/dist/src/components/Chart/OrigamChartCartesian.vue +49 -4
  24. package/dist/src/components/Chart/OrigamChartLegend.vue +39 -18
  25. package/dist/src/components/Chart/OrigamChartPareto.vue +7 -1
  26. package/dist/src/components/Chart/OrigamChartPictorial.vue +2 -2
  27. package/dist/src/components/Chart/OrigamChartRadar.vue +3 -1
  28. package/dist/src/components/Chart/OrigamChartSparkline.vue +3 -1
  29. package/dist/src/components/Chart/OrigamChartStreamgraph.vue +2 -1
  30. package/dist/src/components/Checkbox/OrigamCheckbox.vue +2 -0
  31. package/dist/src/components/Checkbox/OrigamCheckboxGroup.vue +36 -11
  32. package/dist/src/components/Chip/OrigamChip.vue +19 -4
  33. package/dist/src/components/Code/OrigamCode.vue +20 -3
  34. package/dist/src/components/ColorPickerField/OrigamColorPickerField.vue +30 -5
  35. package/dist/src/components/CommandPalette/OrigamCommandPalette.vue +3 -3
  36. package/dist/src/components/ConfirmWrapper/OrigamConfirmWrapper.vue +6 -6
  37. package/dist/src/components/ContextualMenu/OrigamContextualMenu.vue +0 -4
  38. package/dist/src/components/DataList/OrigamDataList.vue +2 -0
  39. package/dist/src/components/DataList/OrigamDataText.vue +6 -6
  40. package/dist/src/components/DataList/OrigamDataTitle.vue +6 -6
  41. package/dist/src/components/DataTable/OrigamDataTableHeaderCell.vue +1 -1
  42. package/dist/src/components/DataTable/OrigamDataTableHeadersCell.vue +4 -1
  43. package/dist/src/components/DatePicker/OrigamDatePicker.vue +2 -0
  44. package/dist/src/components/DatePicker/OrigamDatePickerHeader.vue +6 -6
  45. package/dist/src/components/DatePickerField/OrigamDatePickerField.vue +21 -1
  46. package/dist/src/components/Dialog/OrigamDialog.vue +25 -0
  47. package/dist/src/components/Dialog/OrigamDialogConfirmation.vue +6 -0
  48. package/dist/src/components/ExpansionPanel/OrigamExpansionPanel.vue +2 -0
  49. package/dist/src/components/ExpansionPanel/OrigamExpansionPanelHeader.vue +6 -6
  50. package/dist/src/components/Field/OrigamField.vue +47 -15
  51. package/dist/src/components/FileField/OrigamFileField.vue +5 -1
  52. package/dist/src/components/Icon/OrigamSvgIcon.vue +3 -1
  53. package/dist/src/components/Img/OrigamImg.vue +9 -2
  54. package/dist/src/components/InfiniteScroll/OrigamInfiniteScroll.vue +34 -18
  55. package/dist/src/components/InlineEdit/OrigamInlineEdit.vue +46 -5
  56. package/dist/src/components/Input/OrigamInput.vue +6 -6
  57. package/dist/src/components/List/OrigamListGroup.vue +4 -0
  58. package/dist/src/components/List/OrigamListItem.vue +68 -4
  59. package/dist/src/components/Masonry/OrigamMasonry.vue +18 -2
  60. package/dist/src/components/Menu/OrigamMenu.vue +79 -9
  61. package/dist/src/components/NumberField/OrigamNumberField.vue +13 -3
  62. package/dist/src/components/OtpInputField/OrigamOtpInputField.vue +35 -11
  63. package/dist/src/components/PasswordField/OrigamPasswordField.vue +5 -1
  64. package/dist/src/components/Radio/OrigamRadio.vue +2 -0
  65. package/dist/src/components/Radio/OrigamRadioGroup.vue +36 -11
  66. package/dist/src/components/RatingField/OrigamRatingField.vue +58 -7
  67. package/dist/src/components/RatingField/OrigamRatingFieldItem.vue +78 -30
  68. package/dist/src/components/Select/OrigamSelect.vue +44 -21
  69. package/dist/src/components/SliderField/OrigamSliderField.vue +20 -10
  70. package/dist/src/components/Snackbar/OrigamSnackbarGroup.vue +1 -1
  71. package/dist/src/components/Switch/OrigamSwitch.vue +2 -0
  72. package/dist/src/components/Tabs/OrigamTab.vue +7 -4
  73. package/dist/src/components/Tabs/OrigamTabPanel.vue +4 -2
  74. package/dist/src/components/Tabs/OrigamTabs.vue +7 -5
  75. package/dist/src/components/TextField/OrigamTextField.vue +5 -1
  76. package/dist/src/components/TextareaField/OrigamTextareaField.vue +5 -1
  77. package/dist/src/components/Transition/OrigamExpandX.vue +19 -3
  78. package/dist/src/components/Transition/OrigamExpandY.vue +19 -3
  79. package/dist/src/components/Transition/OrigamTranslateScale.vue +26 -4
  80. package/dist/src/components/Video/OrigamVideo.vue +3 -2
  81. package/dist/src/components/Window/OrigamWindow.vue +20 -3
  82. package/dist/src/composables/Commons/accessibleCommand.composable.cjs +26 -0
  83. package/dist/src/composables/Commons/accessibleCommand.composable.d.ts +78 -0
  84. package/dist/src/composables/Commons/accessibleCommand.composable.js +20 -0
  85. package/dist/src/composables/Commons/activator.composable.cjs +10 -1
  86. package/dist/src/composables/Commons/activator.composable.js +11 -2
  87. package/dist/src/composables/Commons/adjacent.composable.cjs +17 -0
  88. package/dist/src/composables/Commons/adjacent.composable.d.ts +12 -0
  89. package/dist/src/composables/Commons/adjacent.composable.js +17 -0
  90. package/dist/src/composables/Commons/adjacentInner.composable.cjs +20 -0
  91. package/dist/src/composables/Commons/adjacentInner.composable.d.ts +24 -5
  92. package/dist/src/composables/Commons/adjacentInner.composable.js +20 -0
  93. package/dist/src/composables/Commons/audio.composable.cjs +14 -1
  94. package/dist/src/composables/Commons/audio.composable.js +14 -1
  95. package/dist/src/composables/Commons/backButton.composable.cjs +3 -1
  96. package/dist/src/composables/Commons/backButton.composable.js +3 -1
  97. package/dist/src/composables/Commons/border.composable.d.ts +13 -0
  98. package/dist/src/composables/Commons/colorEffect.composable.cjs +58 -46
  99. package/dist/src/composables/Commons/colorEffect.composable.d.ts +10 -5
  100. package/dist/src/composables/Commons/colorEffect.composable.js +70 -46
  101. package/dist/src/composables/Commons/createLayout.composable.cjs +21 -12
  102. package/dist/src/composables/Commons/createLayout.composable.js +21 -12
  103. package/dist/src/composables/Commons/delay.composable.d.ts +16 -0
  104. package/dist/src/composables/Commons/dimension.composable.d.ts +11 -0
  105. package/dist/src/composables/Commons/elevation.composable.cjs +6 -2
  106. package/dist/src/composables/Commons/elevation.composable.d.ts +37 -1
  107. package/dist/src/composables/Commons/elevation.composable.js +7 -2
  108. package/dist/src/composables/Commons/goTo.composable.cjs +4 -2
  109. package/dist/src/composables/Commons/goTo.composable.js +5 -3
  110. package/dist/src/composables/Commons/group.composable.cjs +14 -14
  111. package/dist/src/composables/Commons/group.composable.js +14 -14
  112. package/dist/src/composables/Commons/hotkey.composable.d.ts +18 -7
  113. package/dist/src/composables/Commons/hydration.composable.d.ts +8 -0
  114. package/dist/src/composables/Commons/link.composable.d.ts +20 -0
  115. package/dist/src/composables/Commons/locationStrategies.composable.d.ts +17 -0
  116. package/dist/src/composables/Commons/message.composable.d.ts +19 -5
  117. package/dist/src/composables/Commons/position.composable.d.ts +17 -6
  118. package/dist/src/composables/Commons/refs.composable.d.ts +11 -5
  119. package/dist/src/composables/Commons/rounded.composable.d.ts +11 -1
  120. package/dist/src/composables/Commons/scrolling.composable.cjs +15 -12
  121. package/dist/src/composables/Commons/scrolling.composable.js +15 -12
  122. package/dist/src/composables/Commons/size.composable.d.ts +15 -0
  123. package/dist/src/composables/Commons/ssrBoot.composable.cjs +9 -1
  124. package/dist/src/composables/Commons/ssrBoot.composable.js +10 -2
  125. package/dist/src/composables/Commons/stack.composable.cjs +13 -1
  126. package/dist/src/composables/Commons/stack.composable.js +13 -1
  127. package/dist/src/composables/Commons/theme-props-resolver.composable.cjs +41 -32
  128. package/dist/src/composables/Commons/theme-props-resolver.composable.js +41 -32
  129. package/dist/src/composables/Commons/validation.composable.cjs +3 -3
  130. package/dist/src/composables/Commons/validation.composable.js +3 -3
  131. package/dist/src/composables/Commons/virtual.composable.cjs +24 -8
  132. package/dist/src/composables/Commons/virtual.composable.js +24 -8
  133. package/dist/src/composables/Masonry/masonry.composable.cjs +18 -11
  134. package/dist/src/composables/Masonry/masonry.composable.js +18 -11
  135. package/dist/src/composables/Parallax/parallax.composable.cjs +1 -1
  136. package/dist/src/composables/Parallax/parallax.composable.js +1 -1
  137. package/dist/src/composables/index.cjs +36 -0
  138. package/dist/src/composables/index.d.ts +3 -0
  139. package/dist/src/composables/index.js +3 -0
  140. package/dist/src/consts/Chart/chart-cartesian.const.cjs +5 -2
  141. package/dist/src/consts/Chart/chart-cartesian.const.d.ts +42 -0
  142. package/dist/src/consts/Chart/chart-cartesian.const.js +3 -0
  143. package/dist/src/consts/Commons/elevation.const.cjs +5 -1
  144. package/dist/src/consts/Commons/elevation.const.d.ts +52 -2
  145. package/dist/src/consts/Commons/elevation.const.js +4 -0
  146. package/dist/src/consts/Commons/ripple.const.cjs +13 -3
  147. package/dist/src/consts/Commons/ripple.const.js +13 -3
  148. package/dist/src/consts/RatingField/rating-field.const.cjs +10 -0
  149. package/dist/src/consts/RatingField/rating-field.const.d.ts +36 -0
  150. package/dist/src/consts/RatingField/rating-field.const.js +12 -0
  151. package/dist/src/consts/index.cjs +11 -0
  152. package/dist/src/consts/index.d.ts +1 -0
  153. package/dist/src/consts/index.js +1 -0
  154. package/dist/src/directives/ClickOutside/clickOutside.directive.cjs +2 -0
  155. package/dist/src/directives/ClickOutside/clickOutside.directive.js +2 -0
  156. package/dist/src/directives/Ripple/ripple.directive.cjs +2 -0
  157. package/dist/src/directives/Ripple/ripple.directive.js +2 -0
  158. package/dist/src/enums/Commons/color.enum.cjs +0 -1
  159. package/dist/src/enums/Commons/color.enum.d.ts +14 -5
  160. package/dist/src/enums/Commons/color.enum.js +0 -1
  161. package/dist/src/enums/Sheet/sheet.enum.d.ts +1 -1
  162. package/dist/src/interfaces/Btn/btn.interface.d.ts +7 -10
  163. package/dist/src/interfaces/Chart/chart-cartesian.interface.d.ts +6 -2
  164. package/dist/src/interfaces/Commons/activator.interface.d.ts +3 -2
  165. package/dist/src/interfaces/Commons/adjacent.interface.d.ts +29 -0
  166. package/dist/src/interfaces/Commons/group.interface.d.ts +13 -2
  167. package/dist/src/interfaces/Commons/ripple.interface.d.ts +16 -0
  168. package/dist/src/interfaces/Commons/scroll.interface.d.ts +3 -2
  169. package/dist/src/interfaces/DataTable/data-table-header.interface.d.ts +2 -2
  170. package/dist/src/interfaces/DatePicker/date-picker-month.interface.d.ts +2 -1
  171. package/dist/src/interfaces/Menu/menu.interface.d.ts +28 -1
  172. package/dist/src/interfaces/OtpInputField/otp-input-field.interface.d.ts +21 -1
  173. package/dist/src/interfaces/RatingField/rating-field-item.interface.d.ts +16 -1
  174. package/dist/src/interfaces/index.cjs +11 -0
  175. package/dist/src/interfaces/index.d.ts +1 -0
  176. package/dist/src/interfaces/index.js +1 -0
  177. package/dist/src/nuxt/module.cjs +2 -1
  178. package/dist/src/nuxt/module.js +2 -1
  179. package/dist/src/origam.cjs +1 -2
  180. package/dist/src/origam.js +1 -2
  181. package/dist/src/themes/origam.theme.cjs +8 -14
  182. package/dist/src/themes/origam.theme.js +6 -8
  183. package/dist/src/types/Commons/color.type.d.ts +4 -3
  184. package/dist/src/types/Commons/commons.type.d.ts +33 -0
  185. package/dist/src/types/Commons/theme.type.d.ts +2 -1
  186. package/dist/src/types/Sheet/sheet.type.d.ts +2 -1
  187. package/dist/src/types/index.cjs +22 -0
  188. package/dist/src/types/index.d.ts +2 -0
  189. package/dist/src/types/index.js +2 -0
  190. package/dist/src/types/tokens.type.d.ts +1 -1
  191. package/dist/src/utils/Commons/a11y.util.cjs +35 -0
  192. package/dist/src/utils/Commons/a11y.util.d.ts +63 -0
  193. package/dist/src/utils/Commons/a11y.util.js +33 -0
  194. package/dist/src/utils/Commons/clickOutside.util.cjs +5 -1
  195. package/dist/src/utils/Commons/clickOutside.util.js +5 -1
  196. package/dist/src/utils/Commons/color.util.cjs +10 -15
  197. package/dist/src/utils/Commons/color.util.d.ts +34 -28
  198. package/dist/src/utils/Commons/color.util.js +9 -16
  199. package/dist/src/utils/Commons/goTo.util.cjs +31 -14
  200. package/dist/src/utils/Commons/goTo.util.d.ts +1 -1
  201. package/dist/src/utils/Commons/goTo.util.js +31 -16
  202. package/dist/src/utils/Commons/location.util.cjs +18 -3
  203. package/dist/src/utils/Commons/location.util.js +18 -3
  204. package/dist/src/utils/Commons/ripple.util.cjs +5 -1
  205. package/dist/src/utils/Commons/ripple.util.js +5 -1
  206. package/dist/src/utils/index.cjs +11 -0
  207. package/dist/src/utils/index.d.ts +1 -0
  208. package/dist/src/utils/index.js +1 -0
  209. package/package.json +13 -2
  210. package/dist/src/consts/Btn/btn.const.cjs +0 -7
  211. package/dist/src/consts/Btn/btn.const.d.ts +0 -32
  212. package/dist/src/consts/Btn/btn.const.js +0 -1
  213. package/dist/src/types/Commons/locale.type.cjs +0 -1
  214. package/dist/src/types/Commons/locale.type.d.ts +0 -0
  215. package/dist/src/types/Commons/locale.type.js +0 -0
@@ -9,8 +9,7 @@
9
9
  v-if="hasPrepend"
10
10
  key="prepend"
11
11
  class="origam-data-title__prepend"
12
- :role="isPrependClickable ? 'button' : undefined"
13
- :tabindex="isPrependClickable ? 0 : undefined"
12
+ v-bind="prependCommandAttrs"
14
13
  @click="handleClickPrepend"
15
14
  @keydown="handleKeydownPrepend"
16
15
  >
@@ -46,8 +45,7 @@
46
45
  v-if="hasAppend"
47
46
  key="append"
48
47
  class="origam-data-title__append"
49
- :role="isAppendClickable ? 'button' : undefined"
50
- :tabindex="isAppendClickable ? 0 : undefined"
48
+ v-bind="appendCommandAttrs"
51
49
  @click="handleClickAppend"
52
50
  @keydown="handleKeydownAppend"
53
51
  >
@@ -90,6 +88,8 @@ const props = defineProps({
90
88
  appendIcon: { type: null, required: false },
91
89
  prependAvatar: { type: String, required: false },
92
90
  prependIcon: { type: null, required: false },
91
+ prependAriaLabel: { type: String, required: false },
92
+ appendAriaLabel: { type: String, required: false },
93
93
  density: { type: null, required: false },
94
94
  margin: { type: [Boolean, Number, String], required: false },
95
95
  marginTop: { type: [Boolean, Number, String], required: false },
@@ -119,8 +119,8 @@ const {
119
119
  onClickAppend: handleClickAppend,
120
120
  onKeydownPrepend: handleKeydownPrepend,
121
121
  onKeydownAppend: handleKeydownAppend,
122
- isPrependClickable,
123
- isAppendClickable,
122
+ prependCommandAttrs,
123
+ appendCommandAttrs,
124
124
  hasAppend,
125
125
  hasPrepend
126
126
  } = useAdjacent(props, toRef(props, "prependIcon"), toRef(props, "appendIcon"));
@@ -106,7 +106,7 @@ const getFixedStyles = (column, y) => {
106
106
  return {
107
107
  position: "sticky",
108
108
  left: column.fixed ? convertToUnit(column.fixedOffset) : void 0,
109
- top: props.sticky ? `calc(var(--origam-table-header-height) * ${y})` : void 0
109
+ top: props.sticky ? `calc(var(--origam-table__header-cell---height, 44px) * ${y})` : void 0
110
110
  };
111
111
  };
112
112
  const hasColumn = (name) => {
@@ -77,7 +77,10 @@ const dataTableHeadersCellStyles = computed(() => {
77
77
  ];
78
78
  });
79
79
  const { id, css, load, isLoaded, unload } = useStyle(dataTableHeadersCellStyles, () => props.id);
80
- const headerRowId = (index) => props.id ? `${props.id}-row-${index}` : void 0;
80
+ const headerRowId = (index) => {
81
+ if (!props.id) return void 0;
82
+ return index === 0 ? props.id : `${props.id}-row-${index}`;
83
+ };
81
84
  defineExpose({
82
85
  filterProps,
83
86
  css,
@@ -213,6 +213,8 @@ const props = defineProps({
213
213
  appendIcon: { type: null, required: false },
214
214
  prependAvatar: { type: String, required: false },
215
215
  prependIcon: { type: null, required: false },
216
+ prependAriaLabel: { type: String, required: false },
217
+ appendAriaLabel: { type: String, required: false },
216
218
  density: { type: null, required: false }
217
219
  });
218
220
  const emits = defineEmits(["update:month", "update:year", "update:viewMode", "update:modelValue"]);
@@ -12,8 +12,7 @@
12
12
  <div
13
13
  key="prepend"
14
14
  class="origam-date-picker-header__prepend"
15
- :role="isPrependClickable ? 'button' : undefined"
16
- :tabindex="isPrependClickable ? 0 : undefined"
15
+ v-bind="prependCommandAttrs"
17
16
  @click="handleClickPrepend"
18
17
  @keydown="handleKeydownPrepend"
19
18
  >
@@ -54,8 +53,7 @@
54
53
  <div
55
54
  key="append"
56
55
  class="origam-date-picker-header__append"
57
- :role="isAppendClickable ? 'button' : undefined"
58
- :tabindex="isAppendClickable ? 0 : undefined"
56
+ v-bind="appendCommandAttrs"
59
57
  @click="handleClickAppend"
60
58
  @keydown="handleKeydownAppend"
61
59
  >
@@ -102,6 +100,8 @@ const props = defineProps({
102
100
  appendIcon: { type: null, required: false },
103
101
  prependAvatar: { type: String, required: false },
104
102
  prependIcon: { type: null, required: false },
103
+ prependAriaLabel: { type: String, required: false },
104
+ appendAriaLabel: { type: String, required: false },
105
105
  density: { type: null, required: false }
106
106
  });
107
107
  const emits = defineEmits(["click"]);
@@ -117,8 +117,8 @@ const {
117
117
  onClickAppend: handleClickAppend,
118
118
  onKeydownPrepend: handleKeydownPrepend,
119
119
  onKeydownAppend: handleKeydownAppend,
120
- isPrependClickable,
121
- isAppendClickable,
120
+ prependCommandAttrs,
121
+ appendCommandAttrs,
122
122
  hasAppend,
123
123
  hasPrepend
124
124
  } = useAdjacent(props, toRef(props, "prependIcon"), toRef(props, "appendIcon"));
@@ -16,6 +16,7 @@
16
16
  @blur="handleBlur"
17
17
  @change="handleChange"
18
18
  @click:clear="handleClear"
19
+ @input="handleInput"
19
20
  @mousedown:control="handleMousedownControl"
20
21
  >
21
22
  <template
@@ -244,6 +245,8 @@ const props = defineProps({
244
245
  prependInnerIcon: { type: null, required: false },
245
246
  clearIcon: { type: null, required: false },
246
247
  clearable: { type: Boolean, required: false },
248
+ prependInnerAriaLabel: { type: String, required: false },
249
+ appendInnerAriaLabel: { type: String, required: false },
247
250
  border: { type: [Boolean, Number, String, Array], required: false, skipCheck: true, default: true },
248
251
  borderTop: { type: [Boolean, Number, String], required: false },
249
252
  borderLeft: { type: [Boolean, Number, String], required: false },
@@ -312,6 +315,8 @@ const props = defineProps({
312
315
  appendIcon: { type: null, required: false },
313
316
  prependAvatar: { type: String, required: false },
314
317
  prependIcon: { type: null, required: false },
318
+ prependAriaLabel: { type: String, required: false },
319
+ appendAriaLabel: { type: String, required: false },
315
320
  transition: { type: [Boolean, String, Object], required: false, default: () => ({ component: OrigamTranslateScale }) }
316
321
  });
317
322
  defineEmits(["update:menu", "update:modelValue"]);
@@ -373,6 +378,17 @@ const isMultiple = computed(() => {
373
378
  const isRange = computed(() => {
374
379
  return props.range && model.value.length > 1;
375
380
  });
381
+ const commitTypedDate = (raw) => {
382
+ if (props.multiple || props.range) return;
383
+ if (raw === "") {
384
+ model.value = [];
385
+ return;
386
+ }
387
+ const parsed = adapter.date(raw);
388
+ if (!parsed || !adapter.isValid(parsed)) return;
389
+ if (adapter.format(parsed, "keyboardDate") !== raw) return;
390
+ model.value = [adapter.toISO(parsed)];
391
+ };
376
392
  const isFocused = shallowRef(false);
377
393
  const form = inject(ORIGAM_FORM_KEY, null);
378
394
  const menuDisabled = computed(() => {
@@ -419,8 +435,12 @@ const handleBlur = (e) => {
419
435
  isFocused.value = true;
420
436
  }
421
437
  };
422
- const handleChange = () => {
438
+ const handleInput = (e) => {
439
+ commitTypedDate(e.target?.value ?? "");
440
+ };
441
+ const handleChange = (e) => {
423
442
  if (matchesSelector(origamTextFieldRef.value, ":autofill") || matchesSelector(origamTextFieldRef.value, ":-webkit-autofill")) {
443
+ commitTypedDate(e.target?.value ?? "");
424
444
  }
425
445
  };
426
446
  const handleAfterLeave = () => {
@@ -266,6 +266,8 @@ const props = defineProps({
266
266
  appendIcon: { type: null, required: false },
267
267
  prependAvatar: { type: String, required: false },
268
268
  prependIcon: { type: null, required: false },
269
+ prependAriaLabel: { type: String, required: false },
270
+ appendAriaLabel: { type: String, required: false },
269
271
  active: { type: [Boolean, Object], required: false },
270
272
  activeClass: { type: String, required: false },
271
273
  status: { type: null, required: false },
@@ -398,6 +400,29 @@ defineExpose(forwardRefs({
398
400
  border-radius: var(--origam-dialog---border-radius, 12px);
399
401
  box-shadow: var(--origam-dialog---box-shadow);
400
402
 
403
+ // #563 — la boite qui porte le PLAFOND doit porter le DEFILEMENT.
404
+ //
405
+ // `.origam-overlay__content` est `position: absolute` et de hauteur
406
+ // AUTO : le `max-height: 100%` pose plus bas sur `.origam-card` se
407
+ // resout donc en `none` (pourcentage contre un parent sans hauteur
408
+ // definie). La carte grandit sans plafond, et cette boite la laissait
409
+ // deborder en `overflow: visible`. Mesure Chromium sur `develop`,
410
+ // dialogue Design + 900px injectes dans `#footer` :
411
+ //
412
+ // .origam-card overflow hidden clientH 1047 scrollH 1047 -> ne defile pas
413
+ // .origam-overlay__content visible -> ne rogne pas
414
+ // document -> bloque (scrollStrategy 'block')
415
+ // => pied du dialogue 459px SOUS le viewport, aucun recours.
416
+ //
417
+ // Contrairement a ce que decrit le ticket, `.origam-card__content`
418
+ // ne defilait pas davantage : sans hauteur definie en amont il
419
+ // grandit lui aussi (clientH 1647 === scrollH 1647). AUCUNE boite du
420
+ // dialogue ne defilait.
421
+ //
422
+ // La branche `&--fullscreen` ci-dessous pose deja exactement cette
423
+ // declaration : ceci aligne le mode par defaut sur elle.
424
+ overflow-y: auto;
425
+
401
426
  &,
402
427
  > form {
403
428
  > .origam-card {
@@ -3,6 +3,8 @@
3
3
  :id="id"
4
4
  ref="origamDialogRef"
5
5
  v-model="isActive"
6
+ :class="rootClasses"
7
+ :style="rootStyles"
6
8
  v-bind="dialogProps"
7
9
  @is-read="handleIsRead"
8
10
  >
@@ -240,6 +242,8 @@ const props = defineProps({
240
242
  appendIcon: { type: null, required: false },
241
243
  prependAvatar: { type: String, required: false },
242
244
  prependIcon: { type: null, required: false },
245
+ prependAriaLabel: { type: String, required: false },
246
+ appendAriaLabel: { type: String, required: false },
243
247
  active: { type: [Boolean, Object], required: false },
244
248
  activeClass: { type: String, required: false },
245
249
  status: { type: null, required: false },
@@ -256,6 +260,8 @@ const origamDialogRef = ref();
256
260
  const slots = useSlots();
257
261
  const isActive = useVModel(props, "modelValue");
258
262
  const validatable = ref(false);
263
+ const rootClasses = computed(() => [props.class]);
264
+ const rootStyles = computed(() => props.style);
259
265
  const dialogProps = computed(() => {
260
266
  return origamDialogRef.value?.filterProps(props, ["class", "style", "id", "modelValue"]);
261
267
  });
@@ -175,6 +175,8 @@ const props = defineProps({
175
175
  appendIcon: { type: null, required: false },
176
176
  prependAvatar: { type: String, required: false },
177
177
  prependIcon: { type: null, required: false },
178
+ prependAriaLabel: { type: String, required: false },
179
+ appendAriaLabel: { type: String, required: false },
178
180
  ripple: { type: [Boolean, Object], required: false },
179
181
  active: { type: [Boolean, Object], required: false },
180
182
  activeClass: { type: String, required: false },
@@ -20,8 +20,7 @@
20
20
  v-if="hasPrepend"
21
21
  key="prepend"
22
22
  class="origam-expansion-panel-header__prepend"
23
- :role="isPrependClickable ? 'button' : undefined"
24
- :tabindex="isPrependClickable ? 0 : undefined"
23
+ v-bind="prependCommandAttrs"
25
24
  @click="handleClickPrepend"
26
25
  @keydown="handleKeydownPrepend"
27
26
  >
@@ -65,8 +64,7 @@
65
64
  v-if="hasAppend || !hideActions"
66
65
  key="append"
67
66
  class="origam-expansion-panel-header__append"
68
- :role="isAppendClickable ? 'button' : undefined"
69
- :tabindex="isAppendClickable ? 0 : undefined"
67
+ v-bind="appendCommandAttrs"
70
68
  @click="handleClickAppend"
71
69
  @keydown="handleKeydownAppend"
72
70
  >
@@ -163,6 +161,8 @@ const props = defineProps({
163
161
  appendIcon: { type: null, required: false },
164
162
  prependAvatar: { type: String, required: false },
165
163
  prependIcon: { type: null, required: false },
164
+ prependAriaLabel: { type: String, required: false },
165
+ appendAriaLabel: { type: String, required: false },
166
166
  ripple: { type: [Boolean, Object], required: false },
167
167
  active: { type: [Boolean, Object], required: false },
168
168
  activeClass: { type: String, required: false },
@@ -207,8 +207,8 @@ const hasTitle = computed(() => {
207
207
  const {
208
208
  hasAppend,
209
209
  hasPrepend,
210
- isPrependClickable,
211
- isAppendClickable,
210
+ prependCommandAttrs,
211
+ appendCommandAttrs,
212
212
  onClickPrepend: handleClickPrepend,
213
213
  onClickAppend: handleClickAppend,
214
214
  onKeydownPrepend: handleKeydownPrepend,
@@ -40,8 +40,7 @@
40
40
  v-if="hasPrependInner"
41
41
  key="prependInner"
42
42
  class="origam-field__prepend-inner"
43
- :role="isPrependInnerClickable ? 'button' : undefined"
44
- :tabindex="isPrependInnerClickable ? 0 : undefined"
43
+ v-bind="prependInnerCommandAttrs"
45
44
  @click="handleClickPrependInner"
46
45
  @keydown="handleKeydownPrependInner"
47
46
  >
@@ -129,8 +128,7 @@
129
128
  v-if="hasAppendInner"
130
129
  key="appendInner"
131
130
  class="origam-field__append-inner"
132
- :role="isAppendInnerClickable ? 'button' : undefined"
133
- :tabindex="isAppendInnerClickable ? 0 : undefined"
131
+ v-bind="appendInnerCommandAttrs"
134
132
  @click="handleClickAppendInner"
135
133
  @keydown="handleKeydownAppendInner"
136
134
  >
@@ -174,7 +172,7 @@
174
172
  </template>
175
173
 
176
174
  <script lang="ts" setup>
177
- import { computed, onMounted, ref, StyleValue, useAttrs, useSlots, watch } from "vue";
175
+ import { computed, onBeforeUnmount, onMounted, ref, StyleValue, useAttrs, useSlots, watch } from "vue";
178
176
  import OrigamAvatar from "../Avatar/OrigamAvatar.vue";
179
177
  import OrigamExpandX from "../Transition/OrigamExpandX.vue";
180
178
  import OrigamIcon from "../Icon/OrigamIcon.vue";
@@ -196,6 +194,7 @@ import { useStateFlag } from "../../composables/Commons/stateFlag.composable";
196
194
  import { useStyle } from "../../composables/Commons/style.composable";
197
195
  import { useTypography } from "../../composables/Commons/typography.composable";
198
196
  import { useVariant } from "../../composables/Commons/variant.composable";
197
+ import { IN_BROWSER } from "../../consts/Commons/commons.const";
199
198
  import vContrast from "../../directives/Contrast/contrast.directive";
200
199
  import { DENSITY } from "../../enums/Commons/density.enum";
201
200
  import { EASING } from "../../enums/Transition/transition.enum";
@@ -233,6 +232,8 @@ const props = defineProps({
233
232
  prependInnerIcon: { type: null, required: false },
234
233
  clearIcon: { type: null, required: false, default: MDI_ICONS.CLOSE_CIRCLE_OUTLINE },
235
234
  clearable: { type: Boolean, required: false },
235
+ prependInnerAriaLabel: { type: String, required: false },
236
+ appendInnerAriaLabel: { type: String, required: false },
236
237
  border: { type: [Boolean, Number, String, Array], required: false, skipCheck: true },
237
238
  borderTop: { type: [Boolean, Number, String], required: false },
238
239
  borderLeft: { type: [Boolean, Number, String], required: false },
@@ -286,13 +287,13 @@ const slots = useSlots();
286
287
  const attrs = useAttrs();
287
288
  const { t } = useLocale();
288
289
  const {
290
+ prependInnerCommandAttrs,
291
+ appendInnerCommandAttrs,
289
292
  hasAppendInner,
290
293
  onClickAppendInner: handleClickAppendInner,
291
294
  onClickPrependInner: handleClickPrependInner,
292
295
  onKeydownAppendInner: handleKeydownAppendInner,
293
296
  onKeydownPrependInner: handleKeydownPrependInner,
294
- isAppendInnerClickable,
295
- isPrependInnerClickable,
296
297
  clickClear: handleClickClear,
297
298
  hasPrependInner,
298
299
  hasClear
@@ -401,6 +402,21 @@ const { isOn: active, config: activeState, toggle: handleActive } = useStateFlag
401
402
  const isActive = computed(() => {
402
403
  return props.dirty || active.value || hasPrefix.value || hasSuffix.value;
403
404
  });
405
+ const labelFrames = /* @__PURE__ */ new Set();
406
+ let disposed = false;
407
+ const scheduleLabelFrame = (cb) => {
408
+ if (disposed || !IN_BROWSER) return;
409
+ const id2 = requestAnimationFrame(() => {
410
+ labelFrames.delete(id2);
411
+ cb();
412
+ });
413
+ labelFrames.add(id2);
414
+ };
415
+ onBeforeUnmount(() => {
416
+ disposed = true;
417
+ for (const id2 of labelFrames) cancelAnimationFrame(id2);
418
+ labelFrames.clear();
419
+ });
404
420
  onMounted(() => {
405
421
  watch(isFocused, (newVal, oldVal) => {
406
422
  if (newVal !== oldVal) {
@@ -411,7 +427,7 @@ onMounted(() => {
411
427
  if (hasLabel.value && newVal !== oldVal) {
412
428
  const el = origamLabelRef.value.$el;
413
429
  const targetEl = origamFloatingLabelRef.value.$el;
414
- requestAnimationFrame(() => {
430
+ scheduleLabelFrame(() => {
415
431
  const rect = nullifyTransforms(el);
416
432
  const targetRect = targetEl.getBoundingClientRect();
417
433
  const x = targetRect.x - rect.x;
@@ -569,8 +585,23 @@ defineExpose({
569
585
  // Floor the inline padding at the effective radius (capped at the control
570
586
  // height for pills). Prepended fields opt out below — their prepend icon
571
587
  // already fills the corner.
588
+ //
589
+ // ⛔ LE PLANCHER EST UN CANAL, PAS UNE EXPRESSION FIGEE (#800).
590
+ // Un champ dont le contenu est CENTRE et sans etiquette (OtpInputField)
591
+ // n'a aucun risque de collision avec le coin : le plancher n'y a pas
592
+ // lieu d'etre, et l'appliquer decentre le chiffre. Ce cas s'exprimait
593
+ // jusqu'ici par un `--origam-field---padding-start: 0` SANS UNITE, qui
594
+ // melange `<number>` et `<length>` dans le `max()` et fait JETER la
595
+ // declaration entiere au computed-value time. Le rendu voulu etait donc
596
+ // obtenu par une erreur CSS — mesure Chromium : mettre l'unite donne
597
+ // `padding-inline-start: 4px` avec `padding-inline-end: 0px`, soit un
598
+ // chiffre decentre de 2px. Un consommateur qui veut vraiment zero met
599
+ // desormais `--origam-field---corner-clearance: 0px` : c'est explicite,
600
+ // ca survit a un refactor du `max()`, et ca ne repose sur rien d'invalide.
601
+ --origam-field---corner-clearance:
602
+ min(var(--origam-field---border-radius, 8px), var(--origam-input__control---height, 36px));
572
603
  padding-inline:
573
- max(var(--origam-field---padding-start), min(var(--origam-field---border-radius, 8px), var(--origam-input__control---height, 36px)))
604
+ max(var(--origam-field---padding-start), var(--origam-field---corner-clearance))
574
605
  var(--origam-field---padding-end);
575
606
  backdrop-filter: var(--origam-field---backdrop-filter, none);
576
607
  -webkit-backdrop-filter: var(--origam-field---backdrop-filter, none);
@@ -614,7 +645,7 @@ defineExpose({
614
645
  padding-bottom: var(--origam-field__input---padding-bottom);
615
646
  position: relative;
616
647
  width: 100%;
617
- row-gap: calc(8px - var(--origam-input---density, 0));
648
+ row-gap: calc(8px - var(--origam-input---density, 0px));
618
649
  border: none;
619
650
  background: transparent;
620
651
 
@@ -746,9 +777,9 @@ defineExpose({
746
777
  &__label {
747
778
  contain: layout paint;
748
779
  display: block;
749
- margin-inline-start: var(--origam-field__input---padding-start, 0);
750
- margin-inline-end: var(--origam-field__input---padding-end, 0);
751
- max-width: calc(100% - var(--origam-field__input---padding-start, 0) - var(--origam-field__input---padding-end, 0));
780
+ margin-inline-start: var(--origam-field__input---padding-start, 0px);
781
+ margin-inline-end: var(--origam-field__input---padding-end, 0px);
782
+ max-width: calc(100% - var(--origam-field__input---padding-start, 0px) - var(--origam-field__input---padding-end, 0px));
752
783
  pointer-events: none;
753
784
  position: absolute;
754
785
  top: calc(var(--origam-input---padding-top, 16px) + var(--origam-input---density, 0px) - 8px);
@@ -778,7 +809,8 @@ defineExpose({
778
809
 
779
810
  #{$this}__outline {
780
811
  &--start {
781
- flex: 0 0 max(var(--origam-field---padding-start), min(var(--origam-field---border-radius, 8px), var(--origam-input__control---height, 36px)));
812
+ // Meme plancher que le padding, meme canal — cf. #800.
813
+ flex: 0 0 max(var(--origam-field---padding-start), var(--origam-field---corner-clearance));
782
814
  }
783
815
 
784
816
  &--end {
@@ -1083,7 +1115,7 @@ defineExpose({
1083
1115
  // label"). Keep the 4px on the inline-end for notch
1084
1116
  // breathing room.
1085
1117
  margin-block: 0;
1086
- margin-inline: var(--origam-field__input---padding-start, 0) 4px;
1118
+ margin-inline: var(--origam-field__input---padding-start, 0px) 4px;
1087
1119
  }
1088
1120
  }
1089
1121
 
@@ -454,6 +454,8 @@ const props = defineProps({
454
454
  prependInnerIcon: { type: null, required: false, default: MDI_ICONS.PAPERCLIP },
455
455
  clearIcon: { type: null, required: false },
456
456
  clearable: { type: Boolean, required: false, default: true },
457
+ prependInnerAriaLabel: { type: String, required: false },
458
+ appendInnerAriaLabel: { type: String, required: false },
457
459
  border: { type: [Boolean, Number, String, Array], required: false, skipCheck: true, default: true },
458
460
  borderTop: { type: [Boolean, Number, String], required: false },
459
461
  borderLeft: { type: [Boolean, Number, String], required: false },
@@ -520,7 +522,9 @@ const props = defineProps({
520
522
  appendAvatar: { type: String, required: false },
521
523
  appendIcon: { type: null, required: false },
522
524
  prependAvatar: { type: String, required: false },
523
- prependIcon: { type: null, required: false }
525
+ prependIcon: { type: null, required: false },
526
+ prependAriaLabel: { type: String, required: false },
527
+ appendAriaLabel: { type: String, required: false }
524
528
  });
525
529
  const isDropzoneMode = computed(() => Boolean(props.dropzone || props.dragndrop));
526
530
  const displayMode = computed(() => {
@@ -6,7 +6,7 @@
6
6
  :style="iconStyles"
7
7
  >
8
8
  <svg
9
- aria-hidden="true"
9
+ :aria-hidden="ariaHidden"
10
10
  class="origam-icon__svg"
11
11
  focusable="false"
12
12
  viewBox="0 0 24 24"
@@ -40,6 +40,7 @@ import { computed, StyleValue, toRef } from "vue";
40
40
  import { useBorder } from "../../composables/Commons/border.composable";
41
41
  import { useBothColor } from "../../composables/Commons/bothColor.composable";
42
42
  import { useDimension } from "../../composables/Commons/dimension.composable";
43
+ import { useIconAccessibility } from "../../composables/Icon/iconAccessibility.composable";
43
44
  import { useMargin } from "../../composables/Commons/margin.composable";
44
45
  import { usePadding } from "../../composables/Commons/padding.composable";
45
46
  import { useProps } from "../../composables/Commons/props.composable";
@@ -101,6 +102,7 @@ defineSlots();
101
102
  const isArray = (data) => {
102
103
  return Array.isArray(data);
103
104
  };
105
+ const { ariaHidden } = useIconAccessibility();
104
106
  const { colorClasses, colorStyles } = useBothColor(toRef(props, "bgColor"), toRef(props, "color"));
105
107
  const { borderClasses, borderStyles } = useBorder(props);
106
108
  const { paddingClasses, paddingStyles } = usePadding(props);
@@ -260,8 +260,11 @@ const getSrc = () => {
260
260
  if (img) currentSrc.value = img.currentSrc || img.src;
261
261
  };
262
262
  let timer = -1;
263
+ const bootFrames = /* @__PURE__ */ new Set();
263
264
  onBeforeUnmount(() => {
264
265
  clearTimeout(timer);
266
+ for (const id2 of bootFrames) cancelAnimationFrame(id2);
267
+ bootFrames.clear();
265
268
  });
266
269
  const pollForSize = (img, timeout = 100) => {
267
270
  const poll = () => {
@@ -285,11 +288,15 @@ let stop = null;
285
288
  const markBooted = (val) => {
286
289
  if (val) {
287
290
  if (IN_BROWSER) {
288
- requestAnimationFrame(() => {
289
- requestAnimationFrame(() => {
291
+ const outer = requestAnimationFrame(() => {
292
+ bootFrames.delete(outer);
293
+ const inner = requestAnimationFrame(() => {
294
+ bootFrames.delete(inner);
290
295
  isBooted.value = true;
291
296
  });
297
+ bootFrames.add(inner);
292
298
  });
299
+ bootFrames.add(outer);
293
300
  }
294
301
  stop?.();
295
302
  }
@@ -115,7 +115,7 @@
115
115
  </template>
116
116
 
117
117
  <script lang="ts" setup>
118
- import { computed, nextTick, onMounted, ref, shallowRef, StyleValue, toRef } from "vue";
118
+ import { computed, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, StyleValue, toRef } from "vue";
119
119
  import OrigamBtn from "../Btn/OrigamBtn.vue";
120
120
  import OrigamInfiniteScrollIntersect from "./OrigamInfiniteScrollIntersect.vue";
121
121
  import OrigamProgress from "../Progress/OrigamProgress.vue";
@@ -125,6 +125,7 @@ import { useLocale } from "../../composables/Commons/locale.composable";
125
125
  import { useProps } from "../../composables/Commons/props.composable";
126
126
  import { useStyle } from "../../composables/Commons/style.composable";
127
127
  import { useTypography } from "../../composables/Commons/typography.composable";
128
+ import { IN_BROWSER } from "../../consts/Commons/commons.const";
128
129
  import { DIRECTION } from "../../enums/Commons/direction.enum";
129
130
  import { INFINITE_SCROLL_MODE, INFINITE_SCROLL_SIDE, INFINITE_SCROLL_STATUS } from "../../enums/InfiniteScroll/infinite-scroll.enum";
130
131
  import { PROGRESS_TYPE } from "../../enums/Progress/progress.enum";
@@ -213,25 +214,40 @@ const handleIntersect = ({ side, isIntersecting: _isIntersecting }) => {
213
214
  intersecting(side);
214
215
  }
215
216
  };
217
+ const frames = /* @__PURE__ */ new Set();
218
+ let disposed = false;
219
+ const scheduleFrame = (cb) => {
220
+ if (disposed || !IN_BROWSER) return;
221
+ const id2 = window.requestAnimationFrame(() => {
222
+ frames.delete(id2);
223
+ cb();
224
+ });
225
+ frames.add(id2);
226
+ };
227
+ onBeforeUnmount(() => {
228
+ disposed = true;
229
+ for (const id2 of frames) window.cancelAnimationFrame(id2);
230
+ frames.clear();
231
+ });
232
+ const scheduleFrames = (count, cb) => {
233
+ scheduleFrame(count <= 1 ? cb : () => scheduleFrames(count - 1, cb));
234
+ };
235
+ const rearmIntersect = () => {
236
+ intersecting(currentSide.value);
237
+ };
238
+ const afterDoneTick = () => {
239
+ if (disposed) return;
240
+ if (status.value === INFINITE_SCROLL_STATUS.EMPTY || status.value === INFINITE_SCROLL_STATUS.ERROR) return;
241
+ if (status.value === INFINITE_SCROLL_STATUS.OK && currentSide.value === INFINITE_SCROLL_SIDE.START) {
242
+ setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
243
+ }
244
+ if (props.mode !== INFINITE_SCROLL_MODE.MANUAL) {
245
+ nextTick(() => scheduleFrames(3, rearmIntersect));
246
+ }
247
+ };
216
248
  const done = (_status) => {
217
249
  status.value = _status;
218
- nextTick(() => {
219
- if (status.value === INFINITE_SCROLL_STATUS.EMPTY || status.value === INFINITE_SCROLL_STATUS.ERROR) return;
220
- if (status.value === INFINITE_SCROLL_STATUS.OK && currentSide.value === INFINITE_SCROLL_SIDE.START) {
221
- setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
222
- }
223
- if (props.mode !== INFINITE_SCROLL_MODE.MANUAL) {
224
- nextTick(() => {
225
- window.requestAnimationFrame(() => {
226
- window.requestAnimationFrame(() => {
227
- window.requestAnimationFrame(() => {
228
- intersecting(currentSide.value);
229
- });
230
- });
231
- });
232
- });
233
- }
234
- });
250
+ nextTick(afterDoneTick);
235
251
  };
236
252
  const intersecting = (side) => {
237
253
  if (props.mode !== "manual" && !isIntersecting.value) return;