@rotki/ui-library 2.9.0 → 2.10.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 (50) hide show
  1. package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +1 -1
  2. package/dist/components/accordions/accordion/RuiAccordion.vue.js +87 -8
  3. package/dist/components/accordions/accordion/RuiAccordion.vue.js.map +1 -1
  4. package/dist/components/accordions/accordion/RuiAccordion.vue2.js +1 -62
  5. package/dist/components/accordions/accordion/RuiAccordion.vue2.js.map +1 -1
  6. package/dist/components/calendar/RuiCalendar.vue.js +12 -0
  7. package/dist/components/calendar/RuiCalendar.vue.js.map +1 -1
  8. package/dist/components/calendar/RuiCalendarMenu.vue.js +1 -1
  9. package/dist/components/calendar/RuiCalendarMenu.vue2.js +2 -2
  10. package/dist/components/calendar/RuiCalendarMenu.vue2.js.map +1 -1
  11. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +4 -0
  12. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js +19 -8
  13. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js.map +1 -1
  14. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +49 -16
  15. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js +22 -13
  16. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js.map +1 -1
  17. package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +2 -0
  18. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js +19 -8
  19. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js.map +1 -1
  20. package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +1 -0
  21. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js +18 -8
  22. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js.map +1 -1
  23. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +1 -0
  24. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js +12 -3
  25. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js.map +1 -1
  26. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +1 -0
  27. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js +2 -1
  28. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js.map +1 -1
  29. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +49 -16
  30. package/dist/components/forms/select/RuiMenuSelect.vue2.js +18 -9
  31. package/dist/components/forms/select/RuiMenuSelect.vue2.js.map +1 -1
  32. package/dist/components/forms/slider/RuiSlider.vue.d.ts +2 -0
  33. package/dist/components/forms/slider/RuiSlider.vue2.js +23 -12
  34. package/dist/components/forms/slider/RuiSlider.vue2.js.map +1 -1
  35. package/dist/components/forms/switch/RuiSwitch.vue.d.ts +2 -0
  36. package/dist/components/forms/switch/RuiSwitch.vue2.js +16 -7
  37. package/dist/components/forms/switch/RuiSwitch.vue2.js.map +1 -1
  38. package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +2 -0
  39. package/dist/components/forms/text-area/RuiTextArea.vue2.js +28 -15
  40. package/dist/components/forms/text-area/RuiTextArea.vue2.js.map +1 -1
  41. package/dist/components/forms/text-field/RuiTextField.vue.d.ts +2 -0
  42. package/dist/components/forms/text-field/RuiTextField.vue2.js +26 -13
  43. package/dist/components/forms/text-field/RuiTextField.vue2.js.map +1 -1
  44. package/dist/components/icons/IconBrowser.vue.d.ts +3 -0
  45. package/dist/components/icons/LazyIcon.vue.d.ts +10 -0
  46. package/dist/style.css +97 -60
  47. package/dist/web-types.json +155 -1
  48. package/package.json +1 -1
  49. package/dist/components/accordions/accordion/RuiAccordion.vue3.js +0 -18
  50. package/dist/components/accordions/accordion/RuiAccordion.vue3.js.map +0 -1
@@ -1,10 +1,15 @@
1
- import { defineComponent, useCssVars, unref, computed, toRefs, ref, createElementBlock, openBlock, normalizeProps, guardReactiveProps, createElementVNode, createBlock, createCommentVNode, normalizeClass, toDisplayString, withDirectives, mergeProps, isRef, vModelText, Fragment, renderList } from "vue";
1
+ import { defineComponent, useCssVars, unref, computed, toRefs, ref, createElementBlock, openBlock, normalizeProps, guardReactiveProps, createElementVNode, createBlock, createCommentVNode, normalizeClass, createTextVNode, toDisplayString, withDirectives, mergeProps, isRef, vModelText, Fragment, renderList } from "vue";
2
2
  import _sfc_main$1 from "../../helpers/RuiFormTextDetail.vue.js";
3
3
  import { getRootAttrs, getNonRootAttrs } from "../../../utils/helpers.js";
4
4
  import { get } from "@vueuse/shared";
5
5
  import { useFormTextDetail } from "../../../utils/form-text-detail.js";
6
6
  import { useElementBounding } from "@vueuse/core";
7
- const _hoisted_1 = ["max", "min", "step", "disabled"];
7
+ const _hoisted_1 = ["data-error"];
8
+ const _hoisted_2 = {
9
+ key: 0,
10
+ class: "text-rui-error"
11
+ };
12
+ const _hoisted_3 = ["max", "min", "step", "disabled", "aria-invalid"];
8
13
  const _sfc_main = /* @__PURE__ */ defineComponent({
9
14
  ...{
10
15
  name: "RuiSlider",
@@ -29,15 +34,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
29
34
  successMessages: { default: () => [] },
30
35
  hideDetails: { type: Boolean, default: false },
31
36
  sliderClass: { default: "" },
32
- tickClass: { default: "" }
37
+ tickClass: { default: "" },
38
+ required: { type: Boolean, default: false }
33
39
  },
34
40
  emits: ["update:model-value"],
35
41
  setup(__props, { emit: __emit }) {
36
42
  useCssVars((_ctx) => ({
37
- "v2618ea10": unref(sliderHeight),
38
- "v31c435d5": unref(sliderWidth),
39
- "v07d3ee6a": unref(trackWidth),
40
- "v9517d00a": unref(tickSizeInPx)
43
+ "v5a3a992e": unref(sliderHeight),
44
+ "ae30ee42": unref(sliderWidth),
45
+ "b5d1a6fe": unref(trackWidth),
46
+ "v22bb2631": unref(tickSizeInPx)
41
47
  }));
42
48
  const props = __props;
43
49
  const emit = __emit;
@@ -86,12 +92,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
86
92
  [_ctx.$style["with-error"] ?? ""]: unref(hasError),
87
93
  [_ctx.$style["with-success"] ?? ""]: unref(hasSuccess) && !unref(hasError)
88
94
  }
89
- ])
95
+ ]),
96
+ "data-error": unref(hasError) ? "" : void 0
90
97
  }, [
91
98
  __props.label ? (openBlock(), createElementBlock("div", {
92
99
  key: 0,
93
100
  class: normalizeClass([_ctx.$style.label, "text-body-1"])
94
- }, toDisplayString(__props.label), 3)) : createCommentVNode("", true),
101
+ }, [
102
+ createTextVNode(toDisplayString(__props.label) + " ", 1),
103
+ __props.required ? (openBlock(), createElementBlock("span", _hoisted_2, " ﹡ ")) : createCommentVNode("", true)
104
+ ], 2)) : createCommentVNode("", true),
95
105
  createElementVNode("div", {
96
106
  ref_key: "outer",
97
107
  ref: outer,
@@ -107,8 +117,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
107
117
  max: unref(max),
108
118
  min: unref(min),
109
119
  step: unref(step),
110
- disabled: __props.disabled
111
- }, unref(getNonRootAttrs)(_ctx.$attrs)), null, 16, _hoisted_1), [
120
+ disabled: __props.disabled,
121
+ "aria-invalid": unref(hasError)
122
+ }, unref(getNonRootAttrs)(_ctx.$attrs)), null, 16, _hoisted_3), [
112
123
  [vModelText, unref(vModel)]
113
124
  ]),
114
125
  createElementVNode("div", {
@@ -147,7 +158,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
147
158
  ], 2)
148
159
  ], 2)
149
160
  ], 2)
