@bitrix24/b24ui-nuxt 0.5.10 → 0.5.11

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 (190) hide show
  1. package/dist/meta.cjs +72112 -0
  2. package/dist/meta.d.cts +72110 -0
  3. package/dist/meta.d.mts +5060 -5060
  4. package/dist/meta.d.ts +72110 -0
  5. package/dist/meta.mjs +5060 -5060
  6. package/dist/module.cjs +63 -0
  7. package/dist/module.d.cts +15 -0
  8. package/dist/module.d.ts +15 -0
  9. package/dist/module.json +3 -3
  10. package/dist/module.mjs +1 -1
  11. package/dist/runtime/components/Advice.vue +54 -47
  12. package/dist/runtime/components/Alert.vue +96 -71
  13. package/dist/runtime/components/App.vue +34 -37
  14. package/dist/runtime/components/Avatar.vue +81 -69
  15. package/dist/runtime/components/AvatarGroup.vue +76 -53
  16. package/dist/runtime/components/Badge.vue +83 -83
  17. package/dist/runtime/components/Button.vue +157 -220
  18. package/dist/runtime/components/ButtonGroup.vue +51 -35
  19. package/dist/runtime/components/Calendar.vue +152 -186
  20. package/dist/runtime/components/Checkbox.vue +73 -84
  21. package/dist/runtime/components/Chip.vue +74 -59
  22. package/dist/runtime/components/Collapsible.vue +41 -44
  23. package/dist/runtime/components/Container.vue +27 -18
  24. package/dist/runtime/components/Countdown.vue +378 -198
  25. package/dist/runtime/components/DescriptionList.vue +149 -102
  26. package/dist/runtime/components/DropdownMenu.vue +139 -83
  27. package/dist/runtime/components/DropdownMenuContent.vue +84 -137
  28. package/dist/runtime/components/Form.vue +216 -162
  29. package/dist/runtime/components/FormField.vue +80 -76
  30. package/dist/runtime/components/Input.vue +179 -160
  31. package/dist/runtime/components/InputMenu.vue +380 -300
  32. package/dist/runtime/components/InputNumber.vue +175 -178
  33. package/dist/runtime/components/Kbd.vue +45 -33
  34. package/dist/runtime/components/Link.vue +173 -179
  35. package/dist/runtime/components/LinkBase.vue +42 -64
  36. package/dist/runtime/components/Modal.vue +127 -105
  37. package/dist/runtime/components/ModalDialogClose.vue +8 -4
  38. package/dist/runtime/components/Navbar.vue +33 -24
  39. package/dist/runtime/components/NavbarDivider.vue +33 -24
  40. package/dist/runtime/components/NavbarSection.vue +33 -24
  41. package/dist/runtime/components/NavbarSpacer.vue +33 -24
  42. package/dist/runtime/components/NavigationMenu.vue +210 -144
  43. package/dist/runtime/components/OverlayProvider.vue +17 -13
  44. package/dist/runtime/components/Popover.vue +81 -81
  45. package/dist/runtime/components/Progress.vue +136 -109
  46. package/dist/runtime/components/RadioGroup.vue +134 -120
  47. package/dist/runtime/components/Range.vue +85 -94
  48. package/dist/runtime/components/Select.vue +260 -212
  49. package/dist/runtime/components/SelectMenu.vue +365 -272
  50. package/dist/runtime/components/Separator.vue +71 -61
  51. package/dist/runtime/components/Sidebar.vue +33 -24
  52. package/dist/runtime/components/SidebarBody.vue +38 -30
  53. package/dist/runtime/components/SidebarFooter.vue +33 -24
  54. package/dist/runtime/components/SidebarHeader.vue +33 -24
  55. package/dist/runtime/components/SidebarHeading.vue +33 -24
  56. package/dist/runtime/components/SidebarLayout.vue +70 -40
  57. package/dist/runtime/components/SidebarSection.vue +33 -24
  58. package/dist/runtime/components/SidebarSpacer.vue +33 -24
  59. package/dist/runtime/components/Skeleton.vue +22 -17
  60. package/dist/runtime/components/Slideover.vue +131 -108
  61. package/dist/runtime/components/StackedLayout.vue +73 -40
  62. package/dist/runtime/components/Switch.vue +95 -100
  63. package/dist/runtime/components/Tabs.vue +107 -81
  64. package/dist/runtime/components/Textarea.vue +201 -177
  65. package/dist/runtime/components/Toast.vue +105 -94
  66. package/dist/runtime/components/Toaster.vue +116 -94
  67. package/dist/runtime/components/Tooltip.vue +64 -78
  68. package/dist/runtime/components/content/TableWrapper.vue +70 -58
  69. package/dist/runtime/composables/useAvatarGroup.d.ts +1 -1
  70. package/dist/runtime/composables/useButtonGroup.d.ts +2 -2
  71. package/dist/runtime/composables/useComponentIcons.d.ts +3 -3
  72. package/dist/runtime/composables/useFormField.d.ts +1 -1
  73. package/dist/runtime/prose/A.vue +23 -18
  74. package/dist/runtime/prose/Blockquote.vue +23 -18
  75. package/dist/runtime/prose/Code.vue +31 -23
  76. package/dist/runtime/prose/Em.vue +23 -18
  77. package/dist/runtime/prose/H1.vue +23 -18
  78. package/dist/runtime/prose/H2.vue +23 -18
  79. package/dist/runtime/prose/H3.vue +23 -18
  80. package/dist/runtime/prose/H4.vue +23 -18
  81. package/dist/runtime/prose/H5.vue +23 -18
  82. package/dist/runtime/prose/H6.vue +23 -18
  83. package/dist/runtime/prose/Hr.vue +19 -18
  84. package/dist/runtime/prose/Img.vue +23 -18
  85. package/dist/runtime/prose/Li.vue +23 -18
  86. package/dist/runtime/prose/Ol.vue +23 -18
  87. package/dist/runtime/prose/P.vue +23 -18
  88. package/dist/runtime/prose/Pre.vue +33 -28
  89. package/dist/runtime/prose/Strong.vue +23 -18
  90. package/dist/runtime/prose/Table.vue +54 -44
  91. package/dist/runtime/prose/Tbody.vue +23 -18
  92. package/dist/runtime/prose/Td.vue +23 -18
  93. package/dist/runtime/prose/Th.vue +23 -18
  94. package/dist/runtime/prose/Thead.vue +23 -18
  95. package/dist/runtime/prose/Tr.vue +23 -18
  96. package/dist/runtime/prose/Ul.vue +23 -18
  97. package/dist/runtime/vue/components/Link.vue +202 -201
  98. package/dist/shared/b24ui-nuxt.DrKwIWoc.cjs +7721 -0
  99. package/dist/types.d.mts +5 -3
  100. package/dist/types.d.ts +7 -0
  101. package/dist/unplugin.cjs +236 -0
  102. package/dist/unplugin.d.cts +33 -0
  103. package/dist/unplugin.d.ts +33 -0
  104. package/dist/vite.cjs +21 -0
  105. package/dist/vite.d.cts +14 -0
  106. package/dist/vite.d.ts +14 -0
  107. package/package.json +25 -13
  108. package/dist/runtime/components/Advice.vue.d.ts +0 -170
  109. package/dist/runtime/components/Alert.vue.d.ts +0 -464
  110. package/dist/runtime/components/App.vue.d.ts +0 -23
  111. package/dist/runtime/components/Avatar.vue.d.ts +0 -281
  112. package/dist/runtime/components/AvatarGroup.vue.d.ts +0 -204
  113. package/dist/runtime/components/Badge.vue.d.ts +0 -517
  114. package/dist/runtime/components/Button.vue.d.ts +0 -640
  115. package/dist/runtime/components/ButtonGroup.vue.d.ts +0 -116
  116. package/dist/runtime/components/Calendar.vue.d.ts +0 -437
  117. package/dist/runtime/components/Checkbox.vue.d.ts +0 -354
  118. package/dist/runtime/components/Chip.vue.d.ts +0 -271
  119. package/dist/runtime/components/Collapsible.vue.d.ts +0 -118
  120. package/dist/runtime/components/Container.vue.d.ts +0 -27
  121. package/dist/runtime/components/Countdown.vue.d.ts +0 -356
  122. package/dist/runtime/components/DescriptionList.vue.d.ts +0 -379
  123. package/dist/runtime/components/DropdownMenu.vue.d.ts +0 -533
  124. package/dist/runtime/components/DropdownMenuContent.vue.d.ts +0 -228
  125. package/dist/runtime/components/Form.vue.d.ts +0 -55
  126. package/dist/runtime/components/FormField.vue.d.ts +0 -282
  127. package/dist/runtime/components/Input.vue.d.ts +0 -755
  128. package/dist/runtime/components/InputMenu.vue.d.ts +0 -1504
  129. package/dist/runtime/components/InputNumber.vue.d.ts +0 -658
  130. package/dist/runtime/components/Kbd.vue.d.ts +0 -109
  131. package/dist/runtime/components/Link.vue.d.ts +0 -129
  132. package/dist/runtime/components/LinkBase.vue.d.ts +0 -48
  133. package/dist/runtime/components/Modal.vue.d.ts +0 -327
  134. package/dist/runtime/components/ModalDialogClose.vue.d.ts +0 -10
  135. package/dist/runtime/components/Navbar.vue.d.ts +0 -101
  136. package/dist/runtime/components/NavbarDivider.vue.d.ts +0 -101
  137. package/dist/runtime/components/NavbarSection.vue.d.ts +0 -101
  138. package/dist/runtime/components/NavbarSpacer.vue.d.ts +0 -101
  139. package/dist/runtime/components/NavigationMenu.vue.d.ts +0 -824
  140. package/dist/runtime/components/OverlayProvider.vue.d.ts +0 -2
  141. package/dist/runtime/components/Popover.vue.d.ts +0 -147
  142. package/dist/runtime/components/Progress.vue.d.ts +0 -592
  143. package/dist/runtime/components/RadioGroup.vue.d.ts +0 -723
  144. package/dist/runtime/components/Range.vue.d.ts +0 -417
  145. package/dist/runtime/components/Select.vue.d.ts +0 -1200
  146. package/dist/runtime/components/SelectMenu.vue.d.ts +0 -1298
  147. package/dist/runtime/components/Separator.vue.d.ts +0 -400
  148. package/dist/runtime/components/Sidebar.vue.d.ts +0 -101
  149. package/dist/runtime/components/SidebarBody.vue.d.ts +0 -90
  150. package/dist/runtime/components/SidebarFooter.vue.d.ts +0 -101
  151. package/dist/runtime/components/SidebarHeader.vue.d.ts +0 -101
  152. package/dist/runtime/components/SidebarHeading.vue.d.ts +0 -101
  153. package/dist/runtime/components/SidebarLayout.vue.d.ts +0 -222
  154. package/dist/runtime/components/SidebarSection.vue.d.ts +0 -101
  155. package/dist/runtime/components/SidebarSpacer.vue.d.ts +0 -101
  156. package/dist/runtime/components/Skeleton.vue.d.ts +0 -26
  157. package/dist/runtime/components/Slideover.vue.d.ts +0 -360
  158. package/dist/runtime/components/StackedLayout.vue.d.ts +0 -192
  159. package/dist/runtime/components/Switch.vue.d.ts +0 -587
  160. package/dist/runtime/components/Tabs.vue.d.ts +0 -453
  161. package/dist/runtime/components/Textarea.vue.d.ts +0 -601
  162. package/dist/runtime/components/Toast.vue.d.ts +0 -438
  163. package/dist/runtime/components/Toaster.vue.d.ts +0 -219
  164. package/dist/runtime/components/Tooltip.vue.d.ts +0 -186
  165. package/dist/runtime/components/content/TableWrapper.vue.d.ts +0 -237
  166. package/dist/runtime/prose/A.vue.d.ts +0 -84
  167. package/dist/runtime/prose/Blockquote.vue.d.ts +0 -84
  168. package/dist/runtime/prose/Code.vue.d.ts +0 -97
  169. package/dist/runtime/prose/Em.vue.d.ts +0 -84
  170. package/dist/runtime/prose/H1.vue.d.ts +0 -97
  171. package/dist/runtime/prose/H2.vue.d.ts +0 -123
  172. package/dist/runtime/prose/H3.vue.d.ts +0 -123
  173. package/dist/runtime/prose/H4.vue.d.ts +0 -123
  174. package/dist/runtime/prose/H5.vue.d.ts +0 -123
  175. package/dist/runtime/prose/H6.vue.d.ts +0 -123
  176. package/dist/runtime/prose/Hr.vue.d.ts +0 -74
  177. package/dist/runtime/prose/Img.vue.d.ts +0 -77
  178. package/dist/runtime/prose/Li.vue.d.ts +0 -84
  179. package/dist/runtime/prose/Ol.vue.d.ts +0 -84
  180. package/dist/runtime/prose/P.vue.d.ts +0 -84
  181. package/dist/runtime/prose/Pre.vue.d.ts +0 -117
  182. package/dist/runtime/prose/Strong.vue.d.ts +0 -84
  183. package/dist/runtime/prose/Table.vue.d.ts +0 -144
  184. package/dist/runtime/prose/Tbody.vue.d.ts +0 -84
  185. package/dist/runtime/prose/Td.vue.d.ts +0 -84
  186. package/dist/runtime/prose/Th.vue.d.ts +0 -84
  187. package/dist/runtime/prose/Thead.vue.d.ts +0 -84
  188. package/dist/runtime/prose/Tr.vue.d.ts +0 -84
  189. package/dist/runtime/prose/Ul.vue.d.ts +0 -84
  190. package/dist/runtime/vue/components/Link.vue.d.ts +0 -129
