@leaflink/stash 48.16.0 → 48.16.2

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 (274) hide show
  1. package/assets/illustrations/FileUpload/csv.svg +1 -1
  2. package/assets/illustrations/FileUpload/document.svg +1 -17
  3. package/assets/illustrations/FileUpload/image.svg +1 -1
  4. package/assets/illustrations/FileUpload/pdf.svg +1 -1
  5. package/dist/Accordion.js +1 -1
  6. package/dist/Accordion.js.map +1 -1
  7. package/dist/Accordion.vue.d.ts +8 -9
  8. package/dist/ActionsDropdown.js.map +1 -1
  9. package/dist/ActionsDropdown.vue.d.ts +7 -8
  10. package/dist/AddressSelect.js +42 -38
  11. package/dist/AddressSelect.js.map +1 -1
  12. package/dist/AddressSelect.vue.d.ts +10 -11
  13. package/dist/Alert.js.map +1 -1
  14. package/dist/Alert.vue.d.ts +6 -7
  15. package/dist/AppNavigationItem.js +2 -2
  16. package/dist/AppNavigationItem.js.map +1 -1
  17. package/dist/AppNavigationItem.vue.d.ts +7 -8
  18. package/dist/AppSidebar.js +42 -42
  19. package/dist/AppSidebar.js.map +1 -1
  20. package/dist/AppSidebar.vue.d.ts +8 -9
  21. package/dist/AppTopbar.js +16 -16
  22. package/dist/AppTopbar.js.map +1 -1
  23. package/dist/AppTopbar.vue.d.ts +8 -9
  24. package/dist/Avatar.js.map +1 -1
  25. package/dist/Avatar.vue.d.ts +7 -8
  26. package/dist/Backdrop.vue.d.ts +3 -5
  27. package/dist/Badge.js +1 -1
  28. package/dist/Badge.js.map +1 -1
  29. package/dist/Badge.vue.d.ts +7 -8
  30. package/dist/Box.vue.d.ts +6 -7
  31. package/dist/Box.vue_vue_type_script_setup_true_lang-69e5176b.js.map +1 -1
  32. package/dist/Button.js.map +1 -1
  33. package/dist/Button.vue.d.ts +7 -8
  34. package/dist/ButtonGroup.js +29 -29
  35. package/dist/ButtonGroup.js.map +1 -1
  36. package/dist/ButtonGroup.vue.d.ts +8 -9
  37. package/dist/Card.js.map +1 -1
  38. package/dist/Card.vue.d.ts +6 -7
  39. package/dist/CardContent.vue.d.ts +3 -5
  40. package/dist/CardFooter.vue.d.ts +3 -5
  41. package/dist/CardHeader.js.map +1 -1
  42. package/dist/CardHeader.vue.d.ts +3 -4
  43. package/dist/CardMedia.js +6 -6
  44. package/dist/CardMedia.js.map +1 -1
  45. package/dist/CardMedia.vue.d.ts +3 -4
  46. package/dist/Carousel.js +249 -249
  47. package/dist/Carousel.js.map +1 -1
  48. package/dist/Carousel.vue.d.ts +9 -9
  49. package/dist/Checkbox.js +27 -27
  50. package/dist/Checkbox.js.map +1 -1
  51. package/dist/Checkbox.vue.d.ts +11 -12
  52. package/dist/ChevronToggle.js +1 -1
  53. package/dist/ChevronToggle.vue.d.ts +8 -9
  54. package/dist/{ChevronToggle.vue_vue_type_script_setup_true_lang-1591294c.js → ChevronToggle.vue_vue_type_script_setup_true_lang-fcdf0c19.js} +11 -11
  55. package/dist/{ChevronToggle.vue_vue_type_script_setup_true_lang-1591294c.js.map → ChevronToggle.vue_vue_type_script_setup_true_lang-fcdf0c19.js.map} +1 -1
  56. package/dist/Chip.js +30 -30
  57. package/dist/Chip.js.map +1 -1
  58. package/dist/Chip.vue.d.ts +9 -10
  59. package/dist/ConfirmationCodeInput.js +25 -25
  60. package/dist/ConfirmationCodeInput.js.map +1 -1
  61. package/dist/ConfirmationCodeInput.vue.d.ts +8 -9
  62. package/dist/ContextSwitcher.js +18 -18
  63. package/dist/ContextSwitcher.js.map +1 -1
  64. package/dist/ContextSwitcher.vue.d.ts +9 -10
  65. package/dist/Copy.js.map +1 -1
  66. package/dist/Copy.vue.d.ts +6 -7
  67. package/dist/CurrencyInput.js +93 -93
  68. package/dist/CurrencyInput.js.map +1 -1
  69. package/dist/CurrencyInput.vue.d.ts +10 -11
  70. package/dist/CustomRender.vue.d.ts +3 -15
  71. package/dist/DataView.js +97 -97
  72. package/dist/DataView.js.map +1 -1
  73. package/dist/DataView.vue.d.ts +9 -10
  74. package/dist/DataViewFilters.js +153 -150
  75. package/dist/DataViewFilters.js.map +1 -1
  76. package/dist/DataViewFilters.vue.d.ts +9 -10
  77. package/dist/DataViewSortButton.js.map +1 -1
  78. package/dist/DataViewSortButton.vue.d.ts +6 -7
  79. package/dist/DataViewToolbar.js +27 -27
  80. package/dist/DataViewToolbar.js.map +1 -1
  81. package/dist/DataViewToolbar.vue.d.ts +8 -9
  82. package/dist/DatePicker.js +738 -738
  83. package/dist/DatePicker.js.map +1 -1
  84. package/dist/DatePicker.vue.d.ts +11 -12
  85. package/dist/DescriptionList.js.map +1 -1
  86. package/dist/DescriptionList.vue.d.ts +6 -7
  87. package/dist/DescriptionListDetail.vue.d.ts +3 -5
  88. package/dist/DescriptionListGroup.vue.d.ts +3 -5
  89. package/dist/DescriptionListTerm.vue.d.ts +3 -5
  90. package/dist/Dialog.js +44 -44
  91. package/dist/Dialog.js.map +1 -1
  92. package/dist/Dialog.vue.d.ts +10 -11
  93. package/dist/Divider.vue.d.ts +3 -5
  94. package/dist/Dropdown.js +38 -38
  95. package/dist/Dropdown.js.map +1 -1
  96. package/dist/Dropdown.vue.d.ts +9 -10
  97. package/dist/EmptyState.js +20 -20
  98. package/dist/EmptyState.js.map +1 -1
  99. package/dist/EmptyState.vue.d.ts +6 -7
  100. package/dist/Expand.js +1 -1
  101. package/dist/Expand.vue.d.ts +8 -9
  102. package/dist/{Expand.vue_vue_type_script_setup_true_lang-1751f4a6.js → Expand.vue_vue_type_script_setup_true_lang-0f236267.js} +19 -19
  103. package/dist/Expand.vue_vue_type_script_setup_true_lang-0f236267.js.map +1 -0
  104. package/dist/Field.vue.d.ts +6 -7
  105. package/dist/Field.vue_vue_type_script_setup_true_lang-e1e4ff03.js.map +1 -1
  106. package/dist/FileUpload.js +65 -65
  107. package/dist/FileUpload.js.map +1 -1
  108. package/dist/FileUpload.vue.d.ts +10 -11
  109. package/dist/FilterChip.js +27 -27
  110. package/dist/FilterChip.js.map +1 -1
  111. package/dist/FilterChip.vue.d.ts +8 -9
  112. package/dist/FilterDrawerItem.js +26 -26
  113. package/dist/FilterDrawerItem.js.map +1 -1
  114. package/dist/FilterDrawerItem.vue.d.ts +5 -6
  115. package/dist/FilterDropdown.js +49 -49
  116. package/dist/FilterDropdown.js.map +1 -1
  117. package/dist/FilterDropdown.vue.d.ts +8 -9
  118. package/dist/FilterSelect.js +23 -23
  119. package/dist/FilterSelect.js.map +1 -1
  120. package/dist/FilterSelect.vue.d.ts +8 -9
  121. package/dist/Filters.js +112 -104
  122. package/dist/Filters.js.map +1 -1
  123. package/dist/Filters.vue.d.ts +2204 -65
  124. package/dist/HttpError.js +42 -42
  125. package/dist/HttpError.js.map +1 -1
  126. package/dist/HttpError.vue.d.ts +6 -7
  127. package/dist/Icon.js.map +1 -1
  128. package/dist/Icon.vue.d.ts +7 -8
  129. package/dist/IconLabel.js.map +1 -1
  130. package/dist/IconLabel.vue.d.ts +8 -9
  131. package/dist/Illustration.vue.d.ts +6 -7
  132. package/dist/Illustration.vue_vue_type_script_setup_true_lang-e26c3841.js.map +1 -1
  133. package/dist/Image.js +47 -47
  134. package/dist/Image.js.map +1 -1
  135. package/dist/Image.vue.d.ts +6 -7
  136. package/dist/InlineEdit.js +34 -34
  137. package/dist/InlineEdit.js.map +1 -1
  138. package/dist/InlineEdit.vue.d.ts +9 -10
  139. package/dist/Input.js +35 -35
  140. package/dist/Input.js.map +1 -1
  141. package/dist/Input.vue.d.ts +13 -14
  142. package/dist/InputOptions.js +33 -33
  143. package/dist/InputOptions.js.map +1 -1
  144. package/dist/InputOptions.vue.d.ts +8 -9
  145. package/dist/IntegrationIcon.js.map +1 -1
  146. package/dist/IntegrationIcon.vue.d.ts +7 -8
  147. package/dist/Label.vue.d.ts +6 -7
  148. package/dist/Label.vue_vue_type_script_setup_true_lang-4b02087f.js.map +1 -1
  149. package/dist/LicenseChip.js.map +1 -1
  150. package/dist/LicenseChip.vue.d.ts +6 -7
  151. package/dist/ListItem.vue.d.ts +225 -95
  152. package/dist/ListItemCell.vue.d.ts +4 -16
  153. package/dist/ListView.js +1 -1
  154. package/dist/ListView.vue.d.ts +5072 -470
  155. package/dist/Loading.js +16 -16
  156. package/dist/Loading.js.map +1 -1
  157. package/dist/Loading.vue.d.ts +3 -5
  158. package/dist/Logo.js +1 -1
  159. package/dist/Logo.vue.d.ts +9 -10
  160. package/dist/Logo.vue_vue_type_script_setup_true_lang-2a2597cb.js +196 -0
  161. package/dist/Logo.vue_vue_type_script_setup_true_lang-2a2597cb.js.map +1 -0
  162. package/dist/Menu.vue.d.ts +3 -5
  163. package/dist/MenuItem.vue.d.ts +3 -5
  164. package/dist/Metric.js.map +1 -1
  165. package/dist/Metric.vue.d.ts +6 -7
  166. package/dist/Modal.js +29 -29
  167. package/dist/Modal.js.map +1 -1
  168. package/dist/Modal.vue.d.ts +8 -9
  169. package/dist/Modals.js +8 -7
  170. package/dist/Modals.js.map +1 -1
  171. package/dist/Modals.vue.d.ts +3 -5
  172. package/dist/Module.js.map +1 -1
  173. package/dist/Module.vue.d.ts +7 -8
  174. package/dist/ModuleContent.vue.d.ts +3 -5
  175. package/dist/ModuleFooter.vue.d.ts +3 -5
  176. package/dist/ModuleHeader.js.map +1 -1
  177. package/dist/ModuleHeader.vue.d.ts +6 -7
  178. package/dist/ObfuscateText.js +1 -1
  179. package/dist/ObfuscateText.js.map +1 -1
  180. package/dist/ObfuscateText.vue.d.ts +6 -7
  181. package/dist/PageContent.vue.d.ts +3 -5
  182. package/dist/PageHeader.js.map +1 -1
  183. package/dist/PageHeader.vue.d.ts +6 -7
  184. package/dist/PageNavigation.js +30 -27
  185. package/dist/PageNavigation.js.map +1 -1
  186. package/dist/PageNavigation.vue.d.ts +8 -9
  187. package/dist/Paginate.js +32 -32
  188. package/dist/Paginate.js.map +1 -1
  189. package/dist/Paginate.vue.d.ts +8 -9
  190. package/dist/PlaidLink.js +29 -29
  191. package/dist/PlaidLink.js.map +1 -1
  192. package/dist/PlaidLink.vue.d.ts +11 -12
  193. package/dist/QuickAction.js.map +1 -1
  194. package/dist/QuickAction.vue.d.ts +4 -5
  195. package/dist/Radio.vue.d.ts +20 -1
  196. package/dist/RadioGroup.js +123 -123
  197. package/dist/RadioGroup.js.map +1 -1
  198. package/dist/RadioGroup.vue.d.ts +10 -11
  199. package/dist/RadioNew.js +102 -102
  200. package/dist/RadioNew.js.map +1 -1
  201. package/dist/RadioNew.vue.d.ts +10 -11
  202. package/dist/RangeInput.vue.d.ts +3 -5
  203. package/dist/SearchBar.js +36 -36
  204. package/dist/SearchBar.js.map +1 -1
  205. package/dist/SearchBar.vue.d.ts +9 -10
  206. package/dist/Select.js +792 -774
  207. package/dist/Select.js.map +1 -1
  208. package/dist/Select.vue.d.ts +14 -15
  209. package/dist/SelectStatus.js +27 -27
  210. package/dist/SelectStatus.js.map +1 -1
  211. package/dist/SelectStatus.vue.d.ts +12 -13
  212. package/dist/Skeleton.js.map +1 -1
  213. package/dist/Skeleton.vue.d.ts +7 -8
  214. package/dist/Step.js.map +1 -1
  215. package/dist/Step.vue.d.ts +7 -8
  216. package/dist/Stepper.js +19 -19
  217. package/dist/Stepper.js.map +1 -1
  218. package/dist/Stepper.vue.d.ts +9 -10
  219. package/dist/Switch.js +25 -25
  220. package/dist/Switch.js.map +1 -1
  221. package/dist/Switch.vue.d.ts +11 -12
  222. package/dist/Tab.js +2 -2
  223. package/dist/Tab.vue.d.ts +3 -4
  224. package/dist/{Tab.vue_vue_type_script_setup_true_lang-69d1b046.js → Tab.vue_vue_type_script_setup_true_lang-9aa53203.js} +5 -3
  225. package/dist/Tab.vue_vue_type_script_setup_true_lang-9aa53203.js.map +1 -0
  226. package/dist/Table.js +3 -3
  227. package/dist/Table.js.map +1 -1
  228. package/dist/{Table.keys-cf93df19.js → Table.keys-83e4f09b.js} +11 -11
  229. package/dist/{Table.keys-cf93df19.js.map → Table.keys-83e4f09b.js.map} +1 -1
  230. package/dist/Table.vue.d.ts +6 -7
  231. package/dist/TableCell.js +1 -1
  232. package/dist/TableCell.js.map +1 -1
  233. package/dist/TableCell.vue.d.ts +6 -7
  234. package/dist/TableHeaderCell.js +12 -12
  235. package/dist/TableHeaderCell.js.map +1 -1
  236. package/dist/TableHeaderCell.vue.d.ts +6 -7
  237. package/dist/TableHeaderRow.js +21 -21
  238. package/dist/TableHeaderRow.js.map +1 -1
  239. package/dist/TableHeaderRow.vue.d.ts +8 -9
  240. package/dist/TableRow.js +42 -42
  241. package/dist/TableRow.js.map +1 -1
  242. package/dist/TableRow.vue.d.ts +8 -9
  243. package/dist/Tabs.js +2 -2
  244. package/dist/Tabs.vue.d.ts +8 -9
  245. package/dist/{Tabs.vue_used_vue_type_style_index_0_lang.module-2a131332.js → Tabs.vue_used_vue_type_style_index_0_lang.module-3aa36673.js} +37 -37
  246. package/dist/Tabs.vue_used_vue_type_style_index_0_lang.module-3aa36673.js.map +1 -0
  247. package/dist/TextEditor.js +565 -565
  248. package/dist/TextEditor.js.map +1 -1
  249. package/dist/TextEditor.vue.d.ts +12 -13
  250. package/dist/Textarea.js +28 -28
  251. package/dist/Textarea.js.map +1 -1
  252. package/dist/Textarea.vue.d.ts +10 -11
  253. package/dist/Timeline.js.map +1 -1
  254. package/dist/Timeline.vue.d.ts +6 -7
  255. package/dist/TimelineItem.js +21 -21
  256. package/dist/TimelineItem.js.map +1 -1
  257. package/dist/TimelineItem.vue.d.ts +13 -6
  258. package/dist/Toast.js +134 -134
  259. package/dist/Toast.js.map +1 -1
  260. package/dist/Toast.vue.d.ts +6 -7
  261. package/dist/Toasts.vue.d.ts +3 -5
  262. package/dist/components.css +1 -1
  263. package/dist/index.js.map +1 -1
  264. package/dist/tailwind-base.js.map +1 -1
  265. package/dist/usePlaidLink.d.ts +1 -6
  266. package/dist/useScriptTag.d.ts +3 -8
  267. package/dist/useStepper.d.ts +7 -2
  268. package/package.json +1 -1
  269. package/tailwind-base.ts +13 -6
  270. package/dist/Expand.vue_vue_type_script_setup_true_lang-1751f4a6.js.map +0 -1
  271. package/dist/Logo.vue_vue_type_script_setup_true_lang-d7da48a0.js +0 -196
  272. package/dist/Logo.vue_vue_type_script_setup_true_lang-d7da48a0.js.map +0 -1
  273. package/dist/Tab.vue_vue_type_script_setup_true_lang-69d1b046.js.map +0 -1
  274. package/dist/Tabs.vue_used_vue_type_style_index_0_lang.module-2a131332.js.map +0 -1
