@hobui/viui-cli 0.0.6 → 0.0.7

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 (240) hide show
  1. package/README.md +138 -139
  2. package/dist/adapters/adapter-registry.d.ts +12 -0
  3. package/dist/adapters/adapter-registry.d.ts.map +1 -0
  4. package/dist/adapters/adapter-registry.js +49 -0
  5. package/dist/adapters/adapter-types.d.ts +20 -0
  6. package/dist/adapters/adapter-types.d.ts.map +1 -0
  7. package/dist/adapters/adapter-types.js +1 -0
  8. package/dist/adapters/aider-adapter.d.ts +3 -0
  9. package/dist/adapters/aider-adapter.d.ts.map +1 -0
  10. package/dist/adapters/aider-adapter.js +8 -0
  11. package/dist/adapters/claude-adapter.d.ts +3 -0
  12. package/dist/adapters/claude-adapter.d.ts.map +1 -0
  13. package/dist/adapters/claude-adapter.js +15 -0
  14. package/dist/adapters/cline-adapter.d.ts +3 -0
  15. package/dist/adapters/cline-adapter.d.ts.map +1 -0
  16. package/dist/adapters/cline-adapter.js +8 -0
  17. package/dist/adapters/copilot-adapter.d.ts +5 -0
  18. package/dist/adapters/copilot-adapter.d.ts.map +1 -0
  19. package/dist/adapters/copilot-adapter.js +20 -0
  20. package/dist/adapters/cursor-adapter.d.ts +3 -0
  21. package/dist/adapters/cursor-adapter.d.ts.map +1 -0
  22. package/dist/adapters/cursor-adapter.js +18 -0
  23. package/dist/adapters/external/bolt-adapter.d.ts +3 -0
  24. package/dist/adapters/external/bolt-adapter.d.ts.map +1 -0
  25. package/dist/adapters/external/bolt-adapter.js +15 -0
  26. package/dist/adapters/external/chatgpt-adapter.d.ts +3 -0
  27. package/dist/adapters/external/chatgpt-adapter.d.ts.map +1 -0
  28. package/dist/adapters/external/chatgpt-adapter.js +14 -0
  29. package/dist/adapters/external/external-adapter-base.d.ts +15 -0
  30. package/dist/adapters/external/external-adapter-base.d.ts.map +1 -0
  31. package/dist/adapters/external/external-adapter-base.js +92 -0
  32. package/dist/adapters/external/gemini-adapter.d.ts +3 -0
  33. package/dist/adapters/external/gemini-adapter.d.ts.map +1 -0
  34. package/dist/adapters/external/gemini-adapter.js +14 -0
  35. package/dist/adapters/external/lovable-adapter.d.ts +3 -0
  36. package/dist/adapters/external/lovable-adapter.d.ts.map +1 -0
  37. package/dist/adapters/external/lovable-adapter.js +14 -0
  38. package/dist/adapters/external/v0-adapter.d.ts +3 -0
  39. package/dist/adapters/external/v0-adapter.d.ts.map +1 -0
  40. package/dist/adapters/external/v0-adapter.js +15 -0
  41. package/dist/adapters/windsurf-adapter.d.ts +3 -0
  42. package/dist/adapters/windsurf-adapter.d.ts.map +1 -0
  43. package/dist/adapters/windsurf-adapter.js +23 -0
  44. package/dist/assets/plugins/viui-conf/apply-theme-body.ts +23 -4
  45. package/dist/assets/plugins/viui-conf/defaults/README.md +2 -0
  46. package/dist/assets/plugins/viui-conf/defaults/app-bar.ts +1 -1
  47. package/dist/assets/plugins/viui-conf/defaults/buttons.ts +1 -1
  48. package/dist/assets/plugins/viui-conf/defaults/by-theme/minimalist-2.ts +1 -1
  49. package/dist/assets/plugins/viui-conf/defaults/cards.ts +1 -1
  50. package/dist/assets/plugins/viui-conf/defaults/expansion-panels.ts +16 -0
  51. package/dist/assets/plugins/viui-conf/defaults/index.ts +3 -0
  52. package/dist/assets/plugins/viui-conf/defaults/inputs.ts +11 -1
  53. package/dist/assets/plugins/viui-conf/design-tokens.ts +135 -0
  54. package/dist/assets/plugins/viui-conf/theme-base.ts +1 -1
  55. package/dist/assets/plugins/viui-conf/v-dark.ts +3 -5
  56. package/dist/assets/plugins/viui-conf/v-light.ts +3 -5
  57. package/dist/assets/plugins/vuetify.ts +36 -0
  58. package/dist/assets/prompt-data/components.json +106 -0
  59. package/dist/assets/prompt-data/tokens.json +83 -0
  60. package/dist/assets/themes/_bento-grid.scss +8 -0
  61. package/dist/assets/themes/_glassmorphism.scss +8 -0
  62. package/dist/assets/themes/_material.scss +8 -0
  63. package/dist/assets/themes/_minimalist-2.scss +375 -0
  64. package/dist/assets/themes/_minimalist.scss +9 -0
  65. package/dist/assets/themes/_neo-brutalism.scss +199 -0
  66. package/dist/assets/themes/bento-grid.scss +4 -0
  67. package/dist/assets/themes/glassmorphism.scss +4 -0
  68. package/dist/assets/themes/index.scss +11 -0
  69. package/dist/assets/themes/material.scss +4 -0
  70. package/dist/assets/themes/minimalist-2.scss +5 -0
  71. package/dist/assets/themes/minimalist.scss +4 -0
  72. package/dist/assets/themes/neo-brutalism.scss +5 -0
  73. package/dist/assets/viui-themes/_neo-brutalism.scss +70 -152
  74. package/dist/cli-paths.d.ts +7 -0
  75. package/dist/cli-paths.d.ts.map +1 -0
  76. package/dist/cli-paths.js +19 -0
  77. package/dist/cli.js +28 -578
  78. package/dist/cli.legacy.d.ts +3 -0
  79. package/dist/cli.legacy.d.ts.map +1 -0
  80. package/dist/cli.legacy.js +597 -0
  81. package/dist/commands/audit.d.ts +3 -0
  82. package/dist/commands/audit.d.ts.map +1 -0
  83. package/dist/commands/audit.js +152 -0
  84. package/dist/commands/config/config-export.d.ts +6 -0
  85. package/dist/commands/config/config-export.d.ts.map +1 -0
  86. package/dist/commands/config/config-export.js +23 -0
  87. package/dist/commands/config/config-health.d.ts +6 -0
  88. package/dist/commands/config/config-health.d.ts.map +1 -0
  89. package/dist/commands/config/config-health.js +42 -0
  90. package/dist/commands/config/config-import.d.ts +6 -0
  91. package/dist/commands/config/config-import.d.ts.map +1 -0
  92. package/dist/commands/config/config-import.js +63 -0
  93. package/dist/commands/config/config-rollback.d.ts +6 -0
  94. package/dist/commands/config/config-rollback.d.ts.map +1 -0
  95. package/dist/commands/config/config-rollback.js +47 -0
  96. package/dist/commands/config/config-setup.d.ts +6 -0
  97. package/dist/commands/config/config-setup.d.ts.map +1 -0
  98. package/dist/commands/config/config-setup.js +103 -0
  99. package/dist/commands/config/config-status.d.ts +6 -0
  100. package/dist/commands/config/config-status.d.ts.map +1 -0
  101. package/dist/commands/config/config-status.js +42 -0
  102. package/dist/commands/config/config-uninstall.d.ts +6 -0
  103. package/dist/commands/config/config-uninstall.d.ts.map +1 -0
  104. package/dist/commands/config/config-uninstall.js +74 -0
  105. package/dist/commands/config.d.ts +6 -0
  106. package/dist/commands/config.d.ts.map +1 -0
  107. package/dist/commands/config.js +19 -0
  108. package/dist/commands/docs.d.ts +3 -0
  109. package/dist/commands/docs.d.ts.map +1 -0
  110. package/dist/commands/docs.js +17 -0
  111. package/dist/commands/doctor.d.ts +3 -0
  112. package/dist/commands/doctor.d.ts.map +1 -0
  113. package/dist/commands/doctor.js +93 -0
  114. package/dist/commands/init.d.ts +3 -0
  115. package/dist/commands/init.d.ts.map +1 -0
  116. package/dist/commands/init.js +183 -0
  117. package/dist/commands/sync.d.ts +3 -0
  118. package/dist/commands/sync.d.ts.map +1 -0
  119. package/dist/commands/sync.js +73 -0
  120. package/dist/commands/theme.d.ts +3 -0
  121. package/dist/commands/theme.d.ts.map +1 -0
  122. package/dist/commands/theme.js +86 -0
  123. package/dist/commands/update.d.ts +3 -0
  124. package/dist/commands/update.d.ts.map +1 -0
  125. package/dist/commands/update.js +97 -0
  126. package/dist/prompts/prompt-builder.d.ts +4 -0
  127. package/dist/prompts/prompt-builder.d.ts.map +1 -0
  128. package/dist/prompts/prompt-builder.js +18 -0
  129. package/dist/prompts/prompt-data-loader.d.ts +11 -0
  130. package/dist/prompts/prompt-data-loader.d.ts.map +1 -0
  131. package/dist/prompts/prompt-data-loader.js +15 -0
  132. package/dist/prompts/prompt-sections/section-code-examples.d.ts +2 -0
  133. package/dist/prompts/prompt-sections/section-code-examples.d.ts.map +1 -0
  134. package/dist/prompts/prompt-sections/section-code-examples.js +36 -0
  135. package/dist/prompts/prompt-sections/section-color-tokens.d.ts +2 -0
  136. package/dist/prompts/prompt-sections/section-color-tokens.d.ts.map +1 -0
  137. package/dist/prompts/prompt-sections/section-color-tokens.js +19 -0
  138. package/dist/prompts/prompt-sections/section-component-map.d.ts +3 -0
  139. package/dist/prompts/prompt-sections/section-component-map.d.ts.map +1 -0
  140. package/dist/prompts/prompt-sections/section-component-map.js +12 -0
  141. package/dist/prompts/prompt-sections/section-typography-spacing.d.ts +2 -0
  142. package/dist/prompts/prompt-sections/section-typography-spacing.d.ts.map +1 -0
  143. package/dist/prompts/prompt-sections/section-typography-spacing.js +29 -0
  144. package/dist/services/backup-service.d.ts +7 -0
  145. package/dist/services/backup-service.d.ts.map +1 -0
  146. package/dist/services/backup-service.js +54 -0
  147. package/dist/services/config-service.d.ts +17 -0
  148. package/dist/services/config-service.d.ts.map +1 -0
  149. package/dist/services/config-service.js +64 -0
  150. package/dist/services/diff-engine.d.ts +13 -0
  151. package/dist/services/diff-engine.d.ts.map +1 -0
  152. package/dist/services/diff-engine.js +59 -0
  153. package/dist/services/ide-detector.d.ts +9 -0
  154. package/dist/services/ide-detector.d.ts.map +1 -0
  155. package/dist/services/ide-detector.js +113 -0
  156. package/dist/services/ide-detector.spec.d.ts +2 -0
  157. package/dist/services/ide-detector.spec.d.ts.map +1 -0
  158. package/dist/services/ide-detector.spec.js +108 -0
  159. package/dist/services/lock-file-service.d.ts +15 -0
  160. package/dist/services/lock-file-service.d.ts.map +1 -0
  161. package/dist/services/lock-file-service.js +74 -0
  162. package/dist/services/mcp-config-reader.d.ts +11 -0
  163. package/dist/services/mcp-config-reader.d.ts.map +1 -0
  164. package/dist/services/mcp-config-reader.js +40 -0
  165. package/dist/services/mcp-config-reader.spec.d.ts +2 -0
  166. package/dist/services/mcp-config-reader.spec.d.ts.map +1 -0
  167. package/dist/services/mcp-config-reader.spec.js +125 -0
  168. package/dist/services/mcp-config-writer.d.ts +11 -0
  169. package/dist/services/mcp-config-writer.d.ts.map +1 -0
  170. package/dist/services/mcp-config-writer.js +98 -0
  171. package/dist/services/mcp-config-writer.spec.d.ts +2 -0
  172. package/dist/services/mcp-config-writer.spec.d.ts.map +1 -0
  173. package/dist/services/mcp-config-writer.spec.js +162 -0
  174. package/dist/services/merge-engine.d.ts +12 -0
  175. package/dist/services/merge-engine.d.ts.map +1 -0
  176. package/dist/services/merge-engine.js +54 -0
  177. package/dist/services/vuetify-scaffold-service.d.ts +5 -0
  178. package/dist/services/vuetify-scaffold-service.d.ts.map +1 -0
  179. package/dist/services/vuetify-scaffold-service.js +67 -0
  180. package/dist/templates/vuetify-plugin.d.ts +90 -0
  181. package/dist/templates/vuetify-plugin.d.ts.map +1 -0
  182. package/dist/templates/vuetify-plugin.js +33 -0
  183. package/dist/types/command-types.d.ts +15 -0
  184. package/dist/types/command-types.d.ts.map +1 -0
  185. package/dist/types/command-types.js +2 -0
  186. package/dist/types/config-types.d.ts +29 -0
  187. package/dist/types/config-types.d.ts.map +1 -0
  188. package/dist/types/config-types.js +10 -0
  189. package/dist/types/ide-types.d.ts +29 -0
  190. package/dist/types/ide-types.d.ts.map +1 -0
  191. package/dist/types/ide-types.js +4 -0
  192. package/dist/types/lock-file-types.d.ts +27 -0
  193. package/dist/types/lock-file-types.d.ts.map +1 -0
  194. package/dist/types/lock-file-types.js +2 -0
  195. package/dist/utils/diff-display.d.ts +18 -0
  196. package/dist/utils/diff-display.d.ts.map +1 -0
  197. package/dist/utils/diff-display.js +61 -0
  198. package/dist/utils/fs-safe.d.ts +9 -0
  199. package/dist/utils/fs-safe.d.ts.map +1 -0
  200. package/dist/utils/fs-safe.js +44 -0
  201. package/dist/utils/logger.d.ts +14 -0
  202. package/dist/utils/logger.d.ts.map +1 -0
  203. package/dist/utils/logger.js +28 -0
  204. package/dist/utils/open-browser.d.ts +3 -0
  205. package/dist/utils/open-browser.d.ts.map +1 -0
  206. package/dist/utils/open-browser.js +13 -0
  207. package/package.json +11 -6
  208. package/dist/assets/cursor/.design-system-version +0 -1
  209. package/dist/assets/cursor/commands/audit-accessibility.md +0 -25
  210. package/dist/assets/cursor/commands/audit-ui.md +0 -35
  211. package/dist/assets/cursor/commands/component.md +0 -18
  212. package/dist/assets/cursor/commands/fix-storybook.md +0 -24
  213. package/dist/assets/cursor/commands/generate-component-from-figma.md +0 -26
  214. package/dist/assets/cursor/commands/generate-page-from-figma.md +0 -26
  215. package/dist/assets/cursor/plans/DESIGN_SYSTEM_PLAN.md +0 -177
  216. package/dist/assets/cursor/plans/PLANS_INDEX.md +0 -35
  217. package/dist/assets/cursor/rules/accessibility-contrast.mdc +0 -38
  218. package/dist/assets/cursor/rules/bem-class-style.mdc +0 -107
  219. package/dist/assets/cursor/rules/component-naming.mdc +0 -57
  220. package/dist/assets/cursor/rules/design-system-component-library.mdc +0 -59
  221. package/dist/assets/cursor/rules/design-system-workflow.mdc +0 -48
  222. package/dist/assets/cursor/rules/figma-mapping.mdc +0 -37
  223. package/dist/assets/cursor/rules/icons.mdc +0 -42
  224. package/dist/assets/cursor/rules/project-structure.mdc +0 -137
  225. package/dist/assets/cursor/rules/storybook-component-template.mdc +0 -103
  226. package/dist/assets/cursor/rules/storybook.mdc +0 -68
  227. package/dist/assets/cursor/rules/tokens.mdc +0 -32
  228. package/dist/assets/cursor/rules/viui-themes.mdc +0 -53
  229. package/dist/assets/cursor/rules/vuetify-layout.mdc +0 -52
  230. package/dist/assets/cursor/skills/accessibility.md +0 -75
  231. package/dist/assets/cursor/skills/design-system-thinking.md +0 -40
  232. package/dist/assets/cursor/skills/figma-interpretation.md +0 -38
  233. package/dist/assets/cursor/skills/vue-vuetify-design-system-architect.md +0 -60
  234. package/dist/assets/cursor/sync-manifest.json +0 -6
  235. package/dist/assets/viui-themes/bento-grid-global.scss +0 -5
  236. package/dist/assets/viui-themes/glassmorphism-global.scss +0 -5
  237. package/dist/assets/viui-themes/material-global.scss +0 -5
  238. package/dist/assets/viui-themes/minimalist-2-global.scss +0 -5
  239. package/dist/assets/viui-themes/minimalist-global.scss +0 -5
  240. package/dist/assets/viui-themes/neo-brutalism-global.scss +0 -5