@@ -1,141 +1,142 @@
1
- <script>
2
- import _appConfig from "#build/app.config";
3
- import theme from "#build/b24ui/textarea";
4
- import { tv } from "../utils/tv";
5
- const appConfigTextarea = _appConfig;
6
- const textarea = tv({ extend: tv(theme), ...appConfigTextarea.b24ui?.textarea || {} });
1
+ <script lang="ts">
2
+ import type { VariantProps } from 'tailwind-variants'
3
+ import type { AppConfig } from '@nuxt/schema'
4
+ import _appConfig from '#build/app.config'
5
+ import theme from '#build/b24ui/textarea'
6
+ import type { UseComponentIconsProps } from '../composables/useComponentIcons'
7
+ import { tv } from '../utils/tv'
8
+ import type { AvatarProps } from '../types'
9
+ import type { PartialString } from '../types/utils'
10
+
11
+ const appConfigTextarea = _appConfig as AppConfig & { b24ui: { textarea: Partial<typeof theme> } }
12
+
13
+ const textarea = tv({ extend: tv(theme), ...(appConfigTextarea.b24ui?.textarea || {}) })
14
+
15
+ type TextareaVariants = VariantProps<typeof textarea>
16
+
17
+ export interface TextareaProps extends UseComponentIconsProps {
18
+ /**
19
+ * The element or component this component should render as.
20
+ * @defaultValue 'div'
21
+ */
22
+ as?: any
23
+ id?: string
24
+ name?: string
25
+ /**
26
+ * The placeholder text when the textarea is empty
27
+ */
28
+ placeholder?: string
29
+ /**
30
+ * @defaultValue 'primary'
31
+ */
32
+ color?: TextareaVariants['color']
33
+ /**
34
+ * Removes padding from input
35
+ * @defaultValue false
36
+ */
37
+ noPadding?: boolean
38
+ /**
39
+ * Removes all borders (rings)
40
+ * @defaultValue false
41
+ */
42
+ noBorder?: boolean
43
+ /**
44
+ * Removes all borders (rings) except the bottom one
45
+ * @defaultValue false
46
+ */
47
+ underline?: boolean
48
+ /**
49
+ * Rounds the corners of the button
50
+ * @defaultValue false
51
+ */
52
+ rounded?: boolean
53
+ /**
54
+ * @defaultValue false
55
+ */
56
+ required?: boolean
57
+ /**
58
+ * @defaultValue false
59
+ */
60
+ autofocus?: boolean
61
+ /**
62
+ * @defaultValue 0
63
+ */
64
+ autofocusDelay?: number
65
+ /**
66
+ * @defaultValue false
67
+ */
68
+ autoresize?: boolean
69
+ /**
70
+ * @defaultValue 0
71
+ */
72
+ autoresizeDelay?: number
73
+ /**
74
+ * @defaultValue false
75
+ */
76
+ disabled?: boolean
77
+ /**
78
+ * @defaultValue 3
79
+ */
80
+ rows?: number
81
+ /**
82
+ * @defaultValue 5
83
+ */
84
+ maxrows?: number
85
+ tag?: string
86
+ /**
87
+ * @defaultValue 'primary'
88
+ */
89
+ tagColor?: TextareaVariants['tagColor']
90
+ /**
91
+ * Highlight the ring color like a focus state
92
+ * @defaultValue false
93
+ */
94
+ highlight?: boolean
95
+ class?: any
96
+ b24ui?: PartialString<typeof textarea.slots>
97
+ }
98
+
99
+ export interface TextareaEmits {
100
+ (e: 'update:modelValue', payload: string | number): void
101
+ (e: 'blur', event: FocusEvent): void
102
+ (e: 'change', event: Event): void
103
+ }
104
+
105
+ export interface TextareaSlots {
106
+ leading(props?: {}): any
107
+ default(props?: {}): any
108
+ trailing(props?: {}): any
109
+ }
7
110
  </script>