@@ -1,10 +1,9 @@
1
- import { AllowedComponentProps } from 'vue';
2
- import { ComponentCustomProps } from 'vue';
3
1
  import { ComponentOptionsMixin } from 'vue';
2
+ import { ComponentProvideOptions } from 'vue';
4
3
  import { DefineComponent } from 'vue';
5
4
  import { ExtractPropTypes } from 'vue';
6
5
  import { PropType } from 'vue';
7
- import { VNodeProps } from 'vue';
6
+ import { PublicProps } from 'vue';
8
7
 
9
8
  declare type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
10
9
 
@@ -33,7 +32,7 @@ declare type __VLS_WithTemplateSlots<T, S> = T & {
33
32
  };
34
33
  };
35
34
 
36
- declare const _default: __VLS_WithTemplateSlots<DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<FieldProps>, {
35
+ declare const _default: __VLS_WithTemplateSlots<DefineComponent<ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<FieldProps>, {
37
36
  addBottomSpace: boolean;
38
37
  errorText: undefined;
39
38
  hintText: undefined;
@@ -43,7 +42,7 @@ declare const _default: __VLS_WithTemplateSlots<DefineComponent<__VLS_WithDefaul
43
42
  label: undefined;
44
43
  showOptionalInLabel: boolean;
45
44
  fieldset: boolean;
46
- }>, {}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<FieldProps>, {
45
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<FieldProps>, {
47
46
  addBottomSpace: boolean;
48
47
  errorText: undefined;
49
48
  hintText: undefined;
@@ -53,7 +52,7 @@ declare const _default: __VLS_WithTemplateSlots<DefineComponent<__VLS_WithDefaul
53
52
  label: undefined;
54
53
  showOptionalInLabel: boolean;
55
54
  fieldset: boolean;
56
- }>>>, {
55
+ }>>> & Readonly<{}>, {
57
56
  fieldset: boolean;
58
57
  label: string;
59
58
  id: string;
@@ -63,7 +62,7 @@ declare const _default: __VLS_WithTemplateSlots<DefineComponent<__VLS_WithDefaul
63
62
  hintText: string;
64
63
  errorId: string;
65
64
  showOptionalInLabel: boolean;
66
- }, {}>, {
65
+ }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>, {
67
66
  default?(_: {
68
67
  fieldId: string;
69
68
  fieldErrorId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Field.vue_vue_type_script_setup_true_lang-e1e4ff03.js","sources":["../src/components/Field/Field.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, useAttrs, useSlots } from 'vue';\n\n import Label from '../Label/Label.vue';\n\n defineOptions({\n inheritAttrs: false,\n });\n\n export interface FieldProps {\n /**\n * Adds spacing under the field that is consistent whether hint/error text is displayed.\n */\n addBottomSpace?: boolean;\n\n /**\n * Error text to display. Replaces `hintText` (if provided) & adds error styling.\n */\n errorText?: string;\n\n /**\n * Displays text below the input; hidden when the isReadOnly prop is truthy.\n */\n hintText?: string;\n\n /**\n * ID for the Label and Input; must be unique\n */\n id?: string;\n\n /**\n * ID for the error text element; useful for aria-errormessage\n */\n errorId?: string;\n\n /**\n * Whether it's a readonly field.\n */\n isReadOnly?: boolean;\n\n /**\n * Whether the field is required.\n */\n isRequired?: boolean;\n\n /**\n * Label to render above the input.\n */\n label?: string;\n\n /**\n * Show \"(optional)\" to the right of the label text\n */\n showOptionalInLabel?: boolean;\n\n /**\n * Indicates wheter the field is a fieldset or not\n */\n fieldset?: boolean;\n }\n\n const props = withDefaults(defineProps<FieldProps>(), {\n addBottomSpace: false,\n errorText: undefined,\n hintText: undefined,\n id: undefined,\n errorId: undefined,\n isRequired: false,\n label: undefined,\n showOptionalInLabel: false,\n fieldset: false,\n });\n const attrs = useAttrs();\n const slots = useSlots();\n const fieldId = computed(() => props.id || uniqueId('stash-field-'));\n const fieldErrorId = computed(() => props.errorId || uniqueId('stash-field-error-'));\n const labelId = computed(() => uniqueId('stash-field-label-'));\n const hasError = computed(() => !!props.errorText);\n const wrapperElement = computed(() => (props.fieldset ? 'fieldset' : 'div'));\n\n // Any attributes that are unique to form elements, you want to exclude from\n // being bound from the root element.\n const rootAttrs = computed(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { placeholder, ...otherAttrs } = attrs;\n\n return otherAttrs;\n });\n</script>\n\n<template>\n <component\n :is=\"wrapperElement\"\n data-test=\"stash-field\"\n class=\"stash-field\"\n :class=\"[\n { 'tw-p-0': props.fieldset },\n { 'tw-mb-9': props.addBottomSpace && !props.errorText && !props.hintText && !slots.hint },\n { 'tw-mb-4': props.addBottomSpace && (props.errorText || props.hintText || slots.hint) },\n ]\"\n v-bind=\"rootAttrs\"\n >\n <Label\n v-if=\"props.label\"\n :id=\"labelId\"\n :class=\"{ 'tw-mb-1.5': !!props.isReadOnly }\"\n :for=\"fieldId\"\n :has-error=\"hasError\"\n :is-required=\"isRequired\"\n :show-optional=\"props.showOptionalInLabel\"\n :legend=\"props.fieldset\"\n >\n {{ props.label }}\n </Label>\n\n <!-- @slot for the form field; the Label can also be rendered here instead of using the label prop -->\n <template v-if=\"props.isReadOnly\">\n <div :aria-labelledby=\"labelId\">\n <slot\n :field-id=\"fieldId\"\n :field-error-id=\"fieldErrorId\"\n :has-error=\"hasError\"\n :is-required=\"isRequired\"\n :label-id=\"labelId\"\n :show-optional-in-label=\"props.showOptionalInLabel\"\n ></slot>\n </div>\n </template>\n <template v-else>\n <slot\n :field-id=\"fieldId\"\n :field-error-id=\"fieldErrorId\"\n :has-error=\"hasError\"\n :is-required=\"isRequired\"\n :label-id=\"labelId\"\n :show-optional-in-label=\"props.showOptionalInLabel\"\n ></slot>\n </template>\n\n <span\n v-if=\"props.errorText\"\n :id=\"fieldErrorId\"\n class=\"stash-field-error tw-mt-1 tw-block tw-whitespace-pre-line tw-text-xs tw-text-red-500\"\n data-test=\"stash-field-error\"\n >\n {{ props.errorText }}\n </span>\n\n <span\n v-else-if=\"props.hintText && !props.isReadOnly\"\n class=\"stash-field-hint tw-mt-1 tw-block tw-whitespace-pre-line tw-text-xs\"\n data-test=\"stash-field-hint\"\n >\n {{ props.hintText }}\n </span>\n\n <div\n v-else-if=\"slots.hint && !props.isReadOnly\"\n class=\"stash-field-hint tw-mt-1 tw-whitespace-pre-line tw-text-xs\"\n data-test=\"stash-field-hint\"\n >\n <!-- @slot for displaying hint text below the field -->\n <slot name=\"hint\"></slot>\n </div>\n </component>\n</template>\n"],"names":["attrs","useAttrs","slots","useSlots","fieldId","computed","props","uniqueId","fieldErrorId","labelId","hasError","wrapperElement","rootAttrs","placeholder","otherAttrs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyEQA,IAAQC,KACRC,IAAQC,KACRC,IAAUC,EAAS,MAAMC,EAAM,MAAMC,EAAS,cAAc,CAAC,GAC7DC,IAAeH,EAAS,MAAMC,EAAM,WAAWC,EAAS,oBAAoB,CAAC,GAC7EE,IAAUJ,EAAS,MAAME,EAAS,oBAAoB,CAAC,GACvDG,IAAWL,EAAS,MAAM,CAAC,CAACC,EAAM,SAAS,GAC3CK,IAAiBN,EAAS,MAAOC,EAAM,WAAW,aAAa,KAAM,GAIrEM,IAAYP,EAAS,MAAM;AAE/B,YAAM,EAAE,aAAAQ,GAAa,GAAGC,EAAA,IAAed;AAEhC,aAAAc;AAAA,IAAA,CACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Field.vue_vue_type_script_setup_true_lang-e1e4ff03.js","sources":["../src/components/Field/Field.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import uniqueId from 'lodash-es/uniqueId';\n import { computed, useAttrs, useSlots } from 'vue';\n\n import Label from '../Label/Label.vue';\n\n defineOptions({\n inheritAttrs: false,\n });\n\n export interface FieldProps {\n /**\n * Adds spacing under the field that is consistent whether hint/error text is displayed.\n */\n addBottomSpace?: boolean;\n\n /**\n * Error text to display. Replaces `hintText` (if provided) & adds error styling.\n */\n errorText?: string;\n\n /**\n * Displays text below the input; hidden when the isReadOnly prop is truthy.\n */\n hintText?: string;\n\n /**\n * ID for the Label and Input; must be unique\n */\n id?: string;\n\n /**\n * ID for the error text element; useful for aria-errormessage\n */\n errorId?: string;\n\n /**\n * Whether it's a readonly field.\n */\n isReadOnly?: boolean;\n\n /**\n * Whether the field is required.\n */\n isRequired?: boolean;\n\n /**\n * Label to render above the input.\n */\n label?: string;\n\n /**\n * Show \"(optional)\" to the right of the label text\n */\n showOptionalInLabel?: boolean;\n\n /**\n * Indicates wheter the field is a fieldset or not\n */\n fieldset?: boolean;\n }\n\n const props = withDefaults(defineProps<FieldProps>(), {\n addBottomSpace: false,\n errorText: undefined,\n hintText: undefined,\n id: undefined,\n errorId: undefined,\n isRequired: false,\n label: undefined,\n showOptionalInLabel: false,\n fieldset: false,\n });\n const attrs = useAttrs();\n const slots = useSlots();\n const fieldId = computed(() => props.id || uniqueId('stash-field-'));\n const fieldErrorId = computed(() => props.errorId || uniqueId('stash-field-error-'));\n const labelId = computed(() => uniqueId('stash-field-label-'));\n const hasError = computed(() => !!props.errorText);\n const wrapperElement = computed(() => (props.fieldset ? 'fieldset' : 'div'));\n\n // Any attributes that are unique to form elements, you want to exclude from\n // being bound from the root element.\n const rootAttrs = computed(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { placeholder, ...otherAttrs } = attrs;\n\n return otherAttrs;\n });\n</script>\n\n<template>\n <component\n :is=\"wrapperElement\"\n data-test=\"stash-field\"\n class=\"stash-field\"\n :class=\"[\n { 'tw-p-0': props.fieldset },\n { 'tw-mb-9': props.addBottomSpace && !props.errorText && !props.hintText && !slots.hint },\n { 'tw-mb-4': props.addBottomSpace && (props.errorText || props.hintText || slots.hint) },\n ]\"\n v-bind=\"rootAttrs\"\n >\n <Label\n v-if=\"props.label\"\n :id=\"labelId\"\n :class=\"{ 'tw-mb-1.5': !!props.isReadOnly }\"\n :for=\"fieldId\"\n :has-error=\"hasError\"\n :is-required=\"isRequired\"\n :show-optional=\"props.showOptionalInLabel\"\n :legend=\"props.fieldset\"\n >\n {{ props.label }}\n </Label>\n\n <!-- @slot for the form field; the Label can also be rendered here instead of using the label prop -->\n <template v-if=\"props.isReadOnly\">\n <div :aria-labelledby=\"labelId\">\n <slot\n :field-id=\"fieldId\"\n :field-error-id=\"fieldErrorId\"\n :has-error=\"hasError\"\n :is-required=\"isRequired\"\n :label-id=\"labelId\"\n :show-optional-in-label=\"props.showOptionalInLabel\"\n ></slot>\n </div>\n </template>\n <template v-else>\n <slot\n :field-id=\"fieldId\"\n :field-error-id=\"fieldErrorId\"\n :has-error=\"hasError\"\n :is-required=\"isRequired\"\n :label-id=\"labelId\"\n :show-optional-in-label=\"props.showOptionalInLabel\"\n ></slot>\n </template>\n\n <span\n v-if=\"props.errorText\"\n :id=\"fieldErrorId\"\n class=\"stash-field-error tw-mt-1 tw-block tw-whitespace-pre-line tw-text-xs tw-text-red-500\"\n data-test=\"stash-field-error\"\n >\n {{ props.errorText }}\n </span>\n\n <span\n v-else-if=\"props.hintText && !props.isReadOnly\"\n class=\"stash-field-hint tw-mt-1 tw-block tw-whitespace-pre-line tw-text-xs\"\n data-test=\"stash-field-hint\"\n >\n {{ props.hintText }}\n </span>\n\n <div\n v-else-if=\"slots.hint && !props.isReadOnly\"\n class=\"stash-field-hint tw-mt-1 tw-whitespace-pre-line tw-text-xs\"\n data-test=\"stash-field-hint\"\n >\n <!-- @slot for displaying hint text below the field -->\n <slot name=\"hint\"></slot>\n </div>\n </component>\n</template>\n"],"names":["props","__props","attrs","useAttrs","slots","useSlots","fieldId","computed","uniqueId","fieldErrorId","labelId","hasError","wrapperElement","rootAttrs","placeholder","otherAttrs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DE,UAAMA,IAAQC,GAWRC,IAAQC,KACRC,IAAQC,KACRC,IAAUC,EAAS,MAAMP,EAAM,MAAMQ,EAAS,cAAc,CAAC,GAC7DC,IAAeF,EAAS,MAAMP,EAAM,WAAWQ,EAAS,oBAAoB,CAAC,GAC7EE,IAAUH,EAAS,MAAMC,EAAS,oBAAoB,CAAC,GACvDG,IAAWJ,EAAS,MAAM,CAAC,CAACP,EAAM,SAAS,GAC3CY,IAAiBL,EAAS,MAAOP,EAAM,WAAW,aAAa,KAAM,GAIrEa,IAAYN,EAAS,MAAM;AAE/B,YAAM,EAAE,aAAAO,GAAa,GAAGC,EAAA,IAAeb;AAEhC,aAAAa;AAAA,IAAA,CACR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,15 +1,15 @@
1
- import { defineComponent as H, useCssModule as q, ref as k, inject as K, useAttrs as Q, computed as g, openBlock as n, createElementBlock as i, normalizeClass as d, unref as l, createVNode as w, withModifiers as c, withCtx as I, renderSlot as S, createTextVNode as N, toDisplayString as p, createElementVNode as v, Fragment as U, createBlock as W, createCommentVNode as R, renderList as Z, withDirectives as ee, mergeProps as te, vShow as le } from "vue";
2
- import se from "@leaflink/snitch";
3
- import { I as ne } from "./index-9e1095ef.js";
1
+ import { defineComponent as q, useCssModule as K, ref as U, inject as Q, useAttrs as W, computed as w, openBlock as n, createElementBlock as a, normalizeClass as d, unref as l, createVNode as g, withModifiers as c, withCtx as I, renderSlot as S, createTextVNode as N, toDisplayString as p, createElementVNode as v, Fragment as k, createBlock as Z, createCommentVNode as R, renderList as ee, withDirectives as te, mergeProps as le, vShow as se } from "vue";
2
+ import ne from "@leaflink/snitch";
3
+ import { I as oe } from "./index-9e1095ef.js";
4
4
  import { t as u } from "./locale.js";
5
- import D from "./Button.js";
6
- import oe from "./Icon.js";
5
+ import F from "./Button.js";
6
+ import ie from "./Icon.js";
7
7
  import { _ as ae } from "./_plugin-vue_export-helper-dad06003.js";
8
8
  import "lodash-es/get";
9
9
  import "./Button.vue_used_vue_type_style_index_0_lang.module-a9290468.js";
10
10
  import "lodash-es/uniqueId";
11
11
  import "./Icon.vue_used_vue_type_style_index_0_lang.module-eb359559.js";
12
- const F = {
12
+ const M = {
13
13
  CSV: {
14
14
  EXTENSION: ["csv"],
15
15
  MIME_TYPES: ["text/csv", "application/octet-stream", "application/vnd.ms-excel"],
@@ -42,10 +42,10 @@ const F = {
42
42
  }
43
43
  };
44
44
  var h = /* @__PURE__ */ ((f) => (f.Dense = "dense", f.Standard = "standard", f))(h || {});
45
- const ie = { key: 0 }, re = ["onDragover", "onDrop", "onDragleave"], de = { class: "tw-text-ice-900" }, ce = {
45
+ const re = { key: 0 }, de = { class: "tw-text-ice-900" }, ce = {
46
46
  key: 0,
47
47
  class: "tw-mt-6 tw-text-center tw-text-xs tw-text-ice-700"
48
- }, pe = ["disabled", "accept", "multiple"], ue = /* @__PURE__ */ H({
48
+ }, pe = ["disabled", "accept", "multiple"], ue = /* @__PURE__ */ q({
49
49
  __name: "FileUpload",
50
50
  props: {
51
51
  files: { default: () => [] },
@@ -56,89 +56,89 @@ const ie = { key: 0 }, re = ["onDragover", "onDrop", "onDragleave"], de = { clas
56
56
  size: { default: "standard" }
57
57
  },
58
58
  emits: ["file-select", "file-delete", "file-error"],
59
- setup(f, { emit: E }) {
60
- const m = f, r = q(), y = k(!1), T = k(), _ = K("stashOptions"), M = Q(), A = g(() => {
61
- const e = { ...M };
59
+ setup(f, { emit: A }) {
60
+ const m = f, r = K(), E = A, y = U(!1), T = U(), b = Q("stashOptions"), D = W(), X = w(() => {
61
+ const e = { ...D };
62
62
  return delete e["data-test"], delete e.class, delete e.type, delete e.accept, e;
63
63
  });
64
64
  function O(e, t) {
65
65
  return e.concat(t);
66
66
  }
67
- const b = g(() => m.fileTypes.map((e) => F[e].MIME_TYPES).reduce(O)), C = g(() => m.fileTypes.map((e) => F[e].EXTENSION).reduce(O)), X = g(() => `${_ == null ? void 0 : _.staticPath}/illustrations/FileUpload/${F[m.fileTypes[0]].ILLUSTRATION}.svg`);
68
- function L() {
67
+ const _ = w(() => m.fileTypes.map((e) => M[e].MIME_TYPES).reduce(O)), L = w(() => m.fileTypes.map((e) => M[e].EXTENSION).reduce(O)), Y = w(() => `${b == null ? void 0 : b.staticPath}/illustrations/FileUpload/${M[m.fileTypes[0]].ILLUSTRATION}.svg`);
68
+ function x() {
69
69
  T.value && (T.value.value = "", T.value.click());
70
70
  }
71
- function Y() {
71
+ function $() {
72
72
  y.value = !0;
73
73
  }
74
- function $() {
74
+ function j() {
75
75
  y.value = !1;
76
76
  }
77
- function j(e) {
77
+ function B(e) {
78
78
  const t = u("ll.fileUpload.errors.incorrectFileType", {
79
- fileTypes: C.value.join(", ")
79
+ fileTypes: L.value.join(", ")
80
80
  });
81
- E("file-error", t), se.log(e);
81
+ E("file-error", t), ne.log(e);
82
82
  }
83
- async function B(e) {
84
- if (!b.value.length)
83
+ async function V(e) {
84
+ if (!_.value.length)
85
85
  return !0;
86
- const t = await Promise.all(e.map((a) => J(a)));
87
- if (!(!!t.length && t.every((a) => b.value.includes(a))))
86
+ const t = await Promise.all(e.map((i) => H(i)));
87
+ if (!(!!t.length && t.every((i) => _.value.includes(i))))
88
88
  throw new Error("One or more files contains an unacceptable mime type.");
89
- if (!e.every((a) => {
90
- const P = a.name.split(".").pop();
91
- return P && C.value.includes(P);
89
+ if (!e.every((i) => {
90
+ const C = i.name.split(".").pop();
91
+ return C && L.value.includes(C);
92
92
  }))
93
93
  throw new Error("One or more files contains an unacceptable extension.");
94
94
  return !0;
95
95
  }
96
- async function x(e) {
96
+ async function P(e) {
97
97
  try {
98
- await B(e), E("file-select", { files: e });
98
+ await V(e), E("file-select", { files: e });
99
99
  } catch (t) {
100
- j(t);
100
+ B(t);
101
101
  }
102
102
  }
103
- function V(e) {
103
+ function z(e) {
104
104
  var s;
105
105
  const t = [...((s = e.target) == null ? void 0 : s.files) || []];
106
- x(t);
106
+ P(t);
107
107
  }
108
- function z(e) {
108
+ function G(e) {
109
109
  var s;
110
110
  if (m.disabled)
111
111
  return;
112
112
  const t = [...((s = e.dataTransfer) == null ? void 0 : s.files) || []];
113
- return y.value = !1, x(t);
113
+ return y.value = !1, P(t);
114
114
  }
115
- function G(e) {
115
+ function J(e) {
116
116
  E("file-delete", e);
117
117
  }
118
- function J(e) {
118
+ function H(e) {
119
119
  return new Promise((t, s) => {
120
120
  if (e.type)
121
121
  return t(e.type);
122
122
  if (window.FileReader) {
123
123
  const o = new FileReader();
124
124
  o.onload = () => {
125
- const a = o.result && o.result.match(/[^:]\w+\/[\w-+\d.]+(?=;|,)/) ? o.result.match(/[^:]\w+\/[\w-+\d.]+(?=;|,)/)[0] : "";
126
- t(a);
125
+ const i = o.result && o.result.match(/[^:]\w+\/[\w-+\d.]+(?=;|,)/) ? o.result.match(/[^:]\w+\/[\w-+\d.]+(?=;|,)/)[0] : "";
126
+ t(i);
127
127
  }, o.readAsDataURL(e);
128
128
  } else
129
129
  s(new Error("Failed to read file."));
130
130
  });
131
131
  }
132
- return (e, t) => (n(), i("div", {
133
- class: d(["stash-file-upload", l(M).class]),
132
+ return (e, t) => (n(), a("div", {
133
+ class: d(["stash-file-upload", l(D).class]),
134
134
  "data-test": "stash-file-upload"
135
135
  }, [
136
- e.buttonOnly ? (n(), i("div", ie, [
137
- w(D, {
136
+ e.buttonOnly ? (n(), a("div", re, [
137
+ g(F, {
138
138
  secondary: "",
139
139
  type: "button",
140
140
  disabled: e.disabled || null,
141
- onClick: c(L, ["stop", "prevent"])
141
+ onClick: c(x, ["stop", "prevent"])
142
142
  }, {
143
143
  default: I(() => [
144
144
  S(e.$slots, "submitText", {}, () => [
@@ -146,35 +146,35 @@ const ie = { key: 0 }, re = ["onDragover", "onDrop", "onDragleave"], de = { clas
146
146
  ])
147
147
  ]),
148
148
  _: 3
149
- }, 8, ["disabled", "onClick"])
150
- ])) : (n(), i("div", {
149
+ }, 8, ["disabled"])
150
+ ])) : (n(), a("div", {
151
151
  key: 1,
152
152
  class: d(["tw-rounded tw-p-6", [l(r)["file-dropbox"], y.value && l(r)["is-dragging"], e.disabled && l(r)["is-disabled"]]]),
153
- onDragover: c(Y, ["prevent"]),
154
- onDrop: c(z, ["prevent"]),
155
- onDragleave: c($, ["prevent"])
153
+ onDragover: c($, ["prevent"]),
154
+ onDrop: c(G, ["prevent"]),
155
+ onDragleave: c(j, ["prevent"])
156
156
  }, [
157
157
  v("div", {
158
158
  class: d(["tw-flex tw-flex-col tw-items-center tw-justify-center tw-text-center", [{ "tw-items-center md:tw-flex-row": e.size === l(h).Dense }]])
159
159
  }, [
160
- e.files.length ? (n(!0), i(U, { key: 1 }, Z(e.files, (s) => (n(), i("div", {
160
+ e.files.length ? (n(!0), a(k, { key: 1 }, ee(e.files, (s) => (n(), a("div", {
161
161
  key: s.name
162
162
  }, [
163
- w(oe, { name: "file" }),
163
+ g(ie, { name: "file" }),
164
164
  v("span", null, p(s.name), 1),
165
- w(D, {
165
+ g(F, {
166
166
  class: d([l(r)["remove-button"], l(r).button]),
167
- onClick: c((o) => G(s), ["stop", "prevent"])
167
+ onClick: c((o) => J(s), ["stop", "prevent"])
168
168
  }, {
169
169
  default: I(() => [
170
170
  N(p(l(u)("ll.fileUpload.remove")), 1)
171
171
  ]),
172
172
  _: 2
173
173
  }, 1032, ["class", "onClick"])
174
- ]))), 128)) : (n(), i(U, { key: 0 }, [
175
- e.size !== l(h).Dense ? (n(), W(l(ne), {
174
+ ]))), 128)) : (n(), a(k, { key: 0 }, [
175
+ e.size !== l(h).Dense ? (n(), Z(l(oe), {
176
176
  key: 0,
177
- src: X.value,
177
+ src: Y.value,
178
178
  name: "file",
179
179
  width: "84",
180
180
  height: "96"
@@ -185,12 +185,12 @@ const ie = { key: 0 }, re = ["onDragover", "onDrop", "onDragleave"], de = { clas
185
185
  e.size === l(h).Dense ? "md:tw-ml-1.5 md:tw-mr-3 md:tw-my-0 tw-my-1.5 tw-text-ice-900" : "tw-mt-1.5 tw-my-1.5"
186
186
  )
187
187
  }, p(l(u)("ll.fileUpload.or")), 3),
188
- w(D, {
188
+ g(F, {
189
189
  class: d(["tw-mt-1.5", l(r)["file-select-button"]]),
190
190
  secondary: "",
191
191
  type: "button",
192
192
  disabled: e.disabled,
193
- onClick: c(L, ["stop", "prevent"])
193
+ onClick: c(x, ["stop", "prevent"])
194
194
  }, {
195
195
  default: I(() => [
196
196
  S(e.$slots, "submitText", {}, () => [
@@ -198,24 +198,24 @@ const ie = { key: 0 }, re = ["onDragover", "onDrop", "onDragleave"], de = { clas
198
198
  ])
199
199
  ]),
200
200
  _: 3
201
- }, 8, ["class", "disabled", "onClick"])
201
+ }, 8, ["class", "disabled"])
202
202
  ], 64))
203
203
  ], 2),
204
- e.$slots.hint && !e.files.length ? (n(), i("div", ce, [
204
+ e.$slots.hint && !e.files.length ? (n(), a("div", ce, [
205
205
  S(e.$slots, "hint")
206
206
  ])) : R("", !0)
207
- ], 42, re)),
208
- ee(v("input", te(A.value, {
207
+ ], 34)),
208
+ te(v("input", le(X.value, {
209
209
  ref_key: "fileUploadRef",
210
210
  ref: T,
211
211
  "data-test": "stash-file-upload|input",
212
212
  type: "file",
213
213
  disabled: e.disabled,
214
- accept: b.value.join(","),
214
+ accept: _.value.join(","),
215
215
  multiple: m.multiple,
216
- onChange: V
216
+ onChange: z
217
217
  }), null, 16, pe), [
218
- [le, !1]
218
+ [se, !1]
219
219
  ])
220
220
  ], 2));
221
221
  }
@@ -228,10 +228,10 @@ const ie = { key: 0 }, re = ["onDragover", "onDrop", "onDragleave"], de = { clas
228
228
  button: fe
229
229
  }, ve = {
230
230
  $style: me
231
- }, De = /* @__PURE__ */ ae(ue, [["__cssModules", ve]]);
231
+ }, Fe = /* @__PURE__ */ ae(ue, [["__cssModules", ve]]);
232
232
  export {
233
- F as FILE_TYPES,
233
+ M as FILE_TYPES,
234
234
  h as FileUploadSizes,
235
- De as default
235
+ Fe as default
236
236
  };
237
237
  //# sourceMappingURL=FileUpload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileUpload.js","sources":["../src/components/FileUpload/FileUpload.constants.ts","../src/components/FileUpload/FileUpload.vue"],"sourcesContent":["export const FILE_TYPES = {\n CSV: {\n EXTENSION: ['csv'],\n MIME_TYPES: ['text/csv', 'application/octet-stream', 'application/vnd.ms-excel'],\n ILLUSTRATION: 'csv',\n },\n PDF: {\n EXTENSION: ['pdf'],\n MIME_TYPES: ['application/pdf'],\n ILLUSTRATION: 'pdf',\n },\n PNG: {\n EXTENSION: ['png'],\n MIME_TYPES: ['image/png'],\n ILLUSTRATION: 'image',\n },\n JPEG: {\n EXTENSION: ['jpg', 'jpeg'],\n MIME_TYPES: ['image/jpeg'],\n ILLUSTRATION: 'image',\n },\n DOC: {\n EXTENSION: ['doc', 'docx'],\n MIME_TYPES: ['application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ILLUSTRATION: 'document',\n },\n XLS: {\n EXTENSION: ['xls', 'xlsx'],\n MIME_TYPES: ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ILLUSTRATION: 'csv',\n },\n};\n\nexport enum FileUploadSizes {\n Dense = 'dense',\n Standard = 'standard',\n}\n\nexport type FileUploadSize = `${FileUploadSizes}`;\n","<script lang=\"ts\">\n export * from './FileUpload.constants';\n</script>\n\n<script setup lang=\"ts\">\n import logger from '@leaflink/snitch';\n import { computed, inject, ref, useAttrs, useCssModule } from 'vue';\n import InlineSvg from 'vue-inline-svg';\n\n import { StashProvideState } from '../../../types/misc';\n import { t } from '../../locale';\n import Button from '../Button/Button.vue';\n import Icon from '../Icon/Icon.vue';\n import { FILE_TYPES, FileUploadSize, FileUploadSizes } from './FileUpload.constants';\n\n export type FileType = 'CSV' | 'PDF' | 'PNG' | 'JPEG' | 'DOC' | 'XLS';\n\n export interface FileUploadProps {\n /**\n * Files to display in the component\n */\n files?: File[];\n\n /**\n * Accepted file types\n */\n fileTypes?: FileType[];\n\n /**\n * Should display only the button\n */\n buttonOnly?: boolean;\n\n /**\n * Allows upload of multiple files\n */\n multiple?: boolean;\n\n /**\n * Is the input disabled\n */\n disabled?: boolean;\n\n /**\n * Component size\n */\n size?: FileUploadSize;\n }\n\n const props = withDefaults(defineProps<FileUploadProps>(), {\n files: () => [],\n fileTypes: () => ['CSV', 'PDF', 'PNG', 'JPEG', 'DOC', 'XLS'],\n buttonOnly: false,\n disabled: false,\n multiple: false,\n size: 'standard',\n });\n\n const classes = useCssModule();\n\n const emit =\n defineEmits<{\n (e: 'file-select', { files }: { files: FileUploadProps['files'] }): void;\n (e: 'file-delete', file: File): void;\n (e: 'file-error', message: string): void;\n }>();\n\n const isDraggingOver = ref(false);\n const fileUploadRef = ref<HTMLInputElement>();\n\n const stashOptions = inject<StashProvideState>('stashOptions');\n const attributes = useAttrs();\n\n const inputAttrs = computed(() => {\n const attrs = { ...attributes };\n\n delete attrs['data-test'];\n delete attrs.class;\n delete attrs.type;\n delete attrs.accept;\n\n return attrs;\n });\n\n function concatArraysToFirst(a: string[], b: string[]) {\n return a.concat(b);\n }\n\n const acceptedMimeTypes = computed(() => {\n return props.fileTypes.map((fileType) => FILE_TYPES[fileType].MIME_TYPES).reduce(concatArraysToFirst);\n });\n\n const acceptedFileExtensions = computed(() => {\n return props.fileTypes.map((fileType) => FILE_TYPES[fileType].EXTENSION).reduce(concatArraysToFirst);\n });\n\n const illustrationPath = computed(() => {\n return `${stashOptions?.staticPath}/illustrations/FileUpload/${FILE_TYPES[props.fileTypes[0]].ILLUSTRATION}.svg`;\n });\n\n function openFileDialog() {\n if (fileUploadRef.value) {\n fileUploadRef.value.value = '';\n fileUploadRef.value.click();\n }\n }\n\n function handleDragEnter() {\n isDraggingOver.value = true;\n }\n\n function handleDragLeave() {\n isDraggingOver.value = false;\n }\n\n function handleFileError(error: Error) {\n const message = t('ll.fileUpload.errors.incorrectFileType', {\n fileTypes: acceptedFileExtensions.value.join(', '),\n });\n\n emit('file-error', message);\n\n logger.log(error);\n }\n\n async function areFileTypesAccepted(files: File[]) {\n if (!acceptedMimeTypes.value.length) return true;\n\n const mimeTypes = await Promise.all(files.map((file) => readMimeType(file)));\n\n const allCorrectMimeTypes =\n !!mimeTypes.length && mimeTypes.every((mimeType) => acceptedMimeTypes.value.includes(mimeType));\n\n if (!allCorrectMimeTypes) {\n throw new Error('One or more files contains an unacceptable mime type.');\n }\n\n const allCorrectFileExtensions = files.every((file) => {\n const extension = file.name.split('.').pop();\n\n return extension && acceptedFileExtensions.value.includes(extension);\n });\n\n if (!allCorrectFileExtensions) {\n throw new Error('One or more files contains an unacceptable extension.');\n }\n\n return true;\n }\n\n async function processFiles(files: File[]) {\n try {\n await areFileTypesAccepted(files);\n\n emit('file-select', { files });\n } catch (error) {\n handleFileError(error as Error);\n }\n }\n\n /**\n * Sets file(s) to selected file(s) from dialogue\n * @param {Object} event - file select event that contains file(s)\n * @returns {Array} An array of files\n */\n function handleFileInput(event: Event) {\n const files = [...((event.target as HTMLInputElement)?.files || [])];\n\n processFiles(files);\n }\n\n /**\n * Sets file to dropped file if it is proper file type\n * @param {Object} event - file select event that contains file\n */\n function handleDropFile(event: DragEvent) {\n if (props.disabled) {\n return;\n }\n\n const files = [...(event.dataTransfer?.files || [])];\n\n isDraggingOver.value = false;\n\n return processFiles(files);\n }\n\n function handleFileDelete(file: File) {\n emit('file-delete', file);\n }\n\n function readMimeType(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n if (file.type) {\n return resolve(file.type);\n } else if (window.FileReader) {\n const fileReader = new FileReader();\n\n fileReader.onload = () => {\n const mimeType =\n fileReader.result && (fileReader.result as string).match(/[^:]\\w+\\/[\\w-+\\d.]+(?=;|,)/)\n ? ((fileReader.result as string).match(/[^:]\\w+\\/[\\w-+\\d.]+(?=;|,)/) as string[])[0]\n : '';\n\n resolve(mimeType);\n };\n\n fileReader.readAsDataURL(file);\n } else {\n reject(new Error('Failed to read file.'));\n }\n });\n }\n</script>\n\n<template>\n <div class=\"stash-file-upload\" :class=\"attributes.class\" data-test=\"stash-file-upload\">\n <div v-if=\"buttonOnly\">\n <Button secondary type=\"button\" :disabled=\"disabled || null\" @click.stop.prevent=\"openFileDialog\">\n <slot name=\"submitText\">\n {{ t('ll.fileUpload.uploadFile') }}\n </slot>\n </Button>\n </div>\n <div\n v-else\n class=\"tw-rounded tw-p-6\"\n :class=\"[classes['file-dropbox'], isDraggingOver && classes['is-dragging'], disabled && classes['is-disabled']]\"\n @dragover.prevent=\"handleDragEnter\"\n @drop.prevent=\"handleDropFile\"\n @dragleave.prevent=\"handleDragLeave\"\n >\n <div\n class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-text-center\"\n :class=\"[{ 'tw-items-center md:tw-flex-row': size === FileUploadSizes.Dense }]\"\n >\n <template v-if=\"!files.length\">\n <InlineSvg v-if=\"size !== FileUploadSizes.Dense\" :src=\"illustrationPath\" name=\"file\" width=\"84\" height=\"96\" />\n <span class=\"tw-text-ice-900\">\n {{ t('ll.fileUpload.dragDropFileHere') }}\n </span>\n <span\n :class=\"\n size === FileUploadSizes.Dense\n ? 'md:tw-ml-1.5 md:tw-mr-3 md:tw-my-0 tw-my-1.5 tw-text-ice-900'\n : 'tw-mt-1.5 tw-my-1.5'\n \"\n >\n {{ t('ll.fileUpload.or') }}\n </span>\n <Button\n class=\"tw-mt-1.5\"\n secondary\n type=\"button\"\n :class=\"classes['file-select-button']\"\n :disabled=\"disabled\"\n @click.stop.prevent=\"openFileDialog\"\n >\n <!-- @slot for custom submit text -->\n <slot name=\"submitText\">{{ t('ll.fileUpload.uploadFile') }}</slot>\n </Button>\n </template>\n <template v-else>\n <div v-for=\"file in files\" :key=\"file.name\">\n <Icon name=\"file\" />\n <span>{{ file.name }}</span>\n <Button :class=\"[classes['remove-button'], classes['button']]\" @click.stop.prevent=\"handleFileDelete(file)\">\n {{ t('ll.fileUpload.remove') }}\n </Button>\n </div>\n </template>\n </div>\n <div v-if=\"$slots.hint && !files.length\" class=\"tw-mt-6 tw-text-center tw-text-xs tw-text-ice-700\">\n <!-- @slot for displaying helpful text and/or links -->\n <slot name=\"hint\"></slot>\n </div>\n </div>\n <input\n v-show=\"false\"\n v-bind=\"inputAttrs\"\n ref=\"fileUploadRef\"\n data-test=\"stash-file-upload|input\"\n type=\"file\"\n :disabled=\"disabled\"\n :accept=\"acceptedMimeTypes.join(',')\"\n :multiple=\"props.multiple\"\n @change=\"handleFileInput\"\n />\n </div>\n</template>\n\n<style module>\n .file-dropbox {\n background: var(--color-ice-200);\n background-image: url(\"data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='4' ry='4' stroke='%23C5C9D4FF' stroke-width='1' stroke-dasharray='5 %2c 5' stroke-dashoffset='0' stroke-linecap='square'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n border: theme('borderWidth.DEFAULT') solid var(--color-ice-500);\n border-color: transparent;\n }\n\n .is-dragging {\n background-image: none;\n border-color: var(--color-ice-500);\n\n & > * {\n pointer-events: none;\n }\n }\n\n .is-disabled {\n cursor: no-drop;\n }\n\n /* Constrain the upload icon for drag/drop to the required size */\n .upload-icon {\n height: 98px;\n width: 84px;\n }\n\n .remove-button.button {\n background: transparent;\n border: none;\n color: var(--color-red-500);\n\n &:hover {\n background: transparent;\n border: none;\n }\n }\n</style>\n"],"names":["FILE_TYPES","FileUploadSizes","classes","useCssModule","isDraggingOver","ref","fileUploadRef","stashOptions","inject","attributes","useAttrs","inputAttrs","computed","attrs","concatArraysToFirst","a","b","acceptedMimeTypes","props","fileType","acceptedFileExtensions","illustrationPath","openFileDialog","handleDragEnter","handleDragLeave","handleFileError","error","message","t","emit","logger","areFileTypesAccepted","files","mimeTypes","file","readMimeType","mimeType","extension","processFiles","handleFileInput","event","_a","handleDropFile","handleFileDelete","resolve","reject","fileReader"],"mappings":"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"}
1
+ {"version":3,"file":"FileUpload.js","sources":["../src/components/FileUpload/FileUpload.constants.ts","../src/components/FileUpload/FileUpload.vue"],"sourcesContent":["export const FILE_TYPES = {\n CSV: {\n EXTENSION: ['csv'],\n MIME_TYPES: ['text/csv', 'application/octet-stream', 'application/vnd.ms-excel'],\n ILLUSTRATION: 'csv',\n },\n PDF: {\n EXTENSION: ['pdf'],\n MIME_TYPES: ['application/pdf'],\n ILLUSTRATION: 'pdf',\n },\n PNG: {\n EXTENSION: ['png'],\n MIME_TYPES: ['image/png'],\n ILLUSTRATION: 'image',\n },\n JPEG: {\n EXTENSION: ['jpg', 'jpeg'],\n MIME_TYPES: ['image/jpeg'],\n ILLUSTRATION: 'image',\n },\n DOC: {\n EXTENSION: ['doc', 'docx'],\n MIME_TYPES: ['application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n ILLUSTRATION: 'document',\n },\n XLS: {\n EXTENSION: ['xls', 'xlsx'],\n MIME_TYPES: ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],\n ILLUSTRATION: 'csv',\n },\n};\n\nexport enum FileUploadSizes {\n Dense = 'dense',\n Standard = 'standard',\n}\n\nexport type FileUploadSize = `${FileUploadSizes}`;\n","<script lang=\"ts\">\n export * from './FileUpload.constants';\n</script>\n\n<script setup lang=\"ts\">\n import logger from '@leaflink/snitch';\n import { computed, inject, ref, useAttrs, useCssModule } from 'vue';\n import InlineSvg from 'vue-inline-svg';\n\n import { StashProvideState } from '../../../types/misc';\n import { t } from '../../locale';\n import Button from '../Button/Button.vue';\n import Icon from '../Icon/Icon.vue';\n import { FILE_TYPES, FileUploadSize, FileUploadSizes } from './FileUpload.constants';\n\n export type FileType = 'CSV' | 'PDF' | 'PNG' | 'JPEG' | 'DOC' | 'XLS';\n\n export interface FileUploadProps {\n /**\n * Files to display in the component\n */\n files?: File[];\n\n /**\n * Accepted file types\n */\n fileTypes?: FileType[];\n\n /**\n * Should display only the button\n */\n buttonOnly?: boolean;\n\n /**\n * Allows upload of multiple files\n */\n multiple?: boolean;\n\n /**\n * Is the input disabled\n */\n disabled?: boolean;\n\n /**\n * Component size\n */\n size?: FileUploadSize;\n }\n\n const props = withDefaults(defineProps<FileUploadProps>(), {\n files: () => [],\n fileTypes: () => ['CSV', 'PDF', 'PNG', 'JPEG', 'DOC', 'XLS'],\n buttonOnly: false,\n disabled: false,\n multiple: false,\n size: 'standard',\n });\n\n const classes = useCssModule();\n\n const emit = defineEmits<{\n (e: 'file-select', { files }: { files: FileUploadProps['files'] }): void;\n (e: 'file-delete', file: File): void;\n (e: 'file-error', message: string): void;\n }>();\n\n const isDraggingOver = ref(false);\n const fileUploadRef = ref<HTMLInputElement>();\n\n const stashOptions = inject<StashProvideState>('stashOptions');\n const attributes = useAttrs();\n\n const inputAttrs = computed(() => {\n const attrs = { ...attributes };\n\n delete attrs['data-test'];\n delete attrs.class;\n delete attrs.type;\n delete attrs.accept;\n\n return attrs;\n });\n\n function concatArraysToFirst(a: string[], b: string[]) {\n return a.concat(b);\n }\n\n const acceptedMimeTypes = computed(() => {\n return props.fileTypes.map((fileType) => FILE_TYPES[fileType].MIME_TYPES).reduce(concatArraysToFirst);\n });\n\n const acceptedFileExtensions = computed(() => {\n return props.fileTypes.map((fileType) => FILE_TYPES[fileType].EXTENSION).reduce(concatArraysToFirst);\n });\n\n const illustrationPath = computed(() => {\n return `${stashOptions?.staticPath}/illustrations/FileUpload/${FILE_TYPES[props.fileTypes[0]].ILLUSTRATION}.svg`;\n });\n\n function openFileDialog() {\n if (fileUploadRef.value) {\n fileUploadRef.value.value = '';\n fileUploadRef.value.click();\n }\n }\n\n function handleDragEnter() {\n isDraggingOver.value = true;\n }\n\n function handleDragLeave() {\n isDraggingOver.value = false;\n }\n\n function handleFileError(error: Error) {\n const message = t('ll.fileUpload.errors.incorrectFileType', {\n fileTypes: acceptedFileExtensions.value.join(', '),\n });\n\n emit('file-error', message);\n\n logger.log(error);\n }\n\n async function areFileTypesAccepted(files: File[]) {\n if (!acceptedMimeTypes.value.length) return true;\n\n const mimeTypes = await Promise.all(files.map((file) => readMimeType(file)));\n\n const allCorrectMimeTypes =\n !!mimeTypes.length && mimeTypes.every((mimeType) => acceptedMimeTypes.value.includes(mimeType));\n\n if (!allCorrectMimeTypes) {\n throw new Error('One or more files contains an unacceptable mime type.');\n }\n\n const allCorrectFileExtensions = files.every((file) => {\n const extension = file.name.split('.').pop();\n\n return extension && acceptedFileExtensions.value.includes(extension);\n });\n\n if (!allCorrectFileExtensions) {\n throw new Error('One or more files contains an unacceptable extension.');\n }\n\n return true;\n }\n\n async function processFiles(files: File[]) {\n try {\n await areFileTypesAccepted(files);\n\n emit('file-select', { files });\n } catch (error) {\n handleFileError(error as Error);\n }\n }\n\n /**\n * Sets file(s) to selected file(s) from dialogue\n * @param {Object} event - file select event that contains file(s)\n * @returns {Array} An array of files\n */\n function handleFileInput(event: Event) {\n const files = [...((event.target as HTMLInputElement)?.files || [])];\n\n processFiles(files);\n }\n\n /**\n * Sets file to dropped file if it is proper file type\n * @param {Object} event - file select event that contains file\n */\n function handleDropFile(event: DragEvent) {\n if (props.disabled) {\n return;\n }\n\n const files = [...(event.dataTransfer?.files || [])];\n\n isDraggingOver.value = false;\n\n return processFiles(files);\n }\n\n function handleFileDelete(file: File) {\n emit('file-delete', file);\n }\n\n function readMimeType(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n if (file.type) {\n return resolve(file.type);\n } else if (window.FileReader) {\n const fileReader = new FileReader();\n\n fileReader.onload = () => {\n const mimeType =\n fileReader.result && (fileReader.result as string).match(/[^:]\\w+\\/[\\w-+\\d.]+(?=;|,)/)\n ? ((fileReader.result as string).match(/[^:]\\w+\\/[\\w-+\\d.]+(?=;|,)/) as string[])[0]\n : '';\n\n resolve(mimeType);\n };\n\n fileReader.readAsDataURL(file);\n } else {\n reject(new Error('Failed to read file.'));\n }\n });\n }\n</script>\n\n<template>\n <div class=\"stash-file-upload\" :class=\"attributes.class\" data-test=\"stash-file-upload\">\n <div v-if=\"buttonOnly\">\n <Button secondary type=\"button\" :disabled=\"disabled || null\" @click.stop.prevent=\"openFileDialog\">\n <slot name=\"submitText\">\n {{ t('ll.fileUpload.uploadFile') }}\n </slot>\n </Button>\n </div>\n <div\n v-else\n class=\"tw-rounded tw-p-6\"\n :class=\"[classes['file-dropbox'], isDraggingOver && classes['is-dragging'], disabled && classes['is-disabled']]\"\n @dragover.prevent=\"handleDragEnter\"\n @drop.prevent=\"handleDropFile\"\n @dragleave.prevent=\"handleDragLeave\"\n >\n <div\n class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-text-center\"\n :class=\"[{ 'tw-items-center md:tw-flex-row': size === FileUploadSizes.Dense }]\"\n >\n <template v-if=\"!files.length\">\n <InlineSvg v-if=\"size !== FileUploadSizes.Dense\" :src=\"illustrationPath\" name=\"file\" width=\"84\" height=\"96\" />\n <span class=\"tw-text-ice-900\">\n {{ t('ll.fileUpload.dragDropFileHere') }}\n </span>\n <span\n :class=\"\n size === FileUploadSizes.Dense\n ? 'md:tw-ml-1.5 md:tw-mr-3 md:tw-my-0 tw-my-1.5 tw-text-ice-900'\n : 'tw-mt-1.5 tw-my-1.5'\n \"\n >\n {{ t('ll.fileUpload.or') }}\n </span>\n <Button\n class=\"tw-mt-1.5\"\n secondary\n type=\"button\"\n :class=\"classes['file-select-button']\"\n :disabled=\"disabled\"\n @click.stop.prevent=\"openFileDialog\"\n >\n <!-- @slot for custom submit text -->\n <slot name=\"submitText\">{{ t('ll.fileUpload.uploadFile') }}</slot>\n </Button>\n </template>\n <template v-else>\n <div v-for=\"file in files\" :key=\"file.name\">\n <Icon name=\"file\" />\n <span>{{ file.name }}</span>\n <Button :class=\"[classes['remove-button'], classes['button']]\" @click.stop.prevent=\"handleFileDelete(file)\">\n {{ t('ll.fileUpload.remove') }}\n </Button>\n </div>\n </template>\n </div>\n <div v-if=\"$slots.hint && !files.length\" class=\"tw-mt-6 tw-text-center tw-text-xs tw-text-ice-700\">\n <!-- @slot for displaying helpful text and/or links -->\n <slot name=\"hint\"></slot>\n </div>\n </div>\n <input\n v-show=\"false\"\n v-bind=\"inputAttrs\"\n ref=\"fileUploadRef\"\n data-test=\"stash-file-upload|input\"\n type=\"file\"\n :disabled=\"disabled\"\n :accept=\"acceptedMimeTypes.join(',')\"\n :multiple=\"props.multiple\"\n @change=\"handleFileInput\"\n />\n </div>\n</template>\n\n<style module>\n .file-dropbox {\n background: var(--color-ice-200);\n background-image: url(\"data:image/svg+xml,%3csvg width='100%25' height='100%25' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='100%25' height='100%25' fill='none' rx='4' ry='4' stroke='%23C5C9D4FF' stroke-width='1' stroke-dasharray='5 %2c 5' stroke-dashoffset='0' stroke-linecap='square'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n border: theme('borderWidth.DEFAULT') solid var(--color-ice-500);\n border-color: transparent;\n }\n\n .is-dragging {\n background-image: none;\n border-color: var(--color-ice-500);\n\n & > * {\n pointer-events: none;\n }\n }\n\n .is-disabled {\n cursor: no-drop;\n }\n\n /* Constrain the upload icon for drag/drop to the required size */\n .upload-icon {\n height: 98px;\n width: 84px;\n }\n\n .remove-button.button {\n background: transparent;\n border: none;\n color: var(--color-red-500);\n\n &:hover {\n background: transparent;\n border: none;\n }\n }\n</style>\n"],"names":["FILE_TYPES","FileUploadSizes","props","__props","classes","useCssModule","emit","__emit","isDraggingOver","ref","fileUploadRef","stashOptions","inject","attributes","useAttrs","inputAttrs","computed","attrs","concatArraysToFirst","a","b","acceptedMimeTypes","fileType","acceptedFileExtensions","illustrationPath","openFileDialog","handleDragEnter","handleDragLeave","handleFileError","error","message","t","logger","areFileTypesAccepted","files","mimeTypes","file","readMimeType","mimeType","extension","processFiles","handleFileInput","event","_a","handleDropFile","handleFileDelete","resolve","reject","fileReader"],"mappings":"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"}
@@ -1,10 +1,9 @@
1
- import { AllowedComponentProps } from 'vue';
2
- import { ComponentCustomProps } from 'vue';
3
1
  import { ComponentOptionsMixin } from 'vue';
2
+ import { ComponentProvideOptions } from 'vue';
4
3
  import { DefineComponent } from 'vue';
5
4
  import { ExtractPropTypes } from 'vue';
6
5
  import { PropType } from 'vue';
7
- import { VNodeProps } from 'vue';
6
+ import { PublicProps } from 'vue';
8
7
 
9
8
  declare type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
10
9
 
@@ -33,40 +32,40 @@ declare type __VLS_WithTemplateSlots<T, S> = T & {
33
32
  };
34
33
  };
35
34
 
36
- declare const _default: __VLS_WithTemplateSlots<DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<FileUploadProps>, {
35
+ declare const _default: __VLS_WithTemplateSlots<DefineComponent<ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<FileUploadProps>, {
37
36
  files: () => never[];
38
37
  fileTypes: () => string[];
39
38
  buttonOnly: boolean;
40
39
  disabled: boolean;
41
40
  multiple: boolean;
42
41
  size: string;
43
- }>, {}, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
42
+ }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
44
43
  "file-select": (args_0: {
45
44
  files: FileUploadProps['files'];
46
45
  }) => void;
47
46
  "file-delete": (file: File) => void;
48
47
  "file-error": (message: string) => void;
49
- }, string, VNodeProps & AllowedComponentProps & ComponentCustomProps, Readonly<ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<FileUploadProps>, {
48
+ }, string, PublicProps, Readonly<ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<FileUploadProps>, {
50
49
  files: () => never[];
51
50
  fileTypes: () => string[];
52
51
  buttonOnly: boolean;
53
52
  disabled: boolean;
54
53
  multiple: boolean;
55
54
  size: string;
56
- }>>> & {
55
+ }>>> & Readonly<{
57
56
  "onFile-select"?: ((args_0: {
58
57
  files: FileUploadProps['files'];
59
58
  }) => any) | undefined;
60
59
  "onFile-delete"?: ((file: File) => any) | undefined;
61
60
  "onFile-error"?: ((message: string) => any) | undefined;
62
- }, {
63
- size: "standard" | "dense";
61
+ }>, {
64
62
  disabled: boolean;
65
- files: File[];
63
+ size: "standard" | "dense";
66
64
  multiple: boolean;
65
+ files: File[];
67
66
  fileTypes: FileType[];
68
67
  buttonOnly: boolean;
69
- }, {}>, {
68
+ }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>, {
70
69
  submitText?(_: {}): any;
71
70
  hint?(_: {}): any;
72
71
  }>;
@@ -1,14 +1,14 @@
1
- import { defineComponent as u, useCssModule as f, computed as v, openBlock as a, createBlock as h, normalizeClass as s, unref as t, withCtx as w, createElementVNode as b, renderSlot as C, createElementBlock as n, toDisplayString as k, createCommentVNode as i, createVNode as y } from "vue";
1
+ import { defineComponent as f, useCssModule as v, computed as h, openBlock as a, createBlock as w, normalizeClass as s, unref as t, withCtx as b, createElementVNode as C, renderSlot as k, createElementBlock as i, toDisplayString as y, createCommentVNode as n, createVNode as D } from "vue";
2
2
  import { t as c } from "./locale.js";
3
- import D from "./Chip.js";
4
- import x from "./Icon.js";
5
- import { _ as B } from "./_plugin-vue_export-helper-dad06003.js";
3
+ import x from "./Chip.js";
4
+ import B from "./Icon.js";
5
+ import { _ as F } from "./_plugin-vue_export-helper-dad06003.js";
6
6
  import "lodash-es/get";
7
7
  import "./utils/colorScheme.js";
8
8
  import "lodash-es/uniqueId";
9
9
  import "./index-9e1095ef.js";
10
10
  import "./Icon.vue_used_vue_type_style_index_0_lang.module-eb359559.js";
11
- const F = { class: "tw-flex tw-items-center" }, O = ["aria-label", "title"], R = { key: 1 }, S = /* @__PURE__ */ u({
11
+ const O = { class: "tw-flex tw-items-center" }, R = ["aria-label", "title"], S = { key: 1 }, N = /* @__PURE__ */ f({
12
12
  __name: "FilterChip",
13
13
  props: {
14
14
  filterCount: { default: void 0 },
@@ -18,15 +18,15 @@ const F = { class: "tw-flex tw-items-center" }, O = ["aria-label", "title"], R =
18
18
  isSelected: { type: Boolean, default: !1 }
19
19
  },
20
20
  emits: ["click", "remove"],
21
- setup(d, { emit: r }) {
22
- const e = d, o = f(), l = v(() => Number(e.filterCount) > 0);
23
- function p() {
21
+ setup(d, { emit: p }) {
22
+ const e = d, r = p, o = v(), l = h(() => Number(e.filterCount) > 0);
23
+ function m() {
24
24
  r("click");
25
25
  }
26
- function m() {
26
+ function _() {
27
27
  r("remove");
28
28
  }
29
- return (_, A) => (a(), h(D, {
29
+ return (u, E) => (a(), w(x, {
30
30
  "should-override-colors": "",
31
31
  tabindex: "0",
32
32
  class: s(["stash-filter-chip tw-text-sm tw-font-normal tw-normal-case tw-leading-5 tw-text-ice-900", [
@@ -41,21 +41,21 @@ const F = { class: "tw-flex tw-items-center" }, O = ["aria-label", "title"], R =
41
41
  ]]),
42
42
  radius: "pill",
43
43
  "is-removable": e.isSelected && e.isRemovable && !e.hasDropdown,
44
- onClick: p,
45
- onRemove: m
44
+ onClick: m,
45
+ onRemove: _
46
46
  }, {
47
- default: w(() => [
48
- b("div", F, [
49
- C(_.$slots, "default"),
50
- l.value ? (a(), n("span", {
47
+ default: b(() => [
48
+ C("div", O, [
49
+ k(u.$slots, "default"),
50
+ l.value ? (a(), i("span", {
51
51
  key: 0,
52
52
  "data-test": "span|filter-count",
53
53
  class: s(t(o)["filter-count"]),
54
54
  "aria-label": t(c)("ll.numberOfActiveFilters"),
55
55
  title: t(c)("ll.numberOfActiveFilters")
56
- }, k(e.filterCount), 11, O)) : i("", !0),
57
- e.hasDropdown ? (a(), n("span", R, [
58
- y(x, {
56
+ }, y(e.filterCount), 11, R)) : n("", !0),
57
+ e.hasDropdown ? (a(), i("span", S, [
58
+ D(B, {
59
59
  "data-test": "icon|caret",
60
60
  name: "caret-down",
61
61
  class: s([
@@ -65,25 +65,25 @@ const F = { class: "tw-flex tw-items-center" }, O = ["aria-label", "title"], R =
65
65
  }
66
66
  ])
67
67
  }, null, 8, ["class"])
68
- ])) : i("", !0)
68
+ ])) : n("", !0)
69
69
  ])
70
70
  ]),
71
71
  _: 3
72
72
  }, 8, ["class", "is-removable"]));
73
73
  }
74
- }), N = "_root_1avat_5", M = "_caret_1avat_94", V = {
75
- root: N,
74
+ }), M = "_root_1avat_5", V = "_caret_1avat_94", g = {
75
+ root: M,
76
76
  "is-selected": "_is-selected_1avat_24",
77
77
  "is-removable": "_is-removable_1avat_36",
78
78
  "has-filter-count": "_has-filter-count_1avat_49",
79
79
  "has-dropdown": "_has-dropdown_1avat_54",
80
80
  "filter-count": "_filter-count_1avat_67",
81
- caret: M,
81
+ caret: V,
82
82
  "caret-rotate": "_caret-rotate_1avat_105"
83
- }, g = {
84
- $style: V
85
- }, L = /* @__PURE__ */ B(S, [["__cssModules", g]]);
83
+ }, A = {
84
+ $style: g
85
+ }, P = /* @__PURE__ */ F(N, [["__cssModules", A]]);
86
86
  export {
87
- L as default
87
+ P as default
88
88
  };
89
89
  //# sourceMappingURL=FilterChip.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterChip.js","sources":["../src/components/FilterChip/FilterChip.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, useCssModule } from 'vue';\n\n import { t } from '../../locale';\n import Chip from '../Chip/Chip.vue';\n import Icon from '../Icon/Icon.vue';\n\n export interface FilterChipProps {\n /**\n * Used for conditionally rendering filter count chip\n */\n filterCount?: number;\n\n /**\n * Use for conditionally rendering caret\n */\n hasDropdown?: boolean;\n\n /**\n * Used for styling when `hasDropdown` is true\n */\n isDropdownOpen?: boolean;\n\n /**\n * Used for conditionally rendering close icon and exposing remove event\n */\n isRemovable?: boolean;\n\n /**\n * Used for conditionally applying styles\n */\n isSelected?: boolean;\n }\n\n const props = withDefaults(defineProps<FilterChipProps>(), {\n filterCount: undefined,\n hasDropdown: false,\n isDropdownOpen: false,\n isRemovable: false,\n isSelected: false,\n });\n\n const emit =\n defineEmits<{\n (e: 'click'): void;\n (e: 'remove'): void;\n }>();\n\n const classes = useCssModule();\n const hasFilterCount = computed(() => Number(props.filterCount) > 0);\n\n function handleClick() {\n emit('click');\n }\n\n function handleRemove() {\n emit('remove');\n }\n</script>\n\n<template>\n <Chip\n should-override-colors\n tabindex=\"0\"\n class=\"stash-filter-chip tw-text-sm tw-font-normal tw-normal-case tw-leading-5 tw-text-ice-900\"\n radius=\"pill\"\n :class=\"[\n classes.root,\n {\n [classes['is-selected']]: props.isSelected,\n [classes['is-removable']]: props.isRemovable,\n [classes['is-dropdown-open']]: props.isDropdownOpen,\n [classes['has-dropdown']]: props.hasDropdown,\n [classes['has-filter-count']]: hasFilterCount,\n },\n ]\"\n :is-removable=\"props.isSelected && props.isRemovable && !props.hasDropdown\"\n @click=\"handleClick\"\n @remove=\"handleRemove\"\n >\n <div class=\"tw-flex tw-items-center\">\n <!-- @slot default -->\n <slot></slot>\n\n <span\n v-if=\"hasFilterCount\"\n data-test=\"span|filter-count\"\n :class=\"classes['filter-count']\"\n :aria-label=\"t('ll.numberOfActiveFilters')\"\n :title=\"t('ll.numberOfActiveFilters')\"\n >\n {{ props.filterCount }}\n </span>\n\n <span v-if=\"props.hasDropdown\">\n <Icon\n data-test=\"icon|caret\"\n name=\"caret-down\"\n :class=\"[\n classes.caret,\n {\n [classes['caret-rotate']]: props.isDropdownOpen,\n },\n ]\"\n />\n </span>\n </div>\n </Chip>\n</template>\n\n<style module>\n /**\n many styles declared here are overriding styles defined in Chip\n */\n .root {\n background-color: var(--color-white);\n border: 1px solid var(--color-ice-500);\n cursor: pointer;\n height: theme('spacing.9');\n padding-left: theme('spacing.3');\n padding-right: theme('spacing.3');\n }\n\n .root:focus {\n box-shadow: 0 0 0 4px rgb(0 123 255 / 15%);\n outline: none;\n }\n\n .root:hover {\n background-color: var(--color-blue-100);\n border: 1px solid var(--color-blue-500);\n }\n\n .root.is-selected {\n color: var(--color-white);\n background-color: var(--color-blue-500);\n border: 1px solid var(--color-blue-500);\n }\n\n .root.is-selected:hover {\n color: var(--color-white);\n background-color: var(--color-blue-700);\n border: 1px solid var(--color-blue-700);\n }\n\n .root.is-selected.is-removable {\n background-color: var(--color-blue-500);\n }\n\n .root.is-selected.is-removable :global(.stash-chip__remove-button) {\n margin-right: -1px;\n padding-right: theme('spacing.3');\n }\n\n .root.is-selected.is-removable :global(.stash-chip__remove-button):hover {\n background-color: var(--color-blue-700);\n }\n\n .root.is-selected.has-filter-count:hover {\n background-color: var(--color-blue-700);\n color: var(--color-white);\n }\n\n .root.has-dropdown {\n padding-right: theme('spacing[1.5]');\n }\n\n .root.has-filter-count:hover {\n background-color: var(--color-blue-100);\n color: var(--color-ice-900);\n }\n\n .root label {\n cursor: pointer;\n }\n\n .filter-count {\n display: inline-flex;\n align-items: center;\n border-radius: 5em;\n height: 16px;\n padding: 0 8px;\n margin-left: theme('spacing[1.5]');\n font-size: 10px;\n font-weight: bold;\n background-color: var(--color-blue-500);\n color: var(--color-white);\n }\n\n .is-selected .filter-count {\n background-color: var(--color-blue-700);\n }\n\n .is-selected:hover .filter-count {\n background-color: var(--color-white);\n color: var(--color-blue-700);\n }\n\n .is-selected.is-removable .filter-count {\n background-color: var(--color-blue-700);\n color: var(--color-white);\n }\n\n .caret {\n color: var(--color-ice-700);\n margin-left: theme('spacing[1.5]');\n transform: rotate(0);\n transition: all 0.5s;\n }\n\n .is-selected .caret {\n color: var(--color-white);\n }\n\n .caret-rotate {\n transform: rotate(-180deg);\n }\n</style>\n"],"names":["classes","useCssModule","hasFilterCount","computed","props","handleClick","emit","handleRemove"],"mappings":";;;;;;;;;;;;;;;;;;;;;iBAgDQA,IAAUC,KACVC,IAAiBC,EAAS,MAAM,OAAOC,EAAM,WAAW,IAAI,CAAC;AAEnE,aAASC,IAAc;AACrB,MAAAC,EAAK,OAAO;AAAA,IACd;AAEA,aAASC,IAAe;AACtB,MAAAD,EAAK,QAAQ;AAAA,IACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"FilterChip.js","sources":["../src/components/FilterChip/FilterChip.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, useCssModule } from 'vue';\n\n import { t } from '../../locale';\n import Chip from '../Chip/Chip.vue';\n import Icon from '../Icon/Icon.vue';\n\n export interface FilterChipProps {\n /**\n * Used for conditionally rendering filter count chip\n */\n filterCount?: number;\n\n /**\n * Use for conditionally rendering caret\n */\n hasDropdown?: boolean;\n\n /**\n * Used for styling when `hasDropdown` is true\n */\n isDropdownOpen?: boolean;\n\n /**\n * Used for conditionally rendering close icon and exposing remove event\n */\n isRemovable?: boolean;\n\n /**\n * Used for conditionally applying styles\n */\n isSelected?: boolean;\n }\n\n const props = withDefaults(defineProps<FilterChipProps>(), {\n filterCount: undefined,\n hasDropdown: false,\n isDropdownOpen: false,\n isRemovable: false,\n isSelected: false,\n });\n\n const emit = defineEmits<{\n (e: 'click'): void;\n (e: 'remove'): void;\n }>();\n\n const classes = useCssModule();\n const hasFilterCount = computed(() => Number(props.filterCount) > 0);\n\n function handleClick() {\n emit('click');\n }\n\n function handleRemove() {\n emit('remove');\n }\n</script>\n\n<template>\n <Chip\n should-override-colors\n tabindex=\"0\"\n class=\"stash-filter-chip tw-text-sm tw-font-normal tw-normal-case tw-leading-5 tw-text-ice-900\"\n radius=\"pill\"\n :class=\"[\n classes.root,\n {\n [classes['is-selected']]: props.isSelected,\n [classes['is-removable']]: props.isRemovable,\n [classes['is-dropdown-open']]: props.isDropdownOpen,\n [classes['has-dropdown']]: props.hasDropdown,\n [classes['has-filter-count']]: hasFilterCount,\n },\n ]\"\n :is-removable=\"props.isSelected && props.isRemovable && !props.hasDropdown\"\n @click=\"handleClick\"\n @remove=\"handleRemove\"\n >\n <div class=\"tw-flex tw-items-center\">\n <!-- @slot default -->\n <slot></slot>\n\n <span\n v-if=\"hasFilterCount\"\n data-test=\"span|filter-count\"\n :class=\"classes['filter-count']\"\n :aria-label=\"t('ll.numberOfActiveFilters')\"\n :title=\"t('ll.numberOfActiveFilters')\"\n >\n {{ props.filterCount }}\n </span>\n\n <span v-if=\"props.hasDropdown\">\n <Icon\n data-test=\"icon|caret\"\n name=\"caret-down\"\n :class=\"[\n classes.caret,\n {\n [classes['caret-rotate']]: props.isDropdownOpen,\n },\n ]\"\n />\n </span>\n </div>\n </Chip>\n</template>\n\n<style module>\n /**\n many styles declared here are overriding styles defined in Chip\n */\n .root {\n background-color: var(--color-white);\n border: 1px solid var(--color-ice-500);\n cursor: pointer;\n height: theme('spacing.9');\n padding-left: theme('spacing.3');\n padding-right: theme('spacing.3');\n }\n\n .root:focus {\n box-shadow: 0 0 0 4px rgb(0 123 255 / 15%);\n outline: none;\n }\n\n .root:hover {\n background-color: var(--color-blue-100);\n border: 1px solid var(--color-blue-500);\n }\n\n .root.is-selected {\n color: var(--color-white);\n background-color: var(--color-blue-500);\n border: 1px solid var(--color-blue-500);\n }\n\n .root.is-selected:hover {\n color: var(--color-white);\n background-color: var(--color-blue-700);\n border: 1px solid var(--color-blue-700);\n }\n\n .root.is-selected.is-removable {\n background-color: var(--color-blue-500);\n }\n\n .root.is-selected.is-removable :global(.stash-chip__remove-button) {\n margin-right: -1px;\n padding-right: theme('spacing.3');\n }\n\n .root.is-selected.is-removable :global(.stash-chip__remove-button):hover {\n background-color: var(--color-blue-700);\n }\n\n .root.is-selected.has-filter-count:hover {\n background-color: var(--color-blue-700);\n color: var(--color-white);\n }\n\n .root.has-dropdown {\n padding-right: theme('spacing[1.5]');\n }\n\n .root.has-filter-count:hover {\n background-color: var(--color-blue-100);\n color: var(--color-ice-900);\n }\n\n .root label {\n cursor: pointer;\n }\n\n .filter-count {\n display: inline-flex;\n align-items: center;\n border-radius: 5em;\n height: 16px;\n padding: 0 8px;\n margin-left: theme('spacing[1.5]');\n font-size: 10px;\n font-weight: bold;\n background-color: var(--color-blue-500);\n color: var(--color-white);\n }\n\n .is-selected .filter-count {\n background-color: var(--color-blue-700);\n }\n\n .is-selected:hover .filter-count {\n background-color: var(--color-white);\n color: var(--color-blue-700);\n }\n\n .is-selected.is-removable .filter-count {\n background-color: var(--color-blue-700);\n color: var(--color-white);\n }\n\n .caret {\n color: var(--color-ice-700);\n margin-left: theme('spacing[1.5]');\n transform: rotate(0);\n transition: all 0.5s;\n }\n\n .is-selected .caret {\n color: var(--color-white);\n }\n\n .caret-rotate {\n transform: rotate(-180deg);\n }\n</style>\n"],"names":["props","__props","emit","__emit","classes","useCssModule","hasFilterCount","computed","handleClick","handleRemove"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAkCE,UAAMA,IAAQC,GAQRC,IAAOC,GAKPC,IAAUC,KACVC,IAAiBC,EAAS,MAAM,OAAOP,EAAM,WAAW,IAAI,CAAC;AAEnE,aAASQ,IAAc;AACrB,MAAAN,EAAK,OAAO;AAAA,IACd;AAEA,aAASO,IAAe;AACtB,MAAAP,EAAK,QAAQ;AAAA,IACf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}