@rotki/ui-library 2.18.0 → 2.19.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 (58) hide show
  1. package/dist/README.md +4 -2
  2. package/dist/components/avatars/RuiAvatar.js +7 -0
  3. package/dist/components/avatars/RuiAvatar.js.map +1 -0
  4. package/dist/components/avatars/RuiAvatar.vue.d.ts +31 -0
  5. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js +188 -0
  6. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  7. package/dist/components/avatars/RuiAvatarGroup.js +7 -0
  8. package/dist/components/avatars/RuiAvatarGroup.js.map +1 -0
  9. package/dist/components/avatars/RuiAvatarGroup.vue.d.ts +24 -0
  10. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js +110 -0
  11. package/dist/components/avatars/RuiAvatarGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  12. package/dist/components/avatars/avatar-props.d.ts +33 -0
  13. package/dist/components/avatars/avatar-props.js +46 -0
  14. package/dist/components/avatars/avatar-props.js.map +1 -0
  15. package/dist/components/avatars/use-avatar-group.d.ts +3 -0
  16. package/dist/components/avatars/use-avatar-group.js +10 -0
  17. package/dist/components/avatars/use-avatar-group.js.map +1 -0
  18. package/dist/components/buttons/button/button-styles.js +1 -1
  19. package/dist/components/buttons/button/button-styles.js.map +1 -1
  20. package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
  21. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +3 -0
  22. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +12 -3
  23. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  24. package/dist/components/forms/auto-complete/RuiAutoComplete.js.map +1 -1
  25. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +2 -0
  26. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +8 -0
  27. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  28. package/dist/components/forms/checkbox/RuiCheckbox.js.map +1 -1
  29. package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +25 -22
  30. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js +27 -16
  31. package/dist/components/forms/checkbox/RuiCheckbox.vue_vue_type_script_setup_true_lang.js.map +1 -1
  32. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.js +7 -0
  33. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.js.map +1 -0
  34. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue.d.ts +37 -0
  35. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js +84 -0
  36. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue_vue_type_script_setup_true_lang.js.map +1 -0
  37. package/dist/components/forms/checkbox/checkbox-group/context.d.ts +10 -0
  38. package/dist/components/forms/checkbox/checkbox-group/context.js +6 -0
  39. package/dist/components/forms/checkbox/checkbox-group/context.js.map +1 -0
  40. package/dist/components/index.d.ts +5 -2
  41. package/dist/components/index.js +4 -1
  42. package/dist/icons/icons_1.js +4290 -473
  43. package/dist/icons/icons_1.js.map +1 -1
  44. package/dist/icons/icons_2.js +4358 -474
  45. package/dist/icons/icons_2.js.map +1 -1
  46. package/dist/icons/icons_3.js +4054 -474
  47. package/dist/icons/icons_3.js.map +1 -1
  48. package/dist/icons/icons_4.js +2188 -238
  49. package/dist/icons/icons_4.js.map +1 -1
  50. package/dist/icons/index.js.map +1 -1
  51. package/dist/index.js +4 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/library-icons.json +32 -0
  54. package/dist/style.css +41 -16
  55. package/dist/vite-plugin/index.js +16 -1
  56. package/dist/vite-plugin/index.js.map +1 -1
  57. package/dist/web-types.json +377 -25
  58. package/package.json +3 -2
@@ -42,11 +42,24 @@ function loadValidIcons() {
42
42
  return /* @__PURE__ */ new Set();
43
43
  }
44
44
  /**
45
+ * Loads the baseline icons used by library components, emitted at library
46
+ * build time. Consumers always need these regardless of their own source.
47
+ */
48
+ function loadLibraryBaselineIcons() {
49
+ const distPath = resolve(__dirname, "../library-icons.json");
50
+ if (existsSync(distPath)) try {
51
+ const parsed = JSON.parse(readFileSync(distPath, "utf-8"));
52
+ if (Array.isArray(parsed)) return parsed.filter((v) => typeof v === "string");
53
+ } catch {}
54
+ return [];
55
+ }
56
+ /**
45
57
  * Vite plugin for automatic icon detection and registration
46
58
  */