8
111
 
9
- <script setup>
10
- import { ref, computed, onMounted, nextTick, watch } from "vue";
11
- import { useComponentIcons } from "../composables/useComponentIcons";
12
- import { useFormField } from "../composables/useFormField";
13
- import { looseToNumber } from "../utils";
14
- defineOptions({ inheritAttrs: false });
15
- const props = defineProps({
16
- as: {
17
- type: null,
18
- required: false
19
- },
20
- id: {
21
- type: String,
22
- required: false
23
- },
24
- name: {
25
- type: String,
26
- required: false
27
- },
28
- placeholder: {
29
- type: String,
30
- required: false
31
- },
32
- color: {
33
- type: null,
34
- required: false
35
- },
36
- noPadding: {
37
- type: Boolean,
38
- required: false
39
- },
40
- noBorder: {
41
- type: Boolean,
42
- required: false
43
- },
44
- underline: {
45
- type: Boolean,
46
- required: false
47
- },
48
- rounded: {
49
- type: Boolean,
50
- required: false
51
- },
52
- required: {
53
- type: Boolean,
54
- required: false
55
- },
56
- autofocus: {
57
- type: Boolean,
58
- required: false
59
- },
60
- autofocusDelay: {
61
- type: Number,
62
- required: false,
63
- default: 0
64
- },
65
- autoresize: {
66
- type: Boolean,
67
- required: false
68
- },
69
- autoresizeDelay: {
70
- type: Number,
71
- required: false,
72
- default: 0
73
- },
74
- disabled: {
75
- type: Boolean,
76
- required: false
77
- },
78
- rows: {
79
- type: Number,
80
- required: false,
81
- default: 3
82
- },
83
- maxrows: {
84
- type: Number,
85
- required: false,
86
- default: 5
87
- },
88
- tag: {
89
- type: String,
90
- required: false
91
- },
92
- tagColor: {
93
- type: null,
94
- required: false
95
- },
96
- highlight: {
97
- type: Boolean,
98
- required: false
99
- },
100
- class: {
101
- type: null,
102
- required: false
103
- },
104
- b24ui: {
105
- type: null,
106
- required: false
107
- },
108
- icon: {
109
- type: [Function, Object],
110
- required: false
111
- },
112
- avatar: {
113
- type: Object,
114
- required: false
115
- },
116
- loading: {
117
- type: Boolean,
118
- required: false
119
- },
120
- trailing: {
121
- type: Boolean,
122
- required: false
123
- },
124
- trailingIcon: {
125
- type: [Function, Object],
126
- required: false
127
- }
128
- });
129
- const slots = defineSlots();
130
- const emits = defineEmits(["update:modelValue", "blur", "change"]);
131
- const [modelValue, modelModifiers] = defineModel({
132
- "type": [String, Number, null]
133
- });
134
- const { emitFormFocus, emitFormBlur, emitFormInput, emitFormChange, color, id, name, highlight, disabled, ariaAttrs } = useFormField(props, { deferInputValidation: true });
135
- const { isLeading, isTrailing, leadingIconName, trailingIconName } = useComponentIcons(props);
112
+ <script setup lang="ts">
113
+ import { ref, computed, onMounted, nextTick, watch } from 'vue'
114
+ import { Primitive } from 'reka-ui'
115
+ import { useComponentIcons } from '../composables/useComponentIcons'
116
+ import { useFormField } from '../composables/useFormField'
117
+ import { looseToNumber } from '../utils'
118
+ import B24Avatar from './Avatar.vue'
119
+
120
+ defineOptions({ inheritAttrs: false })
121
+
122
+ const props = withDefaults(defineProps<TextareaProps>(), {
123
+ rows: 3,
124
+ maxrows: 5,
125
+ autofocusDelay: 0,
126
+ autoresizeDelay: 0
127
+ })
128
+ const slots = defineSlots<TextareaSlots>()
129
+ const emits = defineEmits<TextareaEmits>()
130
+
131
+ const [modelValue, modelModifiers] = defineModel<string | number | null>()
132
+
133
+ const { emitFormFocus, emitFormBlur, emitFormInput, emitFormChange, color, id, name, highlight, disabled, ariaAttrs } = useFormField<TextareaProps>(props, { deferInputValidation: true })
134
+ const { isLeading, isTrailing, leadingIconName, trailingIconName } = useComponentIcons(props)
135
+
136
136
  const isTag = computed(() => {
137
- return props.tag;
138
- });
137
+ return props.tag
138
+ })
139
+
139
140
  const b24ui = computed(() => textarea({
140
141
  color: color.value,
141
142
  loading: props.loading,
@@ -148,79 +149,102 @@ const b24ui = computed(() => textarea({
148
149
  underline: Boolean(props.underline),
149
150
  leading: Boolean(isLeading.value || !!props.avatar || !!slots.leading),
150
151
  trailing: Boolean(isTrailing.value || !!slots.trailing)
151
- }));
152
- const textareaRef = ref(null);
153
- function updateInput(value) {
152
+ }))
153
+
154
+ const textareaRef = ref<HTMLTextAreaElement | null>(null)
155
+
156
+ // Custom function to handle the v-model properties
157
+ function updateInput(value: string | null) {
154
158
  if (modelModifiers.trim) {
155
- value = value?.trim() ?? null;
159
+ value = value?.trim() ?? null
156
160
  }
161
+
157
162
  if (modelModifiers.number) {
158
- value = looseToNumber(value);
163
+ value = looseToNumber(value)
159
164
  }
165
+
160
166
  if (modelModifiers.nullify) {
161
- value ||= null;
167
+ value ||= null
162
168
  }
163
- modelValue.value = value;
164
- emitFormInput();
169
+
170
+ modelValue.value = value
171
+ emitFormInput()
165
172
  }
166
- function onInput(event) {
167
- autoResize();
173
+
174
+ function onInput(event: Event) {
175
+ autoResize()
176
+
168
177
  if (!modelModifiers.lazy) {
169
- updateInput(event.target.value);
178
+ updateInput((event.target as HTMLInputElement).value)
170
179
  }
171
180
  }
172
- function onChange(event) {
173
- const value = event.target.value;
181
+
182
+ function onChange(event: Event) {
183
+ const value = (event.target as HTMLInputElement).value
184
+
174
185
  if (modelModifiers.lazy) {
175
- updateInput(value);
186
+ updateInput(value)
176
187
  }
188
+
189
+ // Update trimmed textarea so that it has same behavior as native textarea https://github.com/vuejs/core/blob/5ea8a8a4fab4e19a71e123e4d27d051f5e927172/packages/runtime-dom/src/directives/vModel.ts#L63
177
190
  if (modelModifiers.trim) {
178
- event.target.value = value.trim();
191
+ (event.target as HTMLInputElement).value = value.trim()
179
192
  }
180
- emitFormChange();
181
- emits("change", event);
193
+
194
+ emitFormChange()
195
+ emits('change', event)
182
196
  }
183
- function onBlur(event) {
184
- emitFormBlur();
185
- emits("blur", event);
197
+
198
+ function onBlur(event: FocusEvent) {
199
+ emitFormBlur()
200
+ emits('blur', event)
186
201
  }
202
+
187
203
  function autoFocus() {
188
204
  if (props.autofocus) {
189
- textareaRef.value?.focus();
205
+ textareaRef.value?.focus()
190
206
  }
191
207
  }
208
+
192
209
  function autoResize() {
193
210
  if (props.autoresize && textareaRef.value) {
194
- textareaRef.value.rows = props.rows;
195
- const overflow = textareaRef.value.style.overflow;
196
- textareaRef.value.style.overflow = "hidden";
197
- const styles = window.getComputedStyle(textareaRef.value);
198
- const paddingTop = Number.parseInt(styles.paddingTop);
199
- const paddingBottom = Number.parseInt(styles.paddingBottom);
200
- const padding = paddingTop + paddingBottom;
201
- const lineHeight = Number.parseInt(styles.lineHeight);
202
- const { scrollHeight } = textareaRef.value;
203
- const newRows = (scrollHeight - padding) / lineHeight;
211
+ textareaRef.value.rows = props.rows
212
+ const overflow = textareaRef.value.style.overflow
213
+ textareaRef.value.style.overflow = 'hidden'
214
+
215
+ const styles = window.getComputedStyle(textareaRef.value)
216
+ const paddingTop = Number.parseInt(styles.paddingTop)
217
+ const paddingBottom = Number.parseInt(styles.paddingBottom)
218
+ const padding = paddingTop + paddingBottom
219
+ const lineHeight = Number.parseInt(styles.lineHeight)
220
+ const { scrollHeight } = textareaRef.value
221
+ const newRows = (scrollHeight - padding) / lineHeight
222
+
204
223
  if (newRows > props.rows) {
205
- textareaRef.value.rows = props.maxrows ? Math.min(newRows, props.maxrows) : newRows;
224
+ textareaRef.value.rows = props.maxrows ? Math.min(newRows, props.maxrows) : newRows
206
225
  }
207
- textareaRef.value.style.overflow = overflow;
226
+
227
+ textareaRef.value.style.overflow = overflow
208
228
  }
209
229
  }
230
+
210
231
  watch(modelValue, () => {
211
- nextTick(autoResize);
212
- });
232
+ nextTick(autoResize)
233
+ })
234
+
213
235
  onMounted(() => {
214
236
  setTimeout(() => {
215
- autoFocus();
216
- }, props.autofocusDelay);
237
+ autoFocus()
238
+ }, props.autofocusDelay)
239
+
217
240
  setTimeout(() => {
218
- autoResize();
219
- }, props.autoresizeDelay);
220
- });
241
+ autoResize()
242
+ }, props.autoresizeDelay)
243
+ })
244
+
221
245
  defineExpose({
222
246
  textareaRef
223
- });
247
+ })
224
248
  </script>
