origam 2.12.1 → 2.13.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 (128) hide show
  1. package/dist/src/assets/locales/en.json +114 -76
  2. package/dist/src/assets/locales/fr.json +117 -74
  3. package/dist/src/components/BottomNav/OrigamBottomNav.vue +6 -4
  4. package/dist/src/components/Breadcrumb/OrigamBreadcrumb.vue +1 -1
  5. package/dist/src/components/Breadcrumb/OrigamBreadcrumbDivider.vue +1 -1
  6. package/dist/src/components/Breadcrumb/OrigamBreadcrumbItem.vue +2 -2
  7. package/dist/src/components/Btn/OrigamBtn.vue +1 -1
  8. package/dist/src/components/Calendar/OrigamCalendar.vue +3 -3
  9. package/dist/src/components/Carousel/OrigamCarousel.vue +1 -1
  10. package/dist/src/components/Clipboard/OrigamClipboard.vue +1 -1
  11. package/dist/src/components/Code/OrigamCode.vue +1 -1
  12. package/dist/src/components/ColorPicker/OrigamColorPickerCanvas.vue +2 -2
  13. package/dist/src/components/ContextualMenu/OrigamContextualMenu.vue +1 -0
  14. package/dist/src/components/DataTable/OrigamDataTableFooter.vue +8 -8
  15. package/dist/src/components/DataTable/OrigamDataTableHeadersCellMobile.vue +1 -1
  16. package/dist/src/components/DataTable/OrigamDataTableRow.vue +1 -1
  17. package/dist/src/components/DataTable/OrigamDataTableRows.vue +2 -2
  18. package/dist/src/components/DatePicker/OrigamDatePicker.vue +3 -3
  19. package/dist/src/components/DatePickerField/OrigamDatePickerField.vue +1 -1
  20. package/dist/src/components/ExpansionPanel/OrigamExpansionPanelHeader.vue +8 -3
  21. package/dist/src/components/FileField/OrigamFileField.vue +8 -8
  22. package/dist/src/components/InfiniteScroll/OrigamInfiniteScroll.vue +2 -2
  23. package/dist/src/components/List/OrigamList.vue +7 -0
  24. package/dist/src/components/List/OrigamListItem.vue +71 -3
  25. package/dist/src/components/Media/OrigamMediaController.vue +9 -9
  26. package/dist/src/components/Menu/OrigamMenu.vue +6 -1
  27. package/dist/src/components/Pagination/OrigamPagination.vue +8 -8
  28. package/dist/src/components/RatingField/OrigamRatingFieldItem.vue +1 -1
  29. package/dist/src/components/Select/OrigamSelect.vue +7 -2
  30. package/dist/src/components/SelectionControl/OrigamSelectionControl.vue +6 -3
  31. package/dist/src/components/SelectionControl/OrigamSelectionControlGroup.vue +15 -0
  32. package/dist/src/components/Stepper/OrigamStepper.vue +1 -1
  33. package/dist/src/components/Stepper/OrigamStepperItem.vue +1 -1
  34. package/dist/src/components/Switch/OrigamSwitch.vue +453 -449
  35. package/dist/src/components/TextField/OrigamTextField.vue +4 -1
  36. package/dist/src/components/TextareaField/OrigamRichToolbar.vue +8 -8
  37. package/dist/src/components/TextareaField/OrigamTextareaField.vue +1 -1
  38. package/dist/src/components/Title/OrigamTitle.vue +6 -4
  39. package/dist/src/components/Video/OrigamVideo.vue +3 -3
  40. package/dist/src/composables/Commons/group.composable.cjs +2 -2
  41. package/dist/src/composables/Commons/group.composable.js +2 -2
  42. package/dist/src/composables/Commons/style.composable.cjs +14 -12
  43. package/dist/src/composables/Commons/style.composable.d.ts +16 -2
  44. package/dist/src/composables/Commons/style.composable.js +16 -14
  45. package/dist/src/consts/Btn/btn-toggle.const.cjs +1 -1
  46. package/dist/src/consts/Btn/btn-toggle.const.js +1 -1
  47. package/dist/src/consts/Chip/chip-group.const.cjs +1 -1
  48. package/dist/src/consts/Chip/chip-group.const.js +1 -1
  49. package/dist/src/consts/Commons/date.const.cjs +2 -2
  50. package/dist/src/consts/Commons/date.const.js +2 -2
  51. package/dist/src/consts/Commons/defaults.const.cjs +1 -1
  52. package/dist/src/consts/Commons/defaults.const.js +1 -1
  53. package/dist/src/consts/Commons/display.const.cjs +1 -1
  54. package/dist/src/consts/Commons/display.const.js +1 -1
  55. package/dist/src/consts/Commons/forwardRefs.const.cjs +1 -1
  56. package/dist/src/consts/Commons/forwardRefs.const.js +1 -1
  57. package/dist/src/consts/Commons/goTo.const.cjs +1 -1
  58. package/dist/src/consts/Commons/goTo.const.js +1 -1
  59. package/dist/src/consts/Commons/hover.const.cjs +1 -1
  60. package/dist/src/consts/Commons/hover.const.js +1 -1
  61. package/dist/src/consts/Commons/layout.const.cjs +2 -2
  62. package/dist/src/consts/Commons/layout.const.js +2 -2
  63. package/dist/src/consts/Commons/locale.const.cjs +1 -1
  64. package/dist/src/consts/Commons/locale.const.js +1 -1
  65. package/dist/src/consts/Commons/nested.const.cjs +1 -1
  66. package/dist/src/consts/Commons/nested.const.js +1 -1
  67. package/dist/src/consts/Commons/ripple.const.cjs +1 -1
  68. package/dist/src/consts/Commons/ripple.const.js +1 -1
  69. package/dist/src/consts/Commons/stack.const.cjs +1 -1
  70. package/dist/src/consts/Commons/stack.const.js +1 -1
  71. package/dist/src/consts/DataTable/expand.const.cjs +1 -1
  72. package/dist/src/consts/DataTable/expand.const.js +1 -1
  73. package/dist/src/consts/DataTable/group.const.cjs +1 -1
  74. package/dist/src/consts/DataTable/group.const.js +1 -1
  75. package/dist/src/consts/DataTable/headers.const.cjs +1 -1
  76. package/dist/src/consts/DataTable/headers.const.js +1 -1
  77. package/dist/src/consts/DataTable/pagination.const.cjs +1 -1
  78. package/dist/src/consts/DataTable/pagination.const.js +1 -1
  79. package/dist/src/consts/DataTable/select.const.cjs +2 -2
  80. package/dist/src/consts/DataTable/select.const.js +2 -2
  81. package/dist/src/consts/DataTable/sort.const.cjs +1 -1
  82. package/dist/src/consts/DataTable/sort.const.js +1 -1
  83. package/dist/src/consts/ExpansionPanel/expansion-panel.const.cjs +1 -1
  84. package/dist/src/consts/ExpansionPanel/expansion-panel.const.js +1 -1
  85. package/dist/src/consts/Form/form.const.cjs +1 -1
  86. package/dist/src/consts/Form/form.const.js +1 -1
  87. package/dist/src/consts/Icon/icon.const.cjs +1 -1
  88. package/dist/src/consts/Icon/icon.const.js +1 -1
  89. package/dist/src/consts/ItemGroup/item-group.const.cjs +1 -1
  90. package/dist/src/consts/ItemGroup/item-group.const.js +1 -1
  91. package/dist/src/consts/List/list.const.cjs +1 -1
  92. package/dist/src/consts/List/list.const.js +1 -1
  93. package/dist/src/consts/Menu/menu.const.cjs +1 -1
  94. package/dist/src/consts/Menu/menu.const.js +1 -1
  95. package/dist/src/consts/Parallax/parallax-container.const.cjs +1 -1
  96. package/dist/src/consts/Parallax/parallax-container.const.js +1 -1
  97. package/dist/src/consts/Parallax/parallax-layer.const.cjs +1 -1
  98. package/dist/src/consts/Parallax/parallax-layer.const.js +1 -1
  99. package/dist/src/consts/SelectionControl/selection-control.const.cjs +1 -1
  100. package/dist/src/consts/SelectionControl/selection-control.const.js +1 -1
  101. package/dist/src/consts/Slide/slide-group.const.cjs +1 -1
  102. package/dist/src/consts/Slide/slide-group.const.js +1 -1
  103. package/dist/src/consts/Stepper/stepper.const.cjs +1 -1
  104. package/dist/src/consts/Stepper/stepper.const.js +1 -1
  105. package/dist/src/consts/Tabs/tabs.const.cjs +3 -3
  106. package/dist/src/consts/Tabs/tabs.const.js +3 -3
  107. package/dist/src/consts/Theme/theme.const.cjs +2 -2
  108. package/dist/src/consts/Theme/theme.const.js +2 -2
  109. package/dist/src/consts/Timeline/timeline.const.cjs +1 -1
  110. package/dist/src/consts/Timeline/timeline.const.js +1 -1
  111. package/dist/src/consts/Treeview/treeview.const.cjs +1 -1
  112. package/dist/src/consts/Treeview/treeview.const.js +1 -1
  113. package/dist/src/consts/Window/window.const.cjs +2 -2
  114. package/dist/src/consts/Window/window.const.js +2 -2
  115. package/dist/src/interfaces/Commons/commons.interface.d.ts +18 -0
  116. package/dist/src/interfaces/List/list-item.interface.d.ts +15 -2
  117. package/dist/src/interfaces/List/list.interface.d.ts +10 -2
  118. package/dist/src/interfaces/Pagination/pagination.interface.d.ts +2 -2
  119. package/dist/src/nuxt/module.cjs +3 -2
  120. package/dist/src/nuxt/module.js +2 -1
  121. package/dist/src/origam.cjs +3 -2
  122. package/dist/src/origam.js +3 -2
  123. package/dist/src/services/Commons/circular-buffer.service.cjs +1 -0
  124. package/dist/src/services/Commons/circular-buffer.service.js +1 -0
  125. package/dist/src/utils/Commons/dom.util.cjs +32 -0
  126. package/dist/src/utils/Commons/dom.util.d.ts +1 -0
  127. package/dist/src/utils/Commons/dom.util.js +31 -0
  128. package/package.json +10 -5
