@rotki/ui-library 2.20.1 → 2.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/__test__/options.d.ts +7 -0
  2. package/dist/components/calendar/RuiCalendarMenu.js.map +1 -1
  3. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +3 -1
  4. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  5. package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
  6. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +3 -1
  7. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  8. package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
  9. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +12 -1
  10. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +137 -51
  11. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  12. package/dist/components/forms/file-upload/RuiFileUpload.js +7 -0
  13. package/dist/components/forms/file-upload/RuiFileUpload.js.map +1 -0
  14. package/dist/components/forms/file-upload/RuiFileUpload.vue.d.ts +61 -0
  15. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js +269 -0
  16. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -0
  17. package/dist/components/forms/select/RuiMenuSelect.js.map +1 -1
  18. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +7 -1
  19. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  20. package/dist/components/index.d.ts +3 -2
  21. package/dist/components/index.js +2 -1
  22. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  23. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +6 -0
  24. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +3 -2
  25. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  26. package/dist/composables/dropdown-menu.d.ts +12 -1
  27. package/dist/composables/dropdown-menu.js +46 -7
  28. package/dist/composables/dropdown-menu.js.map +1 -1
  29. package/dist/composables/forms/auto-complete/keyboard-navigation.js +26 -24
  30. package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
  31. package/dist/index.js +2 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/library-icons.json +2 -0
  34. package/dist/style.css +48 -0
  35. package/dist/utils/helpers.d.ts +4 -0
  36. package/dist/utils/helpers.js +21 -1
  37. package/dist/utils/helpers.js.map +1 -1
  38. package/dist/web-types.json +262 -1
  39. package/package.json +1 -1
package/dist/style.css CHANGED
@@ -1138,6 +1138,10 @@ html[data-theme="dark"], html.dark {
1138
1138
  margin-top: 0px !important;
1139
1139
  }
1140
1140
 
1141
+ .-mb-2 {
1142
+ margin-bottom: -0.5rem;
1143
+ }
1144
+
1141
1145
  .-ml-\[0\.5625rem\] {
1142
1146
  margin-left: -0.5625rem;
1143
1147
  }
@@ -2375,6 +2379,10 @@ html[data-theme="dark"], html.dark {
2375
2379
  border-top-width: 1px;
2376
2380
  }
2377
2381
 
2382
+ .\!border-solid {
2383
+ border-style: solid !important;
2384
+ }
2385
+
2378
2386
  .border-dashed {
2379
2387
  border-style: dashed;
2380
2388
  }
@@ -2745,6 +2753,10 @@ html[data-theme="dark"], html.dark {
2745
2753
  background-color: rgba(var(--rui-error-main), 0.2);
2746
2754
  }
2747
2755
 