225
249
 
226
250
  <template>
@@ -257,7 +281,7 @@ defineExpose({
257
281
  />
258
282
  <B24Avatar
259
283
  v-else-if="!!avatar"
260
- :size="props.b24ui?.leadingAvatarSize || b24ui.leadingAvatarSize()"
284
+ :size="((props.b24ui?.leadingAvatarSize || b24ui.leadingAvatarSize()) as AvatarProps['size'])"
261
285
  v-bind="avatar"
262
286
  :class="b24ui.leadingAvatar({ class: props.b24ui?.leadingAvatar })"
263
287
  />
@@ -1,106 +1,117 @@
1
- <script>
2
- import _appConfig from "#build/app.config";
3
- import theme from "#build/b24ui/toast";
4
- import { tv } from "../utils/tv";
5
- const appConfigToast = _appConfig;
6
- const toast = tv({ extend: tv(theme), ...appConfigToast.b24ui?.toast || {} });
1
+ <script lang="ts">
2
+ import type { VariantProps } from 'tailwind-variants'
3
+ import type { ToastRootProps, ToastRootEmits } from 'reka-ui'
4
+ import type { AppConfig } from '@nuxt/schema'
5
+ import _appConfig from '#build/app.config'
6
+ import theme from '#build/b24ui/toast'
7
+ import { tv } from '../utils/tv'
8
+ import type { AvatarProps, ButtonProps, IconComponent } from '../types'
9
+ import type { StringOrVNode } from '../types/utils'
10
+
11
+ const appConfigToast = _appConfig as AppConfig & { b24ui: { toast: Partial<typeof theme> } }
12
+
13
+ const toast = tv({ extend: tv(theme), ...(appConfigToast.b24ui?.toast || {}) })
14
+
15
+ type ToastVariants = VariantProps<typeof toast>
16
+
17
+ export interface ToastProps extends Pick<ToastRootProps, 'defaultOpen' | 'open' | 'type' | 'duration'> {
18
+ /**
19
+ * The element or component this component should render as.
20
+ * @defaultValue 'li'
21
+ */
22
+ as?: any
23
+ title?: StringOrVNode
24
+ description?: StringOrVNode
25
+ /**
26
+ * @IconComponent
27
+ */
28
+ icon?: IconComponent
29
+ avatar?: AvatarProps
30
+ /**
31
+ * @defaultValue 'default'
32
+ */
33
+ color?: ToastVariants['color']
34
+ /**
35
+ * The orientation between the content and the actions
36
+ * @defaultValue 'vertical'
37
+ */
38
+ orientation?: ToastVariants['orientation']
39
+ /**
40
+ * Display a list of actions:
41
+ * - under the title and description when orientation is `vertical`
42
+ * - next to the close button when orientation is `horizontal`
43
+ * `{ size: 'xs' }`{lang="ts"}
44
+ */
45
+ actions?: ButtonProps[]
46
+ /**
47
+ * Display a close button to dismiss the toast.
48
+ * `{ size: 'md', color: 'neutral', variant: 'link' }`{lang="ts"}
49
+ * @defaultValue true
50
+ */
51
+ close?: boolean | Partial<ButtonProps>
52
+ /**
53
+ * The icon displayed in the close button.
54
+ * @defaultValue icons.close
55
+ * @IconComponent
56
+ */
57
+ closeIcon?: IconComponent
58
+ class?: any
59
+ b24ui?: Partial<typeof toast.slots>
60
+ }
61
+
62
+ export interface ToastEmits extends ToastRootEmits {}
63
+
64
+ export interface ToastSlots {
65
+ leading(props?: {}): any
66
+ title(props?: {}): any
67
+ description(props?: {}): any
68
+ actions(props?: {}): any
69
+ close(props: { b24ui: ReturnType<typeof toast> }): any
70
+ }
7
71
  </script>
8
72
 
9
- <script setup>
10
- import { ref, computed, onMounted } from "vue";
11
- import { useForwardPropsEmits } from "reka-ui";
12
- import { reactivePick } from "@vueuse/core";
13
- import { useLocale } from "../composables/useLocale";
14
- const props = defineProps({
15
- as: {
16
- type: null,
17
- required: false
18
- },
19
- title: {
20
- type: [String, Object, Function],
21
- required: false
22
- },
23
- description: {
24
- type: [String, Object, Function],
25
- required: false
26
- },
27
- icon: {
28
- type: [Function, Object],
29
- required: false
30
- },
31
- avatar: {
32
- type: Object,
33
- required: false
34
- },
35
- color: {
36
- type: null,
37
- required: false
38
- },
39
- orientation: {
40
- type: null,
41
- required: false,
42
- default: "vertical"
43
- },
44
- actions: {
45
- type: Array,
46
- required: false
47
- },
48
- close: {
49
- type: [Boolean, Object],
50
- required: false,
51
- default: true
52
- },
53
- closeIcon: {
54
- type: [Function, Object],
55
- required: false
56
- },
57
- class: {
58
- type: null,
59
- required: false
60
- },
61
- b24ui: {
62
- type: Object,
63
- required: false
64
- },
65
- defaultOpen: {
66
- type: Boolean,
67
- required: false
68
- },
69
- open: {
70
- type: Boolean,
71
- required: false
72
- },
73
- type: {
74
- type: String,
75
- required: false
76
- },
77
- duration: {
78
- type: Number,
79
- required: false
80
- }
81
- });
82
- const emits = defineEmits(["escapeKeyDown", "pause", "resume", "swipeStart", "swipeMove", "swipeCancel", "swipeEnd", "update:open"]);
83
- const slots = defineSlots();
84
- const { t } = useLocale();
85
- const rootProps = useForwardPropsEmits(reactivePick(props, "as", "defaultOpen", "open", "duration", "type"), emits);
73
+ <script setup lang="ts">
74
+ import { ref, computed, onMounted } from 'vue'
75
+ import { ToastRoot, ToastTitle, ToastDescription, ToastAction, ToastClose, useForwardPropsEmits } from 'reka-ui'
76
+ import { reactivePick } from '@vueuse/core'
77
+ import { useLocale } from '../composables/useLocale'
78
+ import icons from '../dictionary/icons'
79
+ import B24Avatar from './Avatar.vue'
80
+ import B24Button from './Button.vue'
81
+
82
+ const props = withDefaults(defineProps<ToastProps>(), {
83
+ close: true,
84
+ orientation: 'vertical'
85
+ })
86
+ const emits = defineEmits<ToastEmits>()
87
+ const slots = defineSlots<ToastSlots>()
88
+
89
+ const { t } = useLocale()
90
+
91
+ const rootProps = useForwardPropsEmits(reactivePick(props, 'as', 'defaultOpen', 'open', 'duration', 'type'), emits)
92
+
86
93
  const b24ui = computed(() => toast({
87
94
  color: props.color,
88
95
  orientation: props.orientation,
89
96
  title: !!props.title || !!slots.title
90
- }));
91
- const el = ref();
92
- const height = ref(0);
97
+ }))
98
+
99
+ const el = ref()
100
+ const height = ref(0)
101
+
93
102
  onMounted(() => {
94
103
  if (!el.value) {
95
- return;
104
+ return
96
105
  }
106
+
97
107
  setTimeout(() => {
98
- height.value = el.value.$el.getBoundingClientRect()?.height;
99
- }, 0);
100
- });
108
+ height.value = el.value.$el.getBoundingClientRect()?.height
109
+ }, 0)
110
+ })
111
+
101
112
  defineExpose({
102
113
  height
103
- });
114
+ })
104
115
  </script>
