bootstrap-vue-next 0.46.3 → 1.0.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 (28) hide show
  1. package/dist/{BApp-GXR1wS6K.js → BApp-Bg5xEz8H.js} +14 -2
  2. package/dist/BApp-Bg5xEz8H.js.map +1 -0
  3. package/dist/{BFormFile-BVrDprWL.js → BFormFile-C2DnrbK7.js} +30 -10
  4. package/dist/BFormFile-C2DnrbK7.js.map +1 -0
  5. package/dist/{BFormOtp-C3vmDnzs.js → BFormOtp-ClDACqXM.js} +2 -2
  6. package/dist/{BFormOtp-C3vmDnzs.js.map → BFormOtp-ClDACqXM.js.map} +1 -1
  7. package/dist/{BFormRating-AEiF8K8T.js → BFormRating-iKFgSFet.js} +81 -66
  8. package/dist/BFormRating-iKFgSFet.js.map +1 -0
  9. package/dist/bootstrap-vue-next.css +28 -22
  10. package/dist/bootstrap-vue-next.mjs +4 -4
  11. package/dist/components/BFormFile/useAriaLiveMessage.d.mts +10 -0
  12. package/dist/components/BFormFile/useAriaLiveMessage.d.ts +10 -0
  13. package/dist/components/BFormRating/BFormRating.vue.d.mts +3 -3
  14. package/dist/components/BFormRating/BFormRating.vue.d.ts +3 -3
  15. package/dist/src/components/BApp/index.mjs +1 -1
  16. package/dist/src/components/BFormFile/index.mjs +1 -1
  17. package/dist/src/components/BFormOtp/index.mjs +1 -1
  18. package/dist/src/components/BFormRating/index.mjs +1 -1
  19. package/dist/src/components/index.mjs +4 -4
  20. package/dist/types/ComponentProps.d.mts +3 -3
  21. package/dist/types/ComponentProps.d.ts +3 -3
  22. package/dist/types/ComponentSlots.d.mts +1 -1
  23. package/dist/types/ComponentSlots.d.ts +1 -1
  24. package/package.json +1 -1
  25. package/src/components/BFormRating/_form-rating.scss +30 -25
  26. package/dist/BApp-GXR1wS6K.js.map +0 -1
  27. package/dist/BFormFile-BVrDprWL.js.map +0 -1
  28. package/dist/BFormRating-AEiF8K8T.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { S as useToNumber } from "./dist-DKc2ivHS.js";
1
2
  import { t as useDefaults } from "./useDefaults-BzP4qZBu.js";
2
3
  import { t as useId$1 } from "./useId-Fh-Arhb7.js";
3
4
  import { t as useRtl } from "./useRtl-FeLayV4k.js";
@@ -20,21 +21,12 @@ var _hoisted_2 = [
20
21
  "value"
21
22
  ];
22
23
  var _hoisted_3 = ["aria-label"];
23
- var _hoisted_4 = ["onClick"];
24
- var _hoisted_5 = { class: "b-form-rating-star" };
25
- var _hoisted_6 = ["width", "height"];
26
- var _hoisted_7 = {
27
- key: 0,
28
- d: "M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.282.95l-3.522 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z"
29
- };
30
- var _hoisted_8 = {
31
- key: 1,
32
- d: "M5.354 5.119 7.538.792A.52.52 0 0 1 8 .5c.183 0 .366.097.465.292l2.184 4.327 4.898.696A.54.54 0 0 1 16 6.32a.55.55 0 0 1-.17.445l-3.523 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256a.5.5 0 0 1-.146.05c-.342.06-.668-.254-.6-.642l.83-4.73L.173 6.765a.55.55 0 0 1-.172-.403.6.6 0 0 1 .085-.302.51.51 0 0 1 .37-.245zM8 12.027a.5.5 0 0 1 .232.056l3.686 1.894-.694-3.957a.56.56 0 0 1 .162-.505l2.907-2.77-4.052-.576a.53.53 0 0 1-.393-.288L8.001 2.223 8 2.226z"
33
- };
34
- var _hoisted_9 = {
35
- key: 2,
36
- d: "M2.866 14.85c-.078.444.36.791.746.593l4.39-2.256 4.389 2.256c.386.198.824-.149.746-.592l-.83-4.73 3.522-3.356c.33-.314.16-.888-.282-.95l-4.898-.696L8.465.792a.513.513 0 0 0-.927 0L5.354 5.12l-4.898.696c-.441.062-.612.636-.283.95l3.522 3.356-.83 4.73zm4.905-2.767-3.686 1.894.694-3.957a.56.56 0 0 0-.163-.505L1.71 6.745l4.052-.576a.53.53 0 0 0 .393-.288L8 2.223l1.847 3.658a.53.53 0 0 0 .393.288l4.052.575-2.906 2.77a.56.56 0 0 0-.163.506l.694 3.957-3.686-1.894a.5.5 0 0 0-.461 0z"
37
- };
24
+ var _hoisted_4 = ["d"];
25
+ var _hoisted_5 = ["onClick"];
26
+ var _hoisted_6 = { class: "b-form-rating-item" };
27
+ var _hoisted_7 = ["width", "height"];
28
+ var _hoisted_8 = ["d"];
29
+ var lengthDefault = 5;
38
30
  //#endregion
39
31
  //#region src/components/BFormRating/BFormRating.vue