2756
+ .bg-rui-error\/\[0\.08\] {
2757
+ background-color: rgba(var(--rui-error-main), 0.08);
2758
+ }
2759
+
2748
2760
  .bg-rui-grey-100 {
2749
2761
  --tw-bg-opacity: 1;
2750
2762
  background-color: rgba(var(--rui-grey-100), var(--tw-bg-opacity, 1));
@@ -2813,6 +2825,10 @@ html[data-theme="dark"], html.dark {
2813
2825
  background-color: rgba(var(--rui-primary-main), 0.08);
2814
2826
  }
2815
2827
 
2828
+ .bg-rui-primary\/\[0\.12\] {
2829
+ background-color: rgba(var(--rui-primary-main), 0.12);
2830
+ }
2831
+
2816
2832
  .bg-rui-secondary {
2817
2833
  --tw-bg-opacity: 1;
2818
2834
  background-color: rgba(var(--rui-secondary-main), var(--tw-bg-opacity, 1));
@@ -2853,6 +2869,14 @@ html[data-theme="dark"], html.dark {
2853
2869
  background-color: rgba(var(--rui-success-main), 0.2);
2854
2870
  }
2855
2871
 
2872
+ .bg-rui-success\/\[0\.08\] {
2873
+ background-color: rgba(var(--rui-success-main), 0.08);
2874
+ }
2875
+
2876
+ .bg-rui-success\/\[0\.12\] {
2877
+ background-color: rgba(var(--rui-success-main), 0.12);
2878
+ }
2879
+
2856
2880
  .bg-rui-warning {
2857
2881
  --tw-bg-opacity: 1;
2858
2882
  background-color: rgba(var(--rui-warning-main), var(--tw-bg-opacity, 1));
@@ -3123,6 +3147,10 @@ html[data-theme="dark"], html.dark {
3123
3147
  padding-right: 0px;
3124
3148
  }
3125
3149
 
3150
+ .pr-1 {
3151
+ padding-right: 0.25rem;
3152
+ }
3153
+
3126
3154
  .pr-2 {
3127
3155
  padding-right: 0.5rem;
3128
3156
  }
@@ -3139,6 +3167,10 @@ html[data-theme="dark"], html.dark {
3139
3167
  padding-right: 2rem;
3140
3168
  }
3141
3169
 
3170
+ .pr-\[var\(--rui-scrollbar-gutter\2c 15px\)\] {
3171
+ padding-right: var(--rui-scrollbar-gutter,15px);
3172
+ }
3173
+
3142
3174
  .ps-8 {
3143
3175
  padding-inline-start: 2rem;
3144
3176
  }
@@ -3383,6 +3415,10 @@ html[data-theme="dark"], html.dark {
3383
3415
  line-height: 1.25;
3384
3416
  }
3385
3417
 
3418
+ .tracking-wide {
3419
+ letter-spacing: 0.025em;
3420
+ }
3421
+
3386
3422
  .\!text-rui-dark-text {
3387
3423
  color: var(--rui-dark-text-primary) !important;
3388
3424
  }
@@ -3512,6 +3548,10 @@ html[data-theme="dark"], html.dark {
3512
3548
  opacity: 0.5;
3513
3549
  }
3514
3550
 
3551
+ .opacity-60 {
3552
+ opacity: 0.6;
3553
+ }
3554
+
3515
3555
  .opacity-65 {
3516
3556
  opacity: 0.65;
3517
3557
  }
@@ -4617,6 +4657,10 @@ body {
4617
4657
  background-color: rgba(var(--rui-primary-main), 0.04);
4618
4658
  }
4619
4659
 
4660
+ .hover\:bg-rui-primary\/\[0\.16\]:hover {
4661
+ background-color: rgba(var(--rui-primary-main), 0.16);
4662
+ }
4663
+
4620
4664
  .hover\:bg-rui-secondary-darker:hover {
4621
4665
  --tw-bg-opacity: 1;
4622
4666
  background-color: rgba(var(--rui-secondary-darker), var(--tw-bg-opacity, 1));
@@ -4878,6 +4922,10 @@ body {
4878
4922
  color: var(--rui-text-disabled);
4879
4923
  }
4880
4924
 
4925
+ .disabled\:no-underline:disabled {
4926
+ text-decoration-line: none;
4927
+ }
4928
+
4881
4929
  .disabled\:outline-rui-text-disabled:disabled {
4882
4930
  outline-color: var(--rui-text-disabled);
4883
4931
  }
@@ -36,4 +36,8 @@ export declare function transformCase<T extends object>(item: T, to: 'camelCase'
36
36
  */
37
37
  export declare function getTextToken(string: unknown): string;
38
38
  export declare function transformPropsUnit(value?: string | number): string | undefined;
39
+ /**
40
+ * Formats a byte count into a human-readable string (e.g. "1.2 MB").
41
+ */
42
+ export declare function formatFileSize(bytes: number): string;
39
43
  export {};
@@ -69,7 +69,27 @@ function transformPropsUnit(value) {
69
69
  if (value === void 0 || typeof value === "string" && isNaN(Number(value))) return value;
70
70
  return `${value}px`;
71
71
  }
72
+ /**
73
+ * Formats a byte count into a human-readable string (e.g. "1.2 MB").
74
+ */
75
+ function formatFileSize(bytes) {
76
+ if (!Number.isFinite(bytes) || bytes < 0) return "0 B";
77
+ if (bytes < 1024) return `${bytes} B`;
78
+ const units = [
79
+ "KB",
80
+ "MB",
81
+ "GB",
82
+ "TB"
83
+ ];
84
+ let value = bytes / 1024;
85
+ let unitIndex = 0;
86
+ while (value >= 1024 && unitIndex < units.length - 1) {
87
+ value /= 1024;
88
+ unitIndex++;
89
+ }
90
+ return `${value.toFixed(value >= 10 ? 0 : 1)} ${units[unitIndex]}`;
91
+ }
72
92
  //#endregion
73
- export { formatInteger, getNonRootAttrs, getRootAttrs, getTextToken, transformCase, transformPropsUnit };
93
+ export { formatFileSize, formatInteger, getNonRootAttrs, getRootAttrs, getTextToken, transformCase, transformPropsUnit };
74
94
 
75
95
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","names":[],"sources":["../../src/utils/helpers.ts"],"sourcesContent":["import type { SetupContext } from 'vue';\nimport { objectOmit, objectPick } from '@vueuse/shared';\nimport { camelCase, snakeCase } from 'scule';\n\ninterface FormatNumberOptions {\n fractionDigits?: number;\n}\n\ntype SetupContextAttrs = SetupContext['attrs'];\n\ntype SetupContextAttrsKeys = (keyof SetupContextAttrs)[];\n\nfunction formatNumber(\n amount: number | string,\n { fractionDigits = 2 }: FormatNumberOptions,\n): string {\n return new Intl.NumberFormat(undefined, {\n maximumFractionDigits: fractionDigits,\n minimumFractionDigits: fractionDigits,\n }).format(Number(amount));\n}\n\n/**\n * Format number value without fraction\n * @param {number} amount\n */\nexport function formatInteger(amount: number | string): string {\n return formatNumber(amount, { fractionDigits: 0 });\n}\n\n/**\n * Generates and returns the array of root allowed attributes\n * @param {SetupContextAttrs} data\n * @returns {SetupContextAttrsKeys}\n */\nfunction getRootKeys(data: SetupContextAttrs): SetupContextAttrsKeys {\n return Object.keys(data).filter(key => key.startsWith('data-')) as SetupContextAttrsKeys;\n}\n\n/**\n * Picks only required attributes for root element\n * @param {SetupContextAttrs} data\n * @param {SetupContextAttrsKeys} include\n * @returns {Pick<SetupContextAttrs, any>}\n */\nexport function getRootAttrs(data: SetupContextAttrs, include: SetupContextAttrsKeys = ['class']) {\n return objectPick(data, [...getRootKeys(data), ...include]);\n}\n\n/**\n * Omits root attributes from component's attributes\n * @param {SetupContextAttrs} data\n * @param {SetupContextAttrsKeys} exclude\n * @returns {Omit<SetupContextAttrs, any>}\n */\nexport function getNonRootAttrs(\n data: SetupContextAttrs,\n exclude: SetupContextAttrsKeys = ['class'],\n) {\n return objectOmit(data, [...getRootKeys(data), ...exclude]);\n}\n\n/**\n * Transforms the keys of an object to either camelCase or snake_case\n * @param {T} item\n * @param {\"camelCase\" | \"snake_case\"} to\n * @returns {Record<string, any>}\n */\nexport function transformCase<T extends object>(\n item: T,\n to: 'camelCase' | 'snake_case',\n): Record<string, T[keyof T]> {\n if (!item)\n return item;\n\n return Object.keys(item).reduce(\n (acc, curr) => {\n if (to === 'camelCase')\n acc[camelCase(curr)] = item[curr as keyof T];\n else acc[snakeCase(curr)] = item[curr as keyof T];\n\n return acc;\n },\n {} as Record<string, T[keyof T]>,\n );\n}\n\n/**\n *\n * @param {string} string - String to convert\n * @return {string} - String converted to text token, mostly used to matching keyword\n * @example\n * getTextToken('this is a sentence'); // thisisasentence\n */\n\nexport function getTextToken(string: unknown): string {\n if (!string)\n return '';\n\n return string\n .toString()\n .toLowerCase()\n .replace(/[^\\da-z]/gi, '');\n}\n\nexport function transformPropsUnit(value?: string | number): string | undefined {\n if (value === undefined || (typeof value === 'string' && isNaN(Number(value))))\n return value;\n return `${value}px`;\n}\n"],"mappings":";;;AAYA,SAAS,aACP,QACA,EAAE,iBAAiB,KACX;AACR,QAAO,IAAI,KAAK,aAAa,KAAA,GAAW;EACtC,uBAAuB;EACvB,uBAAuB;EACxB,CAAC,CAAC,OAAO,OAAO,OAAO,CAAC;;;;;;AAO3B,SAAgB,cAAc,QAAiC;AAC7D,QAAO,aAAa,QAAQ,EAAE,gBAAgB,GAAG,CAAC;;;;;;;AAQpD,SAAS,YAAY,MAAgD;AACnE,QAAO,OAAO,KAAK,KAAK,CAAC,QAAO,QAAO,IAAI,WAAW,QAAQ,CAAC;;;;;;;;AASjE,SAAgB,aAAa,MAAyB,UAAiC,CAAC,QAAQ,EAAE;AAChG,QAAO,WAAW,MAAM,CAAC,GAAG,YAAY,KAAK,EAAE,GAAG,QAAQ,CAAC;;;;;;;;AAS7D,SAAgB,gBACd,MACA,UAAiC,CAAC,QAAQ,EAC1C;AACA,QAAO,WAAW,MAAM,CAAC,GAAG,YAAY,KAAK,EAAE,GAAG,QAAQ,CAAC;;;;;;;;AAS7D,SAAgB,cACd,MACA,IAC4B;AAC5B,KAAI,CAAC,KACH,QAAO;AAET,QAAO,OAAO,KAAK,KAAK,CAAC,QACtB,KAAK,SAAS;AACb,MAAI,OAAO,YACT,KAAI,UAAU,KAAK,IAAI,KAAK;MACzB,KAAI,UAAU,KAAK,IAAI,KAAK;AAEjC,SAAO;IAET,EAAE,CACH;;;;;;;;;AAWH,SAAgB,aAAa,QAAyB;AACpD,KAAI,CAAC,OACH,QAAO;AAET,QAAO,OACJ,UAAU,CACV,aAAa,CACb,QAAQ,cAAc,GAAG;;AAG9B,SAAgB,mBAAmB,OAA6C;AAC9E,KAAI,UAAU,KAAA,KAAc,OAAO,UAAU,YAAY,MAAM,OAAO,MAAM,CAAC,CAC3E,QAAO;AACT,QAAO,GAAG,MAAM"}
1
+ {"version":3,"file":"helpers.js","names":[],"sources":["../../src/utils/helpers.ts"],"sourcesContent":["import type { SetupContext } from 'vue';\nimport { objectOmit, objectPick } from '@vueuse/shared';\nimport { camelCase, snakeCase } from 'scule';\n\ninterface FormatNumberOptions {\n fractionDigits?: number;\n}\n\ntype SetupContextAttrs = SetupContext['attrs'];\n\ntype SetupContextAttrsKeys = (keyof SetupContextAttrs)[];\n\nfunction formatNumber(\n amount: number | string,\n { fractionDigits = 2 }: FormatNumberOptions,\n): string {\n return new Intl.NumberFormat(undefined, {\n maximumFractionDigits: fractionDigits,\n minimumFractionDigits: fractionDigits,\n }).format(Number(amount));\n}\n\n/**\n * Format number value without fraction\n * @param {number} amount\n */\nexport function formatInteger(amount: number | string): string {\n return formatNumber(amount, { fractionDigits: 0 });\n}\n\n/**\n * Generates and returns the array of root allowed attributes\n * @param {SetupContextAttrs} data\n * @returns {SetupContextAttrsKeys}\n */\nfunction getRootKeys(data: SetupContextAttrs): SetupContextAttrsKeys {\n return Object.keys(data).filter(key => key.startsWith('data-')) as SetupContextAttrsKeys;\n}\n\n/**\n * Picks only required attributes for root element\n * @param {SetupContextAttrs} data\n * @param {SetupContextAttrsKeys} include\n * @returns {Pick<SetupContextAttrs, any>}\n */\nexport function getRootAttrs(data: SetupContextAttrs, include: SetupContextAttrsKeys = ['class']) {\n return objectPick(data, [...getRootKeys(data), ...include]);\n}\n\n/**\n * Omits root attributes from component's attributes\n * @param {SetupContextAttrs} data\n * @param {SetupContextAttrsKeys} exclude\n * @returns {Omit<SetupContextAttrs, any>}\n */\nexport function getNonRootAttrs(\n data: SetupContextAttrs,\n exclude: SetupContextAttrsKeys = ['class'],\n) {\n return objectOmit(data, [...getRootKeys(data), ...exclude]);\n}\n\n/**\n * Transforms the keys of an object to either camelCase or snake_case\n * @param {T} item\n * @param {\"camelCase\" | \"snake_case\"} to\n * @returns {Record<string, any>}\n */\nexport function transformCase<T extends object>(\n item: T,\n to: 'camelCase' | 'snake_case',\n): Record<string, T[keyof T]> {\n if (!item)\n return item;\n\n return Object.keys(item).reduce(\n (acc, curr) => {\n if (to === 'camelCase')\n acc[camelCase(curr)] = item[curr as keyof T];\n else acc[snakeCase(curr)] = item[curr as keyof T];\n\n return acc;\n },\n {} as Record<string, T[keyof T]>,\n );\n}\n\n/**\n *\n * @param {string} string - String to convert\n * @return {string} - String converted to text token, mostly used to matching keyword\n * @example\n * getTextToken('this is a sentence'); // thisisasentence\n */\n\nexport function getTextToken(string: unknown): string {\n if (!string)\n return '';\n\n return string\n .toString()\n .toLowerCase()\n .replace(/[^\\da-z]/gi, '');\n}\n\nexport function transformPropsUnit(value?: string | number): string | undefined {\n if (value === undefined || (typeof value === 'string' && isNaN(Number(value))))\n return value;\n return `${value}px`;\n}\n\n/**\n * Formats a byte count into a human-readable string (e.g. \"1.2 MB\").\n */\nexport function formatFileSize(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0)\n return '0 B';\n if (bytes < 1024)\n return `${bytes} B`;\n const units = ['KB', 'MB', 'GB', 'TB'];\n let value = bytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n return `${value.toFixed(value >= 10 ? 0 : 1)} ${units[unitIndex]}`;\n}\n"],"mappings":";;;AAYA,SAAS,aACP,QACA,EAAE,iBAAiB,KACX;AACR,QAAO,IAAI,KAAK,aAAa,KAAA,GAAW;EACtC,uBAAuB;EACvB,uBAAuB;EACxB,CAAC,CAAC,OAAO,OAAO,OAAO,CAAC;;;;;;AAO3B,SAAgB,cAAc,QAAiC;AAC7D,QAAO,aAAa,QAAQ,EAAE,gBAAgB,GAAG,CAAC;;;;;;;AAQpD,SAAS,YAAY,MAAgD;AACnE,QAAO,OAAO,KAAK,KAAK,CAAC,QAAO,QAAO,IAAI,WAAW,QAAQ,CAAC;;;;;;;;AASjE,SAAgB,aAAa,MAAyB,UAAiC,CAAC,QAAQ,EAAE;AAChG,QAAO,WAAW,MAAM,CAAC,GAAG,YAAY,KAAK,EAAE,GAAG,QAAQ,CAAC;;;;;;;;AAS7D,SAAgB,gBACd,MACA,UAAiC,CAAC,QAAQ,EAC1C;AACA,QAAO,WAAW,MAAM,CAAC,GAAG,YAAY,KAAK,EAAE,GAAG,QAAQ,CAAC;;;;;;;;AAS7D,SAAgB,cACd,MACA,IAC4B;AAC5B,KAAI,CAAC,KACH,QAAO;AAET,QAAO,OAAO,KAAK,KAAK,CAAC,QACtB,KAAK,SAAS;AACb,MAAI,OAAO,YACT,KAAI,UAAU,KAAK,IAAI,KAAK;MACzB,KAAI,UAAU,KAAK,IAAI,KAAK;AAEjC,SAAO;IAET,EAAE,CACH;;;;;;;;;AAWH,SAAgB,aAAa,QAAyB;AACpD,KAAI,CAAC,OACH,QAAO;AAET,QAAO,OACJ,UAAU,CACV,aAAa,CACb,QAAQ,cAAc,GAAG;;AAG9B,SAAgB,mBAAmB,OAA6C;AAC9E,KAAI,UAAU,KAAA,KAAc,OAAO,UAAU,YAAY,MAAM,OAAO,MAAM,CAAC,CAC3E,QAAO;AACT,QAAO,GAAG,MAAM;;;;;AAMlB,SAAgB,eAAe,OAAuB;AACpD,KAAI,CAAC,OAAO,SAAS,MAAM,IAAI,QAAQ,EACrC,QAAO;AACT,KAAI,QAAQ,KACV,QAAO,GAAG,MAAM;CAClB,MAAM,QAAQ;EAAC;EAAM;EAAM;EAAM;EAAK;CACtC,IAAI,QAAQ,QAAQ;CACpB,IAAI,YAAY;AAChB,QAAO,SAAS,QAAQ,YAAY,MAAM,SAAS,GAAG;AACpD,WAAS;AACT;;AAEF,QAAO,GAAG,MAAM,QAAQ,SAAS,KAAK,IAAI,EAAE,CAAC,GAAG,MAAM"}
@@ -2,7 +2,7 @@
2
2
  "$schema": "http://json.schemastore.org/web-types",
3
3
  "framework": "vue",
4
4
  "name": "@rotki/ui-library",
5
- "version": "2.20.1",
5
+ "version": "2.21.0",
6
6
  "js-types-syntax": "typescript",
7
7
  "description-markup": "markdown",
8
8
  "contributions": {
@@ -4028,6 +4028,24 @@
4028
4028
  "type": "boolean | undefined"
4029
4029
  }
4030
4030
  },
4031
+ {
4032
+ "name": "group-by",
4033
+ "description": "",
4034
+ "required": false,
4035
+ "value": {
4036
+ "kind": "expression",
4037
+ "type": "GroupBy<TItem> | undefined"
4038
+ }
4039
+ },
4040
+ {
4041
+ "name": "item-disabled",
4042
+ "description": "",
4043
+ "required": false,
4044
+ "value": {
4045
+ "kind": "expression",
4046
+ "type": "ItemDisabled<TItem> | undefined"
4047
+ }
4048
+ },
4031
4049
  {
4032
4050
  "name": "model-value",
4033
4051
  "description": "",
@@ -4176,8 +4194,37 @@
4176
4194
  }
4177
4195
  ]
4178
4196
  },
4197
+ {
4198
+ "name": "group-header",
4199
+ "vue-properties": [
4200
+ {
4201
+ "name": "group",
4202
+ "type": "string"
4203
+ },
4204
+ {
4205
+ "name": "items",
4206
+ "type": "TItem[]"
4207
+ }
4208
+ ]
4209
+ },
4179
4210
  {
4180
4211
  "name": "no-data"
4212
+ },
4213
+ {
4214
+ "name": "placeholder",
4215
+ "vue-properties": [
4216
+ {
4217
+ "name": "disabled",
4218
+ "type": "boolean"
4219
+ },
4220
+ {
4221
+ "name": "readOnly",
4222
+ "type": "boolean"
4223
+ }
4224
+ ]
4225
+ },
4226
+ {
4227
+ "name": "footer"
4181
4228
  }
4182
4229
  ],
4183
4230
  "js": {
@@ -4364,6 +4411,211 @@
4364
4411
  "event": "update:modelValue"
4365
4412
  }
4366
4413
  },