47
59
  function ruiIconsPlugin(options = {}) {
48
60
  const { include = [], scanPatterns = DEFAULT_SCAN_PATTERNS, strict = false, debug = false } = options;
49
61
  let validIcons;
62
+ let libraryBaseline;
50
63
  let scanResult;
51
64
  let server = null;
52
65
  let root;
@@ -63,7 +76,7 @@ function ruiIconsPlugin(options = {}) {
63
76
  const fg = await import("fast-glob");
64
77
  const glob = fg.default || fg;
65
78
  scanResult = {
66
- icons: new Set(include),
79
+ icons: new Set([...libraryBaseline, ...include]),
67
80
  invalidIcons: /* @__PURE__ */ new Map()
68
81
  };
69
82
  const files = glob.sync(scanPatterns, {
@@ -122,7 +135,9 @@ function ruiIconsPlugin(options = {}) {
122
135
  configResolved(config) {
123
136
  root = config.root;
124
137
  validIcons = loadValidIcons();
138
+ libraryBaseline = loadLibraryBaselineIcons();
125
139
  log(`Loaded ${validIcons.size} valid icon names`);
140
+ log(`Loaded ${libraryBaseline.length} baseline icons used by library components`);
126
141
  },
127
142
  configureServer(_server) {
128
143
  server = _server;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/vite-plugin/index.ts"],"sourcesContent":["import type { Plugin, ViteDevServer } from 'vite';\nimport type { RuiIconsPluginOptions, ScanResult } from './types';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n extractIconsFromSource,\n generateVirtualModule,\n validateIcons,\n} from './scanner';\n\nconst VIRTUAL_MODULE_ID = 'virtual:rotki-icons';\nconst RESOLVED_VIRTUAL_MODULE_ID = `\\0${VIRTUAL_MODULE_ID}`;\n\nconst DEFAULT_SCAN_PATTERNS = ['**/*.vue', '**/*.ts', '**/*.tsx'];\nconst EXCLUDED_PATTERNS = ['**/node_modules/**', '**/dist/**', '**/.git/**'];\n\n// Get __dirname equivalent in ES modules\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Loads the valid RuiIcons array from the library\n */\nfunction loadValidIcons(): Set<string> {\n // Import the RuiIcons array from the icons module\n // This will be resolved at build time\n try {\n // Try to load from the built dist first (for consumers)\n const distPath = resolve(__dirname, '../icons/index.js');\n if (existsSync(distPath)) {\n // Read and parse the file to extract the RuiIcons array\n const content = readFileSync(distPath, 'utf-8');\n // eslint-disable-next-line regexp/strict\n const match = content.match(/(?:const|var|let) RuiIcons = \\[(.*?)];?/s);\n if (match?.[1]) {\n const iconsStr = match[1];\n const icons = iconsStr.match(/\"([^\"]+)\"/g)?.map(s => s.slice(1, -1)) || [];\n return new Set(icons);\n }\n }\n }\n catch {\n // Fallback: parse the icons source file directly\n }\n\n // Fallback: read and parse the source file\n const sourcePath = resolve(__dirname, '../icons/index.ts');\n if (existsSync(sourcePath)) {\n const content = readFileSync(sourcePath, 'utf-8');\n // eslint-disable-next-line regexp/strict\n const match = content.match(/export const RuiIcons = \\[(.*?)] as const/s);\n if (match?.[1]) {\n const iconsStr = match[1];\n const icons = iconsStr.match(/\"([^\"]+)\"/g)?.map(s => s.slice(1, -1)) || [];\n return new Set(icons);\n }\n }\n\n console.warn('[@rotki/ui-library] Could not load RuiIcons list, validation disabled');\n return new Set();\n}\n\n/**\n * Vite plugin for automatic icon detection and registration\n */\nexport function ruiIconsPlugin(options: RuiIconsPluginOptions = {}): Plugin {\n const {\n include = [],\n scanPatterns = DEFAULT_SCAN_PATTERNS,\n strict = false,\n debug = false,\n } = options;\n\n let validIcons: Set<string>;\n let scanResult: ScanResult;\n let server: ViteDevServer | null = null;\n let root: string;\n\n const log = (message: string): void => {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[@rotki/ui-library/icons] ${message}`);\n }\n };\n\n const warn = (message: string): void => {\n console.warn(`[@rotki/ui-library/icons] ${message}`);\n };\n\n /**\n * Scans all matching files for icon usage\n */\n async function scanFiles(): Promise<void> {\n const fg = await import('fast-glob');\n const glob = fg.default || fg;\n\n scanResult = {\n icons: new Set(include),\n invalidIcons: new Map(),\n };\n\n const files = glob.sync(scanPatterns, {\n cwd: root,\n ignore: EXCLUDED_PATTERNS,\n absolute: true,\n });\n\n log(`Scanning ${files.length} files for icon usage...`);\n\n for (const filePath of files) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n\n if (detectedIcons.size > 0) {\n log(`Found ${detectedIcons.size} potential icons in ${filePath}`);\n validateIcons(detectedIcons, validIcons, filePath, scanResult);\n }\n }\n catch {\n warn(`Failed to read file: ${filePath}`);\n }\n }\n\n // Add manually included icons\n for (const icon of include) {\n if (validIcons.has(icon)) {\n scanResult.icons.add(icon);\n }\n else {\n warn(`Included icon \"${icon}\" is not a valid RuiIcon`);\n }\n }\n\n log(`Detected ${scanResult.icons.size} valid icons`);\n\n // Report invalid icons\n if (scanResult.invalidIcons.size > 0) {\n const invalidList = [...scanResult.invalidIcons.entries()]\n .map(([icon, files]) => ` - \"${icon}\" in: ${files.join(', ')}`)\n .join('\\n');\n\n const message = `Found ${scanResult.invalidIcons.size} invalid icon name(s):\\n${invalidList}`;\n\n if (strict) {\n throw new Error(message);\n }\n else {\n warn(message);\n }\n }\n }\n\n /**\n * Handles file changes in dev mode\n */\n function handleFileChange(filePath: string): void {\n // Check if the changed file matches our scan patterns\n const isRelevantFile = scanPatterns.some((pattern) => {\n const ext = filePath.split('.').pop();\n return pattern.includes(`*.${ext}`);\n });\n\n if (!isRelevantFile)\n return;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n const previousSize = scanResult.icons.size;\n\n validateIcons(detectedIcons, validIcons, filePath, scanResult);\n\n // If new icons were detected, invalidate the virtual module\n if (scanResult.icons.size > previousSize) {\n log(`New icons detected in ${filePath}, invalidating virtual module...`);\n\n // Invalidate the virtual module to trigger re-import\n const mod = server?.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID);\n if (mod) {\n server?.moduleGraph.invalidateModule(mod);\n // Trigger HMR update\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n }\n }\n }\n catch {\n // Ignore read errors\n }\n }\n\n return {\n name: 'rotki-ui-library-icons',\n enforce: 'pre',\n\n configResolved(config) {\n root = config.root;\n validIcons = loadValidIcons();\n log(`Loaded ${validIcons.size} valid icon names`);\n },\n\n configureServer(_server) {\n server = _server;\n\n // Watch for file changes\n server.watcher.on('change', handleFileChange);\n server.watcher.on('add', handleFileChange);\n },\n\n async buildStart() {\n await scanFiles();\n },\n\n resolveId(id) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID;\n }\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n const moduleContent = generateVirtualModule(scanResult.icons);\n log(`Generated virtual module with ${scanResult.icons.size} icons`);\n return moduleContent;\n }\n },\n };\n}\n\nexport type { RuiIconsPluginOptions } from './types';\n\n// eslint-disable-next-line import/no-default-export\nexport default ruiIconsPlugin;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/vite-plugin/index.ts"],"sourcesContent":["import type { Plugin, ViteDevServer } from 'vite';\nimport type { RuiIconsPluginOptions, ScanResult } from './types';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n extractIconsFromSource,\n generateVirtualModule,\n validateIcons,\n} from './scanner';\n\nconst VIRTUAL_MODULE_ID = 'virtual:rotki-icons';\nconst RESOLVED_VIRTUAL_MODULE_ID = `\\0${VIRTUAL_MODULE_ID}`;\n\nconst DEFAULT_SCAN_PATTERNS = ['**/*.vue', '**/*.ts', '**/*.tsx'];\nconst EXCLUDED_PATTERNS = ['**/node_modules/**', '**/dist/**', '**/.git/**'];\n\n// Get __dirname equivalent in ES modules\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Loads the valid RuiIcons array from the library\n */\nfunction loadValidIcons(): Set<string> {\n // Import the RuiIcons array from the icons module\n // This will be resolved at build time\n try {\n // Try to load from the built dist first (for consumers)\n const distPath = resolve(__dirname, '../icons/index.js');\n if (existsSync(distPath)) {\n // Read and parse the file to extract the RuiIcons array\n const content = readFileSync(distPath, 'utf-8');\n // eslint-disable-next-line regexp/strict\n const match = content.match(/(?:const|var|let) RuiIcons = \\[(.*?)];?/s);\n if (match?.[1]) {\n const iconsStr = match[1];\n const icons = iconsStr.match(/\"([^\"]+)\"/g)?.map(s => s.slice(1, -1)) || [];\n return new Set(icons);\n }\n }\n }\n catch {\n // Fallback: parse the icons source file directly\n }\n\n // Fallback: read and parse the source file\n const sourcePath = resolve(__dirname, '../icons/index.ts');\n if (existsSync(sourcePath)) {\n const content = readFileSync(sourcePath, 'utf-8');\n // eslint-disable-next-line regexp/strict\n const match = content.match(/export const RuiIcons = \\[(.*?)] as const/s);\n if (match?.[1]) {\n const iconsStr = match[1];\n const icons = iconsStr.match(/\"([^\"]+)\"/g)?.map(s => s.slice(1, -1)) || [];\n return new Set(icons);\n }\n }\n\n console.warn('[@rotki/ui-library] Could not load RuiIcons list, validation disabled');\n return new Set();\n}\n\n/**\n * Loads the baseline icons used by library components, emitted at library\n * build time. Consumers always need these regardless of their own source.\n */\nfunction loadLibraryBaselineIcons(): string[] {\n const distPath = resolve(__dirname, '../library-icons.json');\n if (existsSync(distPath)) {\n try {\n const parsed: unknown = JSON.parse(readFileSync(distPath, 'utf-8'));\n if (Array.isArray(parsed))\n return parsed.filter((v): v is string => typeof v === 'string');\n }\n catch {\n // fall through\n }\n }\n return [];\n}\n\n/**\n * Vite plugin for automatic icon detection and registration\n */\nexport function ruiIconsPlugin(options: RuiIconsPluginOptions = {}): Plugin {\n const {\n include = [],\n scanPatterns = DEFAULT_SCAN_PATTERNS,\n strict = false,\n debug = false,\n } = options;\n\n let validIcons: Set<string>;\n let libraryBaseline: string[];\n let scanResult: ScanResult;\n let server: ViteDevServer | null = null;\n let root: string;\n\n const log = (message: string): void => {\n if (debug) {\n // eslint-disable-next-line no-console\n console.log(`[@rotki/ui-library/icons] ${message}`);\n }\n };\n\n const warn = (message: string): void => {\n console.warn(`[@rotki/ui-library/icons] ${message}`);\n };\n\n /**\n * Scans all matching files for icon usage\n */\n async function scanFiles(): Promise<void> {\n const fg = await import('fast-glob');\n const glob = fg.default || fg;\n\n scanResult = {\n icons: new Set([...libraryBaseline, ...include]),\n invalidIcons: new Map(),\n };\n\n const files = glob.sync(scanPatterns, {\n cwd: root,\n ignore: EXCLUDED_PATTERNS,\n absolute: true,\n });\n\n log(`Scanning ${files.length} files for icon usage...`);\n\n for (const filePath of files) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n\n if (detectedIcons.size > 0) {\n log(`Found ${detectedIcons.size} potential icons in ${filePath}`);\n validateIcons(detectedIcons, validIcons, filePath, scanResult);\n }\n }\n catch {\n warn(`Failed to read file: ${filePath}`);\n }\n }\n\n // Add manually included icons\n for (const icon of include) {\n if (validIcons.has(icon)) {\n scanResult.icons.add(icon);\n }\n else {\n warn(`Included icon \"${icon}\" is not a valid RuiIcon`);\n }\n }\n\n log(`Detected ${scanResult.icons.size} valid icons`);\n\n // Report invalid icons\n if (scanResult.invalidIcons.size > 0) {\n const invalidList = [...scanResult.invalidIcons.entries()]\n .map(([icon, files]) => ` - \"${icon}\" in: ${files.join(', ')}`)\n .join('\\n');\n\n const message = `Found ${scanResult.invalidIcons.size} invalid icon name(s):\\n${invalidList}`;\n\n if (strict) {\n throw new Error(message);\n }\n else {\n warn(message);\n }\n }\n }\n\n /**\n * Handles file changes in dev mode\n */\n function handleFileChange(filePath: string): void {\n // Check if the changed file matches our scan patterns\n const isRelevantFile = scanPatterns.some((pattern) => {\n const ext = filePath.split('.').pop();\n return pattern.includes(`*.${ext}`);\n });\n\n if (!isRelevantFile)\n return;\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const detectedIcons = extractIconsFromSource(content);\n const previousSize = scanResult.icons.size;\n\n validateIcons(detectedIcons, validIcons, filePath, scanResult);\n\n // If new icons were detected, invalidate the virtual module\n if (scanResult.icons.size > previousSize) {\n log(`New icons detected in ${filePath}, invalidating virtual module...`);\n\n // Invalidate the virtual module to trigger re-import\n const mod = server?.moduleGraph.getModuleById(RESOLVED_VIRTUAL_MODULE_ID);\n if (mod) {\n server?.moduleGraph.invalidateModule(mod);\n // Trigger HMR update\n server?.ws.send({\n type: 'full-reload',\n path: '*',\n });\n }\n }\n }\n catch {\n // Ignore read errors\n }\n }\n\n return {\n name: 'rotki-ui-library-icons',\n enforce: 'pre',\n\n configResolved(config) {\n root = config.root;\n validIcons = loadValidIcons();\n libraryBaseline = loadLibraryBaselineIcons();\n log(`Loaded ${validIcons.size} valid icon names`);\n log(`Loaded ${libraryBaseline.length} baseline icons used by library components`);\n },\n\n configureServer(_server) {\n server = _server;\n\n // Watch for file changes\n server.watcher.on('change', handleFileChange);\n server.watcher.on('add', handleFileChange);\n },\n\n async buildStart() {\n await scanFiles();\n },\n\n resolveId(id) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID;\n }\n },\n\n load(id) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n const moduleContent = generateVirtualModule(scanResult.icons);\n log(`Generated virtual module with ${scanResult.icons.size} icons`);\n return moduleContent;\n }\n },\n };\n}\n\nexport type { RuiIconsPluginOptions } from './types';\n\n// eslint-disable-next-line import/no-default-export\nexport default ruiIconsPlugin;\n"],"mappings":"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"}