40
32
  var BFormRating_default = /* @__PURE__ */ defineComponent({
@@ -79,8 +71,8 @@ var BFormRating_default = /* @__PURE__ */ defineComponent({
79
71
  type: Boolean,
80
72
  default: false
81
73
  },
82
- size: { default: "1rem" },
83
- stars: { default: 5 },
74
+ size: { default: void 0 },
75
+ length: { default: lengthDefault },
84
76
  variant: { default: void 0 }
85
77
  }, {
86
78
  "modelValue": { default: 0 },
@@ -104,40 +96,63 @@ var BFormRating_default = /* @__PURE__ */ defineComponent({
104
96
  } catch {}
105
97
  return isRtl?.value ?? false;
106
98
  });
107
- const computedClasses = computed(() => ({
108
- "form-control": true,
109
- "is-readonly": props.readonly,
110
- "is-disabled": props.disabled,
111
- "no-border": props.noBorder,
112
- "b-form-rating": true,
113
- "d-inline-flex": props.inline
114
- }));
115
- function isIconFull(index) {
116
- return displayValue.value - index >= 1;
117
- }
118
- function isIconHalf(index) {
99
+ const computedClasses = computed(() => [
100
+ "form-control",
101
+ "b-form-rating",
102
+ "align-items-center",
103
+ {
104
+ "is-readonly": props.readonly,
105
+ "is-disabled": props.disabled,
106
+ "no-border": props.noBorder,
107
+ "d-flex": !props.inline,
108
+ "d-inline-flex": props.inline,
109
+ "b-form-rating-inline": props.inline
110
+ }
111
+ ]);
112
+ const isIconFull = (index) => displayValue.value - index >= 1;
113
+ const isIconHalf = (index) => {
119
114
  const diff = displayValue.value - index;
120
115
  return diff >= .5 && diff < 1;
121
- }
116
+ };
117
+ const iconPaths = {
118
+ full: "M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.282.95l-3.522 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z",
119
+ half: "M5.354 5.119 7.538.792A.52.52 0 0 1 8 .5c.183 0 .366.097.465.292l2.184 4.327 4.898.696A.54.54 0 0 1 16 6.32a.55.55 0 0 1-.17.445l-3.523 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256a.5.5 0 0 1-.146.05c-.342.06-.668-.254-.6-.642l.83-4.73L.173 6.765a.55.55 0 0 1-.172-.403.6.6 0 0 1 .085-.302.51.51 0 0 1 .37-.245zM8 12.027a.5.5 0 0 1 .232.056l3.686 1.894-.694-3.957a.56.56 0 0 1 .162-.505l2.907-2.77-4.052-.576a.53.53 0 0 1-.393-.288L8.001 2.223 8 2.226z",
120
+ empty: "M2.866 14.85c-.078.444.36.791.746.593l4.39-2.256 4.389 2.256c.386.198.824-.149.746-.592l-.83-4.73 3.522-3.356c.33-.314.16-.888-.282-.95l-4.898-.696L8.465.792a.513.513 0 0 0-.927 0L5.354 5.12l-4.898.696c-.441.062-.612.636-.283.95l3.522 3.356-.83 4.73zm4.905-2.767-3.686 1.894.694-3.957a.56.56 0 0 0-.163-.505L1.71 6.745l4.052-.576a.53.53 0 0 0 .393-.288L8 2.223l1.847 3.658a.53.53 0 0 0 .393.288l4.052.575-2.906 2.77a.56.56 0 0 0-.163.506l.694 3.957-3.686-1.894a.5.5 0 0 0-.461 0z",
121
+ clear: "M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708"
122
+ };
123
+ const getIcon = (index) => {
124
+ if (isIconFull(index)) return iconPaths.full;
125
+ if (isIconHalf(index)) return iconPaths.half;
126
+ return iconPaths.empty;
127
+ };
122
128
  const hoverValue = ref(null);
123
129
  const displayValue = computed(() => hoverValue.value !== null ? hoverValue.value : modelValue.value);
124
- const clampedStars = computed(() => Math.max(3, props.stars));
130
+ const lengthNumber = useToNumber(() => props.length, {
131
+ nanToZero: true,
132
+ method: "parseInt"
133
+ });
134
+ const computedLength = computed(() => lengthNumber.value > 0 ? lengthNumber.value : lengthDefault);
125
135
  const computedSize = computed(() => {
126
- if (props.size === "sm") return ".875rem";
127
- if (props.size === "lg") return "1.25rem";
128
- return props.size;
136
+ return `${{
137
+ sm: .875,
138
+ default: 1,
139
+ lg: 1.25
140
+ }[props.size ?? "default"]}rem`;
141
+ });
142
+ const computedFormatter = computed(() => {
143
+ const preciseValue = props.precision > 0 ? props.precision : 0;
144
+ return new Intl.NumberFormat(computedLocale.value, {
145
+ style: "decimal",
146
+ useGrouping: false,
147
+ minimumFractionDigits: preciseValue,
148
+ maximumFractionDigits: preciseValue,
149
+ notation: "standard"
150
+ });
129
151
  });
130
- const computedFormatter = computed(() => new Intl.NumberFormat(computedLocale.value, {
131
- style: "decimal",
132
- useGrouping: false,
133
- minimumFractionDigits: props.precision > 0 ? props.precision : 0,
134
- maximumFractionDigits: props.precision > 0 ? props.precision : 0,
135
- notation: "standard"
136
- }));
137
152
  const displayValueText = computed(() => {
138
153
  const val = props.precision > 0 ? roundedValue.value : displayValue.value;
139
154
  const formattedValue = computedFormatter.value.format(val);
140
- if (props.showValueMax) return `${formattedValue}/${computedFormatter.value.format(clampedStars.value)}`;
155
+ if (props.showValueMax) return `${formattedValue}/${computedFormatter.value.format(computedLength.value)}`;
141
156
  if (props.showValue) return formattedValue;
142
157
  return "";
143
158
  });
@@ -146,7 +161,7 @@ var BFormRating_default = /* @__PURE__ */ defineComponent({
146
161
  const factor = 10 ** props.precision;
147
162
  return Math.round((val + Number.EPSILON) * factor) / factor;
148
163
  });
149
- const iconColors = computed(() => Array.from({ length: clampedStars.value }, () => {
164
+ const iconColors = computed(() => Array.from({ length: computedLength.value }, () => {
150
165
  if (props.disabled) return {
151
166
  class: "is-disabled",
152
167
  style: {}
@@ -164,19 +179,19 @@ var BFormRating_default = /* @__PURE__ */ defineComponent({
164
179
  style: {}
165
180
  };
166
181
  }));
167
- function onKeydown(e) {
182
+ const onKeydown = (e) => {
168
183
  if (props.readonly || props.disabled) return;
169
184
  let newValue = modelValue.value;
170
185
  const isRtlMode = computedRtl.value;
171
186
  switch (e.key) {
172
187
  case "ArrowRight":
173
- newValue = isRtlMode ? Math.max(newValue - 1, 0) : Math.min(newValue + 1, clampedStars.value);
188
+ newValue = isRtlMode ? Math.max(newValue - 1, 0) : Math.min(newValue + 1, computedLength.value);
174
189
  break;
175
190
  case "ArrowUp":
176
- newValue = Math.min(newValue + 1, clampedStars.value);
191
+ newValue = Math.min(newValue + 1, computedLength.value);
177
192
  break;
178
193
  case "ArrowLeft":
179
- newValue = isRtlMode ? Math.min(newValue + 1, clampedStars.value) : Math.max(newValue - 1, 0);
194
+ newValue = isRtlMode ? Math.min(newValue + 1, computedLength.value) : Math.max(newValue - 1, 0);
180
195
  break;
181
196
  case "ArrowDown":
182
197
  newValue = Math.max(newValue - 1, 0);
@@ -185,15 +200,15 @@ var BFormRating_default = /* @__PURE__ */ defineComponent({
185
200
  }
186
201
  e.preventDefault();
187
202
  modelValue.value = newValue;
188
- }
189
- function selectRating(starIndex) {
203
+ };
204
+ const selectRating = (itemIndex) => {
190
205
  if (props.readonly || props.disabled) return;
191
- modelValue.value = hoverValue.value !== null ? hoverValue.value : starIndex;
192
- }
193
- function clearRating() {
206
+ modelValue.value = hoverValue.value !== null ? hoverValue.value : itemIndex;
207
+ };
208
+ const clearRating = () => {
194
209
  hoverValue.value = null;
195
210
  modelValue.value = 0;
196
- }
211
+ };
197
212
  __expose({ hoverValue });
198
213
  return (_ctx, _cache) => {
199
214
  return openBlock(), createElementBlock("output", {
@@ -203,9 +218,9 @@ var BFormRating_default = /* @__PURE__ */ defineComponent({
203
218
  form: unref(props).form ? unref(props).form : void 0,
204
219
  role: "slider",
205
220
  "aria-valuemin": 0,
206
- "aria-valuemax": clampedStars.value,
221
+ "aria-valuemax": computedLength.value,
207
222
  "aria-valuenow": displayValue.value,
208
- "aria-valuetext": unref(props).labelValueCurrent(displayValue.value, clampedStars.value),
223
+ "aria-valuetext": unref(props).labelValueCurrent(displayValue.value, computedLength.value),
209
224
  "aria-disabled": unref(props).disabled ? true : void 0,
210
225
  "aria-readonly": unref(props).readonly ? true : void 0,
211
226
  tabindex: unref(props).disabled ? void 0 : "0",
@@ -220,7 +235,7 @@ var BFormRating_default = /* @__PURE__ */ defineComponent({
220
235
  }, null, 8, _hoisted_2)) : createCommentVNode("", true),
221
236
  unref(props).showClear && !unref(props).readonly && !unref(props).disabled ? (openBlock(), createElementBlock("span", {
222
237
  key: 1,
223
- class: "clear-button-spacing",
238
+ class: "rating-clear-button",
224
239
  onClick: clearRating
225
240
  }, [renderSlot(_ctx.$slots, "icon-clear", {}, () => [(openBlock(), createElementBlock("svg", {
226
241
  viewBox: "0 0 16 16",
@@ -228,25 +243,25 @@ var BFormRating_default = /* @__PURE__ */ defineComponent({
228
243
  "aria-label": unref(props).clearLabel,
229
244
  xmlns: "http://www.w3.org/2000/svg",
230
245
  class: "clear-icon"
231
- }, [..._cache[0] || (_cache[0] = [createElementVNode("g", null, [createElementVNode("path", { d: "M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708" })], -1)])], 8, _hoisted_3))])])) : createCommentVNode("", true),
232
- (openBlock(true), createElementBlock(Fragment, null, renderList(clampedStars.value, (starIndex, index) => {
246
+ }, [createElementVNode("g", null, [createElementVNode("path", { d: iconPaths.clear }, null, 8, _hoisted_4)])], 8, _hoisted_3))])])) : createCommentVNode("", true),
247
+ (openBlock(true), createElementBlock(Fragment, null, renderList(computedLength.value, (itemIndex, index) => {
233
248
  return openBlock(), createElementBlock("span", {
234
- key: starIndex,
235
- class: "star",
236
- onClick: ($event) => selectRating(starIndex)
249
+ key: itemIndex,
250
+ class: "rating-item flex-grow-1",
251
+ onClick: ($event) => selectRating(itemIndex)
237
252
  }, [renderSlot(_ctx.$slots, "default", {
238
- starIndex,
253
+ itemIndex,
239
254
  isFilled: isIconFull(index),
240
255
  isHalf: isIconHalf(index)
241
- }, () => [createElementVNode("span", _hoisted_5, [(openBlock(), createElementBlock("svg", {
256
+ }, () => [createElementVNode("span", _hoisted_6, [(openBlock(), createElementBlock("svg", {
242
257
  xmlns: "http://www.w3.org/2000/svg",
243
258
  width: computedSize.value,
244
259
  height: computedSize.value,
245
260
  fill: "currentColor",
246
- class: normalizeClass([[iconColors.value[index]?.class], "star-spacing"]),
261
+ class: normalizeClass([iconColors.value[index]?.class]),
247
262
  style: normalizeStyle(iconColors.value[index]?.style),
248
263
  viewBox: "0 0 16 16"
249
- }, [isIconFull(index) ? (openBlock(), createElementBlock("path", _hoisted_7)) : isIconHalf(index) ? (openBlock(), createElementBlock("path", _hoisted_8)) : (openBlock(), createElementBlock("path", _hoisted_9))], 14, _hoisted_6))])])], 8, _hoisted_4);
264
+ }, [createElementVNode("path", { d: getIcon(index) }, null, 8, _hoisted_8)], 14, _hoisted_7))])])], 8, _hoisted_5);
250
265
  }), 128)),
251
266
  unref(props).showValue || unref(props).showValueMax ? (openBlock(), createElementBlock("span", {
252
267
  key: 2,
@@ -260,4 +275,4 @@ var BFormRating_default = /* @__PURE__ */ defineComponent({
260
275
  //#endregion
261
276
  export { BFormRating_default as t };
262
277
 
263
- //# sourceMappingURL=BFormRating-AEiF8K8T.js.map
278
+ //# sourceMappingURL=BFormRating-iKFgSFet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BFormRating-iKFgSFet.js","names":[],"sources":["../src/components/BFormRating/BFormRating.vue","../src/components/BFormRating/BFormRating.vue"],"sourcesContent":["<template>\n <output\n :id=\"computedId\"\n :class=\"computedClasses\"\n :dir=\"computedRtl ? 'rtl' : 'ltr'\"\n :form=\"props.form ? props.form : undefined\"\n role=\"slider\"\n :aria-valuemin=\"0\"\n :aria-valuemax=\"computedLength\"\n :aria-valuenow=\"displayValue\"\n :aria-valuetext=\"props.labelValueCurrent(displayValue, computedLength)\"\n :aria-disabled=\"props.disabled ? true : undefined\"\n :aria-readonly=\"props.readonly ? true : undefined\"\n :tabindex=\"props.disabled ? undefined : '0'\"\n @keydown=\"onKeydown\"\n >\n <input\n v-if=\"props.name && !props.disabled\"\n key=\"hidden\"\n type=\"hidden\"\n :name=\"props.name\"\n :form=\"props.form\"\n :value=\"modelValue\"\n />\n <span\n v-if=\"props.showClear && !props.readonly && !props.disabled\"\n class=\"rating-clear-button\"\n @click=\"clearRating\"\n >\n <slot name=\"icon-clear\">\n <svg\n viewBox=\"0 0 16 16\"\n role=\"img\"\n :aria-label=\"props.clearLabel\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"clear-icon\"\n >\n <g>\n <path :d=\"iconPaths.clear\" />\n </g>\n </svg>\n </slot>\n </span>\n <span\n v-for=\"(itemIndex, index) in computedLength\"\n :key=\"itemIndex\"\n class=\"rating-item flex-grow-1\"\n @click=\"selectRating(itemIndex)\"\n >\n <slot :item-index=\"itemIndex\" :is-filled=\"isIconFull(index)\" :is-half=\"isIconHalf(index)\">\n <span class=\"b-form-rating-item\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n :width=\"computedSize\"\n :height=\"computedSize\"\n fill=\"currentColor\"\n :class=\"[iconColors[index]?.class]\"\n :style=\"iconColors[index]?.style\"\n viewBox=\"0 0 16 16\"\n >\n <path :d=\"getIcon(index)\" />\n </svg>\n </span>\n </slot>\n </span>\n\n <span\n v-if=\"props.showValue || props.showValueMax\"\n :style=\"{fontSize: computedSize}\"\n class=\"rating-value-text\"\n >\n {{ displayValueText }}\n </span>\n </output>\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, ref} from 'vue'\nimport {useToNumber} from '@vueuse/core'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport {useRtl} from '../../composables/useRtl'\nimport type {BFormRatingProps, BFormRatingSlots, Size} from '../../types'\n\nconst lengthDefault = 5\nconst _props = withDefaults(defineProps<Omit<BFormRatingProps, 'modelValue'>>(), {\n clearLabel: 'Clear rating',\n color: '',\n id: undefined,\n inline: false,\n labelValueCurrent: (current: number, max: number) => `${current} of ${max}`,\n locale: undefined,\n noBorder: false,\n precision: 0,\n readonly: false,\n disabled: false,\n form: undefined,\n name: undefined,\n showClear: false,\n showValue: false,\n showValueMax: false,\n size: undefined,\n length: lengthDefault,\n variant: undefined,\n})\nconst props = useDefaults(_props, 'BFormRating')\ndefineSlots<BFormRatingSlots>()\n\nconst modelValue = defineModel<Exclude<BFormRatingProps['modelValue'], undefined>>({default: 0})\n\nconst computedId = useId(() => props.id, 'form-rating')\n\nconst {isRtl, locale: globalLocale} = useRtl()\n\nconst computedLocale = computed(() => {\n const loc = (props.locale ?? globalLocale?.value) || undefined\n const nf = new Intl.NumberFormat(loc)\n return nf.resolvedOptions().locale\n})\n\nconst computedRtl = computed(() => {\n const locale = computedLocale.value\n try {\n const localeObj = new Intl.Locale(locale)\n const {textInfo} = localeObj as Intl.Locale & {textInfo?: {direction: string}}\n if (textInfo) {\n return textInfo.direction === 'rtl'\n }\n } catch {\n // Fallback\n }\n return isRtl?.value ?? false\n})\n\nconst computedClasses = computed(() => [\n 'form-control',\n 'b-form-rating',\n 'align-items-center',\n {\n 'is-readonly': props.readonly,\n 'is-disabled': props.disabled,\n 'no-border': props.noBorder,\n 'd-flex': !props.inline,\n 'd-inline-flex': props.inline,\n 'b-form-rating-inline': props.inline,\n },\n])\n\nconst isIconFull = (index: number): boolean => displayValue.value - index >= 1\nconst isIconHalf = (index: number): boolean => {\n const diff = displayValue.value - index\n return diff >= 0.5 && diff < 1\n}\nconst iconPaths = {\n full: 'M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.282.95l-3.522 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z',\n half: 'M5.354 5.119 7.538.792A.52.52 0 0 1 8 .5c.183 0 .366.097.465.292l2.184 4.327 4.898.696A.54.54 0 0 1 16 6.32a.55.55 0 0 1-.17.445l-3.523 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256a.5.5 0 0 1-.146.05c-.342.06-.668-.254-.6-.642l.83-4.73L.173 6.765a.55.55 0 0 1-.172-.403.6.6 0 0 1 .085-.302.51.51 0 0 1 .37-.245zM8 12.027a.5.5 0 0 1 .232.056l3.686 1.894-.694-3.957a.56.56 0 0 1 .162-.505l2.907-2.77-4.052-.576a.53.53 0 0 1-.393-.288L8.001 2.223 8 2.226z',\n empty:\n 'M2.866 14.85c-.078.444.36.791.746.593l4.39-2.256 4.389 2.256c.386.198.824-.149.746-.592l-.83-4.73 3.522-3.356c.33-.314.16-.888-.282-.95l-4.898-.696L8.465.792a.513.513 0 0 0-.927 0L5.354 5.12l-4.898.696c-.441.062-.612.636-.283.95l3.522 3.356-.83 4.73zm4.905-2.767-3.686 1.894.694-3.957a.56.56 0 0 0-.163-.505L1.71 6.745l4.052-.576a.53.53 0 0 0 .393-.288L8 2.223l1.847 3.658a.53.53 0 0 0 .393.288l4.052.575-2.906 2.77a.56.56 0 0 0-.163.506l.694 3.957-3.686-1.894a.5.5 0 0 0-.461 0z',\n clear:\n 'M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708',\n} as const\nconst getIcon = (index: number): string => {\n if (isIconFull(index)) return iconPaths.full\n if (isIconHalf(index)) return iconPaths.half\n return iconPaths.empty\n}\n\nconst hoverValue = ref<number | null>(null)\n\nconst displayValue = computed(() =>\n hoverValue.value !== null ? hoverValue.value : modelValue.value\n)\n\nconst lengthNumber = useToNumber(() => props.length, {nanToZero: true, method: 'parseInt'})\nconst computedLength = computed(() => (lengthNumber.value > 0 ? lengthNumber.value : lengthDefault))\n\nconst computedSize = computed(() => {\n const resolved = {\n sm: 0.875,\n default: 1,\n lg: 1.25,\n } satisfies Record<Size | 'default', number>\n return `${resolved[props.size ?? 'default']}rem`\n})\n\nconst computedFormatter = computed(() => {\n const preciseValue = props.precision > 0 ? props.precision : 0\n return new Intl.NumberFormat(computedLocale.value, {\n style: 'decimal',\n useGrouping: false,\n minimumFractionDigits: preciseValue,\n maximumFractionDigits: preciseValue,\n notation: 'standard',\n })\n})\n\nconst displayValueText = computed(() => {\n const val = props.precision > 0 ? roundedValue.value : displayValue.value\n const formattedValue = computedFormatter.value.format(val)\n if (props.showValueMax) {\n const formattedMax = computedFormatter.value.format(computedLength.value)\n return `${formattedValue}/${formattedMax}`\n }\n if (props.showValue) {\n return formattedValue\n }\n return ''\n})\n\nconst roundedValue = computed(() => {\n const val = displayValue.value\n const factor = 10 ** props.precision\n return Math.round((val + Number.EPSILON) * factor) / factor\n})\n\nconst iconColors = computed(() =>\n Array.from({length: computedLength.value}, () => {\n if (props.disabled) {\n return {class: 'is-disabled', style: {}}\n }\n if (props.variant) {\n return {class: `text-${props.variant}`, style: {}}\n }\n if (props.color) {\n return {class: '', style: {color: props.color}}\n }\n return {class: '', style: {}}\n })\n)\n\n//add keyboard support\nconst onKeydown = (e: KeyboardEvent) => {\n if (props.readonly || props.disabled) return\n\n let newValue = modelValue.value\n\n const isRtlMode = computedRtl.value\n\n switch (e.key) {\n case 'ArrowRight':\n newValue = isRtlMode\n ? Math.max(newValue - 1, 0)\n : Math.min(newValue + 1, computedLength.value)\n break\n case 'ArrowUp':\n newValue = Math.min(newValue + 1, computedLength.value)\n break\n case 'ArrowLeft':\n newValue = isRtlMode\n ? Math.min(newValue + 1, computedLength.value)\n : Math.max(newValue - 1, 0)\n break\n case 'ArrowDown':\n newValue = Math.max(newValue - 1, 0)\n break\n default:\n return\n }\n\n e.preventDefault()\n modelValue.value = newValue\n}\n\nconst selectRating = (itemIndex: number) => {\n if (props.readonly || props.disabled) return\n modelValue.value = hoverValue.value !== null ? hoverValue.value : itemIndex\n}\n\n// clear\nconst clearRating = () => {\n hoverValue.value = null\n modelValue.value = 0\n}\n\ndefineExpose({\n hoverValue,\n})\n</script>\n","<template>\n <output\n :id=\"computedId\"\n :class=\"computedClasses\"\n :dir=\"computedRtl ? 'rtl' : 'ltr'\"\n :form=\"props.form ? props.form : undefined\"\n role=\"slider\"\n :aria-valuemin=\"0\"\n :aria-valuemax=\"computedLength\"\n :aria-valuenow=\"displayValue\"\n :aria-valuetext=\"props.labelValueCurrent(displayValue, computedLength)\"\n :aria-disabled=\"props.disabled ? true : undefined\"\n :aria-readonly=\"props.readonly ? true : undefined\"\n :tabindex=\"props.disabled ? undefined : '0'\"\n @keydown=\"onKeydown\"\n >\n <input\n v-if=\"props.name && !props.disabled\"\n key=\"hidden\"\n type=\"hidden\"\n :name=\"props.name\"\n :form=\"props.form\"\n :value=\"modelValue\"\n />\n <span\n v-if=\"props.showClear && !props.readonly && !props.disabled\"\n class=\"rating-clear-button\"\n @click=\"clearRating\"\n >\n <slot name=\"icon-clear\">\n <svg\n viewBox=\"0 0 16 16\"\n role=\"img\"\n :aria-label=\"props.clearLabel\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"clear-icon\"\n >\n <g>\n <path :d=\"iconPaths.clear\" />\n </g>\n </svg>\n </slot>\n </span>\n <span\n v-for=\"(itemIndex, index) in computedLength\"\n :key=\"itemIndex\"\n class=\"rating-item flex-grow-1\"\n @click=\"selectRating(itemIndex)\"\n >\n <slot :item-index=\"itemIndex\" :is-filled=\"isIconFull(index)\" :is-half=\"isIconHalf(index)\">\n <span class=\"b-form-rating-item\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n :width=\"computedSize\"\n :height=\"computedSize\"\n fill=\"currentColor\"\n :class=\"[iconColors[index]?.class]\"\n :style=\"iconColors[index]?.style\"\n viewBox=\"0 0 16 16\"\n >\n <path :d=\"getIcon(index)\" />\n </svg>\n </span>\n </slot>\n </span>\n\n <span\n v-if=\"props.showValue || props.showValueMax\"\n :style=\"{fontSize: computedSize}\"\n class=\"rating-value-text\"\n >\n {{ displayValueText }}\n </span>\n </output>\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, ref} from 'vue'\nimport {useToNumber} from '@vueuse/core'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport {useRtl} from '../../composables/useRtl'\nimport type {BFormRatingProps, BFormRatingSlots, Size} from '../../types'\n\nconst lengthDefault = 5\nconst _props = withDefaults(defineProps<Omit<BFormRatingProps, 'modelValue'>>(), {\n clearLabel: 'Clear rating',\n color: '',\n id: undefined,\n inline: false,\n labelValueCurrent: (current: number, max: number) => `${current} of ${max}`,\n locale: undefined,\n noBorder: false,\n precision: 0,\n readonly: false,\n disabled: false,\n form: undefined,\n name: undefined,\n showClear: false,\n showValue: false,\n showValueMax: false,\n size: undefined,\n length: lengthDefault,\n variant: undefined,\n})\nconst props = useDefaults(_props, 'BFormRating')\ndefineSlots<BFormRatingSlots>()\n\nconst modelValue = defineModel<Exclude<BFormRatingProps['modelValue'], undefined>>({default: 0})\n\nconst computedId = useId(() => props.id, 'form-rating')\n\nconst {isRtl, locale: globalLocale} = useRtl()\n\nconst computedLocale = computed(() => {\n const loc = (props.locale ?? globalLocale?.value) || undefined\n const nf = new Intl.NumberFormat(loc)\n return nf.resolvedOptions().locale\n})\n\nconst computedRtl = computed(() => {\n const locale = computedLocale.value\n try {\n const localeObj = new Intl.Locale(locale)\n const {textInfo} = localeObj as Intl.Locale & {textInfo?: {direction: string}}\n if (textInfo) {\n return textInfo.direction === 'rtl'\n }\n } catch {\n // Fallback\n }\n return isRtl?.value ?? false\n})\n\nconst computedClasses = computed(() => [\n 'form-control',\n 'b-form-rating',\n 'align-items-center',\n {\n 'is-readonly': props.readonly,\n 'is-disabled': props.disabled,\n 'no-border': props.noBorder,\n 'd-flex': !props.inline,\n 'd-inline-flex': props.inline,\n 'b-form-rating-inline': props.inline,\n },\n])\n\nconst isIconFull = (index: number): boolean => displayValue.value - index >= 1\nconst isIconHalf = (index: number): boolean => {\n const diff = displayValue.value - index\n return diff >= 0.5 && diff < 1\n}\nconst iconPaths = {\n full: 'M3.612 15.443c-.386.198-.824-.149-.746-.592l.83-4.73L.173 6.765c-.329-.314-.158-.888.283-.95l4.898-.696L7.538.792c.197-.39.73-.39.927 0l2.184 4.327 4.898.696c.441.062.612.636.282.95l-3.522 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256z',\n half: 'M5.354 5.119 7.538.792A.52.52 0 0 1 8 .5c.183 0 .366.097.465.292l2.184 4.327 4.898.696A.54.54 0 0 1 16 6.32a.55.55 0 0 1-.17.445l-3.523 3.356.83 4.73c.078.443-.36.79-.746.592L8 13.187l-4.389 2.256a.5.5 0 0 1-.146.05c-.342.06-.668-.254-.6-.642l.83-4.73L.173 6.765a.55.55 0 0 1-.172-.403.6.6 0 0 1 .085-.302.51.51 0 0 1 .37-.245zM8 12.027a.5.5 0 0 1 .232.056l3.686 1.894-.694-3.957a.56.56 0 0 1 .162-.505l2.907-2.77-4.052-.576a.53.53 0 0 1-.393-.288L8.001 2.223 8 2.226z',\n empty:\n 'M2.866 14.85c-.078.444.36.791.746.593l4.39-2.256 4.389 2.256c.386.198.824-.149.746-.592l-.83-4.73 3.522-3.356c.33-.314.16-.888-.282-.95l-4.898-.696L8.465.792a.513.513 0 0 0-.927 0L5.354 5.12l-4.898.696c-.441.062-.612.636-.283.95l3.522 3.356-.83 4.73zm4.905-2.767-3.686 1.894.694-3.957a.56.56 0 0 0-.163-.505L1.71 6.745l4.052-.576a.53.53 0 0 0 .393-.288L8 2.223l1.847 3.658a.53.53 0 0 0 .393.288l4.052.575-2.906 2.77a.56.56 0 0 0-.163.506l.694 3.957-3.686-1.894a.5.5 0 0 0-.461 0z',\n clear:\n 'M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708',\n} as const\nconst getIcon = (index: number): string => {\n if (isIconFull(index)) return iconPaths.full\n if (isIconHalf(index)) return iconPaths.half\n return iconPaths.empty\n}\n\nconst hoverValue = ref<number | null>(null)\n\nconst displayValue = computed(() =>\n hoverValue.value !== null ? hoverValue.value : modelValue.value\n)\n\nconst lengthNumber = useToNumber(() => props.length, {nanToZero: true, method: 'parseInt'})\nconst computedLength = computed(() => (lengthNumber.value > 0 ? lengthNumber.value : lengthDefault))\n\nconst computedSize = computed(() => {\n const resolved = {\n sm: 0.875,\n default: 1,\n lg: 1.25,\n } satisfies Record<Size | 'default', number>\n return `${resolved[props.size ?? 'default']}rem`\n})\n\nconst computedFormatter = computed(() => {\n const preciseValue = props.precision > 0 ? props.precision : 0\n return new Intl.NumberFormat(computedLocale.value, {\n style: 'decimal',\n useGrouping: false,\n minimumFractionDigits: preciseValue,\n maximumFractionDigits: preciseValue,\n notation: 'standard',\n })\n})\n\nconst displayValueText = computed(() => {\n const val = props.precision > 0 ? roundedValue.value : displayValue.value\n const formattedValue = computedFormatter.value.format(val)\n if (props.showValueMax) {\n const formattedMax = computedFormatter.value.format(computedLength.value)\n return `${formattedValue}/${formattedMax}`\n }\n if (props.showValue) {\n return formattedValue\n }\n return ''\n})\n\nconst roundedValue = computed(() => {\n const val = displayValue.value\n const factor = 10 ** props.precision\n return Math.round((val + Number.EPSILON) * factor) / factor\n})\n\nconst iconColors = computed(() =>\n Array.from({length: computedLength.value}, () => {\n if (props.disabled) {\n return {class: 'is-disabled', style: {}}\n }\n if (props.variant) {\n return {class: `text-${props.variant}`, style: {}}\n }\n if (props.color) {\n return {class: '', style: {color: props.color}}\n }\n return {class: '', style: {}}\n })\n)\n\n//add keyboard support\nconst onKeydown = (e: KeyboardEvent) => {\n if (props.readonly || props.disabled) return\n\n let newValue = modelValue.value\n\n const isRtlMode = computedRtl.value\n\n switch (e.key) {\n case 'ArrowRight':\n newValue = isRtlMode\n ? Math.max(newValue - 1, 0)\n : Math.min(newValue + 1, computedLength.value)\n break\n case 'ArrowUp':\n newValue = Math.min(newValue + 1, computedLength.value)\n break\n case 'ArrowLeft':\n newValue = isRtlMode\n ? Math.min(newValue + 1, computedLength.value)\n : Math.max(newValue - 1, 0)\n break\n case 'ArrowDown':\n newValue = Math.max(newValue - 1, 0)\n break\n default:\n return\n }\n\n e.preventDefault()\n modelValue.value = newValue\n}\n\nconst selectRating = (itemIndex: number) => {\n if (props.readonly || props.disabled) return\n modelValue.value = hoverValue.value !== null ? hoverValue.value : itemIndex\n}\n\n// clear\nconst clearRating = () => {\n hoverValue.value = null\n modelValue.value = 0\n}\n\ndefineExpose({\n hoverValue,\n})\n</script>\n"],"mappings":"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"}
@@ -144,17 +144,15 @@
144
144
  }
145
145
 
146
146
  .b-form-rating {
147
- display: flex;
148
- justify-content: space-between;
149
- padding: 0.375rem 0.75rem;
150
- border-radius: 0.375rem;
151
- border: 1px solid var(--bs-secondary-border-subtle, #dee2e6);
152
- background-color: var(--bs-body-bg);
153
- gap: 0.25rem;
154
- flex: 1 1 auto;
155
- width: 1%;
147
+ text-align: center;
156
148
  min-width: 0;
157
149
  }
150
+ .b-form-rating:not(.b-form-rating-inline) {
151
+ width: 100%;
152
+ }
153
+ .b-form-rating.b-form-rating-inline {
154
+ width: auto;
155
+ }
158
156
  .b-form-rating.no-border {
159
157
  border: none;
160
158
  }
@@ -173,36 +171,44 @@
173
171
  transform: scale(1.5);
174
172
  }
175
173
 
176
- .star {
177
- cursor: pointer;
174
+ .rating-item {
175
+ align-items: center;
176
+ display: flex;
177
+ justify-content: center;
178
178
  user-select: none;
179
179
  padding: 0 0.25em;
180
180
  }
181
181
 
182
- .is-readonly .star,
183
- .is-disabled .star {
184
- cursor: default;
182
+ .b-form-rating:not(.is-readonly):not(.is-disabled) .rating-item {
183
+ cursor: pointer;
185
184
  }
186
185
 
187
- .clear-button-spacing {
188
- cursor: pointer;
189
- margin-left: 0.5rem;
186
+ .is-readonly .rating-item,
187
+ .is-disabled .rating-item {
188
+ cursor: default;
190
189
  }
191
190
 
192
- .star-spacing {
193
- margin: 0 0.5rem;
191
+ .rating-clear-button {
192
+ align-items: center;
193
+ cursor: pointer;
194
+ display: inline-flex;
195
+ flex-shrink: 0;
196
+ padding: 0 0.25em;
194
197
  }
195
198
 
196
199
  .rating-value-text {
200
+ flex-shrink: 0;
197
201
  color: var(--bs-body-color);
198
- margin: 0 0.6;
202
+ margin: 0;
203
+ padding: 0 0.25em;
199
204
  }
200
205
 
201
- .b-form-rating-star svg {
206
+ .b-form-rating-item {
207
+ display: inline-flex;
202
208
  transition: transform 0.2s ease;
203
209
  }
204
210
 
205
- .b-form-rating:not(.is-readonly):not(.is-disabled) .star:hover .b-form-rating-star svg {
211
+ .b-form-rating:not(.is-readonly):not(.is-disabled) .rating-item:hover .b-form-rating-item {
206
212
  transform: scale(1.5);
207
213
  }
208
214
 
@@ -13,11 +13,11 @@ import { n as BProgressBar_default, t as BProgress_default } from "./BProgress-B
13
13
  import { t as BSpinner_default } from "./BSpinner-H1DZOmiM.js";
14
14
  import { t as BButton_default } from "./BButton-KZu5jczf.js";
15
15
  import { t as BAlert_default } from "./BAlert-C9Mi4RDx.js";
16
- import { n as BOrchestrator_default, t as BApp_default } from "./BApp-GXR1wS6K.js";
16
+ import { n as BOrchestrator_default, t as BApp_default } from "./BApp-Bg5xEz8H.js";
17
17
  import { useProvideDefaults } from "./src/composables/useProvideDefaults/index.mjs";
18
18
  import { useRegistry } from "./src/composables/useRegistry/index.mjs";
19
19
  import { t as BAutocomplete_default } from "./BAutocomplete-BFbbKtpz.js";
20
- import { t as BFormOtp_default } from "./BFormOtp-C3vmDnzs.js";
20
+ import { t as BFormOtp_default } from "./BFormOtp-ClDACqXM.js";
21
21
  import { n as BDatePicker_default, t as BDateRangePicker_default } from "./BDatePicker-AVTYcVLy.js";
22
22
  import { t as BTimeField_default } from "./BTimeField-CbRGjaI6.js";
23
23
  import { n as BDateRangeField_default, r as BDateField_default, t as BTimeRangeField_default } from "./BDateField-Bj-Jz7u4.js";
@@ -43,10 +43,10 @@ import { t as BFormSelectOption_default } from "./BFormSelectOption-C8orMj24.js"
43
43
  import { n as BFormDatalist_default, t as BFormFloatingLabel_default } from "./BForm-CcbrqF35.js";
44
44
  import { i as BFormInvalidFeedback_default, n as BFormText_default, r as BFormRow_default, t as BFormValidFeedback_default } from "./BFormValidFeedback-BTNOXbQ6.js";
45
45
  import { n as BFormCheckbox_default, t as BFormCheckboxGroup_default } from "./BFormCheckbox-BMhyR-J5.js";
46
- import { t as BFormFile_default } from "./BFormFile-BVrDprWL.js";
46
+ import { t as BFormFile_default } from "./BFormFile-C2DnrbK7.js";
47
47
  import { t as BFormGroup_default } from "./BFormGroup-D3R7DxxF.js";
48
48
  import { n as BFormRadio_default, t as BFormRadioGroup_default } from "./BFormRadio-DRViMh6V.js";
49
- import { t as BFormRating_default } from "./BFormRating-AEiF8K8T.js";
49
+ import { t as BFormRating_default } from "./BFormRating-iKFgSFet.js";
50
50
  import { n as BFormSelectOptionGroup_default, t as BFormSelect_default } from "./BFormSelect-DdjH8482.js";
51
51
  import { t as BFormSpinbutton_default } from "./BFormSpinbutton-fkVMbQC3.js";
52
52
  import { t as BFormTags_default } from "./BFormTags-CUcyRTCK.js";
@@ -0,0 +1,10 @@
1
+ import { MaybeRef, Ref } from 'vue';
2
+ /**
3
+ * Manages an ARIA live region message with a clear-then-set pattern.
4
+ *
5
+ * Screen readers only announce `aria-live` content on a transition from empty
6
+ * to non-empty text. By clearing the message first and then setting it in the
7
+ * next tick we guarantee that every file selection produces that empty→non-empty
8
+ * transition, even when the same file is selected again.
9
+ */
10
+ export declare const useAriaLiveMessage: (selectedFiles: Ref<readonly File[]>, formatter: MaybeRef<((files: readonly File[]) => string) | undefined>) => Readonly<Ref<string, string>>;
@@ -0,0 +1,10 @@
1
+ import { MaybeRef, Ref } from 'vue';
2
+ /**
3
+ * Manages an ARIA live region message with a clear-then-set pattern.
4
+ *
5
+ * Screen readers only announce `aria-live` content on a transition from empty
6
+ * to non-empty text. By clearing the message first and then setting it in the
7
+ * next tick we guarantee that every file selection produces that empty→non-empty
8
+ * transition, even when the same file is selected again.
9
+ */
10
+ export declare const useAriaLiveMessage: (selectedFiles: Ref<readonly File[]>, formatter: MaybeRef<((files: readonly File[]) => string) | undefined>) => Readonly<Ref<string, string>>;
@@ -1,4 +1,4 @@
1
- import { BFormRatingProps, BFormRatingSlots } from '../../types';
1
+ import { BFormRatingProps, BFormRatingSlots, Size } from '../../types';
2
2
  type __VLS_Props = Omit<BFormRatingProps, 'modelValue'>;
3
3
  type __VLS_Slots = BFormRatingSlots;
4
4
  type __VLS_ModelProps = {
@@ -17,19 +17,19 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_PublicProps, {
17
17
  id: string;
18
18
  name: string;
19
19
  readonly: boolean;
20
- size: "sm" | "lg" | string;
20
+ size: Size;
21
21
  color: string;
22
22
  variant: "primary" | "secondary" | "success" | "danger" | "warning" | "info" | "light" | "dark" | string;
23
23
  precision: number;
24
24
  showValue: boolean;
25
25
  inline: boolean;
26
+ length: import('../../types/CommonTypes').Numberish;
26
27
  locale: string;
27
28
  clearLabel: string;
28
29
  labelValueCurrent: (current: number, max: number) => string;
29
30
  noBorder: boolean;
30
31
  showClear: boolean;
31
32
  showValueMax: boolean;
32
- stars: number;
33
33
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
34
34
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
35
35
  declare const _default: typeof __VLS_export;
@@ -1,4 +1,4 @@
1
- import { BFormRatingProps, BFormRatingSlots } from '../../types';
1
+ import { BFormRatingProps, BFormRatingSlots, Size } from '../../types';
2
2
  type __VLS_Props = Omit<BFormRatingProps, 'modelValue'>;
3
3
  type __VLS_Slots = BFormRatingSlots;
4
4
  type __VLS_ModelProps = {
@@ -17,19 +17,19 @@ declare const __VLS_base: import('vue').DefineComponent<__VLS_PublicProps, {
17
17
  id: string;
18
18
  name: string;
19
19
  readonly: boolean;
20
- size: "sm" | "lg" | string;
20
+ size: Size;
21
21
  color: string;
22
22
  variant: "primary" | "secondary" | "success" | "danger" | "warning" | "info" | "light" | "dark" | string;
23
23
  precision: number;
24
24
  showValue: boolean;
25
25
  inline: boolean;
26
+ length: import('../../types/CommonTypes').Numberish;
26
27
  locale: string;
27
28
  clearLabel: string;
28
29
  labelValueCurrent: (current: number, max: number) => string;
29
30
  noBorder: boolean;
30
31
  showClear: boolean;
31
32
  showValueMax: boolean;
32
- stars: number;
33
33
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
34
34
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
35
35
  declare const _default: typeof __VLS_export;
@@ -1,2 +1,2 @@
1
- import { n as BOrchestrator_default, t as BApp_default } from "../../../BApp-GXR1wS6K.js";
1
+ import { n as BOrchestrator_default, t as BApp_default } from "../../../BApp-Bg5xEz8H.js";
2
2
  export { BApp_default as BApp, BOrchestrator_default as BOrchestrator };
@@ -1,2 +1,2 @@
1
- import { t as BFormFile_default } from "../../../BFormFile-BVrDprWL.js";
1
+ import { t as BFormFile_default } from "../../../BFormFile-C2DnrbK7.js";
2
2
  export { BFormFile_default as BFormFile };
@@ -1,2 +1,2 @@
1
- import { t as BFormOtp_default } from "../../../BFormOtp-C3vmDnzs.js";
1
+ import { t as BFormOtp_default } from "../../../BFormOtp-ClDACqXM.js";
2
2
  export { BFormOtp_default as BFormOtp };
@@ -1,2 +1,2 @@
1
- import { t as BFormRating_default } from "../../../BFormRating-AEiF8K8T.js";
1
+ import { t as BFormRating_default } from "../../../BFormRating-iKFgSFet.js";
2
2
  export { BFormRating_default as BFormRating };
@@ -9,9 +9,9 @@ import { n as BProgressBar_default, t as BProgress_default } from "../../BProgre
9
9
  import { t as BSpinner_default } from "../../BSpinner-H1DZOmiM.js";
10
10
  import { t as BButton_default } from "../../BButton-KZu5jczf.js";
11
11
  import { t as BAlert_default } from "../../BAlert-C9Mi4RDx.js";
12
- import { n as BOrchestrator_default, t as BApp_default } from "../../BApp-GXR1wS6K.js";
12
+ import { n as BOrchestrator_default, t as BApp_default } from "../../BApp-Bg5xEz8H.js";
13
13
  import { t as BAutocomplete_default } from "../../BAutocomplete-BFbbKtpz.js";
14
- import { t as BFormOtp_default } from "../../BFormOtp-C3vmDnzs.js";
14
+ import { t as BFormOtp_default } from "../../BFormOtp-ClDACqXM.js";
15
15
  import { n as BDatePicker_default, t as BDateRangePicker_default } from "../../BDatePicker-AVTYcVLy.js";
16
16
  import { t as BTimeField_default } from "../../BTimeField-CbRGjaI6.js";
17
17
  import { n as BDateRangeField_default, r as BDateField_default, t as BTimeRangeField_default } from "../../BDateField-Bj-Jz7u4.js";
@@ -37,10 +37,10 @@ import { t as BFormSelectOption_default } from "../../BFormSelectOption-C8orMj24
37
37
  import { n as BFormDatalist_default, t as BFormFloatingLabel_default } from "../../BForm-CcbrqF35.js";
38
38
  import { i as BFormInvalidFeedback_default, n as BFormText_default, r as BFormRow_default, t as BFormValidFeedback_default } from "../../BFormValidFeedback-BTNOXbQ6.js";
39
39
  import { n as BFormCheckbox_default, t as BFormCheckboxGroup_default } from "../../BFormCheckbox-BMhyR-J5.js";
40
- import { t as BFormFile_default } from "../../BFormFile-BVrDprWL.js";
40
+ import { t as BFormFile_default } from "../../BFormFile-C2DnrbK7.js";
41
41
  import { t as BFormGroup_default } from "../../BFormGroup-D3R7DxxF.js";
42
42
  import { n as BFormRadio_default, t as BFormRadioGroup_default } from "../../BFormRadio-DRViMh6V.js";
43
- import { t as BFormRating_default } from "../../BFormRating-AEiF8K8T.js";
43
+ import { t as BFormRating_default } from "../../BFormRating-iKFgSFet.js";
44
44
  import { n as BFormSelectOptionGroup_default, t as BFormSelect_default } from "../../BFormSelect-DdjH8482.js";
45
45
  import { t as BFormSpinbutton_default } from "../../BFormSpinbutton-fkVMbQC3.js";
46
46
  import { t as BFormTags_default } from "../../BFormTags-CUcyRTCK.js";
@@ -325,7 +325,7 @@ export interface BFormDatalistBaseProps {
325
325
  textField?: string;
326
326
  valueField?: string;
327
327
  }
328
- export interface BFormDatalistProps<Item = Record<string, unknown> | string | number | boolean, ValueKey extends Item extends Record<string, unknown> ? keyof Item : string = Item extends Record<string, unknown> ? keyof Item : never> {
328
+ export interface BFormDatalistProps<Item = Record<string, unknown> | string | number | boolean, ValueKey extends (Item extends Record<string, unknown> ? keyof Item : string) = Item extends Record<string, unknown> ? keyof Item : never> {
329
329
  disabled?: boolean;
330
330
  disabledField?: keyof Item & string;
331
331
  id?: string;
@@ -470,8 +470,8 @@ export interface BFormRatingProps {
470
470
  showClear?: boolean;
471
471
  showValue?: boolean;
472
472
  showValueMax?: boolean;
473
- size?: 'sm' | 'lg' | string;
474
- stars?: number;
473
+ size?: Size;
474
+ length?: Numberish;
475
475
  variant?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | string;
476
476
  }
477
477
  export interface BFormSelectBaseProps {
@@ -325,7 +325,7 @@ export interface BFormDatalistBaseProps {
325
325
  textField?: string;
326
326
  valueField?: string;
327
327
  }
328
- export interface BFormDatalistProps<Item = Record<string, unknown> | string | number | boolean, ValueKey extends Item extends Record<string, unknown> ? keyof Item : string = Item extends Record<string, unknown> ? keyof Item : never> {
328
+ export interface BFormDatalistProps<Item = Record<string, unknown> | string | number | boolean, ValueKey extends (Item extends Record<string, unknown> ? keyof Item : string) = Item extends Record<string, unknown> ? keyof Item : never> {
329
329
  disabled?: boolean;
330
330
  disabledField?: keyof Item & string;
331
331
  id?: string;
@@ -470,8 +470,8 @@ export interface BFormRatingProps {
470
470
  showClear?: boolean;
471
471
  showValue?: boolean;
472
472
  showValueMax?: boolean;
473
- size?: 'sm' | 'lg' | string;
474
- stars?: number;
473
+ size?: Size;
474
+ length?: Numberish;
475
475
  variant?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'light' | 'dark' | string;
476
476
  }
477
477
  export interface BFormSelectBaseProps {
@@ -272,7 +272,7 @@ export type BFormRadioGroupSlots = {
272
272
  export type BFormRatingSlots = {
273
273
  'icon-clear'?: (props: Record<string, never>) => any;
274
274
  'default'?: (props: {
275
- starIndex: number;
275
+ itemIndex: number;
276
276
  isFilled: boolean;
277
277
  isHalf: boolean;
278
278
  }) => any;
@@ -272,7 +272,7 @@ export type BFormRadioGroupSlots = {
272
272
  export type BFormRatingSlots = {
273
273
  'icon-clear'?: (props: Record<string, never>) => any;
274
274
  'default'?: (props: {
275
- starIndex: number;
275
+ itemIndex: number;
276
276
  isFilled: boolean;
277
277
  isHalf: boolean;
278
278
  }) => any;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "bootstrap-vue-next",
3
3
  "displayName": "BootstrapVueNext",
4
4
  "description": "Seamless integration of Vue 3, Bootstrap 5, and TypeScript for modern, type-safe UI development",
5
- "version": "0.46.3",
5
+ "version": "1.0.0",
6
6
  "license": "MIT",
7
7
  "type": "module",
8
8
  "main": "./dist/bootstrap-vue-next.mjs",