4414
+ {
4415
+ "name": "RuiFileUpload",
4416
+ "source": {
4417
+ "module": "@rotki/ui-library/components/forms/file-upload/RuiFileUpload.vue",
4418
+ "symbol": "RuiFileUpload"
4419
+ },
4420
+ "attributes": [
4421
+ {
4422
+ "name": "accept",
4423
+ "description": "File type filter (HTML accept attribute syntax). e.g. '.csv', 'image/*', '.png,.jpg'",
4424
+ "required": false,
4425
+ "default": "'*'",
4426
+ "value": {
4427
+ "kind": "expression",
4428
+ "type": "string | undefined"
4429
+ }
4430
+ },
4431
+ {
4432
+ "name": "multiple",
4433
+ "description": "Allow multiple file selection.",
4434
+ "required": false,
4435
+ "default": "false",
4436
+ "value": {
4437
+ "kind": "expression",
4438
+ "type": "boolean | undefined"
4439
+ }
4440
+ },
4441
+ {
4442
+ "name": "disabled",
4443
+ "description": "",
4444
+ "required": false,
4445
+ "default": "false",
4446
+ "value": {
4447
+ "kind": "expression",
4448
+ "type": "boolean | undefined"
4449
+ }
4450
+ },
4451
+ {
4452
+ "name": "loading",
4453
+ "description": "Shows a loading overlay (consumer-driven, e.g. while uploading).",
4454
+ "required": false,
4455
+ "default": "false",
4456
+ "value": {
4457
+ "kind": "expression",
4458
+ "type": "boolean | undefined"
4459
+ }
4460
+ },
4461
+ {
4462
+ "name": "progress",
4463
+ "description": "Upload progress 0-100. When provided alongside `loading`, the overlay shows a determinate progress bar with percentage.",
4464
+ "required": false,
4465
+ "default": "undefined",
4466
+ "value": {
4467
+ "kind": "expression",
4468
+ "type": "number | undefined"
4469
+ }
4470
+ },
4471
+ {
4472
+ "name": "uploaded",
4473
+ "description": "Renders the success state border/icon. Consumer toggles back to false.",
4474
+ "required": false,
4475
+ "default": "false",
4476
+ "value": {
4477
+ "kind": "expression",
4478
+ "type": "boolean | undefined"
4479
+ }
4480
+ },
4481
+ {
4482
+ "name": "max-size",
4483
+ "description": "Optional max size per file in bytes; failures emit `error` and set internal error state.",
4484
+ "required": false,
4485
+ "default": "undefined",
4486
+ "value": {
4487
+ "kind": "expression",
4488
+ "type": "number | undefined"
4489
+ }
4490
+ },
4491
+ {
4492
+ "name": "error-messages",
4493
+ "description": "External error messages (e.g. from Vuelidate). Shown via the standard form detail block.",
4494
+ "required": false,
4495
+ "default": "[]",
4496
+ "value": {
4497
+ "kind": "expression",
4498
+ "type": "string | string[] | undefined"
4499
+ }
4500
+ },
4501
+ {
4502
+ "name": "hint",
4503
+ "description": "Hint text below the dropzone.",
4504
+ "required": false,
4505
+ "default": "''",
4506
+ "value": {
4507
+ "kind": "expression",
4508
+ "type": "string | undefined"
4509
+ }
4510
+ },
4511
+ {
4512
+ "name": "no-drop",
4513
+ "description": "Disable drag-and-drop; the dropzone becomes click-only (matches rotki.com use case).",
4514
+ "required": false,
4515
+ "default": "false",
4516
+ "value": {
4517
+ "kind": "expression",
4518
+ "type": "boolean | undefined"
4519
+ }
4520
+ },
4521
+ {
4522
+ "name": "upload-text",
4523
+ "description": "Replace the default \"Drag and drop or {button}\" copy.",
4524
+ "required": false,
4525
+ "default": "'Drag and drop or'",
4526
+ "value": {
4527
+ "kind": "expression",
4528
+ "type": "string | undefined"
4529
+ }
4530
+ },
4531
+ {
4532
+ "name": "click-to-upload-text",
4533
+ "description": "Label shown on the inline button when no file is selected.",
4534
+ "required": false,
4535
+ "default": "'click to upload'",
4536
+ "value": {
4537
+ "kind": "expression",
4538
+ "type": "string | undefined"
4539
+ }
4540
+ },
4541
+ {
4542
+ "name": "replace-text",
4543
+ "description": "Label shown on the inline button when one or more files are already selected.",
4544
+ "required": false,
4545
+ "default": "'replace file'",
4546
+ "value": {
4547
+ "kind": "expression",
4548
+ "type": "string | undefined"
4549
+ }
4550
+ },
4551
+ {
4552
+ "name": "hide-details",
4553
+ "description": "Hide the bottom hint/error details strip.",
4554
+ "required": false,
4555
+ "default": "false",
4556
+ "value": {
4557
+ "kind": "expression",
4558
+ "type": "boolean | undefined"
4559
+ }
4560
+ },
4561
+ {
4562
+ "name": "model-value",
4563
+ "description": "",
4564
+ "required": true,
4565
+ "value": {
4566
+ "kind": "expression",
4567
+ "type": "File | File[] | undefined"
4568
+ }
4569
+ }
4570
+ ],
4571
+ "slots": [
4572
+ {
4573
+ "name": "preview",
4574
+ "vue-properties": [
4575
+ {
4576
+ "name": "files",
4577
+ "type": "File[]"
4578
+ },
4579
+ {
4580
+ "name": "remove",
4581
+ "type": "() => void"
4582
+ }
4583
+ ]
4584
+ },
4585
+ {
4586
+ "name": "icon"
4587
+ },
4588
+ {
4589
+ "name": "description"
4590
+ }
4591
+ ],
4592
+ "js": {
4593
+ "events": [
4594
+ {
4595
+ "name": "error",
4596
+ "arguments": [
4597
+ {
4598
+ "name": "argument",
4599
+ "type": "[message: string]"
4600
+ }
4601
+ ]
4602
+ },
4603
+ {
4604
+ "name": "update:modelValue",
4605
+ "arguments": [
4606
+ {
4607
+ "name": "argument",
4608
+ "type": "[value: File | File[] | undefined]"
4609
+ }
4610
+ ]
4611
+ }
4612
+ ]
4613
+ },
4614
+ "vue-model": {
4615
+ "prop": "modelValue",
4616
+ "event": "update:modelValue"
4617
+ }
4618
+ },
4367
4619
  {
4368
4620
  "name": "RuiRevealableTextField",
4369
4621
  "source": {
@@ -6466,6 +6718,15 @@
6466
6718
  "type": "boolean | undefined"
6467
6719
  }
6468
6720
  },
6721
+ {
6722
+ "name": "anchor-el",
6723
+ "description": "Optional external element to anchor the menu to, instead of the\nactivator slot's wrapper. When set, the menu's position is computed\nagainst this element.",
6724
+ "required": false,
6725
+ "value": {
6726
+ "kind": "expression",
6727
+ "type": "HTMLElement | undefined"
6728
+ }
6729
+ },
6469
6730
  {
6470
6731
  "name": "model-value",
6471
6732
  "description": "",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rotki/ui-library",
3
- "version": "2.20.1",
3
+ "version": "2.21.0",
4
4
  "description": "A vue design system and component library for rotki",
5
5
  "type": "module",
6
6
  "keywords": [