@@ -0,0 +1,92 @@
1
+ /** Strip import lines referencing internal paths */
2
+ export function stripImportPaths(md) {
3
+ return md.replace(/^.*import\s+.*from\s+['"]@[/'].*['"].*$/gm, '')
4
+ .replace(/^\s*[-*]\s*(Design System repo|Consumer app|Tokens):.*@.*$/gm, '')
5
+ .replace(/^\s*[-*]\s*Import path:?\s*$/gm, '');
6
+ }
7
+ /** Compact color table (12 rows) — extracted from COLORS_JSON */
8
+ export const COLORS_TABLE = `| Token | Light | Dark |
9
+ |---|---|---|
10
+ | primary | #024799 | #619ee9 |
11
+ | accent | #cc0e0e | #ed7b7b |
12
+ | neutral-bg | #F4F7FA | #0D1117 |
13
+ | neutral-text | #0F1E2D | #E6EDF3 |
14
+ | neutral-border | #D0DAE6 | #21262D |
15
+ | success | #0E9F6E | #34D399 |
16
+ | warning | #D47B0A | #FBBF24 |
17
+ | error | #B91C1C | #F87171 |
18
+ | info | #8abdef | #619ee9 |
19
+ | surface-bg | #FFFFFF | #121212 |
20
+ | surface-card | #FFFFFF | #2a2a2a |
21
+ | surface-elev | #FFFFFF | #1e1e1e |`;
22
+ /** CSS vars block for embedded use */
23
+ export const CSS_VARS_BLOCK = `:root {
24
+ --color-primary: #024799;
25
+ --color-accent: #cc0e0e;
26
+ --neutral-bg: #F4F7FA;
27
+ --neutral-text: #0F1E2D;
28
+ --neutral-border: #D0DAE6;
29
+ --color-success: #0E9F6E;
30
+ --color-warning: #D47B0A;
31
+ --color-error: #B91C1C;
32
+ --color-info: #8abdef;
33
+ }
34
+ .dark {
35
+ --color-primary: #619ee9;
36
+ --color-accent: #ed7b7b;
37
+ --neutral-bg: #0D1117;
38
+ --neutral-text: #E6EDF3;
39
+ --neutral-border: #21262D;
40
+ --color-success: #34D399;
41
+ --color-warning: #FBBF24;
42
+ --color-error: #F87171;
43
+ --color-info: #619ee9;
44
+ }`;
45
+ /** Tailwind extend config */
46
+ export const TAILWIND_CONFIG = `extend: {
47
+ colors: {
48
+ 'primary': '#024799',
49
+ 'accent': '#cc0e0e',
50
+ 'neutral-bg': '#F4F7FA',
51
+ 'neutral-text': '#0F1E2D',
52
+ 'success': '#0E9F6E',
53
+ 'warning': '#D47B0A',
54
+ 'error': '#B91C1C',
55
+ 'info': '#8abdef'
56
+ }
57
+ }`;
58
+ /** Replace full color JSON blob with a compact replacement */
59
+ export function replaceColorsWithFormat(md, replacement) {
60
+ return md.replace(/\{"colors":\{[^}]*(?:\{[^}]*\}[^}]*)*\}\}/g, replacement);
61
+ }
62
+ /** Vi* → shadcn component mapping */
63
+ const SHADCN_MAP = {
64
+ ViButton: '<Button>', ViCard: '<Card>', ViInput: '<Input>',
65
+ ViSelect: '<Select>', ViAlert: '<Alert>', ViDialog: '<Dialog>',
66
+ ViDataTable: '<Table>', ViChip: '<Badge>', ViAvatar: '<Avatar>',
67
+ ViCheckbox: '<Checkbox>', ViSwitch: '<Switch>', ViLoading: '<Skeleton>',
68
+ };
69
+ /** Vi* → HTML semantic mapping */
70
+ const HTML_MAP = {
71
+ ViButton: '<button>', ViCard: '<div class="card">', ViInput: '<input>',
72
+ ViSelect: '<select>', ViAlert: '<div role="alert">', ViDialog: '<dialog>',
73
+ ViDataTable: '<table>', ViChip: '<span class="badge">', ViAvatar: '<img>',
74
+ ViCheckbox: '<input type="checkbox">', ViSwitch: '<input type="checkbox" role="switch">',
75
+ };
76
+ /** Map Vi* component names to target equivalent */
77
+ export function mapComponents(md, target) {
78
+ const map = target === 'shadcn' ? SHADCN_MAP : HTML_MAP;
79
+ let result = md;
80
+ for (const [vi, replacement] of Object.entries(map)) {
81
+ result = result.replace(new RegExp(`\\b${vi}\\b`, 'g'), replacement);
82
+ }
83
+ return result;
84
+ }
85
+ /** Trim text to maxChars at last newline */
86
+ export function trimToLimit(text, maxChars) {
87
+ if (text.length <= maxChars)
88
+ return text;
89
+ const trimmed = text.slice(0, maxChars);
90
+ const lastNl = trimmed.lastIndexOf('\n');
91
+ return (lastNl > 0 ? trimmed.slice(0, lastNl) : trimmed) + '\n\n[truncated]';
92
+ }
@@ -0,0 +1,3 @@
1
+ import type { AiAdapter } from '../adapter-types.js';
2
+ export declare const geminiAdapter: AiAdapter;
3
+ //# sourceMappingURL=gemini-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/external/gemini-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,qBAAqB,CAAA;AAGhE,eAAO,MAAM,aAAa,EAAE,SAY3B,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { stripImportPaths, replaceColorsWithFormat, CSS_VARS_BLOCK, trimToLimit } from './external-adapter-base.js';
2
+ export const geminiAdapter = {
3
+ name: 'Gemini',
4
+ category: 'external',
5
+ detectDirs: [],
6
+ outputPath: '.viui/prompts/gemini/design-system.txt',
7
+ maxChars: 6000,
8
+ transform(markdown, meta) {
9
+ let result = stripImportPaths(markdown);
10
+ result = replaceColorsWithFormat(result, CSS_VARS_BLOCK);
11
+ result = trimToLimit(result, 6000);
12
+ return `# iNET Design System (v${meta.version})\n\n` + result;
13
+ },
14
+ };
@@ -0,0 +1,3 @@
1
+ import type { AiAdapter } from '../adapter-types.js';
2
+ export declare const lovableAdapter: AiAdapter;
3
+ //# sourceMappingURL=lovable-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lovable-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/external/lovable-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,qBAAqB,CAAA;AAGhE,eAAO,MAAM,cAAc,EAAE,SAY5B,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { stripImportPaths, replaceColorsWithFormat, TAILWIND_CONFIG, trimToLimit } from './external-adapter-base.js';
2
+ export const lovableAdapter = {
3
+ name: 'Lovable',
4
+ category: 'external',
5
+ detectDirs: [],
6
+ outputPath: '.viui/prompts/lovable/design-system.txt',
7
+ maxChars: 4000,
8
+ transform(markdown, meta) {
9
+ let result = stripImportPaths(markdown);
10
+ result = replaceColorsWithFormat(result, TAILWIND_CONFIG);
11
+ result = trimToLimit(result, 4000);
12
+ return `# iNET Design System (v${meta.version})\n\n` + result;
13
+ },
14
+ };
@@ -0,0 +1,3 @@
1
+ import type { AiAdapter } from '../adapter-types.js';
2
+ export declare const v0Adapter: AiAdapter;
3
+ //# sourceMappingURL=v0-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v0-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/external/v0-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,qBAAqB,CAAA;AAGhE,eAAO,MAAM,SAAS,EAAE,SAavB,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { stripImportPaths, replaceColorsWithFormat, TAILWIND_CONFIG, mapComponents, trimToLimit } from './external-adapter-base.js';
2
+ export const v0Adapter = {
3
+ name: 'v0',
4
+ category: 'external',
5
+ detectDirs: [],
6
+ outputPath: '.viui/prompts/v0/design-system.txt',
7
+ maxChars: 4000,
8
+ transform(markdown, meta) {
9
+ let result = stripImportPaths(markdown);
10
+ result = replaceColorsWithFormat(result, TAILWIND_CONFIG);
11
+ result = mapComponents(result, 'shadcn');
12
+ result = trimToLimit(result, 4000);
13
+ return `# iNET Design System (v${meta.version})\n\n` + result;
14
+ },
15
+ };
@@ -0,0 +1,3 @@
1
+ import type { AiAdapter } from './adapter-types.js';
2
+ export declare const windsurfAdapter: AiAdapter;
3
+ //# sourceMappingURL=windsurf-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/windsurf-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAkBnD,eAAO,MAAM,eAAe,EAAE,SAQ7B,CAAA"}
@@ -0,0 +1,23 @@
1
+ /** Truncate markdown to fit within maxChars by removing sections from the end */
2
+ function truncateToFit(markdown, maxChars) {
3
+ if (markdown.length <= maxChars)
4
+ return markdown;
5
+ // Split into sections by ## headings
6
+ const sections = markdown.split(/(?=^## )/m);
7
+ let result = sections[0] ?? '';
8
+ for (let i = 1; i < sections.length; i++) {
9
+ if ((result + sections[i]).length > maxChars)
10
+ break;
11
+ result += sections[i];
12
+ }
13
+ return result.trimEnd() + '\n';
14
+ }
15
+ export const windsurfAdapter = {
16
+ name: 'Windsurf',
17
+ detectDirs: ['.windsurf'],
18
+ outputPath: '.windsurf/rules/viui-design-system.md',
19
+ maxChars: 6000,
20
+ transform(markdown) {
21
+ return truncateToFit(markdown, this.maxChars ?? 6000);
22
+ },
23
+ };
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Áp dụng body class theo VITE_VIUI_THEME để SCSS viui-themes (design-style-*) có hiệu lực toàn app.
2
+ * Áp dụng body class theo VITE_VIUI_THEME để SCSS themes (design-style-*) có hiệu lực toàn app.
3
3
  * Import file này trong vuetify.ts (hoặc main.ts) để tự động gắn class khi load; export để gọi khi đổi theme tại runtime.
4
4
  */
5
5
  import { VIUI_DEFAULT_THEME_ID } from './defaults/index'
@@ -11,16 +11,35 @@ const DESIGN_STYLE_PREFIX = 'design-style-'
11
11
  /**
12
12
  * Gắn class `design-style-<id>` lên body, gỡ mọi class `design-style-*` cũ.
13
13
  * Gọi khi khởi động app hoặc khi user đổi theme (vd. từ settings).
14
+ * Hai vòng lặp: (1) gỡ hết design-style-* rồi add một class; (2) gỡ mọi design-style-* khác toAdd (tránh race khi module chạy hai lần hoặc script khác thêm class).
14
15
  */
15
16
  export function applyViuiThemeBodyClass(id: string): void {
16
17
  if (typeof document === 'undefined') return
17
18
  const body = document.body
18
19
  if (!body) return
19
20
  const toAdd = DESIGN_STYLE_PREFIX + id
20
- Array.from(body.classList).forEach((c) => {
21
- if (c.startsWith(DESIGN_STYLE_PREFIX)) body.classList.remove(c)
22
- })
21
+ for (;;) {
22
+ const toRemove = Array.from(body.classList).find((c) => c.startsWith(DESIGN_STYLE_PREFIX))
23
+ if (!toRemove) break
24
+ body.classList.remove(toRemove)
25
+ }
23
26
  body.classList.add(toAdd)
27
+ for (;;) {
28
+ const other = Array.from(body.classList).find((c) => c.startsWith(DESIGN_STYLE_PREFIX) && c !== toAdd)
29
+ if (!other) break
30
+ body.classList.remove(other)
31
+ }
24
32
  }
25
33
 
26
34
  applyViuiThemeBodyClass(themeId)
35
+
36
+ // Dev-only: giúp debug khi theme không áp dụng (giao diện vẫn mặc định)
37
+ try {
38
+ if ((import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV) {
39
+ console.info(
40
+ `[ViUI] Theme: ${themeId} → body class "design-style-${themeId}". Nếu style vẫn mặc định: kiểm tra main.scss có import themes-entry và app có import main.scss.`
41
+ )
42
+ }
43
+ } catch {
44
+ /* no import.meta.env */
45
+ }
@@ -25,6 +25,8 @@ Khi chạy `viui-cli init` hoặc `viui-cli sync`, CLI đồng bộ **viui-theme
25
25
 
26
26
  **Body class (tự động):** Trong `vuetify.ts` (hoặc `main.ts`), thêm một dòng: `import './viui-conf/apply-theme-body'` (hoặc `import '@/plugins/viui-conf/apply-theme-body'`). Khi load, module sẽ đọc `VITE_VIUI_THEME` và gắn class `design-style-<themeId>` lên `body`, nhờ đó style SCSS theme áp toàn app. Đổi theme tại runtime: gọi `import { applyViuiThemeBodyClass } from '@/plugins/viui-conf/apply-theme-body'; applyViuiThemeBodyClass('neo-brutalism')`.
27
27
 
28
+ **Theme không áp dụng (giao diện vẫn mặc định)?** (1) `.env` có `VITE_VIUI_THEME=neo-brutalism` và **restart dev server**. (2) `vuetify.ts` có `import './viui-conf/apply-theme-body'`. (3) Có `src/assets/styles/main.scss` với `@use './viui-themes-entry' as *;` và **app entry (main.ts) import main.scss**. (4) Đã chạy `viui-cli sync` để có `src/assets/styles/viui-themes/`. Console (dev) có log `[ViUI] Theme: neo-brutalism → body class "design-style-neo-brutalism"` nếu body class đã chạy; có log mà style vẫn mặc định → SCSS chưa load (kiểm tra bước 3).
29
+
28
30
  ## Cấu trúc
29
31
 
30
32
  - `index.ts` — merge base + export `getDefaults(themeId?)`, `defaults` (= getDefaults()).
@@ -8,7 +8,7 @@ import type { VuetifyOptions } from 'vuetify'
8
8
  export const appBarDefaults: NonNullable<VuetifyOptions['defaults']> = {
9
9
  VAppBar: {
10
10
  density: 'default',
11
- elevation: 1,
11
+ elevation: 0,
12
12
  color: 'surface',
13
13
  },
14
14
  }
@@ -8,7 +8,7 @@ import type { VuetifyOptions } from 'vuetify'
8
8
  export const buttonDefaults: NonNullable<VuetifyOptions['defaults']> = {
9
9
  VBtn: {
10
10
  variant: 'elevated',
11
- elevation: 1,
11
+ elevation: 0,
12
12
  rounded: 'lg',
13
13
  size: 'default',
14
14
  },
@@ -10,6 +10,6 @@ export const minimalist2ThemeDefaults: NonNullable<VuetifyOptions['defaults']> =
10
10
  variant: 'outlined',
11
11
  },
12
12
  VCard: {
13
- variant: 'flat',
13
+ variant: 'elevated',
14
14
  },
15
15
  }
@@ -6,7 +6,7 @@ import type { VuetifyOptions } from 'vuetify'
6
6
 
7
7
  export const cardDefaults: NonNullable<VuetifyOptions['defaults']> = {
8
8
  VCard: {
9
- elevation: 1,
9
+ elevation: 0,
10
10
  rounded: 'lg',
11
11
  },
12
12
  }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * iNET Design System — Vuetify defaults cho Expansion Panels (VExpansionPanels, VExpansionPanel).
3
+ */
4
+
5
+ import type { VuetifyOptions } from 'vuetify'
6
+
7
+ export const expansionPanelDefaults: NonNullable<VuetifyOptions['defaults']> = {
8
+ VExpansionPanels: {
9
+ variant: 'default',
10
+ eager: false,
11
+ flat: false,
12
+ },
13
+ VExpansionPanel: {
14
+ rounded: 'lg',
15
+ },
16
+ }
@@ -20,6 +20,7 @@ import { mainDefaults } from './main'
20
20
  import { chipDefaults } from './chips'
21
21
  import { avatarDefaults } from './avatars'
22
22
  import { menuDefaults } from './menus'
23
+ import { expansionPanelDefaults } from './expansion-panels'
23
24
  import { getThemeDefaults } from './by-theme'
24
25
 
25
26
  type DefaultsConfig = NonNullable<VuetifyOptions['defaults']>
@@ -59,6 +60,7 @@ const baseDefaults: DefaultsConfig = mergeDefaults(
59
60
  chipDefaults,
60
61
  avatarDefaults,
61
62
  menuDefaults,
63
+ expansionPanelDefaults,
62
64
  )
63
65
 
64
66
  /**
@@ -89,5 +91,6 @@ export { mainDefaults } from './main'
89
91
  export { chipDefaults } from './chips'
90
92
  export { avatarDefaults } from './avatars'
91
93
  export { menuDefaults } from './menus'
94
+ export { expansionPanelDefaults } from './expansion-panels'
92
95
  export { getThemeDefaults, VIUI_DEFAULT_THEME_ID } from './by-theme'
93
96
  export type { ViuiThemeId } from './by-theme'
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * iNET Design System — Vuetify defaults cho form inputs:
3
- * VTextField, VTextarea, VSelect, VAutocomplete, VCheckbox, VRadioGroup, VSwitch.
3
+ * VTextField, VTextarea, VSelect, VAutocomplete, VCheckbox, VRadioGroup, VSwitch, VColorInput (labs).
4
4
  */
5
5
 
6
6
  import type { VuetifyOptions } from 'vuetify'
@@ -39,4 +39,14 @@ export const inputDefaults: NonNullable<VuetifyOptions['defaults']> = {
39
39
  VSwitch: {
40
40
  hideDetails: true,
41
41
  },
42
+ /** Labs — https://vuetifyjs.com/en/components/color-inputs/ */
43
+ VColorInput: {
44
+ variant: 'outlined',
45
+ density: 'default',
46
+ hideDetails: 'auto',
47
+ rounded: 'lg',
48
+ hideActions: true,
49
+ colorPip: true,
50
+ pipLocation: 'prepend-inner',
51
+ },
42
52
  }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * iNET Design System - Design Tokens (Standalone for consumer apps)
3
+ * Replaces the monorepo re-export version that uses @/ alias paths.
4
+ * Sync with src/tokens/design-tokens.ts + src/tokens/inet-design-tokens.ts when tokens change.
5
+ */
6
+
7
+ export const colorTokens = {
8
+ brand: {
9
+ primary: '#0582D4',
10
+ secondary: '#6c757d',
11
+ accent: '#E8353C',
12
+ logo: '#E8353C',
13
+ },
14
+ semantic: {
15
+ success: '#1EE5B8',
16
+ warning: '#FFB74D',
17
+ error: '#B91C1C',
18
+ info: '#2196F3',
19
+ },
20
+ surface: {
21
+ background: '#121212',
22
+ elevated: '#1e1e1e',
23
+ card: '#2a2a2a',
24
+ overlay: 'rgba(0, 0, 0, 0.5)',
25
+ },
26
+ border: {
27
+ default: '#424242',
28
+ subtle: '#303030',
29
+ focus: '#0582D4',
30
+ error: '#B91C1C',
31
+ },
32
+ text: {
33
+ primary: '#e0e0e0',
34
+ secondary: '#b0b0b0',
35
+ disabled: '#6c757d',
36
+ placeholder: '#6c757d',
37
+ inverse: '#121212',
38
+ link: '#2196F3',
39
+ },
40
+ neutral: {
41
+ 0: '#ffffff',
42
+ 50: '#F5F7FA',
43
+ 100: '#e0e0e0',
44
+ 200: '#b0b0b0',
45
+ 300: '#8c8c8c',
46
+ 400: '#6c757d',
47
+ 500: '#4a4a4a',
48
+ 600: '#424242',
49
+ 700: '#303030',
50
+ 800: '#2a2a2a',
51
+ 900: '#1e1e1e',
52
+ 950: '#121212',
53
+ },
54
+ state: {
55
+ hover: 'rgba(255, 255, 255, 0.08)',
56
+ focus: 'rgba(5, 130, 212, 0.24)',
57
+ selected: 'rgba(5, 130, 212, 0.16)',
58
+ pressed: 'rgba(255, 255, 255, 0.12)',
59
+ disabled: 'rgba(255, 255, 255, 0.12)',
60
+ },
61
+ special: {
62
+ glowOrange: '#ff7b00',
63
+ glowPink: '#ff00ff',
64
+ glowCyan: '#00ffff',
65
+ gradientStart: '#0582D4',
66
+ gradientEnd: '#619ee9',
67
+ },
68
+ } as const
69
+
70
+ export const shapeTokens = {
71
+ borderRadius: {
72
+ none: '0',
73
+ sm: '4px',
74
+ base: '8px',
75
+ md: '12px',
76
+ lg: '16px',
77
+ xl: '24px',
78
+ '2xl': '32px',
79
+ full: '9999px',
80
+ },
81
+ } as const
82
+
83
+ export const inetDesignTokens = {
84
+ design_philosophy_title: 'triết lý thiết kế [Simple – Secure – Stable]',
85
+ colors: {
86
+ primary: {
87
+ light: '#024799', dark: '#619ee9', origin: '#0074BC', 500: '#0582D4',
88
+ scaleLight: ['#8abdef','#7eb3e7','#72a8e0','#669ed8','#5a93d0','#4c88c8','#3f7cbf','#3170b7','#2363ae','#1256a4','#024799'],
89
+ scaleDark: ['#619ee9','#5996e1','#528ed9','#4a86d1','#427ec8','#3a76c0','#316eb7','#2965af','#205ca5','#17539c','#0d4992'],
90
+ },
91
+ secondary: { light: '#024799', dark: '#5b4964' },
92
+ accent: {
93
+ light: '#cc0e0e', dark: '#ed7b7b', origin: '#ED1C24', 500: '#E8353C',
94
+ scaleLight: ['#f47e7e','#f17575','#ee6c6c','#eb6464','#e85b5b','#e45151','#e04646','#dc3b3b','#d82e2e','#d21f1f','#cc0e0e'],
95
+ scaleDark: ['#ed7b7b','#e77272','#e16868','#da5f5f','#d45555','#cd4a4a','#c63f3f','#be3333','#b62525','#ac1717','#a10606'],
96
+ },
97
+ tech: { 500: '#22D3EE' },
98
+ neutral: {
99
+ light: {
100
+ 50: '#F4F7FA', 100: '#E8EEF4', 200: '#D0DAE6', 300: '#B0C2D4', 400: '#8FA3B8',
101
+ 500: '#6D8599', 600: '#4A6278', 700: '#2E4A5C', 800: '#1A2F40', 900: '#0F1E2D',
102
+ },
103
+ dark: {
104
+ 50: '#0D1117', 100: '#161B22', 200: '#21262D', 300: '#2D333B', 400: '#3D444D',
105
+ 500: '#545D68', 600: '#768390', 700: '#8B949E', 800: '#B1BAC4', 900: '#E6EDF3',
106
+ },
107
+ keyTokens: {
108
+ light: { bg: '#F4F7FA', border: '#D0DAE6', subtle: '#4A6278', text: '#0F1E2D' },
109
+ dark: { bg: '#0D1117', border: '#21262D', subtle: '#8B949E', text: '#E6EDF3' },
110
+ },
111
+ },
112
+ success: {
113
+ light: { default: '#0E9F6E', surface: '#ECFDF5', border: '#A7F3D0', text: '#065F46' },
114
+ dark: { default: '#34D399', surface: '#0A2A1F', border: '#064E3B', text: '#34D399' },
115
+ },
116
+ warning: {
117
+ light: { default: '#D47B0A', surface: '#FFFBEB', border: '#FDE68A', text: '#92400E' },
118
+ dark: { default: '#FBBF24', surface: '#2A1F06', border: '#78350F', text: '#FBBF24' },
119
+ },
120
+ info: {
121
+ light: { default: '#8abdef', surface: '#EFF6FF', border: '#BFDBFE', text: '#1E40AF' },
122
+ dark: { default: '#619ee9', surface: '#0A1628', border: '#1E3A5F', text: '#93C5FD' },
123
+ },
124
+ error: {
125
+ light: { default: '#B91C1C', surface: '#FEF2F2', border: '#FECACA', text: '#991B1B' },
126
+ dark: { default: '#F87171', surface: '#450A0A', border: '#7F1D1D', text: '#FECACA' },
127
+ },
128
+ },
129
+ typography: {
130
+ 'font-family': "'Be Vietnam Pro', sans-serif",
131
+ 'font-size': { xs: '0.75rem', sm: '0.875rem', base: '1rem', lg: '1.125rem' },
132
+ },
133
+ spacing: { xs: '0.25rem', sm: '0.5rem', md: '1rem', lg: '1.5rem' },
134
+ brand: { 'logo-width': '200px', 'logo-min-height': '38px' },
135
+ } as const
@@ -3,7 +3,7 @@
3
3
  * Extended theme using design tokens as single source of truth
4
4
  */
5
5
 
6
- import { colorTokens } from '@/tokens/design-tokens'
6
+ import { colorTokens } from './design-tokens'
7
7
 
8
8
  /**
9
9
  * Base theme colors shared between light and dark themes
@@ -4,10 +4,8 @@
4
4
  */
5
5
 
6
6
  import type { ThemeDefinition } from 'vuetify'
7
- import ThemeBase from './theme-base.ts'
8
- import { colorTokens } from '@/tokens/design-tokens'
9
- import { shapeTokens } from '@/tokens/design-tokens'
10
- import inetDesignTokens from '@/tokens/inet-design-tokens'
7
+ import ThemeBase from './theme-base'
8
+ import { colorTokens, shapeTokens, inetDesignTokens } from './design-tokens'
11
9
 
12
10
  const DarkTheme: ThemeDefinition = {
13
11
  dark: true,
@@ -27,7 +25,7 @@ const DarkTheme: ThemeDefinition = {
27
25
  'outline-variant': colorTokens.border.subtle,
28
26
  },
29
27
  variables: {
30
- 'border-opacity': 0.2,
28
+ 'border-opacity': 0.6,
31
29
  'high-emphasis-opacity': 0.87,
32
30
  'medium-emphasis-opacity': 0.60,
33
31
  'disabled-opacity': 0.38,
@@ -4,10 +4,8 @@
4
4
  */
5
5
 
6
6
  import type { ThemeDefinition } from 'vuetify'
7
- import ThemeBase from './theme-base.ts'
8
- import { colorTokens } from '@/tokens/design-tokens'
9
- import { shapeTokens } from '@/tokens/design-tokens'
10
- import inetDesignTokens from '@/tokens/inet-design-tokens'
7
+ import ThemeBase from './theme-base'
8
+ import { colorTokens, shapeTokens, inetDesignTokens } from './design-tokens'
11
9
 
12
10
  const LightTheme: ThemeDefinition = {
13
11
  dark: false,
@@ -30,7 +28,7 @@ const LightTheme: ThemeDefinition = {
30
28
  accent: colorTokens.brand.accent,
31
29
  },
32
30
  variables: {
33
- 'border-opacity': 0.12,
31
+ 'border-opacity': 0.35,
34
32
  'high-emphasis-opacity': 0.87,
35
33
  'medium-emphasis-opacity': 0.60,
36
34
  'disabled-opacity': 0.38,
@@ -0,0 +1,36 @@
1
+ // src/plugins/vuetify.ts — Auto-generated by viui-cli init
2
+ // Modify freely; viui sync will NOT overwrite this file.
3
+ import 'vuetify/styles'
4
+ import '@mdi/font/css/materialdesignicons.css'
5
+ import { createVuetify } from 'vuetify'
6
+ import { aliases, mdi } from 'vuetify/iconsets/mdi'
7
+ import * as components from 'vuetify/components'
8
+ import * as directives from 'vuetify/directives'
9
+ import LightTheme from './viui-conf/v-light'
10
+ import DarkTheme from './viui-conf/v-dark'
11
+ import { getDefaults, VIUI_DEFAULT_THEME_ID } from './viui-conf/defaults/index'
12
+ import { applyViuiThemeBodyClass } from './viui-conf/apply-theme-body'
13
+
14
+ /** Read theme from env, fallback to default (minimalist-2). */
15
+ const themeId = import.meta.env.VITE_VIUI_THEME ?? VIUI_DEFAULT_THEME_ID
16
+
17
+ /** Re-export for runtime theme switching (e.g. from a settings page). */
18
+ export { applyViuiThemeBodyClass }
19
+
20
+ export const vuetify = createVuetify({
21
+ components,
22
+ directives,
23
+ defaults: getDefaults(themeId),
24
+ icons: {
25
+ defaultSet: 'mdi',
26
+ aliases,
27
+ sets: { mdi },
28
+ },
29
+ theme: {
30
+ defaultTheme: 'light',
31
+ themes: {
32
+ light: LightTheme,
33
+ dark: DarkTheme,
34
+ },
35
+ },
36
+ })