105
116
 
106
117
  <template>
@@ -118,7 +129,7 @@ defineExpose({
118
129
  v-if="icon"
119
130
  :class="b24ui.icon({ class: props.b24ui?.icon })"
120
131
  />
121
- <B24Avatar v-else-if="avatar" :size="props.b24ui?.avatarSize || b24ui.avatarSize()" v-bind="avatar" :class="b24ui.avatar({ class: props.b24ui?.avatar })" />
132
+ <B24Avatar v-else-if="avatar" :size="((props.b24ui?.avatarSize || b24ui.avatarSize()) as AvatarProps['size'])" v-bind="avatar" :class="b24ui.avatar({ class: props.b24ui?.avatar })" />
122
133
  </slot>
123
134
 
124
135
  <div :class="b24ui.wrapper({ class: props.b24ui?.wrapper })">
@@ -150,7 +161,7 @@ defineExpose({
150
161
  </div>
151
162
  </div>
152
163
 
153
- <div v-if="orientation === 'horizontal' && actions?.length || close !== null" :class="b24ui.actions({ class: props.b24ui?.actions, orientation: 'horizontal' })">
164
+ <div v-if="(orientation === 'horizontal' && actions?.length) || close !== null" :class="b24ui.actions({ class: props.b24ui?.actions, orientation: 'horizontal' })">
154
165
  <template v-if="orientation === 'horizontal' && actions?.length">
155
166
  <slot name="actions">
156
167
  <ToastAction v-for="(action, index) in actions" :key="index" :alt-text="action.label || 'Action'" as-child @click.stop>
@@ -167,7 +178,7 @@ defineExpose({
167
178
  size="xs"
168
179
  color="link"
169
180
  :aria-label="t('toast.close')"
170
- v-bind="typeof close === 'object' ? close : {}"
181
+ v-bind="(typeof close === 'object' ? close as Partial<ButtonProps> : {})"
171
182
  :class="b24ui.close({ class: props.b24ui?.close })"
172
183
  @click.stop
173
184
  />