@@ -13,7 +13,7 @@
13
13
  <template v-if="hasPrepend">
14
14
  <span
15
15
  key="prepend"
16
- class="origam-breadcrumbs__prepend"
16
+ class="origam-breadcrumb-item__prepend"
17
17
  @click="handleClickPrepend"
18
18
  >
19
19
  <slot name="prepend">
@@ -40,7 +40,7 @@
40
40
  <template v-if="hasAppend">
41
41
  <span
42
42
  key="append"
43
- class="origam-breadcrumbs__append"
43
+ class="origam-breadcrumb-item__append"
44
44
  @click="handleClickAppend"
45
45
  >
46
46
  <slot name="append">
@@ -386,7 +386,7 @@ const btnClasses = computed(() => {
386
386
  props.class
387
387
  ];
388
388
  });
389
- const { id, css, load, isLoaded, unload } = useStyle(btnStyles);
389
+ const { id, css, load, isLoaded, unload } = useStyle(btnStyles, () => props.id);
390
390
  defineExpose({
391
391
  group,
392
392
  filterProps,
@@ -459,13 +459,13 @@ const VIEW_LABEL_FALLBACK = {
459
459
  function viewLabel(view) {
460
460
  return t(`origam.calendar.view.${view}`, VIEW_LABEL_FALLBACK[view]);
461
461
  }
462
- const ariaLabel = computed(() => t("origam.calendar.ariaLabel", "Calendar"));
462
+ const ariaLabel = computed(() => t("origam.calendar.aria_label", "Calendar"));
463
463
  const ariaToolbarLabel = computed(() => t("origam.calendar.toolbar", "Calendar toolbar"));
464
464
  const ariaPrevLabel = computed(() => t("origam.calendar.previous", "Previous"));
465
465
  const ariaNextLabel = computed(() => t("origam.calendar.next", "Next"));
466
466
  const ariaTodayLabel = computed(() => t("origam.calendar.today", "Today"));
467
- const ariaViewListLabel = computed(() => t("origam.calendar.viewSwitcher", "View"));
468
- const ariaMonthLabel = computed(() => t("origam.calendar.monthGrid", "Month grid"));
467
+ const ariaViewListLabel = computed(() => t("origam.calendar.view_switcher", "View"));
468
+ const ariaMonthLabel = computed(() => t("origam.calendar.month_grid", "Month grid"));
469
469
  const todayLabel = computed(() => t("origam.calendar.today", "Today"));
470
470
  const emptyLabel = computed(() => t("origam.calendar.empty", "No events to display"));
471
471
  const slotPx = DEFAULT_SLOT_HEIGHT_PX;
@@ -243,7 +243,7 @@ const controlProps = (item, index, group) => {
243
243
  item,
244
244
  {
245
245
  id: `carousel-item-${item.id}`,
246
- "aria-label": t("origam.carousel.ariaLabel.delimiter", index + 1, group.items.value.length),
246
+ "aria-label": t("origam.carousel.aria_label.delimiter", index + 1, group.items.value.length),
247
247
  // The SELECTED dot is active. When the consumer passes an
248
248
  // `active` STATE object, the selected dot wears that surface
249
249
  // (forced); otherwise it just reads as active. Hover applies
@@ -108,7 +108,7 @@ const { t } = useLocale();
108
108
  const resolvedFeedbackText = computed(() => props.successText ?? props.feedbackText ?? "Copied!");
109
109
  const defaultIcon = MDI_ICONS.CONTENT_COPY;
110
110
  const defaultAriaLabel = computed(
111
- () => copied.value ? t("origam.clipboard.copiedAriaLabel", "Value copied to clipboard") : t("origam.clipboard.copyAriaLabel", "Copy to clipboard")
111
+ () => copied.value ? t("origam.clipboard.copied_aria_label", "Value copied to clipboard") : t("origam.clipboard.copy_aria_label", "Copy to clipboard")
112
112
  );
113
113
  async function handleCopy() {
114
114
  if (props.disabled) return false;
@@ -267,7 +267,7 @@ const copyButtonLabel = computed(
267
267
  () => copied.value ? t("origam.code.copied", "Copied!") : t("origam.code.copy", "Copy")
268
268
  );
269
269
  const copyAriaLabel = computed(
270
- () => copied.value ? t("origam.code.copiedAriaLabel", "Code copied to clipboard") : t("origam.code.copyAriaLabel", "Copy code to clipboard")
270
+ () => copied.value ? t("origam.code.copied_aria_label", "Code copied to clipboard") : t("origam.code.copy_aria_label", "Copy code to clipboard")
271
271
  );
272
272
  const copyBtnStyle = {
273
273
  padding: "var(--origam-code__copy---padding-block) var(--origam-code__copy---padding-inline)"
@@ -128,12 +128,12 @@ const updateCanvas = () => {
128
128
  ctx.fillRect(0, 0, canvas.width, canvas.height);
129
129
  };
130
130
  const canvasAriaLabel = computed(() => {
131
- return props.ariaLabel ?? t("origam.colorPicker.canvas.ariaLabel");
131
+ return props.ariaLabel ?? t("origam.color_picker.canvas.aria_label");
132
132
  });
133
133
  const canvasAriaValueText = computed(() => {
134
134
  const s = Math.round((props.colorHsv?.s ?? 0) * 100);
135
135
  const v = Math.round((props.colorHsv?.v ?? 0) * 100);
136
- return t("origam.colorPicker.canvas.value", s, v);
136
+ return t("origam.color_picker.canvas.value", s, v);
137
137
  });
138
138
  const STEP_SMALL = 0.01;
139
139
  const STEP_LARGE = 0.05;
@@ -92,6 +92,7 @@ const props = defineProps({
92
92
  borderBottomColor: { type: [String, Object, Boolean, null], required: false, skipCheck: true },
93
93
  borderLeftColor: { type: [String, Object, Boolean, null], required: false, skipCheck: true },
94
94
  density: { type: null, required: false },
95
+ size: { type: null, required: false },
95
96
  rounded: { type: [Boolean, Number, String, null], required: false, skipCheck: true },
96
97
  roundedTopRight: { type: [Boolean, Number, String], required: false },
97
98
  roundedTopLeft: { type: [Boolean, Number, String], required: false },
@@ -50,18 +50,18 @@ const props = defineProps({
50
50
  nextIcon: { type: null, required: false },
51
51
  firstIcon: { type: null, required: false },
52
52
  lastIcon: { type: null, required: false },
53
- itemsPerPageText: { type: String, required: false, default: "origam.dataFooter.itemsPerPageText" },
54
- pageText: { type: String, required: false, default: "origam.dataFooter.pageText" },
55
- firstPageLabel: { type: String, required: false, default: "origam.dataFooter.firstPage" },
56
- prevPageLabel: { type: String, required: false, default: "origam.dataFooter.prevPage" },
57
- nextPageLabel: { type: String, required: false, default: "origam.dataFooter.nextPage" },
58
- lastPageLabel: { type: String, required: false, default: "origam.dataFooter.lastPage" },
53
+ itemsPerPageText: { type: String, required: false, default: "origam.data_footer.items_per_page_text" },
54
+ pageText: { type: String, required: false, default: "origam.data_footer.page_text" },
55
+ firstPageLabel: { type: String, required: false, default: "origam.data_footer.first_page" },
56
+ prevPageLabel: { type: String, required: false, default: "origam.data_footer.prev_page" },
57
+ nextPageLabel: { type: String, required: false, default: "origam.data_footer.next_page" },
58
+ lastPageLabel: { type: String, required: false, default: "origam.data_footer.last_page" },
59
59
  itemsPerPageOptions: { type: Array, required: false, default: () => [
60
60
  { value: 10, title: "10" },
61
61
  { value: 25, title: "25" },
62
62
  { value: 50, title: "50" },
63
63
  { value: 100, title: "100" },
64
- { value: -1, title: "origam.dataFooter.itemsPerPageAll" }
64
+ { value: -1, title: "origam.data_footer.items_per_page_all" }
65
65
  ] },
66
66
  showCurrentPage: { type: Boolean, required: false, default: true },
67
67
  id: { type: String, required: false },
@@ -90,7 +90,7 @@ const itemsPerPageOptions = computed(() => props.itemsPerPageOptions.map((option
90
90
  if (typeof option === "number") {
91
91
  return {
92
92
  value: option,
93
- title: option === -1 ? t("origam.dataFooter.itemsPerPageAll") : String(option)
93
+ title: option === -1 ? t("origam.data_footer.items_per_page_all") : String(option)
94
94
  };
95
95
  }
96
96
  return {
@@ -13,7 +13,7 @@
13
13
  :append-icon="appendIcon"
14
14
  :density="DENSITY.DEFAULT"
15
15
  :items="displayItems"
16
- :label="t('origam.dataTable.sortBy')"
16
+ :label="t('origam.data_table.sort_by')"
17
17
  :multiple="multiSort"
18
18
  chips
19
19
  class="origam-data-table-headers-cell__sort-select"
@@ -43,7 +43,7 @@
43
43
  >
44
44
  <origam-btn
45
45
  :aria-expanded="isExpanded(item)"
46
- :aria-label="isExpanded(item) ? t('origam.dataTableRow.collapseRow', 'Collapse row') : t('origam.dataTableRow.expandRow', 'Expand row')"
46
+ :aria-label="isExpanded(item) ? t('origam.data_table_row.collapse_row', 'Collapse row') : t('origam.data_table_row.expand_row', 'Expand row')"
47
47
  :icon="isExpanded(item) ? MDI_ICONS.CHEVRON_UP : MDI_ICONS.CHEVRON_DOWN"
48
48
  :size="SIZES.SMALL"
49
49
  @click="handleBtnClick"
@@ -90,14 +90,14 @@ const attrs = useAttrs();
90
90
  const props = defineProps({
91
91
  hideNoData: { type: Boolean, required: false },
92
92
  items: { type: Array, required: false },
93
- noDataText: { type: String, required: false, default: "origam.noDataText" },
93
+ noDataText: { type: String, required: false, default: "origam.no_data_text" },
94
94
  rowProps: { type: [Object, Function], required: false },
95
95
  cellProps: { type: [Object, Function], required: false },
96
96
  id: { type: String, required: false },
97
97
  class: { type: [String, Array, Object], required: false },
98
98
  style: { type: [String, Array, Object, Boolean, null], required: false, skipCheck: true },
99
99
  loading: { type: [Boolean, Number, Object], required: false },
100
- loadingText: { type: String, required: false, default: "origam.dataIterator.loadingText" },
100
+ loadingText: { type: String, required: false, default: "origam.data_iterator.loading_text" },
101
101
  tag: { type: String, required: false },
102
102
  color: { type: [String, Object, Boolean, null], required: false, skipCheck: true },
103
103
  mobileBreakpoint: { type: null, required: false }
@@ -174,7 +174,7 @@ const props = defineProps({
174
174
  active: { type: [Boolean, Object], required: false },
175
175
  activeClass: { type: String, required: false },
176
176
  hover: { type: [Boolean, Object], required: false },
177
- title: { type: String, required: false, default: "origam.datePicker.title" },
177
+ title: { type: String, required: false, default: "origam.date_picker.title" },
178
178
  fontFamily: { type: String, required: false },
179
179
  fontSize: { type: String, required: false },
180
180
  fontWeight: { type: String, required: false },
@@ -206,7 +206,7 @@ const props = defineProps({
206
206
  weekdays: { type: Array, required: false },
207
207
  weeksInMonth: { type: null, required: false, default: CALENDAR_STRATEGY.STATIC },
208
208
  firstDayOfWeek: { type: Number, required: false },
209
- header: { type: String, required: false, default: "origam.datePicker.header" },
209
+ header: { type: String, required: false, default: "origam.date_picker.header" },
210
210
  appendAvatar: { type: String, required: false },
211
211
  appendIcon: { type: null, required: false },
212
212
  prependAvatar: { type: String, required: false },
@@ -244,7 +244,7 @@ const year = ref(Number(props.year ?? adapter.getYear(adapter.startOfYear(adapte
244
244
  const isReversing = shallowRef(false);
245
245
  const header = computed(() => {
246
246
  if ((props.multiple || props.range) && model.value?.length > 1) {
247
- return t("origam.datePicker.itemsSelected", model.value?.length);
247
+ return t("origam.date_picker.items_selected", model.value?.length);
248
248
  }
249
249
  return model.value?.[0] && adapter.isValid(model.value?.[0]) ? adapter.format(adapter.date(model.value?.[0]), "normalDateWithWeekday") : t(props.header);
250
250
  });
@@ -86,7 +86,7 @@
86
86
  <template v-if="isRange">
87
87
  <span class="origam-date-picker-field__selection-text">
88
88
  <slot name="rangeSelection">
89
- {{ t('origam.datePickerRangeField.text', selectedValues[0], selectedValues[1]) }}
89
+ {{ t('origam.date_picker_range_field.text', selectedValues[0], selectedValues[1]) }}
90
90
  </slot>
91
91
  </span>
92
92
  </template>
@@ -46,10 +46,15 @@
46
46
  class="origam-expansion-panel-header__title"
47
47
  >
48
48
  <slot
49
- name="default"
49
+ name="title"
50
50
  v-bind="slotProps"
51
51
  >
52
- {{ title }}
52
+ <slot
53
+ name="default"
54
+ v-bind="slotProps"
55
+ >
56
+ {{ title }}
57
+ </slot>
53
58
  </slot>
54
59
  </span>
55
60
 
@@ -189,7 +194,7 @@ const slotProps = computed(() => {
189
194
  };
190
195
  });
191
196
  const hasTitle = computed(() => {
192
- return slots.default || props.title;
197
+ return slots.title || slots.default || props.title != null;
193
198
  });
194
199
  const {
195
200
  hasAppend,
@@ -395,8 +395,8 @@ import { filterInputAttrs, forwardRefs, humanReadableFileSize, wrapInArray } fro
395
395
  const _props = defineProps({
396
396
  chips: { type: Boolean, required: false },
397
397
  counter: { type: Boolean, required: false },
398
- counterSizeString: { type: String, required: false, default: "origam.fileField.counterSize" },
399
- counterString: { type: String, required: false, default: "origam.fileField.counter" },
398
+ counterSizeString: { type: String, required: false, default: "origam.file_field.counter_size" },
399
+ counterString: { type: String, required: false, default: "origam.file_field.counter" },
400
400
  placeholder: { type: String, required: false },
401
401
  persistentPlaceholder: { type: Boolean, required: false },
402
402
  persistentCounter: { type: Boolean, required: false },
@@ -414,9 +414,9 @@ const _props = defineProps({
414
414
  downloadIcon: { type: String, required: false, default: MDI_ICONS.DOWNLOAD },
415
415
  downloadable: { type: Boolean, required: false },
416
416
  progress: { type: Array, required: false },
417
- dropzoneTitle: { type: String, required: false, default: "origam.fileField.dropzoneTitle" },
418
- dropzoneSubtitle: { type: String, required: false, default: "origam.fileField.dropzoneSubtitle" },
419
- browseText: { type: String, required: false, default: "origam.fileField.browse" },
417
+ dropzoneTitle: { type: String, required: false, default: "origam.file_field.dropzone_title" },
418
+ dropzoneSubtitle: { type: String, required: false, default: "origam.file_field.dropzone_subtitle" },
419
+ browseText: { type: String, required: false, default: "origam.file_field.browse" },
420
420
  maxFileSizeErrorString: { type: String, required: false, default: "origam.validation.max_size_error" },
421
421
  display: { type: String, required: false, default: "list" },
422
422
  dropzone: { type: Boolean, required: false },
@@ -692,16 +692,16 @@ const fileNames = computed(() => {
692
692
  const selectionText = computed(() => {
693
693
  if (!hasFiles.value) return "";
694
694
  if (props.multiple) {
695
- return t(props.counterString, [model.value?.length ?? 0]);
695
+ return t(props.counterString, model.value?.length ?? 0);
696
696
  }
697
697
  return fileNames.value[0] ?? "";
698
698
  });
699
699
  const counterValue = computed(() => {
700
700
  const fileCount = model.value?.length ?? 0;
701
701
  if (props.showSize) {
702
- return t(props.counterSizeString, [fileCount, totalBytesReadable.value]);
702
+ return t(props.counterSizeString, fileCount, totalBytesReadable.value);
703
703
  }
704
- return t(props.counterString, [fileCount]);
704
+ return t(props.counterString, fileCount);
705
705
  });
706
706
  const hasFiles = computed(() => {
707
707
  return Array.isArray(model.value) && model.value.length > 0;
@@ -134,8 +134,8 @@ import {
134
134
  const props = defineProps({
135
135
  side: { type: null, required: false, default: INFINITE_SCROLL_SIDE.END },
136
136
  mode: { type: null, required: false, default: INFINITE_SCROLL_MODE.INTERSECT },
137
- loadMoreText: { type: String, required: false, default: "origam.infiniteScroll.loadMore" },
138
- emptyText: { type: String, required: false, default: "origam.infiniteScroll.empty" },
137
+ loadMoreText: { type: String, required: false, default: "origam.infinite_scroll.load_more" },
138
+ emptyText: { type: String, required: false, default: "origam.infinite_scroll.empty" },
139
139
  margin: { type: String, required: false },
140
140
  id: { type: String, required: false },
141
141
  class: { type: [String, Array, Object], required: false },
@@ -2,6 +2,7 @@
2
2
  <component
3
3
  :is="tag"
4
4
  :id="id"
5
+ ref="contentRef"
5
6
  :class="listClasses"
6
7
  :style="listStyles"
7
8
  :tabindex="tabIndex"
@@ -132,6 +133,7 @@ const props = defineProps({
132
133
  borderBottomColor: { type: [String, Object, Boolean, null], required: false, skipCheck: true },
133
134
  borderLeftColor: { type: [String, Object, Boolean, null], required: false, skipCheck: true },
134
135
  density: { type: null, required: false, default: DENSITY.DEFAULT },
136
+ size: { type: null, required: false },
135
137
  rounded: { type: [Boolean, Number, String, null], required: false, skipCheck: true },
136
138
  roundedTopRight: { type: [Boolean, Number, String], required: false },
137
139
  roundedTopLeft: { type: [Boolean, Number, String], required: false },
@@ -177,6 +179,7 @@ const { filterProps } = useProps(props);
177
179
  const slotDefaults = computed(() => ({
178
180
  "origam-list-item": {
179
181
  density: props.density,
182
+ size: props.size,
180
183
  color: props.color,
181
184
  bgColor: props.bgColor
182
185
  }
@@ -384,6 +387,10 @@ defineExpose({
384
387
  --origam-list---density: -8px;
385
388
  }
386
389
 
390
+ &--density-comfortable {
391
+ --origam-list---density: 8px;
392
+ }
393
+
387
394
  &__overlay {
388
395
  background-color: var(--origam-list__overlay---background-color, var(--origam-color__overlay---scrim));
389
396
  border-radius: var(--origam-list__overlay---border-radius, inherit);
@@ -124,6 +124,7 @@ import {
124
124
  useList,
125
125
  useNestedItem,
126
126
  useProps,
127
+ useSize,
127
128
  useStateEffect,
128
129
  useStyle,
129
130
  useTypography
@@ -171,6 +172,7 @@ const _props = defineProps({
171
172
  roundedTopLeft: { type: [Boolean, Number, String], required: false },
172
173
  roundedBottomLeft: { type: [Boolean, Number, String], required: false },
173
174
  roundedBottomRight: { type: [Boolean, Number, String], required: false },
175
+ size: { type: null, required: false },
174
176
  tag: { type: String, required: false, default: "div" },
175
177
  href: { type: String, required: false },
176
178
  replace: { type: Boolean, required: false },
@@ -222,6 +224,7 @@ const {
222
224
  const list = useList();
223
225
  const { backgroundColorClasses, backgroundColorStyles } = useBackgroundColor(toRef(props, "bgColor"));
224
226
  const { densityClasses } = useDensity(props);
227
+ const { sizeClasses } = useSize(props);
225
228
  const { isHover, hoverState } = useHover(props);
226
229
  const {
227
230
  borderClasses,
@@ -337,6 +340,7 @@ const listItemClasses = computed(() => {
337
340
  backgroundColorClasses.value,
338
341
  borderClasses.value,
339
342
  densityClasses.value,
343
+ sizeClasses.value,
340
344
  elevationClasses.value,
341
345
  lineClasses.value,
342
346
  roundedClasses.value,
@@ -365,6 +369,11 @@ defineExpose({
365
369
  .origam-list-item {
366
370
  $this: &;
367
371
 
372
+ // Declared locally rather than inherited from the global reset in
373
+ // `assets/scss/main.scss`: the row height is the contract of the
374
+ // `--size-*` rungs below, and it must resolve to the same number
375
+ // whether or not the consumer imported the reset sheet. Same
376
+ // precedent as `.origam-field__input`, which declares it too.
368
377
  align-items: var(--origam-list-item---align-items, center);
369
378
  display: var(--origam-list-item---display, grid);
370
379
  flex: var(--origam-list-item---flex, none);
@@ -372,15 +381,34 @@ defineExpose({
372
381
  grid-template-columns: var(--origam-list-item---grid-template-columns, max-content 1fr auto);
373
382
 
374
383
  max-width: var(--origam-list-item---max-width, 100%);
375
- min-height: calc(var(--origam-list-item---min-height, 40px) + var(--origam-list---density, 0px));
384
+ // Density is added ONCE, on this term only — mirrors
385
+ // `.origam-field__input`'s own `min-height: max(calc(height + density), lineHeight + padding)`.
386
+ // The block padding below stays fixed per rung (no density term), exactly
387
+ // like the field's `--origam-field__input---padding-top/bottom`, which are
388
+ // only rung-dependent. Adding density a second time here (or a third time
389
+ // via the block padding) double/triple-counts it — see the mixin comment.
390
+ // `border-box` is declared here rather than inherited: the rung scale
391
+ // below resolves to a DIFFERENT height under each box model, so leaving
392
+ // it to the consumer's reset made the row depend on whether that reset
393
+ // was loaded. Measured on x-large + comfortable: 60px without the reset
394
+ // (content-box), 52px with it (border-box) — the second is what a built
395
+ // app renders, and it silently broke the control/row match. Declaring
396
+ // the model makes the scale mean one thing everywhere.
397
+ box-sizing: border-box;
398
+
399
+ // Density is added ONCE, on this term only — mirrors
400
+ // `.origam-field__input`'s own `min-height: max(height + density, …)`.
401
+ // Under `border-box` this min-height IS the row height, so the rungs
402
+ // below hand it the FULL rung, not the rung minus its padding.
403
+ min-height: max(calc(var(--origam-list-item---min-height, 56px) + var(--origam-list---density, 0px)), 1.5rem);
376
404
 
377
405
  text-decoration: var(--origam-list-item---text-decoration, none);
378
406
 
379
407
  outline: var(--origam-list-item---outline, none);
380
408
  position: var(--origam-list-item---position, relative);
381
409
 
382
- padding-block-start: calc(var(--origam-list-item---padding-block-start, 8px) + var(--origam-list---density, 0px));
383
- padding-block-end: calc(var(--origam-list-item---padding-block-end, 8px) + var(--origam-list---density, 0px));
410
+ padding-block-start: var(--origam-list-item---padding-block-start, 8px);
411
+ padding-block-end: var(--origam-list-item---padding-block-end, 8px);
384
412
  padding-inline-start: calc(var(--origam-list-item---padding-inline-start, 16px) + var(--origam-list---indent-padding, 0px) + var(--origam-list---density, 0px));
385
413
  padding-inline-end: calc(var(--origam-list-item---padding-inline-end, 16px) + var(--origam-list---density, 0px));
386
414
 
@@ -402,6 +430,46 @@ defineExpose({
402
430
  --origam-list-item---border-radius: 4px;
403
431
  }
404
432
 
433
+ // Row-height scale, aligned rung for rung on the control-height scale
434
+ // (`--origam-input__control---height-{sm,md,lg,xl}` = 28/36/44/52px) so
435
+ // a row and a field of the same `size` share an identical vertical
436
+ // footprint. The block padding is the field's own per-size padding —
437
+ // (rung - 24px title line-height) / 2.
438
+ //
439
+ // The row is `border-box` (declared on the base rule above), so the
440
+ // `min-height` there IS the rendered height: the rung goes in whole,
441
+ // and the block padding only positions the 24px title inside it.
442
+ // Density is NOT touched here — the base rule already applies it once,
443
+ // to `min-height` only, which is where the field applies it too.
444
+ //
445
+ // The result reproduces `.origam-field__input` exactly:
446
+ // `max(controlHeight + density, 1.5rem + paddingTop + paddingBottom)`.
447
+ @mixin size-rung($rung, $block) {
448
+ --origam-list-item---min-height: #{$rung};
449
+ --origam-list-item---padding-block-start: #{$block};
450
+ --origam-list-item---padding-block-end: #{$block};
451
+ }
452
+
453
+ &--size-small {
454
+ @include size-rung(var(--origam-list-item---height-sm, 28px), var(--origam-list-item---padding-block-sm, 2px));
455
+ }
456
+
457
+ // `x-small` maps onto the default rung on purpose: `.origam-field` has no
458
+ // `--size-x-small` rule, so a field at that size renders at 36px. Giving
459
+ // the row a smaller rung would re-create the mismatch instead of fixing it.
460
+ &--size-x-small,
461
+ &--size-default {
462
+ @include size-rung(var(--origam-list-item---height-md, 36px), var(--origam-list-item---padding-block-md, 6px));
463
+ }
464
+
465
+ &--size-large {
466
+ @include size-rung(var(--origam-list-item---height-lg, 44px), var(--origam-list-item---padding-block-lg, 10px));
467
+ }
468
+
469
+ &--size-x-large {
470
+ @include size-rung(var(--origam-list-item---height-xl, 52px), var(--origam-list-item---padding-block-xl, 14px));
471
+ }
472
+
405
473
  &--active {
406
474
  #{$this}__prepend,
407
475
  #{$this}__append {
@@ -213,18 +213,18 @@ const muteLabel = computed(() => t("origam.media.mute", "Mute"));
213
213
  const unmuteLabel = computed(() => t("origam.media.unmute", "Unmute"));
214
214
  const volumeLabel = computed(() => t("origam.media.volume", "Volume"));
215
215
  const seekLabel = computed(() => t("origam.media.seek", "Seek"));
216
- const previousLabel = computed(() => t("origam.media.previousTrack", "Previous track"));
217
- const nextLabel = computed(() => t("origam.media.nextTrack", "Next track"));
218
- const loopAllLabel = computed(() => t("origam.media.loopAll", "Loop playlist"));
219
- const loopOneLabel = computed(() => t("origam.media.loopOne", "Loop track"));
220
- const loopOffLabel = computed(() => t("origam.media.loopOff", "Loop off"));
216
+ const previousLabel = computed(() => t("origam.media.previous_track", "Previous track"));
217
+ const nextLabel = computed(() => t("origam.media.next_track", "Next track"));
218
+ const loopAllLabel = computed(() => t("origam.media.loop_all", "Loop playlist"));
219
+ const loopOneLabel = computed(() => t("origam.media.loop_one", "Loop track"));
220
+ const loopOffLabel = computed(() => t("origam.media.loop_off", "Loop off"));
221
221
  const shuffleLabel = computed(() => t("origam.media.shuffle", "Shuffle"));
222
- const castLabel = computed(() => t("origam.media.castToDevice", "Cast to device"));
223
- const stopCastLabel = computed(() => t("origam.media.stopCasting", "Stop casting"));
222
+ const castLabel = computed(() => t("origam.media.cast_to_device", "Cast to device"));
223
+ const stopCastLabel = computed(() => t("origam.media.stop_casting", "Stop casting"));
224
224
  const settingsLabel = computed(() => t("origam.media.settings", "Settings"));
225
225
  const downloadLabel = computed(() => t("origam.media.download", "Download"));
226
- const speedLabel = computed(() => t("origam.media.playbackSpeed", "Playback speed"));
227
- const normalSpeedLabel = computed(() => t("origam.media.normalSpeed", "Normal"));
226
+ const speedLabel = computed(() => t("origam.media.playback_speed", "Playback speed"));
227
+ const normalSpeedLabel = computed(() => t("origam.media.normal_speed", "Normal"));
228
228
  const qualityLabel = computed(() => t("origam.media.quality", "Quality"));
229
229
  const transportLabel = computed(() => t("origam.media.transport", "Transport controls"));
230
230
  const state = computed(() => props.state);
@@ -29,7 +29,11 @@
29
29
  :style="[colorStyles, roundedStyles, borderStyles, elevationStyles, paddingStyles, marginStyles]"
30
30
  >
31
31
  <slot name="default">
32
- <origam-list class="origam-menu__list">
32
+ <origam-list
33
+ :density="density"
34
+ :size="size"
35
+ class="origam-menu__list"
36
+ >
33
37
  <origam-list-subheader
34
38
  v-if="title"
35
39
  class="origam-menu__title"
@@ -155,6 +159,7 @@ const _props = defineProps({
155
159
  borderBottomColor: { type: [String, Object, Boolean, null], required: false, skipCheck: true },
156
160
  borderLeftColor: { type: [String, Object, Boolean, null], required: false, skipCheck: true },
157
161
  density: { type: null, required: false },
162
+ size: { type: null, required: false },
158
163
  rounded: { type: [Boolean, Number, String, null], required: false, skipCheck: true },
159
164
  roundedTopRight: { type: [Boolean, Number, String], required: false },
160
165
  roundedTopLeft: { type: [Boolean, Number, String], required: false },
@@ -190,13 +190,13 @@ const props = defineProps({
190
190
  prevIcon: { type: null, required: false, default: MDI_ICONS.CHEVRON_LEFT },
191
191
  nextIcon: { type: null, required: false, default: MDI_ICONS.CHEVRON_RIGHT },
192
192
  lastIcon: { type: null, required: false, default: MDI_ICONS.CHEVRON_DOUBLE_RIGHT },
193
- ariaLabel: { type: String, required: false, default: "origam.pagination.ariaLabel.root" },
194
- pageAriaLabel: { type: String, required: false, default: "origam.pagination.ariaLabel.page" },
195
- currentPageAriaLabel: { type: String, required: false, default: "origam.pagination.ariaLabel.currentPage" },
196
- firstAriaLabel: { type: String, required: false, default: "origam.pagination.ariaLabel.first" },
197
- previousAriaLabel: { type: String, required: false, default: "origam.pagination.ariaLabel.previous" },
198
- nextAriaLabel: { type: String, required: false, default: "origam.pagination.ariaLabel.next" },
199
- lastAriaLabel: { type: String, required: false, default: "origam.pagination.ariaLabel.last" },
193
+ ariaLabel: { type: String, required: false, default: "origam.pagination.aria_label.root" },
194
+ pageAriaLabel: { type: String, required: false, default: "origam.pagination.aria_label.page" },
195
+ currentPageAriaLabel: { type: String, required: false, default: "origam.pagination.aria_label.current_page" },
196
+ firstAriaLabel: { type: String, required: false, default: "origam.pagination.aria_label.first" },
197
+ previousAriaLabel: { type: String, required: false, default: "origam.pagination.aria_label.previous" },
198
+ nextAriaLabel: { type: String, required: false, default: "origam.pagination.aria_label.next" },
199
+ lastAriaLabel: { type: String, required: false, default: "origam.pagination.aria_label.last" },
200
200
  ellipsis: { type: String, required: false, default: "..." },
201
201
  showFirstLastPage: { type: Boolean, required: false },
202
202
  compact: { type: Boolean, required: false, default: false },
@@ -208,7 +208,7 @@ const props = defineProps({
208
208
  infoText: { type: String, required: false, default: "origam.pagination.info" },
209
209
  previousText: { type: String, required: false },
210
210
  nextText: { type: String, required: false },
211
- pageNumberAriaLabel: { type: String, required: false, default: "origam.pagination.ariaLabel.pageNumber" },
211
+ pageNumberAriaLabel: { type: String, required: false, default: "origam.pagination.aria_label.page_number" },
212
212
  hoverColor: { type: [String, Object, Boolean, null], required: false, skipCheck: true },
213
213
  hoverBgColor: { type: [String, Object, Boolean, null], required: false, skipCheck: true },
214
214
  activeColor: { type: [String, Object, Boolean, null], required: false, skipCheck: true },
@@ -45,7 +45,7 @@ const props = defineProps({
45
45
  index: { type: Number, required: false, default: -1 },
46
46
  value: { type: Number, required: true },
47
47
  label: { type: String, required: false },
48
- itemAriaLabel: { type: String, required: false, default: "origam.rating.ariaLabel.item" },
48
+ itemAriaLabel: { type: String, required: false, default: "origam.rating.aria_label.item" },
49
49
  showStar: { type: Boolean, required: false, default: true },
50
50
  isFilled: { type: Boolean, required: false },
51
51
  isHovered: { type: Boolean, required: false },
@@ -85,8 +85,10 @@
85
85
  v-if="hasList"
86
86
  :id="listboxId"
87
87
  ref="origamListRef"
88
+ :density="density"
88
89
  :select-strategy="multiple ? SELECT_STRATEGY.INDEPENDENT : SELECT_STRATEGY.SINGLE_INDEPENDENT"
89
90
  :selected="selectedValues"
91
+ :size="listSize"
90
92
  :tabindex="-1"
91
93
  aria-live="polite"
92
94
  v-bind="{ ...listProps }"
@@ -308,6 +310,7 @@ import {
308
310
  KEYBOARD_VALUES,
309
311
  MDI_ICONS,
310
312
  SELECT_STRATEGY,
313
+ SIZES,
311
314
  TEXT_FIELD_TYPE
312
315
  } from "../../enums";
313
316
  import { deepEqual, forwardRefs, getUid, matchesSelector, noop, wrapInArray } from "../../utils";
@@ -322,7 +325,7 @@ const _props = defineProps({
322
325
  menuProps: { type: Object, required: false },
323
326
  chipProps: { type: Object, required: false },
324
327
  multiple: { type: Boolean, required: false },
325
- noDataText: { type: String, required: false, default: "origam.noDataText" },
328
+ noDataText: { type: String, required: false, default: "origam.no_data_text" },
326
329
  openOnClear: { type: Boolean, required: false },
327
330
  autocomplete: { type: Boolean, required: false },
328
331
  autoSelectFirst: { type: [Boolean, String], required: false },
@@ -867,6 +870,9 @@ const hasList = computed(() => {
867
870
  const textFieldProps = computed(() => {
868
871
  return origamTextFieldRef.value?.filterProps(props, ["class", "id", "style", "counterValue", "dirty", "modelValue", "placeholder", "validationValue", "focused"]);
869
872
  });
873
+ const listSize = computed(() => {
874
+ return props.size ?? SIZES.DEFAULT;
875
+ });
870
876
  const isDirty = computed(() => {
871
877
  return model.value.length > 0;
872
878
  });
@@ -1099,7 +1105,6 @@ defineExpose(forwardRefs({
1099
1105
  }
1100
1106
 
1101
1107
  .origam-select__content .origam-list-item {
1102
- --origam-list-item---min-height: 32px;
1103
1108
  --origam-list-item---padding-inline-start: 32px;
1104
1109
  }
1105
1110
  </style>
@@ -50,8 +50,11 @@
50
50
  </div>
51
51
  </div>
52
52
 
53
- <div class="origam-selection-control__label">
54
- <slot name="label">
53
+ <div
54
+ v-if="label || $slots.label"
55
+ class="origam-selection-control__label"
56
+ >
57
+ <slot name="label" v-bind="{text: label, color, props: { id, onClick: handleClickLabel, ...labelProps}}">
55
58
  <origam-label
56
59
  ref="origamLabelRef"
57
60
  :for="id"
@@ -192,7 +195,7 @@ group?.onForceUpdate(() => {
192
195
  });
193
196
  const origamLabelRef = ref();
194
197
  const labelProps = computed(() => {
195
- return origamLabelRef.value?.filterProps(props, ["text", "color", "bgColor", "class", "style", "id", "for"]);
198
+ return origamLabelRef.value?.filterProps(props, ["text", "color", "bgColor", "border", "elevation", "class", "style", "id", "for"]);
196
199
  });
197
200
  const handleFocus = (e) => {
198
201
  if (!isInteractive.value) return;