150
- ], 2),
161
+ ], 10, _hoisted_1),
151
162
  !__props.hideDetails ? (openBlock(), createBlock(_sfc_main$1, {
152
163
  key: 0,
153
164
  class: "pt-1",
@@ -1 +1 @@
1
- {"version":3,"file":"RuiSlider.vue2.js","sources":["../../../../src/components/forms/slider/RuiSlider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ContextColorsType } from '@/consts/colors';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface Props {\n modelValue?: number;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n showThumbLabel?: boolean;\n showTicks?: boolean;\n hideTrack?: boolean;\n tickSize?: number;\n vertical?: boolean;\n color?: ContextColorsType;\n label?: string;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n sliderClass?: string;\n tickClass?: string;\n}\n\ndefineOptions({\n name: 'RuiSlider',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: 0,\n min: 0,\n max: 100,\n step: 1,\n disabled: false,\n showThumbLabel: false,\n showTicks: false,\n hideTrack: false,\n vertical: false,\n tickSize: 2,\n color: 'primary',\n label: '',\n hint: '',\n errorMessages: () => [],\n successMessages: () => [],\n hideDetails: false,\n sliderClass: '',\n tickClass: '',\n});\n\nconst emit = defineEmits<{\n (e: 'update:model-value', value: number): void;\n}>();\n\nconst { modelValue, max, min, step, errorMessages, successMessages, vertical, tickSize } = toRefs(props);\n\nconst vModel = computed({\n get() {\n return get(modelValue);\n },\n set(value: number) {\n emit('update:model-value', value);\n },\n});\n\nconst ticksData = computed<[number, number]>(() => {\n const minVal = get(min);\n const stepVal = get(step);\n const range = get(max) - minVal;\n const total = range / stepVal;\n const current = Math.round((get(modelValue) - minVal) / stepVal);\n\n return [current, total];\n});\n\nconst trackWidth = computed(() => {\n const [current, total] = get(ticksData);\n const percentage = Math.min(100, Math.max(0, Math.round(current / total * 100)));\n return `${percentage}%`;\n});\n\nconst { hasError, hasSuccess } = useFormTextDetail(\n errorMessages,\n successMessages,\n);\n\nconst outer = ref<HTMLDivElement>();\nconst { width, height } = useElementBounding(outer);\n\nconst sliderWidth = computed(() => `${get(width)}px`);\nconst sliderHeight = computed(() => `${get(height)}px`);\nconst tickSizeInPx = computed(() => `${get(tickSize)}px`);\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <label\n :class=\"[\n $style.wrapper,\n {\n [$style.disabled ?? '']: disabled,\n [$style.vertical ?? '']: vertical,\n [$style[color] ?? '']: color,\n [$style['hide-track'] ?? '']: hideTrack,\n [$style['big-tick'] ?? '']: tickSize > 4,\n [$style['with-error'] ?? '']: hasError,\n [$style['with-success'] ?? '']: hasSuccess && !hasError,\n },\n ]\"\n >\n <div\n v-if=\"label\"\n :class=\"$style.label\"\n class=\"text-body-1\"\n >\n {{ label }}\n </div>\n <div\n ref=\"outer\"\n :class=\"$style.outer\"\n >\n <div :class=\"$style.inner\">\n <input\n v-model=\"vModel\"\n :class=\"$style.input\"\n type=\"range\"\n :max=\"max\"\n :min=\"min\"\n :step=\"step\"\n :disabled=\"disabled\"\n v-bind=\"getNonRootAttrs($attrs)\"\n />\n <div :class=\"$style.slider\">\n <div :class=\"$style.slider__inner\">\n <div :class=\"[$style.slider__container, sliderClass]\">\n <div\n v-if=\"!hideTrack\"\n :class=\"$style.slider__container__track\"\n />\n <div\n v-if=\"showTicks && !disabled\"\n :class=\"$style.slider__ticks\"\n >\n <span\n v-for=\"i in (ticksData[1] + 1)\"\n :key=\"i\"\n :class=\"hideTrack ? [tickClass] : { [$style.highlighted]: i - 1 <= ticksData[0], [tickClass]: i - 1 > ticksData[0] }\"\n />\n </div>\n </div>\n <div :class=\"$style.slider__thumb\" />\n <div\n v-if=\"showThumbLabel && !disabled\"\n :class=\"$style.slider__thumb_label\"\n >\n {{ modelValue }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </label>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n class=\"pt-1\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" module>\n@use '@/styles/colors.scss' as c;\n\n:global(.dark) {\n .wrapper {\n &.disabled {\n .inner {\n .slider {\n &__container {\n @apply bg-rui-grey-800 #{!important};\n\n &__track {\n @apply bg-rui-grey-700 #{!important};\n }\n }\n\n &__thumb {\n @apply bg-rui-grey-700 #{!important};\n }\n }\n }\n }\n\n .inner {\n .slider {\n &__ticks {\n span {\n &.highlighted {\n @apply bg-[#121212];\n }\n }\n }\n }\n }\n }\n}\n\n.wrapper {\n @apply flex items-start gap-3;\n\n &.disabled {\n .label {\n @apply text-rui-text-disabled;\n }\n .inner {\n .slider {\n &__container {\n @apply bg-rui-grey-300 #{!important};\n\n &__track {\n @apply bg-rui-grey-400 #{!important};\n }\n }\n\n &__thumb {\n @apply bg-rui-grey-400 #{!important};\n }\n }\n }\n }\n\n @each $color in c.$context-colors {\n &.#{$color},\n &.with-#{$color} {\n .inner {\n .slider {\n &__container {\n @apply bg-rui-#{$color} bg-opacity-40;\n\n &__track {\n @apply bg-rui-#{$color};\n }\n }\n\n &__thumb {\n @apply bg-rui-#{$color};\n\n &:before {\n @apply bg-rui-#{$color};\n }\n }\n\n &__ticks {\n span {\n @apply bg-rui-#{$color};\n }\n }\n }\n }\n\n &.big-tick {\n .inner {\n .slider {\n &__ticks {\n span {\n @apply bg-rui-#{$color}-lighter;\n\n &.highlighted {\n @apply bg-rui-#{$color};\n }\n }\n }\n }\n }\n }\n }\n }\n\n @each $color in ('error', 'success') {\n &.with-#{$color} {\n .label {\n @apply text-rui-#{$color};\n }\n }\n }\n\n &.vertical {\n @apply flex-col-reverse items-center h-full;\n\n .label {\n @apply mb-2 text-center;\n }\n\n .outer {\n @apply min-w-0 min-h-[120px] w-8;\n }\n\n .inner {\n width: v-bind(sliderHeight);\n height: v-bind(sliderWidth);\n @apply -rotate-90;\n transform-origin: 0 0;\n --tw-translate-y: v-bind(sliderHeight);\n\n .slider {\n &__thumb {\n &_label {\n @apply mt-6;\n @apply rotate-90 translate-x-0;\n transform-origin: 0 50%;\n }\n }\n }\n }\n }\n\n .label {\n @apply mt-1 text-rui-text;\n }\n\n .outer {\n @apply relative h-8 flex-1 min-w-[120px];\n }\n\n .inner {\n width: v-bind(sliderWidth);\n height: v-bind(sliderHeight);\n @apply relative;\n\n .input {\n @apply h-full w-full opacity-0 cursor-pointer;\n\n &:not(:disabled) {\n &:hover {\n ~ .slider {\n .slider {\n &__thumb {\n &:before {\n @apply scale-100;\n }\n }\n }\n }\n }\n\n &:focus {\n ~ .slider {\n .slider {\n &__thumb {\n &:before {\n @apply scale-100 opacity-15;\n }\n }\n }\n }\n }\n\n &:active {\n ~ .slider {\n .slider {\n &__thumb {\n &:before {\n @apply scale-100 opacity-30;\n }\n\n &_label {\n @apply opacity-100 visible;\n }\n }\n }\n }\n }\n }\n }\n\n .slider {\n @apply absolute h-full w-full top-0 px-2 pointer-events-none;\n\n &__inner {\n @apply relative h-full w-full cursor-pointer;\n }\n\n &__container {\n @apply absolute top-1/2 transform -translate-y-1/2;\n @apply w-full h-1 rounded-full;\n\n &__track {\n width: v-bind(trackWidth);\n @apply transition-all ease-linear duration-75 delay-0;\n @apply h-full rounded-full;\n }\n }\n\n &__ticks {\n @apply h-full absolute top-0;\n @apply flex justify-between items-center;\n margin: 0 calc(v-bind(tickSizeInPx) / -2);\n width: calc(100% + v-bind(tickSizeInPx));\n\n span {\n @apply rounded-full;\n width: calc(v-bind(tickSizeInPx));\n height: calc(v-bind(tickSizeInPx));\n\n &.highlighted {\n @apply bg-rui-grey-100;\n }\n }\n }\n\n &__thumb {\n @apply absolute top-1/2 transition-all ease-linear duration-75 delay-0 transform -translate-y-1/2 -translate-x-1/2;\n @apply w-3 h-3 rounded-full shadow-2;\n left: v-bind(trackWidth);\n\n &:before {\n @apply w-8 h-8 rounded-full absolute top-1/2 left-1/2;\n @apply opacity-10;\n @apply transition transform -translate-x-1/2 -translate-y-1/2 scale-0;\n content: '';\n }\n\n &_label {\n left: v-bind(trackWidth);\n @apply invisible opacity-0;\n @apply absolute -mt-7 transition-all ease-linear duration-75 delay-0 transform -translate-x-1/2;\n @apply px-2 py-1 text-xs font-normal;\n @apply bg-rui-grey-700/90 text-white rounded shadow;\n }\n }\n }\n }\n}\n</style>\n"],"names":["_createElementBlock","_normalizeProps","_guardReactiveProps","_unref","$attrs","_createElementVNode","_normalizeClass","$style","_withDirectives","_mergeProps","_Fragment","_renderList","_createBlock","RuiFormTextDetail"],"mappings":"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"}
1
+ {"version":3,"file":"RuiSlider.vue2.js","sources":["../../../../src/components/forms/slider/RuiSlider.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ContextColorsType } from '@/consts/colors';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface Props {\n modelValue?: number;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n showThumbLabel?: boolean;\n showTicks?: boolean;\n hideTrack?: boolean;\n tickSize?: number;\n vertical?: boolean;\n color?: ContextColorsType;\n label?: string;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n sliderClass?: string;\n tickClass?: string;\n required?: boolean;\n}\n\ndefineOptions({\n name: 'RuiSlider',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: 0,\n min: 0,\n max: 100,\n step: 1,\n disabled: false,\n showThumbLabel: false,\n showTicks: false,\n hideTrack: false,\n vertical: false,\n tickSize: 2,\n color: 'primary',\n label: '',\n hint: '',\n errorMessages: () => [],\n successMessages: () => [],\n hideDetails: false,\n sliderClass: '',\n tickClass: '',\n required: false,\n});\n\nconst emit = defineEmits<{\n (e: 'update:model-value', value: number): void;\n}>();\n\nconst { modelValue, max, min, step, errorMessages, successMessages, vertical, tickSize } = toRefs(props);\n\nconst vModel = computed({\n get() {\n return get(modelValue);\n },\n set(value: number) {\n emit('update:model-value', value);\n },\n});\n\nconst ticksData = computed<[number, number]>(() => {\n const minVal = get(min);\n const stepVal = get(step);\n const range = get(max) - minVal;\n const total = range / stepVal;\n const current = Math.round((get(modelValue) - minVal) / stepVal);\n\n return [current, total];\n});\n\nconst trackWidth = computed(() => {\n const [current, total] = get(ticksData);\n const percentage = Math.min(100, Math.max(0, Math.round(current / total * 100)));\n return `${percentage}%`;\n});\n\nconst { hasError, hasSuccess } = useFormTextDetail(\n errorMessages,\n successMessages,\n);\n\nconst outer = ref<HTMLDivElement>();\nconst { width, height } = useElementBounding(outer);\n\nconst sliderWidth = computed(() => `${get(width)}px`);\nconst sliderHeight = computed(() => `${get(height)}px`);\nconst tickSizeInPx = computed(() => `${get(tickSize)}px`);\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <label\n :class=\"[\n $style.wrapper,\n {\n [$style.disabled ?? '']: disabled,\n [$style.vertical ?? '']: vertical,\n [$style[color] ?? '']: color,\n [$style['hide-track'] ?? '']: hideTrack,\n [$style['big-tick'] ?? '']: tickSize > 4,\n [$style['with-error'] ?? '']: hasError,\n [$style['with-success'] ?? '']: hasSuccess && !hasError,\n },\n ]\"\n :data-error=\"hasError ? '' : undefined\"\n >\n <div\n v-if=\"label\"\n :class=\"$style.label\"\n class=\"text-body-1\"\n >\n {{ label }}\n <span\n v-if=\"required\"\n class=\"text-rui-error\"\n >\n ﹡\n </span>\n </div>\n <div\n ref=\"outer\"\n :class=\"$style.outer\"\n >\n <div :class=\"$style.inner\">\n <input\n v-model=\"vModel\"\n :class=\"$style.input\"\n type=\"range\"\n :max=\"max\"\n :min=\"min\"\n :step=\"step\"\n :disabled=\"disabled\"\n :aria-invalid=\"hasError\"\n v-bind=\"getNonRootAttrs($attrs)\"\n />\n <div :class=\"$style.slider\">\n <div :class=\"$style.slider__inner\">\n <div :class=\"[$style.slider__container, sliderClass]\">\n <div\n v-if=\"!hideTrack\"\n :class=\"$style.slider__container__track\"\n />\n <div\n v-if=\"showTicks && !disabled\"\n :class=\"$style.slider__ticks\"\n >\n <span\n v-for=\"i in (ticksData[1] + 1)\"\n :key=\"i\"\n :class=\"hideTrack ? [tickClass] : { [$style.highlighted]: i - 1 <= ticksData[0], [tickClass]: i - 1 > ticksData[0] }\"\n />\n </div>\n </div>\n <div :class=\"$style.slider__thumb\" />\n <div\n v-if=\"showThumbLabel && !disabled\"\n :class=\"$style.slider__thumb_label\"\n >\n {{ modelValue }}\n </div>\n </div>\n </div>\n </div>\n </div>\n </label>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n class=\"pt-1\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" module>\n@use '@/styles/colors.scss' as c;\n\n:global(.dark) {\n .wrapper {\n &.disabled {\n .inner {\n .slider {\n &__container {\n @apply bg-rui-grey-800 #{!important};\n\n &__track {\n @apply bg-rui-grey-700 #{!important};\n }\n }\n\n &__thumb {\n @apply bg-rui-grey-700 #{!important};\n }\n }\n }\n }\n\n .inner {\n .slider {\n &__ticks {\n span {\n &.highlighted {\n @apply bg-[#121212];\n }\n }\n }\n }\n }\n }\n}\n\n.wrapper {\n @apply flex items-start gap-3;\n\n &.disabled {\n .label {\n @apply text-rui-text-disabled;\n }\n .inner {\n .slider {\n &__container {\n @apply bg-rui-grey-300 #{!important};\n\n &__track {\n @apply bg-rui-grey-400 #{!important};\n }\n }\n\n &__thumb {\n @apply bg-rui-grey-400 #{!important};\n }\n }\n }\n }\n\n @each $color in c.$context-colors {\n &.#{$color},\n &.with-#{$color} {\n .inner {\n .slider {\n &__container {\n @apply bg-rui-#{$color} bg-opacity-40;\n\n &__track {\n @apply bg-rui-#{$color};\n }\n }\n\n &__thumb {\n @apply bg-rui-#{$color};\n\n &:before {\n @apply bg-rui-#{$color};\n }\n }\n\n &__ticks {\n span {\n @apply bg-rui-#{$color};\n }\n }\n }\n }\n\n &.big-tick {\n .inner {\n .slider {\n &__ticks {\n span {\n @apply bg-rui-#{$color}-lighter;\n\n &.highlighted {\n @apply bg-rui-#{$color};\n }\n }\n }\n }\n }\n }\n }\n }\n\n @each $color in ('error', 'success') {\n &.with-#{$color} {\n .label {\n @apply text-rui-#{$color};\n }\n }\n }\n\n &.vertical {\n @apply flex-col-reverse items-center h-full;\n\n .label {\n @apply mb-2 text-center;\n }\n\n .outer {\n @apply min-w-0 min-h-[120px] w-8;\n }\n\n .inner {\n width: v-bind(sliderHeight);\n height: v-bind(sliderWidth);\n @apply -rotate-90;\n transform-origin: 0 0;\n --tw-translate-y: v-bind(sliderHeight);\n\n .slider {\n &__thumb {\n &_label {\n @apply mt-6;\n @apply rotate-90 translate-x-0;\n transform-origin: 0 50%;\n }\n }\n }\n }\n }\n\n .label {\n @apply mt-1 text-rui-text;\n }\n\n .outer {\n @apply relative h-8 flex-1 min-w-[120px];\n }\n\n .inner {\n width: v-bind(sliderWidth);\n height: v-bind(sliderHeight);\n @apply relative;\n\n .input {\n @apply h-full w-full opacity-0 cursor-pointer;\n\n &:not(:disabled) {\n &:hover {\n ~ .slider {\n .slider {\n &__thumb {\n &:before {\n @apply scale-100;\n }\n }\n }\n }\n }\n\n &:focus {\n ~ .slider {\n .slider {\n &__thumb {\n &:before {\n @apply scale-100 opacity-15;\n }\n }\n }\n }\n }\n\n &:active {\n ~ .slider {\n .slider {\n &__thumb {\n &:before {\n @apply scale-100 opacity-30;\n }\n\n &_label {\n @apply opacity-100 visible;\n }\n }\n }\n }\n }\n }\n }\n\n .slider {\n @apply absolute h-full w-full top-0 px-2 pointer-events-none;\n\n &__inner {\n @apply relative h-full w-full cursor-pointer;\n }\n\n &__container {\n @apply absolute top-1/2 transform -translate-y-1/2;\n @apply w-full h-1 rounded-full;\n\n &__track {\n width: v-bind(trackWidth);\n @apply transition-all ease-linear duration-75 delay-0;\n @apply h-full rounded-full;\n }\n }\n\n &__ticks {\n @apply h-full absolute top-0;\n @apply flex justify-between items-center;\n margin: 0 calc(v-bind(tickSizeInPx) / -2);\n width: calc(100% + v-bind(tickSizeInPx));\n\n span {\n @apply rounded-full;\n width: calc(v-bind(tickSizeInPx));\n height: calc(v-bind(tickSizeInPx));\n\n &.highlighted {\n @apply bg-rui-grey-100;\n }\n }\n }\n\n &__thumb {\n @apply absolute top-1/2 transition-all ease-linear duration-75 delay-0 transform -translate-y-1/2 -translate-x-1/2;\n @apply w-3 h-3 rounded-full shadow-2;\n left: v-bind(trackWidth);\n\n &:before {\n @apply w-8 h-8 rounded-full absolute top-1/2 left-1/2;\n @apply opacity-10;\n @apply transition transform -translate-x-1/2 -translate-y-1/2 scale-0;\n content: '';\n }\n\n &_label {\n left: v-bind(trackWidth);\n @apply invisible opacity-0;\n @apply absolute -mt-7 transition-all ease-linear duration-75 delay-0 transform -translate-x-1/2;\n @apply px-2 py-1 text-xs font-normal;\n @apply bg-rui-grey-700/90 text-white rounded shadow;\n }\n }\n }\n }\n}\n</style>\n"],"names":["_createElementBlock","_normalizeProps","_guardReactiveProps","_unref","$attrs","_createElementVNode","_normalizeClass","$style","_createTextVNode","_toDisplayString","_withDirectives","_mergeProps","_Fragment","_renderList","_createBlock","RuiFormTextDetail"],"mappings":"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"}
@@ -9,6 +9,7 @@ export interface Props {
9
9
  errorMessages?: string | string[];
10
10
  successMessages?: string | string[];
11
11
  hideDetails?: boolean;
12
+ required?: boolean;
12
13
  }
13
14
  declare var __VLS_1: {};
14
15
  type __VLS_Slots = {} & {
@@ -27,6 +28,7 @@ declare const __VLS_base: import("vue").DefineComponent<Props, {}, {}, {}, {}, i
27
28
  errorMessages: string | string[];
28
29
  successMessages: string | string[];
29
30
  hint: string;
31
+ required: boolean;
30
32
  hideDetails: boolean;
31
33
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
32
34
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -2,7 +2,12 @@ import { defineComponent, toRefs, createElementBlock, openBlock, normalizeProps,
2
2
  import _sfc_main$1 from "../../helpers/RuiFormTextDetail.vue.js";
3
3
  import { getRootAttrs, getNonRootAttrs } from "../../../utils/helpers.js";
4
4
  import { useFormTextDetail } from "../../../utils/form-text-detail.js";
5
- const _hoisted_1 = ["checked", "disabled"];
5
+ const _hoisted_1 = ["data-error"];
6
+ const _hoisted_2 = ["checked", "disabled", "aria-invalid"];
7
+ const _hoisted_3 = {
8
+ key: 0,
9
+ class: "text-rui-error"
10
+ };
6
11
  const _sfc_main = /* @__PURE__ */ defineComponent({
7
12
  ...{
8
13
  name: "RuiSwitch",
@@ -18,7 +23,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
18
23
  hint: { default: "" },
19
24
  errorMessages: { default: () => [] },
20
25
  successMessages: { default: () => [] },
21
- hideDetails: { type: Boolean, default: false }
26
+ hideDetails: { type: Boolean, default: false },
27
+ required: { type: Boolean, default: false }
22
28
  },
23
29
  emits: ["update:modelValue"],
24
30
  setup(__props, { emit: __emit }) {
@@ -46,7 +52,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
46
52
  [_ctx.$style["with-error"]]: unref(hasError),
47
53
  [_ctx.$style["with-success"]]: unref(hasSuccess) && !unref(hasError)
48
54
  }
49
- ])
55
+ ]),
56
+ "data-error": unref(hasError) ? "" : void 0
50
57
  }, [
51
58
  createElementVNode("div", {
52
59
  class: normalizeClass(_ctx.$style.inner)
@@ -55,10 +62,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
55
62
  checked: unref(modelValue),
56
63
  type: "checkbox",
57
64
  class: _ctx.$style.input,
58
- disabled: __props.disabled
65
+ disabled: __props.disabled,
66
+ "aria-invalid": unref(hasError)
59
67
  }, unref(getNonRootAttrs)(_ctx.$attrs), {
60
68
  onInput: _cache[0] || (_cache[0] = ($event) => input($event))
61
- }), null, 16, _hoisted_1),
69
+ }), null, 16, _hoisted_2),
62
70
  createElementVNode("div", {
63
71
  class: normalizeClass(_ctx.$style.toggle)
64
72
  }, null, 2)
@@ -69,9 +77,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
69
77
  }, [
70
78
  renderSlot(_ctx.$slots, "default", {}, () => [
71
79
  createTextVNode(toDisplayString(__props.label), 1)
72
- ])
80
+ ]),
81
+ __props.required ? (openBlock(), createElementBlock("span", _hoisted_3, " ﹡ ")) : createCommentVNode("", true)
73
82
  ], 2)) : createCommentVNode("", true)
74
- ], 2),
83
+ ], 10, _hoisted_1),
75
84
  !__props.hideDetails ? (openBlock(), createBlock(_sfc_main$1, {
76
85
  key: 0,
77
86
  class: "pt-1",
@@ -1 +1 @@
1
- {"version":3,"file":"RuiSwitch.vue2.js","sources":["../../../../src/components/forms/switch/RuiSwitch.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface Props {\n modelValue?: boolean;\n disabled?: boolean;\n color?: ContextColorsType;\n size?: 'sm';\n label?: string;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n}\n\ndefineOptions({\n name: 'RuiSwitch',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: false,\n disabled: false,\n color: undefined,\n size: undefined,\n label: '',\n hint: '',\n errorMessages: () => [],\n successMessages: () => [],\n hideDetails: false,\n});\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', modelValue: boolean): void;\n}>();\n\nconst { size, modelValue, errorMessages, successMessages } = toRefs(props);\n\nfunction input(event: Event) {\n const checked = (event.target as HTMLInputElement).checked;\n emit('update:modelValue', checked);\n}\n\nconst { hasError, hasSuccess } = useFormTextDetail(\n errorMessages,\n successMessages,\n);\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <label\n :class=\"[\n $style.wrapper,\n $style[size ?? ''],\n $style[color ?? ''],\n {\n [$style.checked]: modelValue,\n [$style.disabled]: disabled,\n [$style['with-error']]: hasError,\n [$style['with-success']]: hasSuccess && !hasError,\n },\n ]\"\n >\n <div :class=\"$style.inner\">\n <input\n :checked=\"modelValue\"\n type=\"checkbox\"\n :class=\"$style.input\"\n :disabled=\"disabled\"\n v-bind=\"getNonRootAttrs($attrs)\"\n @input=\"input($event)\"\n />\n <div\n :class=\"$style.toggle\"\n />\n </div>\n <span\n v-if=\"label || $slots.default\"\n :class=\"$style.label\"\n class=\"text-body-1\"\n >\n <slot>{{ label }}</slot>\n </span>\n </label>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n class=\"pt-1\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" module>\n@use '@/styles/colors.scss' as c;\n\n.wrapper {\n @apply relative flex gap-2 items-start cursor-pointer;\n\n &.disabled {\n @apply cursor-not-allowed;\n\n .input {\n @apply bg-rui-grey-300 cursor-not-allowed;\n }\n\n .label {\n @apply text-rui-text-disabled;\n }\n\n .toggle {\n @apply bg-rui-grey-500;\n }\n }\n\n &:hover {\n &:not(.disabled) {\n .toggle {\n @apply shadow-1;\n }\n }\n }\n\n &.checked {\n &:not(.disabled) {\n .input {\n @apply bg-black;\n }\n }\n\n .toggle {\n @apply left-[21px];\n }\n }\n\n &.sm {\n .inner {\n @apply w-10 h-5 mt-0.5;\n }\n .toggle {\n @apply w-4 h-4;\n\n &:before {\n @apply w-6 h-6;\n }\n }\n\n &.checked {\n .toggle {\n @apply left-[22px];\n }\n }\n }\n\n &.checked {\n &:not(.disabled) {\n @each $color in c.$context-colors {\n &.#{$color} {\n .input {\n @apply bg-rui-#{$color};\n }\n }\n }\n }\n }\n\n &.with-error {\n .input {\n @apply bg-rui-error #{!important};\n }\n\n .label {\n @apply text-rui-error;\n }\n }\n\n &.with-success {\n .input {\n @apply bg-rui-success #{!important};\n }\n\n .label {\n @apply text-rui-success;\n }\n }\n\n .inner {\n @apply relative w-[43px] h-[24px] shrink-0;\n }\n\n .input {\n @apply appearance-none relative w-full h-full rounded-full bg-rui-grey-400 transition-all duration-75 ease-in-out cursor-pointer;\n\n &:active:not(:disabled) {\n + .toggle {\n &:before {\n @apply opacity-20;\n }\n }\n }\n }\n\n .toggle {\n @apply absolute w-5 h-5 transition-all duration-75 ease-in-out transform -translate-y-1/2 top-1/2 rounded-full pointer-events-none;\n @apply bg-white left-[2px];\n\n &:before {\n content: '';\n @apply absolute w-10 h-10 bg-black rounded-full top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 transition-all ease-in-out opacity-0;\n }\n }\n}\n\n:global(.dark) {\n .wrapper {\n &.disabled {\n .input {\n @apply bg-rui-grey-800;\n }\n\n .toggle {\n @apply bg-rui-grey-600;\n }\n }\n\n &.checked {\n &:not(.disabled) {\n .input {\n @apply bg-white;\n }\n .toggle {\n @apply bg-black;\n }\n }\n }\n\n &.checked {\n &:not(.disabled) {\n @each $color in c.$context-colors {\n &.#{$color} {\n .input {\n @apply bg-rui-#{$color}/[0.5];\n }\n .toggle {\n @apply bg-rui-#{$color};\n }\n }\n }\n }\n }\n\n &.with-error {\n .input {\n @apply bg-rui-error/[0.5] #{!important};\n }\n .toggle {\n @apply bg-rui-error #{!important};\n }\n }\n\n &.with-success {\n .input {\n @apply bg-rui-success/[0.5] #{!important};\n }\n .toggle {\n @apply bg-rui-success #{!important};\n }\n }\n }\n\n .input {\n @apply bg-rui-grey-700;\n }\n\n .toggle {\n &:before {\n @apply bg-white;\n }\n }\n}\n</style>\n"],"names":["_createElementBlock","_normalizeProps","_guardReactiveProps","_unref","$attrs","_createElementVNode","_normalizeClass","$style","_mergeProps","$slots","_renderSlot","_createBlock","RuiFormTextDetail"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAsBA,UAAM,QAAQ;AAYd,UAAM,OAAO;AAIb,UAAM,EAAE,MAAM,YAAY,eAAe,gBAAA,IAAoB,OAAO,KAAK;AAEzE,aAAS,MAAM,OAAc;AAC3B,YAAM,UAAW,MAAM,OAA4B;AACnD,WAAK,qBAAqB,OAAO;AAAA,IACnC;AAEA,UAAM,EAAE,UAAU,WAAA,IAAe;AAAA,MAC/B;AAAA,MACA;AAAA,IAAA;;0BAKAA,mBA0CM,OAAAC,eAAAC,mBA1COC,MAAA,YAAA,EAAaC,KAAAA,MAAM,CAAA,CAAA,GAAA;AAAA,QAC9BC,mBAiCQ,SAAA;AAAA,UAhCL,OAAKC,eAAA;AAAA,YAAYC,KAAAA,OAAO;AAAA,YAAiBA,KAAAA,OAAOJ,MAAA,IAAA,KAAI,EAAA;AAAA,YAAiBI,KAAAA,OAAO,QAAA,SAAK,EAAA;AAAA;eAA8BA,KAAAA,OAAO,OAAO,GAAGJ,MAAA,UAAA;AAAA,eAAuBI,KAAAA,OAAO,QAAQ,GAAG,QAAA;AAAA,cAAqBA,CAAAA,KAAAA,uBAAuBJ,MAAA,QAAA;AAAA,eAAqBI,KAAAA,OAAM,cAAA,CAAA,GAAmBJ,MAAA,UAAA,KAAU,CAAKA,MAAA,QAAA;AAAA,YAAA;AAAA;;UAYnRE,mBAYM,OAAA;AAAA,YAZA,OAAKC,eAAEC,KAAAA,OAAO,KAAK;AAAA,UAAA;YACvBF,mBAOE,SAPFG,WAOE;AAAA,cANC,SAASL,MAAA,UAAA;AAAA,cACV,MAAK;AAAA,cACJ,OAAOI,KAAAA,OAAO;AAAA,cACd,UAAU,QAAA;AAAA,YAAA,GACHJ,MAAA,eAAA,EAAgBC,KAAAA,MAAM,GAAA;AAAA,cAC7B,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,MAAM,MAAM;AAAA,YAAA;YAEtBC,mBAEE,OAAA;AAAA,cADC,OAAKC,eAAEC,KAAAA,OAAO,MAAM;AAAA,YAAA;;UAIjB,QAAA,SAASE,KAAAA,OAAO,wBADxBT,mBAMO,QAAA;AAAA;YAJJ,OAAKM,eAAA,CAAEC,KAAAA,OAAO,OACT,aAAa,CAAA;AAAA,UAAA;YAEnBG,WAAwB,4BAAxB,MAAwB;AAAA,8CAAf,QAAA,KAAK,GAAA,CAAA;AAAA,YAAA;;;SAIT,QAAA,4BADTC,YAMEC,aAAA;AAAA;UAJA,OAAM;AAAA,UACL,kBAAgBT,MAAA,aAAA;AAAA,UAChB,oBAAkBA,MAAA,eAAA;AAAA,UAClB,MAAM,QAAA;AAAA,QAAA;;;;;"}
1
+ {"version":3,"file":"RuiSwitch.vue2.js","sources":["../../../../src/components/forms/switch/RuiSwitch.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\nexport interface Props {\n modelValue?: boolean;\n disabled?: boolean;\n color?: ContextColorsType;\n size?: 'sm';\n label?: string;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n required?: boolean;\n}\n\ndefineOptions({\n name: 'RuiSwitch',\n inheritAttrs: false,\n});\n\nconst props = withDefaults(defineProps<Props>(), {\n modelValue: false,\n disabled: false,\n color: undefined,\n size: undefined,\n label: '',\n hint: '',\n errorMessages: () => [],\n successMessages: () => [],\n hideDetails: false,\n required: false,\n});\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', modelValue: boolean): void;\n}>();\n\nconst { size, modelValue, errorMessages, successMessages } = toRefs(props);\n\nfunction input(event: Event) {\n const checked = (event.target as HTMLInputElement).checked;\n emit('update:modelValue', checked);\n}\n\nconst { hasError, hasSuccess } = useFormTextDetail(\n errorMessages,\n successMessages,\n);\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <label\n :class=\"[\n $style.wrapper,\n $style[size ?? ''],\n $style[color ?? ''],\n {\n [$style.checked]: modelValue,\n [$style.disabled]: disabled,\n [$style['with-error']]: hasError,\n [$style['with-success']]: hasSuccess && !hasError,\n },\n ]\"\n :data-error=\"hasError ? '' : undefined\"\n >\n <div :class=\"$style.inner\">\n <input\n :checked=\"modelValue\"\n type=\"checkbox\"\n :class=\"$style.input\"\n :disabled=\"disabled\"\n :aria-invalid=\"hasError\"\n v-bind=\"getNonRootAttrs($attrs)\"\n @input=\"input($event)\"\n />\n <div\n :class=\"$style.toggle\"\n />\n </div>\n <span\n v-if=\"label || $slots.default\"\n :class=\"$style.label\"\n class=\"text-body-1\"\n >\n <slot>{{ label }}</slot>\n <span\n v-if=\"required\"\n class=\"text-rui-error\"\n >\n ﹡\n </span>\n </span>\n </label>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n class=\"pt-1\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" module>\n@use '@/styles/colors.scss' as c;\n\n.wrapper {\n @apply relative flex gap-2 items-start cursor-pointer;\n\n &.disabled {\n @apply cursor-not-allowed;\n\n .input {\n @apply bg-rui-grey-300 cursor-not-allowed;\n }\n\n .label {\n @apply text-rui-text-disabled;\n }\n\n .toggle {\n @apply bg-rui-grey-500;\n }\n }\n\n &:hover {\n &:not(.disabled) {\n .toggle {\n @apply shadow-1;\n }\n }\n }\n\n &.checked {\n &:not(.disabled) {\n .input {\n @apply bg-black;\n }\n }\n\n .toggle {\n @apply left-[21px];\n }\n }\n\n &.sm {\n .inner {\n @apply w-10 h-5 mt-0.5;\n }\n .toggle {\n @apply w-4 h-4;\n\n &:before {\n @apply w-6 h-6;\n }\n }\n\n &.checked {\n .toggle {\n @apply left-[22px];\n }\n }\n }\n\n &.checked {\n &:not(.disabled) {\n @each $color in c.$context-colors {\n &.#{$color} {\n .input {\n @apply bg-rui-#{$color};\n }\n }\n }\n }\n }\n\n &.with-error {\n .input {\n @apply bg-rui-error #{!important};\n }\n\n .label {\n @apply text-rui-error;\n }\n }\n\n &.with-success {\n .input {\n @apply bg-rui-success #{!important};\n }\n\n .label {\n @apply text-rui-success;\n }\n }\n\n .inner {\n @apply relative w-[43px] h-[24px] shrink-0;\n }\n\n .input {\n @apply appearance-none relative w-full h-full rounded-full bg-rui-grey-400 transition-all duration-75 ease-in-out cursor-pointer;\n\n &:active:not(:disabled) {\n + .toggle {\n &:before {\n @apply opacity-20;\n }\n }\n }\n }\n\n .toggle {\n @apply absolute w-5 h-5 transition-all duration-75 ease-in-out transform -translate-y-1/2 top-1/2 rounded-full pointer-events-none;\n @apply bg-white left-[2px];\n\n &:before {\n content: '';\n @apply absolute w-10 h-10 bg-black rounded-full top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 transition-all ease-in-out opacity-0;\n }\n }\n}\n\n:global(.dark) {\n .wrapper {\n &.disabled {\n .input {\n @apply bg-rui-grey-800;\n }\n\n .toggle {\n @apply bg-rui-grey-600;\n }\n }\n\n &.checked {\n &:not(.disabled) {\n .input {\n @apply bg-white;\n }\n .toggle {\n @apply bg-black;\n }\n }\n }\n\n &.checked {\n &:not(.disabled) {\n @each $color in c.$context-colors {\n &.#{$color} {\n .input {\n @apply bg-rui-#{$color}/[0.5];\n }\n .toggle {\n @apply bg-rui-#{$color};\n }\n }\n }\n }\n }\n\n &.with-error {\n .input {\n @apply bg-rui-error/[0.5] #{!important};\n }\n .toggle {\n @apply bg-rui-error #{!important};\n }\n }\n\n &.with-success {\n .input {\n @apply bg-rui-success/[0.5] #{!important};\n }\n .toggle {\n @apply bg-rui-success #{!important};\n }\n }\n }\n\n .input {\n @apply bg-rui-grey-700;\n }\n\n .toggle {\n &:before {\n @apply bg-white;\n }\n }\n}\n</style>\n"],"names":["_createElementBlock","_normalizeProps","_guardReactiveProps","_unref","$attrs","_createElementVNode","_normalizeClass","$style","_mergeProps","$slots","_renderSlot","_createBlock","RuiFormTextDetail"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,UAAM,QAAQ;AAad,UAAM,OAAO;AAIb,UAAM,EAAE,MAAM,YAAY,eAAe,gBAAA,IAAoB,OAAO,KAAK;AAEzE,aAAS,MAAM,OAAc;AAC3B,YAAM,UAAW,MAAM,OAA4B;AACnD,WAAK,qBAAqB,OAAO;AAAA,IACnC;AAEA,UAAM,EAAE,UAAU,WAAA,IAAe;AAAA,MAC/B;AAAA,MACA;AAAA,IAAA;;0BAKAA,mBAkDM,OAAAC,eAAAC,mBAlDOC,MAAA,YAAA,EAAaC,KAAAA,MAAM,CAAA,CAAA,GAAA;AAAA,QAC9BC,mBAyCQ,SAAA;AAAA,UAxCL,OAAKC,eAAA;AAAA,YAAYC,KAAAA,OAAO;AAAA,YAAiBA,KAAAA,OAAOJ,MAAA,IAAA,KAAI,EAAA;AAAA,YAAiBI,KAAAA,OAAO,QAAA,SAAK,EAAA;AAAA;eAA8BA,KAAAA,OAAO,OAAO,GAAGJ,MAAA,UAAA;AAAA,eAAuBI,KAAAA,OAAO,QAAQ,GAAG,QAAA;AAAA,cAAqBA,CAAAA,KAAAA,uBAAuBJ,MAAA,QAAA;AAAA,eAAqBI,KAAAA,OAAM,cAAA,CAAA,GAAmBJ,MAAA,UAAA,KAAU,CAAKA,MAAA,QAAA;AAAA,YAAA;AAAA;UAWlR,cAAYA,MAAA,QAAA,IAAQ,KAAQ;AAAA,QAAA;UAE7BE,mBAaM,OAAA;AAAA,YAbA,OAAKC,eAAEC,KAAAA,OAAO,KAAK;AAAA,UAAA;YACvBF,mBAQE,SARFG,WAQE;AAAA,cAPC,SAASL,MAAA,UAAA;AAAA,cACV,MAAK;AAAA,cACJ,OAAOI,KAAAA,OAAO;AAAA,cACd,UAAU,QAAA;AAAA,cACV,gBAAcJ,MAAA,QAAA;AAAA,YAAA,GACPA,MAAA,eAAA,EAAgBC,KAAAA,MAAM,GAAA;AAAA,cAC7B,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA,IAAA,CAAA,WAAE,MAAM,MAAM;AAAA,YAAA;YAEtBC,mBAEE,OAAA;AAAA,cADC,OAAKC,eAAEC,KAAAA,OAAO,MAAM;AAAA,YAAA;;UAIjB,QAAA,SAASE,KAAAA,OAAO,wBADxBT,mBAYO,QAAA;AAAA;YAVJ,OAAKM,eAAA,CAAEC,KAAAA,OAAO,OACT,aAAa,CAAA;AAAA,UAAA;YAEnBG,WAAwB,4BAAxB,MAAwB;AAAA,8CAAf,QAAA,KAAK,GAAA,CAAA;AAAA,YAAA;YAEN,QAAA,yBADRV,mBAKO,QALP,YAGC,KAED;;;SAIK,QAAA,4BADTW,YAMEC,aAAA;AAAA;UAJA,OAAM;AAAA,UACL,kBAAgBT,MAAA,aAAA;AAAA,UAChB,oBAAkBA,MAAA,eAAA;AAAA,UAClB,MAAM,QAAA;AAAA,QAAA;;;;;"}
@@ -21,6 +21,7 @@ export interface Props {
21
21
  maxRows?: number | string;
22
22
  rowHeight?: number | string;
23
23
  autoGrow?: boolean;
24
+ required?: boolean;
24
25
  }
25
26
  type __VLS_Props = Props;
26
27
  type __VLS_ModelProps = {
@@ -51,6 +52,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
51
52
  errorMessages: string | string[];
52
53
  successMessages: string | string[];
53
54
  hint: string;
55
+ required: boolean;
54
56
  hideDetails: boolean;
55
57
  textColor: ContextColorsType;
56
58
  prependIcon: RuiIcons;
@@ -1,5 +1,5 @@
1
1
  import { getRootAttrs, getNonRootAttrs } from "../../../utils/helpers.js";
2
- import { defineComponent, mergeModels, useCssVars, unref, computed, ref, useModel, toRefs, useCssModule, watch, onMounted, createElementBlock, openBlock, normalizeProps, guardReactiveProps, createElementVNode, createBlock, createCommentVNode, normalizeClass, renderSlot, createVNode, withDirectives, normalizeStyle, mergeProps, vModelText, toDisplayString, withModifiers, withCtx, nextTick } from "vue";
2
+ import { defineComponent, mergeModels, useCssVars, unref, computed, ref, useModel, toRefs, useCssModule, watch, onMounted, createElementBlock, openBlock, normalizeProps, guardReactiveProps, createElementVNode, createBlock, createCommentVNode, normalizeClass, renderSlot, createVNode, withDirectives, normalizeStyle, mergeProps, vModelText, createTextVNode, toDisplayString, withModifiers, withCtx, nextTick } from "vue";
3
3
  import { logicAnd, logicNot } from "@vueuse/math";
4
4
  import RuiButton from "../../buttons/button/RuiButton.vue.js";
5
5
  import _sfc_main$1 from "../../helpers/RuiFormTextDetail.vue.js";
@@ -8,8 +8,13 @@ import { assert } from "../../../utils/assert.js";
8
8
  import { get, set } from "@vueuse/shared";
9
9
  import { useResizeObserver, useFocus, refDebounced } from "@vueuse/core";
10
10
  import { useFormTextDetail } from "../../../utils/form-text-detail.js";
11
- const _hoisted_1 = ["value"];
12
- const _hoisted_2 = ["placeholder", "disabled", "readonly"];
11
+ const _hoisted_1 = ["data-error"];
12
+ const _hoisted_2 = ["value"];
13
+ const _hoisted_3 = ["placeholder", "disabled", "readonly", "aria-invalid"];
14
+ const _hoisted_4 = {
15
+ key: 0,
16
+ class: "text-rui-error"
17
+ };
13
18
  const _sfc_main = /* @__PURE__ */ defineComponent({
14
19
  ...{
15
20
  name: "RuiTextArea",
@@ -36,7 +41,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
36
41
  minRows: { default: 2 },
37
42
  maxRows: { default: void 0 },
38
43
  rowHeight: { default: 1.5 },
39
- autoGrow: { type: Boolean, default: false }
44
+ autoGrow: { type: Boolean, default: false },
45
+ required: { type: Boolean, default: false }
40
46
  }, {
41
47
  "modelValue": { required: true },
42
48
  "modelModifiers": {}
@@ -44,9 +50,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
44
50
  emits: /* @__PURE__ */ mergeModels(["click:clear"], ["update:modelValue"]),
45
51
  setup(__props, { emit: __emit }) {
46
52
  useCssVars((_ctx) => ({
47
- "v0693e487": unref(appendWidth),
48
- "v6faa6706": unref(prependWidth),
49
- "v27a5adb2": unref(labelWithQuote)
53
+ "v188749d2": unref(appendWidth),
54
+ "v16b7dedc": unref(prependWidth),
55
+ "v41348808": unref(labelWithQuote)
50
56
  }));
51
57
  const modelValue = useModel(__props, "modelValue");
52
58
  const props = __props;
@@ -62,7 +68,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
62
68
  noResize,
63
69
  rowHeight,
64
70
  errorMessages,
65
- successMessages
71
+ successMessages,
72
+ required
66
73
  } = toRefs(props);
67
74
  const prepend = ref();
68
75
  const append = ref();
@@ -73,7 +80,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
73
80
  const labelVal = get(label);
74
81
  if (!labelVal)
75
82
  return '"\\200B"';
76
- return `' ${get(label)} '`;
83
+ const asterisk = get(required) ? "﹡" : "";
84
+ return `' ${labelVal}${asterisk} '`;
77
85
  });
78
86
  const fieldStyles = computed(() => {
79
87
  const height = Number(get(rowHeight));
@@ -152,7 +160,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
152
160
  [unref(css)["with-success"] ?? ""]: unref(hasSuccess) && !unref(hasError),
153
161
  [unref(css)[`text_${__props.textColor}`] ?? ""]: __props.textColor && !unref(hasMessages)
154
162
  }
155
- ])
163
+ ]),
164
+ "data-error": unref(hasError) ? "" : void 0
156
165
  }, [
157
166
  _ctx.$slots.prepend || __props.prependIcon ? (openBlock(), createElementBlock("div", {
158
167
  key: 0,
@@ -180,7 +189,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
180
189
  "aria-hidden": "true",
181
190
  disabled: "",
182
191
  readonly: ""
183
- }, null, 14, _hoisted_1)) : createCommentVNode("", true),
192
+ }, null, 14, _hoisted_2)) : createCommentVNode("", true),
184
193
  withDirectives(createElementVNode("textarea", mergeProps({
185
194
  ref_key: "textarea",
186
195
  ref: textarea,
@@ -189,13 +198,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
189
198
  class: [unref(css).textarea, unref(noResize) ? "resize-none" : "resize-y"],
190
199
  style: unref(fieldStyles),
191
200
  disabled: unref(disabled),
192
- readonly: unref(readonly)
193
- }, ("getNonRootAttrs" in _ctx ? _ctx.getNonRootAttrs : unref(getNonRootAttrs))(_ctx.$attrs)), null, 16, _hoisted_2), [
201
+ readonly: unref(readonly),
202
+ "aria-invalid": unref(hasError)
203
+ }, ("getNonRootAttrs" in _ctx ? _ctx.getNonRootAttrs : unref(getNonRootAttrs))(_ctx.$attrs)), null, 16, _hoisted_3), [
194
204
  [vModelText, modelValue.value]
195
205
  ]),
196
206
  createElementVNode("label", {
197
207
  class: normalizeClass(unref(css).label)
198
- }, toDisplayString(unref(label)), 3),
208
+ }, [
209
+ createTextVNode(toDisplayString(unref(label)) + " ", 1),
210
+ unref(required) ? (openBlock(), createElementBlock("span", _hoisted_4, " ﹡ ")) : createCommentVNode("", true)
211
+ ], 2),
199
212
  __props.variant === "outlined" ? (openBlock(), createElementBlock("fieldset", {
200
213
  key: 1,
201
214
  class: normalizeClass(unref(css).fieldset)
@@ -234,7 +247,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
234
247
  createVNode(RuiIcon, { name: __props.appendIcon }, null, 8, ["name"])
235
248
  ], 2)) : createCommentVNode("", true)
236
249
  ], 2)) : createCommentVNode("", true)
237
- ], 2),
250
+ ], 10, _hoisted_1),
238
251
  !__props.hideDetails ? (openBlock(), createBlock(_sfc_main$1, {
239
252
  key: 0,
240
253
  class: "pt-1 px-3",
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTextArea.vue2.js","sources":["../../../../src/components/forms/text-area/RuiTextArea.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { RuiIcons } from '@/icons';\nimport { logicAnd, logicNot } from '@vueuse/math';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { assert } from '@/utils/assert';\n\nexport interface Props {\n label?: string;\n placeholder?: string;\n disabled?: boolean;\n variant?: 'default' | 'filled' | 'outlined';\n color?: ContextColorsType;\n textColor?: ContextColorsType;\n dense?: boolean;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n prependIcon?: RuiIcons;\n appendIcon?: RuiIcons;\n readonly?: boolean;\n clearable?: boolean;\n noResize?: boolean;\n minRows?: number | string;\n maxRows?: number | string;\n rowHeight?: number | string;\n autoGrow?: boolean;\n}\n\ndefineOptions({\n name: 'RuiTextArea',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<string>({ required: true });\n\nconst props = withDefaults(defineProps<Props>(), {\n label: '',\n placeholder: '',\n disabled: false,\n variant: 'default',\n color: undefined,\n textColor: undefined,\n dense: false,\n hint: '',\n errorMessages: () => [],\n successMessages: () => [],\n hideDetails: false,\n prependIcon: undefined,\n appendIcon: undefined,\n readonly: false,\n clearable: false,\n noResize: false,\n minRows: 2,\n rowHeight: 1.5, // in rems\n maxRows: undefined,\n autoGrow: false,\n});\n\nconst emit = defineEmits<{\n (e: 'click:clear'): void;\n}>();\n\nconst {\n label,\n autoGrow,\n clearable,\n disabled,\n readonly,\n minRows,\n maxRows,\n noResize,\n rowHeight,\n errorMessages,\n successMessages,\n} = toRefs(props);\n\nconst prepend = ref<HTMLDivElement>();\nconst append = ref<HTMLDivElement>();\nconst textarea = ref<HTMLTextAreaElement>();\nconst textareaSizer = ref<HTMLTextAreaElement>();\n\nconst css = useCssModule();\n\nconst labelWithQuote = computed(() => {\n const labelVal = get(label);\n if (!labelVal)\n return '\"\\\\200B\"';\n\n return `' ${get(label)} '`;\n});\n\nconst fieldStyles = computed(() => {\n const height = Number(get(rowHeight));\n const min = Number(get(minRows));\n const max = Number(get(maxRows));\n const value: { minHeight: string; maxHeight?: string } = {\n minHeight: `${min * height + 0.75}rem`,\n };\n if (max)\n value.maxHeight = `${max * height + 0.75}rem`;\n\n return value;\n});\n\nconst prependWidth = ref('0px');\nconst appendWidth = ref('0px');\n\nuseResizeObserver(prepend, (entries) => {\n const [entry] = entries;\n assert(entry);\n const { width, left } = entry.contentRect;\n set(prependWidth, `${width + left + 24}px`);\n});\n\nuseResizeObserver(append, (entries) => {\n const [entry] = entries;\n assert(entry);\n const { width, right } = entry.contentRect;\n set(appendWidth, `${width + right + 24}px`);\n});\n\nconst colorClass = computed(() => (props.color ? css[props.color] : undefined));\n\nconst showClearIcon = logicAnd(\n clearable,\n modelValue,\n logicNot(disabled),\n logicNot(readonly),\n);\n\nconst { hasError, hasSuccess, hasMessages } = useFormTextDetail(\n errorMessages,\n successMessages,\n);\n\nfunction clearIconClicked() {\n set(modelValue, '');\n emit('click:clear');\n}\n\nfunction computeFieldHeight(newVal?: string, oldVal?: string) {\n if (!get(autoGrow))\n return;\n\n const field = get(textarea);\n const fieldValue = newVal ?? get(modelValue);\n const fieldSizer = get(textareaSizer);\n if (!(field && fieldSizer))\n return;\n\n nextTick(() => {\n field.style.minHeight = get(fieldStyles).minHeight;\n const sizerHeight = fieldSizer.scrollHeight;\n const fieldHeight = field.scrollHeight;\n let height = `${Math.max(sizerHeight, fieldHeight) / 16}rem`;\n if (oldVal && oldVal.length > fieldValue.length)\n height = `${Math.min(sizerHeight, fieldHeight) / 16}rem`;\n\n field.style.height = height;\n });\n}\n\nconst { focused } = useFocus(textarea);\nconst focusedDebounced = refDebounced(focused, 500);\n\nwatch(modelValue, computeFieldHeight);\nonMounted(computeFieldHeight);\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <div\n :class=\"[\n css.wrapper,\n colorClass,\n css[variant ?? ''],\n {\n [css.dense]: dense,\n [css.disabled]: disabled,\n [css['no-label']]: !label,\n [css['with-error'] ?? '']: hasError,\n [css['with-success'] ?? '']: hasSuccess && !hasError,\n [css[`text_${textColor}`] ?? '']: textColor && !hasMessages,\n },\n ]\"\n >\n <div\n v-if=\"$slots.prepend || prependIcon\"\n ref=\"prepend\"\n class=\"flex items-center gap-1 shrink-0\"\n :class=\"css.prepend\"\n >\n <slot\n v-if=\"$slots.prepend\"\n name=\"prepend\"\n />\n <div\n v-else-if=\"prependIcon\"\n :class=\"[css.icon]\"\n >\n <RuiIcon :name=\"prependIcon\" />\n </div>\n </div>\n <div :class=\"css.inner_wrapper\">\n <textarea\n v-if=\"autoGrow\"\n ref=\"textareaSizer\"\n :value=\"modelValue\"\n :class=\"[css.textarea_sizer]\"\n :style=\"fieldStyles\"\n aria-hidden=\"true\"\n disabled\n readonly\n />\n <textarea\n ref=\"textarea\"\n v-model=\"modelValue\"\n :placeholder=\"placeholder || ' '\"\n :class=\"[css.textarea, noResize ? 'resize-none' : 'resize-y']\"\n :style=\"fieldStyles\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n v-bind=\"getNonRootAttrs($attrs)\"\n />\n <label :class=\"css.label\">\n {{ label }}\n </label>\n <fieldset\n v-if=\"variant === 'outlined'\"\n :class=\"css.fieldset\"\n >\n <legend />\n </fieldset>\n </div>\n <div\n v-if=\"$slots.append || appendIcon || showClearIcon\"\n ref=\"append\"\n class=\"flex items-center gap-1 shrink-0\"\n :class=\"css.append\"\n >\n <RuiButton\n v-if=\"showClearIcon\"\n :class=\"{ hidden: !focusedDebounced }\"\n variant=\"text\"\n type=\"button\"\n icon\n class=\"!p-2 clear-btn\"\n color=\"error\"\n tabindex=\"-1\"\n @click.stop=\"clearIconClicked()\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"20\"\n />\n </RuiButton>\n <slot\n v-if=\"$slots.append\"\n name=\"append\"\n />\n <div\n v-else-if=\"appendIcon\"\n :class=\"[css.icon]\"\n >\n <RuiIcon :name=\"appendIcon\" />\n </div>\n </div>\n </div>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n class=\"pt-1 px-3\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" module>\n@use '@/styles/colors.scss' as c;\n\n:global(.dark) {\n .wrapper {\n .label {\n @apply border-white/[0.42];\n\n &:after {\n @apply border-white;\n }\n }\n\n .icon {\n @apply text-white/[0.56];\n }\n\n &:hover {\n .label {\n @apply border-white;\n }\n }\n\n &.filled {\n .textarea {\n &:focus {\n + .label {\n @apply bg-white/[0.13];\n }\n }\n }\n\n .label {\n @apply bg-white/[0.09];\n }\n }\n\n &.outlined {\n .fieldset {\n @apply border-white/[0.23];\n }\n\n &:not(.disabled) {\n .textarea {\n &:hover,\n &:focus {\n ~ .fieldset {\n @apply border-white;\n }\n }\n }\n }\n }\n }\n}\n\n.wrapper {\n @apply relative w-full min-w-[12.5rem] flex items-start;\n\n .inner_wrapper {\n @apply flex flex-1 pt-4;\n }\n\n .append {\n @apply absolute right-0;\n }\n\n .textarea {\n @apply leading-6 text-rui-text w-full bg-transparent pb-2 pt-0;\n @apply outline-0 outline-none placeholder:opacity-0 focus:placeholder:opacity-100;\n\n --x-padding: 0.75rem;\n padding-right: calc(var(--x-padding) + v-bind(appendWidth)) !important;\n\n &_sizer {\n @apply invisible absolute top-0 left-0 w-full h-0 -z-10 pointer-events-none py-2 px-3 #{!important};\n\n padding-right: calc(var(--x-padding) + v-bind(appendWidth)) !important;\n }\n\n &:focus {\n @apply outline-0;\n + .label {\n @apply after:scale-x-100;\n }\n }\n\n &:not(:placeholder-shown),\n &:autofill,\n &:-webkit-autofill,\n &[data-has-value='true'],\n &:focus {\n + .label {\n @apply text-xs leading-tight;\n padding-left: var(--x-padding);\n padding-right: var(--x-padding);\n }\n }\n\n &:disabled {\n @apply border-dotted;\n\n &,\n + .label {\n @apply text-rui-text-disabled;\n }\n\n ~ .fieldset {\n @apply border-dotted;\n }\n }\n }\n\n .label {\n @apply left-0 text-base leading-[3.2] text-rui-text-secondary pointer-events-none absolute top-0 flex h-full w-full select-none transition-all border-b border-black/[0.42];\n\n --x-padding: 0rem;\n\n padding-left: calc(var(--x-padding) + v-bind(prependWidth));\n padding-right: calc(var(--x-padding) + v-bind(appendWidth));\n\n &:after {\n content: '';\n @apply absolute bottom-0 left-0 block w-full scale-x-0 border-b-2 mb-[-1px] transition-transform duration-300 border-black;\n }\n }\n\n &:hover {\n .label {\n @apply border-black;\n }\n }\n\n .icon {\n @apply text-black/[0.54];\n }\n\n .prepend,\n .append {\n @apply mt-4 mx-3;\n\n .textarea {\n --x-padding: 0rem;\n }\n }\n\n @each $color in c.$context-colors {\n &.#{$color} {\n .textarea {\n &:focus {\n + .label {\n @apply text-rui-#{$color};\n }\n }\n }\n\n .label {\n @apply after:border-rui-#{$color};\n }\n\n &.outlined {\n &:not(.disabled) {\n .textarea {\n &:focus {\n ~ .fieldset {\n @apply border-rui-#{$color};\n }\n }\n }\n }\n }\n }\n\n &.text_#{$color},\n &.with-#{$color} {\n .prepend,\n .append,\n .textarea {\n @apply text-rui-#{$color};\n }\n\n &:not(.disabled) .prepend svg,\n &:not(.disabled) .append svg {\n @apply text-rui-#{$color};\n }\n }\n }\n\n @each $color in 'error', 'success' {\n &.with-#{$color} {\n .textarea {\n @apply border-rui-#{$color} #{!important};\n }\n\n .label {\n @apply text-rui-#{$color} after:border-rui-#{$color} #{!important};\n }\n\n .fieldset {\n @apply border-rui-#{$color} #{!important};\n }\n }\n }\n\n &.dense {\n .inner_wrapper {\n @apply pt-2;\n\n .textarea {\n @apply py-1;\n &_sizer {\n @apply py-1;\n }\n }\n }\n }\n\n &.filled,\n &.outlined {\n .textarea {\n @apply px-3;\n }\n\n .prepend {\n @apply mr-0;\n\n + .inner_wrapper .textarea {\n &:not(:placeholder-shown),\n &:autofill,\n &:-webkit-autofill,\n &[data-has-value='true'],\n &:focus {\n + .label {\n --x-padding: 0.75rem;\n }\n }\n }\n }\n\n .append {\n @apply ml-0;\n }\n\n .prepend,\n .append {\n + .inner_wrapper > .label {\n --x-padding: 0rem;\n }\n }\n\n .label {\n --x-padding: 0.75rem;\n }\n }\n\n &.filled {\n .label {\n @apply rounded-t bg-black/[0.06];\n }\n\n &.no-label {\n .textarea {\n @apply py-4;\n &_sizer {\n @apply py-4;\n }\n }\n\n &.dense {\n .textarea {\n @apply py-3;\n }\n }\n }\n }\n\n &.outlined {\n .textarea {\n &:not(:placeholder-shown),\n &:autofill,\n &:-webkit-autofill,\n &[data-has-value='true'],\n &:focus {\n @apply border-t-transparent;\n\n + .label {\n @apply leading-[0] pl-4;\n }\n\n ~ .fieldset {\n legend {\n &:after {\n content: v-bind(labelWithQuote);\n }\n }\n }\n }\n }\n\n .fieldset {\n @apply absolute w-full h-[calc(100%+0.5rem)] top-0 left-0 pointer-events-none rounded border border-black/[0.23] px-2 transition-all -mt-2;\n\n legend {\n @apply opacity-0 text-xs;\n\n &:after {\n @apply whitespace-break-spaces;\n content: '\\200B';\n }\n }\n }\n\n &:not(.disabled) {\n .textarea {\n &:hover,\n &:focus {\n ~ .fieldset {\n @apply border border-black;\n }\n }\n\n &:focus {\n ~ .fieldset {\n @apply border-2;\n }\n }\n }\n }\n\n .label {\n @apply border-0 border-transparent;\n\n &:after {\n content: none !important;\n }\n }\n\n &.dense {\n .label {\n @apply leading-[2.5];\n }\n }\n }\n}\n</style>\n"],"names":["_useModel","_createElementBlock","_normalizeProps","_guardReactiveProps","getRootAttrs","$attrs","_createElementVNode","_normalizeClass","_unref","$slots","_renderSlot","_createVNode","_withDirectives","_mergeProps","getNonRootAttrs","_createBlock","RuiFormTextDetail"],"mappings":"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"}
1
+ {"version":3,"file":"RuiTextArea.vue2.js","sources":["../../../../src/components/forms/text-area/RuiTextArea.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { ContextColorsType } from '@/consts/colors';\nimport type { RuiIcons } from '@/icons';\nimport { logicAnd, logicNot } from '@vueuse/math';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiFormTextDetail from '@/components/helpers/RuiFormTextDetail.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport { assert } from '@/utils/assert';\n\nexport interface Props {\n label?: string;\n placeholder?: string;\n disabled?: boolean;\n variant?: 'default' | 'filled' | 'outlined';\n color?: ContextColorsType;\n textColor?: ContextColorsType;\n dense?: boolean;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n prependIcon?: RuiIcons;\n appendIcon?: RuiIcons;\n readonly?: boolean;\n clearable?: boolean;\n noResize?: boolean;\n minRows?: number | string;\n maxRows?: number | string;\n rowHeight?: number | string;\n autoGrow?: boolean;\n required?: boolean;\n}\n\ndefineOptions({\n name: 'RuiTextArea',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<string>({ required: true });\n\nconst props = withDefaults(defineProps<Props>(), {\n label: '',\n placeholder: '',\n disabled: false,\n variant: 'default',\n color: undefined,\n textColor: undefined,\n dense: false,\n hint: '',\n errorMessages: () => [],\n successMessages: () => [],\n hideDetails: false,\n prependIcon: undefined,\n appendIcon: undefined,\n readonly: false,\n clearable: false,\n noResize: false,\n minRows: 2,\n rowHeight: 1.5, // in rems\n maxRows: undefined,\n autoGrow: false,\n required: false,\n});\n\nconst emit = defineEmits<{\n (e: 'click:clear'): void;\n}>();\n\nconst {\n label,\n autoGrow,\n clearable,\n disabled,\n readonly,\n minRows,\n maxRows,\n noResize,\n rowHeight,\n errorMessages,\n successMessages,\n required,\n} = toRefs(props);\n\nconst prepend = ref<HTMLDivElement>();\nconst append = ref<HTMLDivElement>();\nconst textarea = ref<HTMLTextAreaElement>();\nconst textareaSizer = ref<HTMLTextAreaElement>();\n\nconst css = useCssModule();\n\nconst labelWithQuote = computed<string>(() => {\n const labelVal = get(label);\n if (!labelVal)\n return '\"\\\\200B\"';\n\n const asterisk = get(required) ? '﹡' : '';\n return `' ${labelVal}${asterisk} '`;\n});\n\nconst fieldStyles = computed(() => {\n const height = Number(get(rowHeight));\n const min = Number(get(minRows));\n const max = Number(get(maxRows));\n const value: { minHeight: string; maxHeight?: string } = {\n minHeight: `${min * height + 0.75}rem`,\n };\n if (max)\n value.maxHeight = `${max * height + 0.75}rem`;\n\n return value;\n});\n\nconst prependWidth = ref('0px');\nconst appendWidth = ref('0px');\n\nuseResizeObserver(prepend, (entries) => {\n const [entry] = entries;\n assert(entry);\n const { width, left } = entry.contentRect;\n set(prependWidth, `${width + left + 24}px`);\n});\n\nuseResizeObserver(append, (entries) => {\n const [entry] = entries;\n assert(entry);\n const { width, right } = entry.contentRect;\n set(appendWidth, `${width + right + 24}px`);\n});\n\nconst colorClass = computed(() => (props.color ? css[props.color] : undefined));\n\nconst showClearIcon = logicAnd(\n clearable,\n modelValue,\n logicNot(disabled),\n logicNot(readonly),\n);\n\nconst { hasError, hasSuccess, hasMessages } = useFormTextDetail(\n errorMessages,\n successMessages,\n);\n\nfunction clearIconClicked() {\n set(modelValue, '');\n emit('click:clear');\n}\n\nfunction computeFieldHeight(newVal?: string, oldVal?: string) {\n if (!get(autoGrow))\n return;\n\n const field = get(textarea);\n const fieldValue = newVal ?? get(modelValue);\n const fieldSizer = get(textareaSizer);\n if (!(field && fieldSizer))\n return;\n\n nextTick(() => {\n field.style.minHeight = get(fieldStyles).minHeight;\n const sizerHeight = fieldSizer.scrollHeight;\n const fieldHeight = field.scrollHeight;\n let height = `${Math.max(sizerHeight, fieldHeight) / 16}rem`;\n if (oldVal && oldVal.length > fieldValue.length)\n height = `${Math.min(sizerHeight, fieldHeight) / 16}rem`;\n\n field.style.height = height;\n });\n}\n\nconst { focused } = useFocus(textarea);\nconst focusedDebounced = refDebounced(focused, 500);\n\nwatch(modelValue, computeFieldHeight);\nonMounted(computeFieldHeight);\n</script>\n\n<template>\n <div v-bind=\"getRootAttrs($attrs)\">\n <div\n :class=\"[\n css.wrapper,\n colorClass,\n css[variant ?? ''],\n {\n [css.dense]: dense,\n [css.disabled]: disabled,\n [css['no-label']]: !label,\n [css['with-error'] ?? '']: hasError,\n [css['with-success'] ?? '']: hasSuccess && !hasError,\n [css[`text_${textColor}`] ?? '']: textColor && !hasMessages,\n },\n ]\"\n :data-error=\"hasError ? '' : undefined\"\n >\n <div\n v-if=\"$slots.prepend || prependIcon\"\n ref=\"prepend\"\n class=\"flex items-center gap-1 shrink-0\"\n :class=\"css.prepend\"\n >\n <slot\n v-if=\"$slots.prepend\"\n name=\"prepend\"\n />\n <div\n v-else-if=\"prependIcon\"\n :class=\"[css.icon]\"\n >\n <RuiIcon :name=\"prependIcon\" />\n </div>\n </div>\n <div :class=\"css.inner_wrapper\">\n <textarea\n v-if=\"autoGrow\"\n ref=\"textareaSizer\"\n :value=\"modelValue\"\n :class=\"[css.textarea_sizer]\"\n :style=\"fieldStyles\"\n aria-hidden=\"true\"\n disabled\n readonly\n />\n <textarea\n ref=\"textarea\"\n v-model=\"modelValue\"\n :placeholder=\"placeholder || ' '\"\n :class=\"[css.textarea, noResize ? 'resize-none' : 'resize-y']\"\n :style=\"fieldStyles\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :aria-invalid=\"hasError\"\n v-bind=\"getNonRootAttrs($attrs)\"\n />\n <label :class=\"css.label\">\n {{ label }}\n <span\n v-if=\"required\"\n class=\"text-rui-error\"\n >\n ﹡\n </span>\n </label>\n <fieldset\n v-if=\"variant === 'outlined'\"\n :class=\"css.fieldset\"\n >\n <legend />\n </fieldset>\n </div>\n <div\n v-if=\"$slots.append || appendIcon || showClearIcon\"\n ref=\"append\"\n class=\"flex items-center gap-1 shrink-0\"\n :class=\"css.append\"\n >\n <RuiButton\n v-if=\"showClearIcon\"\n :class=\"{ hidden: !focusedDebounced }\"\n variant=\"text\"\n type=\"button\"\n icon\n class=\"!p-2 clear-btn\"\n color=\"error\"\n tabindex=\"-1\"\n @click.stop=\"clearIconClicked()\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"20\"\n />\n </RuiButton>\n <slot\n v-if=\"$slots.append\"\n name=\"append\"\n />\n <div\n v-else-if=\"appendIcon\"\n :class=\"[css.icon]\"\n >\n <RuiIcon :name=\"appendIcon\" />\n </div>\n </div>\n </div>\n <RuiFormTextDetail\n v-if=\"!hideDetails\"\n class=\"pt-1 px-3\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hint=\"hint\"\n />\n </div>\n</template>\n\n<style lang=\"scss\" module>\n@use '@/styles/colors.scss' as c;\n\n:global(.dark) {\n .wrapper {\n .label {\n @apply border-white/[0.42];\n\n &:after {\n @apply border-white;\n }\n }\n\n .icon {\n @apply text-white/[0.56];\n }\n\n &:hover {\n .label {\n @apply border-white;\n }\n }\n\n &.filled {\n .textarea {\n &:focus {\n + .label {\n @apply bg-white/[0.13];\n }\n }\n }\n\n .label {\n @apply bg-white/[0.09];\n }\n }\n\n &.outlined {\n .fieldset {\n @apply border-white/[0.23];\n }\n\n &:not(.disabled) {\n .textarea {\n &:hover,\n &:focus {\n ~ .fieldset {\n @apply border-white;\n }\n }\n }\n }\n }\n }\n}\n\n.wrapper {\n @apply relative w-full min-w-[12.5rem] flex items-start;\n\n .inner_wrapper {\n @apply flex flex-1 pt-4;\n }\n\n .append {\n @apply absolute right-0;\n }\n\n .textarea {\n @apply leading-6 text-rui-text w-full bg-transparent pb-2 pt-0;\n @apply outline-0 outline-none placeholder:opacity-0 focus:placeholder:opacity-100;\n\n --x-padding: 0.75rem;\n padding-right: calc(var(--x-padding) + v-bind(appendWidth)) !important;\n\n &_sizer {\n @apply invisible absolute top-0 left-0 w-full h-0 -z-10 pointer-events-none py-2 px-3 #{!important};\n\n padding-right: calc(var(--x-padding) + v-bind(appendWidth)) !important;\n }\n\n &:focus {\n @apply outline-0;\n + .label {\n @apply after:scale-x-100;\n }\n }\n\n &:not(:placeholder-shown),\n &:autofill,\n &:-webkit-autofill,\n &[data-has-value='true'],\n &:focus {\n + .label {\n @apply text-xs leading-tight;\n padding-left: var(--x-padding);\n padding-right: var(--x-padding);\n }\n }\n\n &:disabled {\n @apply border-dotted;\n\n &,\n + .label {\n @apply text-rui-text-disabled;\n }\n\n ~ .fieldset {\n @apply border-dotted;\n }\n }\n }\n\n .label {\n @apply left-0 text-base leading-[3.2] text-rui-text-secondary pointer-events-none absolute top-0 flex h-full w-full select-none transition-all border-b border-black/[0.42];\n\n --x-padding: 0rem;\n\n padding-left: calc(var(--x-padding) + v-bind(prependWidth));\n padding-right: calc(var(--x-padding) + v-bind(appendWidth));\n\n &:after {\n content: '';\n @apply absolute bottom-0 left-0 block w-full scale-x-0 border-b-2 mb-[-1px] transition-transform duration-300 border-black;\n }\n }\n\n &:hover {\n .label {\n @apply border-black;\n }\n }\n\n .icon {\n @apply text-black/[0.54];\n }\n\n .prepend,\n .append {\n @apply mt-4 mx-3;\n\n .textarea {\n --x-padding: 0rem;\n }\n }\n\n @each $color in c.$context-colors {\n &.#{$color} {\n .textarea {\n &:focus {\n + .label {\n @apply text-rui-#{$color};\n }\n }\n }\n\n .label {\n @apply after:border-rui-#{$color};\n }\n\n &.outlined {\n &:not(.disabled) {\n .textarea {\n &:focus {\n ~ .fieldset {\n @apply border-rui-#{$color};\n }\n }\n }\n }\n }\n }\n\n &.text_#{$color},\n &.with-#{$color} {\n .prepend,\n .append,\n .textarea {\n @apply text-rui-#{$color};\n }\n\n &:not(.disabled) .prepend svg,\n &:not(.disabled) .append svg {\n @apply text-rui-#{$color};\n }\n }\n }\n\n @each $color in 'error', 'success' {\n &.with-#{$color} {\n .textarea {\n @apply border-rui-#{$color} #{!important};\n }\n\n .label {\n @apply text-rui-#{$color} after:border-rui-#{$color} #{!important};\n }\n\n .fieldset {\n @apply border-rui-#{$color} #{!important};\n }\n }\n }\n\n &.dense {\n .inner_wrapper {\n @apply pt-2;\n\n .textarea {\n @apply py-1;\n &_sizer {\n @apply py-1;\n }\n }\n }\n }\n\n &.filled,\n &.outlined {\n .textarea {\n @apply px-3;\n }\n\n .prepend {\n @apply mr-0;\n\n + .inner_wrapper .textarea {\n &:not(:placeholder-shown),\n &:autofill,\n &:-webkit-autofill,\n &[data-has-value='true'],\n &:focus {\n + .label {\n --x-padding: 0.75rem;\n }\n }\n }\n }\n\n .append {\n @apply ml-0;\n }\n\n .prepend,\n .append {\n + .inner_wrapper > .label {\n --x-padding: 0rem;\n }\n }\n\n .label {\n --x-padding: 0.75rem;\n }\n }\n\n &.filled {\n .label {\n @apply rounded-t bg-black/[0.06];\n }\n\n &.no-label {\n .textarea {\n @apply py-4;\n &_sizer {\n @apply py-4;\n }\n }\n\n &.dense {\n .textarea {\n @apply py-3;\n }\n }\n }\n }\n\n &.outlined {\n .textarea {\n &:not(:placeholder-shown),\n &:autofill,\n &:-webkit-autofill,\n &[data-has-value='true'],\n &:focus {\n @apply border-t-transparent;\n\n + .label {\n @apply leading-[0] pl-4;\n }\n\n ~ .fieldset {\n legend {\n &:after {\n content: v-bind(labelWithQuote);\n }\n }\n }\n }\n }\n\n .fieldset {\n @apply absolute w-full h-[calc(100%+0.5rem)] top-0 left-0 pointer-events-none rounded border border-black/[0.23] px-2 transition-all -mt-2;\n\n legend {\n @apply opacity-0 text-xs;\n\n &:after {\n @apply whitespace-break-spaces;\n content: '\\200B';\n }\n }\n }\n\n &:not(.disabled) {\n .textarea {\n &:hover,\n &:focus {\n ~ .fieldset {\n @apply border border-black;\n }\n }\n\n &:focus {\n ~ .fieldset {\n @apply border-2;\n }\n }\n }\n }\n\n .label {\n @apply border-0 border-transparent;\n\n &:after {\n content: none !important;\n }\n }\n\n &.dense {\n .label {\n @apply leading-[2.5];\n }\n }\n }\n}\n</style>\n"],"names":["_useModel","_createElementBlock","_normalizeProps","_guardReactiveProps","getRootAttrs","$attrs","_createElementVNode","_normalizeClass","_unref","$slots","_renderSlot","_createVNode","_withDirectives","_mergeProps","getNonRootAttrs","_createTextVNode","_toDisplayString","_createBlock","RuiFormTextDetail"],"mappings":"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"}
@@ -16,6 +16,7 @@ export interface TextFieldProps {
16
16
  appendIcon?: RuiIcons;
17
17
  readonly?: boolean;
18
18
  clearable?: boolean;
19
+ required?: boolean;
19
20
  }
20
21
  type __VLS_Props = TextFieldProps;
21
22
  type __VLS_ModelProps = {
@@ -56,6 +57,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {
56
57
  errorMessages: string | string[];
57
58
  successMessages: string | string[];
58
59
  hint: string;
60
+ required: boolean;
59
61
  hideDetails: boolean;
60
62
  textColor: ContextColorsType;
61
63
  prependIcon: RuiIcons;
@@ -1,4 +1,4 @@
1
- import { defineComponent, mergeModels, useCssVars, unref, computed, ref, useModel, toRefs, createElementBlock, openBlock, normalizeProps, guardReactiveProps, createElementVNode, createBlock, createCommentVNode, normalizeClass, renderSlot, createVNode, mergeProps, toDisplayString, withModifiers, withCtx } from "vue";
1
+ import { defineComponent, mergeModels, useCssVars, unref, computed, ref, useModel, toRefs, createElementBlock, openBlock, normalizeProps, guardReactiveProps, createElementVNode, createBlock, createCommentVNode, normalizeClass, renderSlot, createVNode, mergeProps, createTextVNode, toDisplayString, withModifiers, withCtx } from "vue";
2
2
  import { logicAnd, logicNot } from "@vueuse/math";
3
3
  import RuiButton from "../../buttons/button/RuiButton.vue.js";
4
4
  import _sfc_main$1 from "../../helpers/RuiFormTextDetail.vue.js";
@@ -8,7 +8,12 @@ import { getRootAttrs, getNonRootAttrs } from "../../../utils/helpers.js";
8
8
  import { get, set } from "@vueuse/shared";
9
9
  import { useElementBounding, useResizeObserver, useFocus, refDebounced } from "@vueuse/core";
10
10
  import { useFormTextDetail } from "../../../utils/form-text-detail.js";
11
- const _hoisted_1 = ["value", "placeholder", "disabled", "dense", "variant", "readonly", "wrapper-width"];
11
+ const _hoisted_1 = ["data-error"];
12
+ const _hoisted_2 = ["value", "placeholder", "disabled", "dense", "variant", "readonly", "wrapper-width", "aria-invalid"];
13
+ const _hoisted_3 = {
14
+ key: 0,
15
+ class: "text-rui-error"
16
+ };
12
17
  const _sfc_main = /* @__PURE__ */ defineComponent({
13
18
  ...{
14
19
  name: "RuiTextField",
@@ -30,7 +35,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
30
35
  prependIcon: { default: void 0 },
31
36
  appendIcon: { default: void 0 },
32
37
  readonly: { type: Boolean, default: false },
33
- clearable: { type: Boolean, default: false }
38
+ clearable: { type: Boolean, default: false },
39
+ required: { type: Boolean, default: false }
34
40
  }, {
35
41
  "modelValue": { required: true },
36
42
  "modelModifiers": {}
@@ -38,9 +44,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
38
44
  emits: /* @__PURE__ */ mergeModels(["focus-input", "blur", "remove", "clear"], ["update:modelValue"]),
39
45
  setup(__props, { expose: __expose, emit: __emit }) {
40
46
  useCssVars((_ctx) => ({
41
- "e33098ac": unref(prependWidth),
42
- "v04b6e3ba": unref(appendWidth),
43
- "v16ccf914": unref(labelWithQuote)
47
+ "ee029486": unref(prependWidth),
48
+ "v5a045972": unref(appendWidth),
49
+ "v70a87b32": unref(labelWithQuote)
44
50
  }));
45
51
  const modelValue = useModel(__props, "modelValue");
46
52
  const props = __props;
@@ -51,7 +57,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
51
57
  disabled,
52
58
  readonly,
53
59
  errorMessages,
54
- successMessages
60
+ successMessages,
61
+ required
55
62
  } = toRefs(props);
56
63
  function input(event) {
57
64
  const value = event.target.value;
@@ -61,7 +68,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
61
68
  const labelVal = get(label);
62
69
  if (!labelVal)
63
70
  return '"\\200B"';
64
- return `' ${labelVal} '`;
71
+ const asterisk = get(required) ? "﹡" : "";
72
+ return `' ${labelVal}${asterisk} '`;
65
73
  });
66
74
  const prepend = ref();
67
75
  const append = ref();
@@ -120,7 +128,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
120
128
  [_ctx.$style["with-success"] ?? ""]: unref(hasSuccess) && !unref(hasError),
121
129
  [_ctx.$style[`text_${__props.textColor}`] ?? ""]: __props.textColor && !unref(hasMessages)
122
130
  }
123
- ])
131
+ ]),
132
+ "data-error": unref(hasError) ? "" : void 0
124
133
  }, [
125
134
  _ctx.$slots.prepend || __props.prependIcon ? (openBlock(), createElementBlock("div", {
126
135
  key: 0,
@@ -151,16 +160,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
151
160
  dense: __props.dense,
152
161
  variant: __props.variant,
153
162
  readonly: unref(readonly),
154
- "wrapper-width": unref(width)
163
+ "wrapper-width": unref(width),
164
+ "aria-invalid": unref(hasError)
155
165
  }, unref(getNonRootAttrs)(_ctx.$attrs), {
156
166
  onInput: _cache[0] || (_cache[0] = ($event) => input($event)),
157
167
  onBlur: _cache[1] || (_cache[1] = ($event) => emit("blur", $event)),
158
168
  onRemove: _cache[2] || (_cache[2] = ($event) => emit("remove", $event))
159
- }), null, 16, _hoisted_1),
169
+ }), null, 16, _hoisted_2),
160
170
  createElementVNode("label", {
161
171
  class: normalizeClass(_ctx.$style.label)
162
172
  }, [
163
- createElementVNode("span", null, toDisplayString(unref(label)), 1)
173
+ createElementVNode("span", null, [
174
+ createTextVNode(toDisplayString(unref(label)) + " ", 1),
175
+ unref(required) ? (openBlock(), createElementBlock("span", _hoisted_3, " ﹡ ")) : createCommentVNode("", true)
176
+ ])
164
177
  ], 2),
165
178
  __props.variant === "outlined" ? (openBlock(), createElementBlock("fieldset", {
166
179
  key: 0,
@@ -202,7 +215,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
202
215
  createVNode(RuiIcon, { name: __props.appendIcon }, null, 8, ["name"])
203
216
  ], 2)) : createCommentVNode("", true)
204
217
  ], 2)) : createCommentVNode("", true)
205
- ], 2),
218
+ ], 10, _hoisted_1),
206
219
  !__props.hideDetails ? (openBlock(), createBlock(_sfc_main$1, {
207
220
  key: 0,
208
221
  class: "pt-1 px-3",