@fui-org/fui-cli 2.1.4 → 2.2.1

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 (214) hide show
  1. package/README.md +16 -7
  2. package/dist/fui-xg17j3f9.js +396 -0
  3. package/dist/fui.js +1 -1
  4. package/package.json +1 -1
  5. package/skills/fui/SKILL.md +152 -39
  6. package/skills/{fui-skill → fui}/assets/projectdefaultstyle.css +489 -489
  7. package/skills/{fui-skill → fui}/examples/component.vue +162 -162
  8. package/skills/{fui-skill → fui}/references/INDEX.md +4 -5
  9. package/skills/{fui-skill → fui}/references/advanced-techniques.md +170 -168
  10. package/skills/{fui-skill → fui}/references/component-design.md +2 -2
  11. package/skills/{fui-skill → fui}/references/component-quickref.md +78 -78
  12. package/skills/{fui-skill → fui}/references/component-table.md +287 -287
  13. package/skills/{fui-skill → fui}/references/components-dialog.md +191 -191
  14. package/skills/{fui-skill → fui}/references/components-display.md +141 -141
  15. package/skills/{fui-skill → fui}/references/components-echart.md +316 -316
  16. package/skills/{fui-skill → fui}/references/components-input.md +335 -335
  17. package/skills/{fui-skill → fui}/references/controls-patterns.md +2 -2
  18. package/skills/{fui-skill → fui}/references/controls-styling-vocabulary.md +173 -173
  19. package/skills/{fui-skill → fui}/references/db-workflow.md +9 -9
  20. package/skills/{fui-skill → fui}/references/default-function.md +456 -456
  21. package/skills/{fui-skill → fui}/references/design-modes.md +57 -57
  22. package/skills/{fui-skill → fui}/references/echart-templates.md +489 -489
  23. package/skills/{fui-skill → fui}/references/fastproject.md +99 -99
  24. package/skills/{fui-skill → fui}/references/fullstack-workflow.md +314 -313
  25. package/skills/{fui-skill → fui}/references/module-data-patterns.md +117 -117
  26. package/skills/{fui-skill → fui}/references/module-json-anatomy.md +132 -132
  27. package/skills/{fui-skill → fui}/references/module-structure.md +144 -144
  28. package/skills/{fui-skill → fui}/references/new-session.md +3 -20
  29. package/skills/{fui-skill → fui}/references/pdfmake.md +60 -60
  30. package/skills/{fui-skill → fui}/references/permission-system.md +1 -1
  31. package/skills/{fui-skill → fui}/references/platform-architecture.md +269 -269
  32. package/skills/{fui-skill → fui}/references/project-config.md +303 -303
  33. package/skills/{fui-skill → fui}/references/project-provisioning.md +4 -4
  34. package/skills/{fui-skill → fui}/references/script-map.md +262 -262
  35. package/skills/{fui-skill → fui}/references/sql-clr-functions.md +225 -225
  36. package/skills/{fui-skill → fui}/references/system-design.md +3 -3
  37. package/skills/{fui-skill → fui}/references/tapi-permission-patterns.md +156 -156
  38. package/skills/{fui-skill → fui}/references/tapi-reference.md +474 -474
  39. package/skills/fui/references/tools-registry.md +214 -0
  40. package/skills/{fui-skill → fui}/references/ui-crosswindow-patterns.md +321 -321
  41. package/skills/{fui-skill → fui}/references/ui-dialog-patterns.md +255 -255
  42. package/skills/{fui-skill → fui}/references/ui-layout-patterns.md +176 -176
  43. package/skills/{fui-skill → fui}/references/ui-patterns.md +303 -303
  44. package/skills/{fui-skill → fui}/references/ui-screenshot-review.md +95 -95
  45. package/skills/{fui-skill → fui}/references/ui-table-cell-patterns.md +318 -318
  46. package/skills/{fui-skill → fui}/references/verification.md +18 -18
  47. package/skills/{fui-skill → fui}/references/watcher-patterns.md +163 -163
  48. package/skills/{fui-skill → fui}/references/websocket-realtime.md +271 -271
  49. package/skills/{fui-skill → fui}/scripts/component-3.0.js +2715 -2715
  50. package/skills/{fui-skill → fui}/scripts/component.js +3147 -3147
  51. package/skills/{fui-skill → fui}/scripts/componentTable-3.0.js +1038 -1038
  52. package/skills/{fui-skill → fui}/scripts/componentTable.js +891 -891
  53. package/skills/{fui-skill → fui}/scripts/defaultfunction-3.0.js +866 -866
  54. package/skills/{fui-skill → fui}/scripts/defaultfunction.js +1051 -1051
  55. package/skills/{fui-skill → fui}/scripts/fastproject-3.0.js +870 -870
  56. package/skills/{fui-skill → fui}/scripts/fastproject.js +828 -828
  57. package/dist/fui-h4z7zhk2.js +0 -381
  58. package/skills/fui-skill/SKILL.md +0 -139
  59. package/skills/fui-skill/references/tools-registry.md +0 -84
  60. /package/skills/{fui-skill → fui}/assets/projectdefaultstyle-3.0.css +0 -0
  61. /package/skills/{fui-skill → fui}/design-md/airbnb/DESIGN.md +0 -0
  62. /package/skills/{fui-skill → fui}/design-md/airbnb/README.md +0 -0
  63. /package/skills/{fui-skill → fui}/design-md/airtable/DESIGN.md +0 -0
  64. /package/skills/{fui-skill → fui}/design-md/airtable/README.md +0 -0
  65. /package/skills/{fui-skill → fui}/design-md/apple/DESIGN.md +0 -0
  66. /package/skills/{fui-skill → fui}/design-md/apple/README.md +0 -0
  67. /package/skills/{fui-skill → fui}/design-md/asu/DESIGN.md +0 -0
  68. /package/skills/{fui-skill → fui}/design-md/asu/README.md +0 -0
  69. /package/skills/{fui-skill → fui}/design-md/binance/DESIGN.md +0 -0
  70. /package/skills/{fui-skill → fui}/design-md/binance/README.md +0 -0
  71. /package/skills/{fui-skill → fui}/design-md/bmw/DESIGN.md +0 -0
  72. /package/skills/{fui-skill → fui}/design-md/bmw/README.md +0 -0
  73. /package/skills/{fui-skill → fui}/design-md/bmw-m/DESIGN.md +0 -0
  74. /package/skills/{fui-skill → fui}/design-md/bmw-m/README.md +0 -0
  75. /package/skills/{fui-skill → fui}/design-md/bugatti/DESIGN.md +0 -0
  76. /package/skills/{fui-skill → fui}/design-md/bugatti/README.md +0 -0
  77. /package/skills/{fui-skill → fui}/design-md/cal/DESIGN.md +0 -0
  78. /package/skills/{fui-skill → fui}/design-md/cal/README.md +0 -0
  79. /package/skills/{fui-skill → fui}/design-md/claude/DESIGN.md +0 -0
  80. /package/skills/{fui-skill → fui}/design-md/claude/README.md +0 -0
  81. /package/skills/{fui-skill → fui}/design-md/clay/DESIGN.md +0 -0
  82. /package/skills/{fui-skill → fui}/design-md/clay/README.md +0 -0
  83. /package/skills/{fui-skill → fui}/design-md/clickhouse/DESIGN.md +0 -0
  84. /package/skills/{fui-skill → fui}/design-md/clickhouse/README.md +0 -0
  85. /package/skills/{fui-skill → fui}/design-md/cohere/DESIGN.md +0 -0
  86. /package/skills/{fui-skill → fui}/design-md/cohere/README.md +0 -0
  87. /package/skills/{fui-skill → fui}/design-md/coinbase/DESIGN.md +0 -0
  88. /package/skills/{fui-skill → fui}/design-md/coinbase/README.md +0 -0
  89. /package/skills/{fui-skill → fui}/design-md/composio/DESIGN.md +0 -0
  90. /package/skills/{fui-skill → fui}/design-md/composio/README.md +0 -0
  91. /package/skills/{fui-skill → fui}/design-md/cursor/DESIGN.md +0 -0
  92. /package/skills/{fui-skill → fui}/design-md/cursor/README.md +0 -0
  93. /package/skills/{fui-skill → fui}/design-md/elevenlabs/DESIGN.md +0 -0
  94. /package/skills/{fui-skill → fui}/design-md/elevenlabs/README.md +0 -0
  95. /package/skills/{fui-skill → fui}/design-md/expo/DESIGN.md +0 -0
  96. /package/skills/{fui-skill → fui}/design-md/expo/README.md +0 -0
  97. /package/skills/{fui-skill → fui}/design-md/ferrari/DESIGN.md +0 -0
  98. /package/skills/{fui-skill → fui}/design-md/ferrari/README.md +0 -0
  99. /package/skills/{fui-skill → fui}/design-md/figma/DESIGN.md +0 -0
  100. /package/skills/{fui-skill → fui}/design-md/figma/README.md +0 -0
  101. /package/skills/{fui-skill → fui}/design-md/framer/DESIGN.md +0 -0
  102. /package/skills/{fui-skill → fui}/design-md/framer/README.md +0 -0
  103. /package/skills/{fui-skill → fui}/design-md/fui/DESIGN.md +0 -0
  104. /package/skills/{fui-skill → fui}/design-md/hashicorp/DESIGN.md +0 -0
  105. /package/skills/{fui-skill → fui}/design-md/hashicorp/README.md +0 -0
  106. /package/skills/{fui-skill → fui}/design-md/ibm/DESIGN.md +0 -0
  107. /package/skills/{fui-skill → fui}/design-md/ibm/README.md +0 -0
  108. /package/skills/{fui-skill → fui}/design-md/intercom/DESIGN.md +0 -0
  109. /package/skills/{fui-skill → fui}/design-md/intercom/README.md +0 -0
  110. /package/skills/{fui-skill → fui}/design-md/kraken/DESIGN.md +0 -0
  111. /package/skills/{fui-skill → fui}/design-md/kraken/README.md +0 -0
  112. /package/skills/{fui-skill → fui}/design-md/lamborghini/DESIGN.md +0 -0
  113. /package/skills/{fui-skill → fui}/design-md/lamborghini/README.md +0 -0
  114. /package/skills/{fui-skill → fui}/design-md/linear.app/DESIGN.md +0 -0
  115. /package/skills/{fui-skill → fui}/design-md/linear.app/README.md +0 -0
  116. /package/skills/{fui-skill → fui}/design-md/lovable/DESIGN.md +0 -0
  117. /package/skills/{fui-skill → fui}/design-md/lovable/README.md +0 -0
  118. /package/skills/{fui-skill → fui}/design-md/mastercard/DESIGN.md +0 -0
  119. /package/skills/{fui-skill → fui}/design-md/mastercard/README.md +0 -0
  120. /package/skills/{fui-skill → fui}/design-md/meta/DESIGN.md +0 -0
  121. /package/skills/{fui-skill → fui}/design-md/meta/README.md +0 -0
  122. /package/skills/{fui-skill → fui}/design-md/minimax/DESIGN.md +0 -0
  123. /package/skills/{fui-skill → fui}/design-md/minimax/README.md +0 -0
  124. /package/skills/{fui-skill → fui}/design-md/mintlify/DESIGN.md +0 -0
  125. /package/skills/{fui-skill → fui}/design-md/mintlify/README.md +0 -0
  126. /package/skills/{fui-skill → fui}/design-md/miro/DESIGN.md +0 -0
  127. /package/skills/{fui-skill → fui}/design-md/miro/README.md +0 -0
  128. /package/skills/{fui-skill → fui}/design-md/mistral.ai/DESIGN.md +0 -0
  129. /package/skills/{fui-skill → fui}/design-md/mistral.ai/README.md +0 -0
  130. /package/skills/{fui-skill → fui}/design-md/mongodb/DESIGN.md +0 -0
  131. /package/skills/{fui-skill → fui}/design-md/mongodb/README.md +0 -0
  132. /package/skills/{fui-skill → fui}/design-md/nike/DESIGN.md +0 -0
  133. /package/skills/{fui-skill → fui}/design-md/nike/README.md +0 -0
  134. /package/skills/{fui-skill → fui}/design-md/notion/DESIGN.md +0 -0
  135. /package/skills/{fui-skill → fui}/design-md/notion/README.md +0 -0
  136. /package/skills/{fui-skill → fui}/design-md/nvidia/DESIGN.md +0 -0
  137. /package/skills/{fui-skill → fui}/design-md/nvidia/README.md +0 -0
  138. /package/skills/{fui-skill → fui}/design-md/ollama/DESIGN.md +0 -0
  139. /package/skills/{fui-skill → fui}/design-md/ollama/README.md +0 -0
  140. /package/skills/{fui-skill → fui}/design-md/opencode.ai/DESIGN.md +0 -0
  141. /package/skills/{fui-skill → fui}/design-md/opencode.ai/README.md +0 -0
  142. /package/skills/{fui-skill → fui}/design-md/pinterest/DESIGN.md +0 -0
  143. /package/skills/{fui-skill → fui}/design-md/pinterest/README.md +0 -0
  144. /package/skills/{fui-skill → fui}/design-md/playstation/DESIGN.md +0 -0
  145. /package/skills/{fui-skill → fui}/design-md/playstation/README.md +0 -0
  146. /package/skills/{fui-skill → fui}/design-md/posthog/DESIGN.md +0 -0
  147. /package/skills/{fui-skill → fui}/design-md/posthog/README.md +0 -0
  148. /package/skills/{fui-skill → fui}/design-md/raycast/DESIGN.md +0 -0
  149. /package/skills/{fui-skill → fui}/design-md/raycast/README.md +0 -0
  150. /package/skills/{fui-skill → fui}/design-md/renault/DESIGN.md +0 -0
  151. /package/skills/{fui-skill → fui}/design-md/renault/README.md +0 -0
  152. /package/skills/{fui-skill → fui}/design-md/replicate/DESIGN.md +0 -0
  153. /package/skills/{fui-skill → fui}/design-md/replicate/README.md +0 -0
  154. /package/skills/{fui-skill → fui}/design-md/resend/DESIGN.md +0 -0
  155. /package/skills/{fui-skill → fui}/design-md/resend/README.md +0 -0
  156. /package/skills/{fui-skill → fui}/design-md/revolut/DESIGN.md +0 -0
  157. /package/skills/{fui-skill → fui}/design-md/revolut/README.md +0 -0
  158. /package/skills/{fui-skill → fui}/design-md/runwayml/DESIGN.md +0 -0
  159. /package/skills/{fui-skill → fui}/design-md/runwayml/README.md +0 -0
  160. /package/skills/{fui-skill → fui}/design-md/sanity/DESIGN.md +0 -0
  161. /package/skills/{fui-skill → fui}/design-md/sanity/README.md +0 -0
  162. /package/skills/{fui-skill → fui}/design-md/sentry/DESIGN.md +0 -0
  163. /package/skills/{fui-skill → fui}/design-md/sentry/README.md +0 -0
  164. /package/skills/{fui-skill → fui}/design-md/shopify/DESIGN.md +0 -0
  165. /package/skills/{fui-skill → fui}/design-md/shopify/README.md +0 -0
  166. /package/skills/{fui-skill → fui}/design-md/slack/DESIGN.md +0 -0
  167. /package/skills/{fui-skill → fui}/design-md/spacex/DESIGN.md +0 -0
  168. /package/skills/{fui-skill → fui}/design-md/spacex/README.md +0 -0
  169. /package/skills/{fui-skill → fui}/design-md/spotify/DESIGN.md +0 -0
  170. /package/skills/{fui-skill → fui}/design-md/spotify/README.md +0 -0
  171. /package/skills/{fui-skill → fui}/design-md/starbucks/DESIGN.md +0 -0
  172. /package/skills/{fui-skill → fui}/design-md/starbucks/README.md +0 -0
  173. /package/skills/{fui-skill → fui}/design-md/stripe/DESIGN.md +0 -0
  174. /package/skills/{fui-skill → fui}/design-md/stripe/README.md +0 -0
  175. /package/skills/{fui-skill → fui}/design-md/supabase/DESIGN.md +0 -0
  176. /package/skills/{fui-skill → fui}/design-md/supabase/README.md +0 -0
  177. /package/skills/{fui-skill → fui}/design-md/superhuman/DESIGN.md +0 -0
  178. /package/skills/{fui-skill → fui}/design-md/superhuman/README.md +0 -0
  179. /package/skills/{fui-skill → fui}/design-md/tesla/DESIGN.md +0 -0
  180. /package/skills/{fui-skill → fui}/design-md/tesla/README.md +0 -0
  181. /package/skills/{fui-skill → fui}/design-md/theverge/DESIGN.md +0 -0
  182. /package/skills/{fui-skill → fui}/design-md/theverge/README.md +0 -0
  183. /package/skills/{fui-skill → fui}/design-md/together.ai/DESIGN.md +0 -0
  184. /package/skills/{fui-skill → fui}/design-md/together.ai/README.md +0 -0
  185. /package/skills/{fui-skill → fui}/design-md/uber/DESIGN.md +0 -0
  186. /package/skills/{fui-skill → fui}/design-md/uber/README.md +0 -0
  187. /package/skills/{fui-skill → fui}/design-md/vercel/DESIGN.md +0 -0
  188. /package/skills/{fui-skill → fui}/design-md/vercel/README.md +0 -0
  189. /package/skills/{fui-skill → fui}/design-md/vodafone/DESIGN.md +0 -0
  190. /package/skills/{fui-skill → fui}/design-md/vodafone/README.md +0 -0
  191. /package/skills/{fui-skill → fui}/design-md/voltagent/DESIGN.md +0 -0
  192. /package/skills/{fui-skill → fui}/design-md/voltagent/README.md +0 -0
  193. /package/skills/{fui-skill → fui}/design-md/warp/DESIGN.md +0 -0
  194. /package/skills/{fui-skill → fui}/design-md/warp/README.md +0 -0
  195. /package/skills/{fui-skill → fui}/design-md/webflow/DESIGN.md +0 -0
  196. /package/skills/{fui-skill → fui}/design-md/webflow/README.md +0 -0
  197. /package/skills/{fui-skill → fui}/design-md/wired/DESIGN.md +0 -0
  198. /package/skills/{fui-skill → fui}/design-md/wired/README.md +0 -0
  199. /package/skills/{fui-skill → fui}/design-md/wise/DESIGN.md +0 -0
  200. /package/skills/{fui-skill → fui}/design-md/wise/README.md +0 -0
  201. /package/skills/{fui-skill → fui}/design-md/x.ai/DESIGN.md +0 -0
  202. /package/skills/{fui-skill → fui}/design-md/x.ai/README.md +0 -0
  203. /package/skills/{fui-skill → fui}/design-md/zapier/DESIGN.md +0 -0
  204. /package/skills/{fui-skill → fui}/design-md/zapier/README.md +0 -0
  205. /package/skills/{fui-skill → fui}/examples/f-table-patterns.json +0 -0
  206. /package/skills/{fui-skill → fui}/examples/module-patterns.json +0 -0
  207. /package/skills/{fui-skill → fui}/examples/project-patterns.json +0 -0
  208. /package/skills/{fui-skill → fui}/references/coding-standards.md +0 -0
  209. /package/skills/{fui-skill → fui}/references/db-table-design.md +0 -0
  210. /package/skills/{fui-skill → fui}/references/fsheet.md +0 -0
  211. /package/skills/{fui-skill → fui}/references/tapi-file-api.md +0 -0
  212. /package/skills/{fui-skill → fui}/references/ui-templates.md +0 -0
  213. /package/skills/{fui-skill → fui}/scripts/fechart.js +0 -0
  214. /package/skills/{fui-skill → fui}/scripts/fsheet.js +0 -0
@@ -1,162 +1,162 @@
1
- <template>
2
- <div class="uc-component-name">
3
- <v-card outlined>
4
- <v-card-title v-if="title" class="subtitle-1 font-weight-bold">
5
- <slot name="title">
6
- {{ title }}
7
- </slot>
8
- </v-card-title>
9
-
10
- <v-card-text>
11
- <div v-if="loading">
12
- <slot name="loading">
13
- Loading...
14
- </slot>
15
- </div>
16
- <div v-else-if="!hasItems">
17
- <slot name="empty">
18
- No data
19
- </slot>
20
- </div>
21
- <div v-else>
22
- <slot :items="localItems" :selected-item="localValue">
23
- <v-list dense>
24
- <v-list-item
25
- v-for="(item, index) in localItems"
26
- :key="item.id || item.value || index"
27
- @click="handleSelect(item)"
28
- >
29
- <v-list-item-content>
30
- <v-list-item-title>{{ getItemLabel(item) }}</v-list-item-title>
31
- </v-list-item-content>
32
- </v-list-item>
33
- </v-list>
34
- </slot>
35
-
36
- <v-btn
37
- v-if="showAction"
38
- small
39
- color="primary"
40
- :disabled="disabled"
41
- @click="handleAction"
42
- >
43
- {{ actionLabel }}
44
- </v-btn>
45
- </div>
46
- </v-card-text>
47
- </v-card>
48
- </div>
49
- </template>
50
-
51
- <script>
52
- /**
53
- * Description: Reusable starter component. Prefer generic props, emits, and slots.
54
- * Usage: <uc-component-name :items="rows" :value="selectedRow" @select="handleSelect"></uc-component-name>
55
- * NOTE: No "name:" property — FUI resolves name from filename automatically.
56
- */
57
- export default {
58
- props: {
59
- title: {
60
- type: String,
61
- default: ''
62
- },
63
- value: {
64
- type: [String, Number, Object, Array],
65
- default: null
66
- },
67
- items: {
68
- type: Array,
69
- default: function() {
70
- return [];
71
- }
72
- },
73
- itemText: {
74
- type: String,
75
- default: 'label'
76
- },
77
- loading: {
78
- type: Boolean,
79
- default: false
80
- },
81
- disabled: {
82
- type: Boolean,
83
- default: false
84
- },
85
- showAction: {
86
- type: Boolean,
87
- default: true
88
- },
89
- actionLabel: {
90
- type: String,
91
- default: 'Action'
92
- },
93
- options: {
94
- type: Object,
95
- default: function() {
96
- return {};
97
- }
98
- }
99
- },
100
- data() {
101
- return {
102
- localValue: null,
103
- localItems: []
104
- }
105
- },
106
- computed: {
107
- hasItems() {
108
- return this.localItems.length > 0;
109
- },
110
- resolvedItemText() {
111
- return this.options.itemText || this.itemText;
112
- },
113
- resolvedItemValue() {
114
- return this.options.itemValue || 'value';
115
- }
116
- },
117
- watch: {
118
- value: {
119
- handler(val) {
120
- this.localValue = val;
121
- },
122
- immediate: true
123
- },
124
- items: {
125
- handler(val) {
126
- this.localItems = Array.isArray(val) ? val : [];
127
- },
128
- immediate: true
129
- }
130
- },
131
- methods: {
132
- getItemLabel(item) {
133
- if (!item || typeof item !== 'object') {
134
- return item;
135
- }
136
-
137
- return item[this.resolvedItemText] || item.label || item.name || '';
138
- },
139
- getItemValue(item) {
140
- if (!item || typeof item !== 'object') {
141
- return item;
142
- }
143
-
144
- return item[this.resolvedItemValue] || item.value || item.id || item;
145
- },
146
- handleSelect(item) {
147
- var nextValue = this.getItemValue(item);
148
- this.localValue = nextValue;
149
- this.$emit('input', nextValue);
150
- this.$emit('select', item);
151
- this.$emit('change', nextValue);
152
- },
153
- handleAction() {
154
- this.$emit('action', {
155
- value: this.localValue,
156
- items: this.localItems
157
- });
158
- }
159
- }
160
- }
161
- </script>
162
-
1
+ <template>
2
+ <div class="uc-component-name">
3
+ <v-card outlined>
4
+ <v-card-title v-if="title" class="subtitle-1 font-weight-bold">
5
+ <slot name="title">
6
+ {{ title }}
7
+ </slot>
8
+ </v-card-title>
9
+
10
+ <v-card-text>
11
+ <div v-if="loading">
12
+ <slot name="loading">
13
+ Loading...
14
+ </slot>
15
+ </div>
16
+ <div v-else-if="!hasItems">
17
+ <slot name="empty">
18
+ No data
19
+ </slot>
20
+ </div>
21
+ <div v-else>
22
+ <slot :items="localItems" :selected-item="localValue">
23
+ <v-list dense>
24
+ <v-list-item
25
+ v-for="(item, index) in localItems"
26
+ :key="item.id || item.value || index"
27
+ @click="handleSelect(item)"
28
+ >
29
+ <v-list-item-content>
30
+ <v-list-item-title>{{ getItemLabel(item) }}</v-list-item-title>
31
+ </v-list-item-content>
32
+ </v-list-item>
33
+ </v-list>
34
+ </slot>
35
+
36
+ <v-btn
37
+ v-if="showAction"
38
+ small
39
+ color="primary"
40
+ :disabled="disabled"
41
+ @click="handleAction"
42
+ >
43
+ {{ actionLabel }}
44
+ </v-btn>
45
+ </div>
46
+ </v-card-text>
47
+ </v-card>
48
+ </div>
49
+ </template>
50
+
51
+ <script>
52
+ /**
53
+ * Description: Reusable starter component. Prefer generic props, emits, and slots.
54
+ * Usage: <uc-component-name :items="rows" :value="selectedRow" @select="handleSelect"></uc-component-name>
55
+ * NOTE: No "name:" property — FUI resolves name from filename automatically.
56
+ */
57
+ export default {
58
+ props: {
59
+ title: {
60
+ type: String,
61
+ default: ''
62
+ },
63
+ value: {
64
+ type: [String, Number, Object, Array],
65
+ default: null
66
+ },
67
+ items: {
68
+ type: Array,
69
+ default: function() {
70
+ return [];
71
+ }
72
+ },
73
+ itemText: {
74
+ type: String,
75
+ default: 'label'
76
+ },
77
+ loading: {
78
+ type: Boolean,
79
+ default: false
80
+ },
81
+ disabled: {
82
+ type: Boolean,
83
+ default: false
84
+ },
85
+ showAction: {
86
+ type: Boolean,
87
+ default: true
88
+ },
89
+ actionLabel: {
90
+ type: String,
91
+ default: 'Action'
92
+ },
93
+ options: {
94
+ type: Object,
95
+ default: function() {
96
+ return {};
97
+ }
98
+ }
99
+ },
100
+ data() {
101
+ return {
102
+ localValue: null,
103
+ localItems: []
104
+ }
105
+ },
106
+ computed: {
107
+ hasItems() {
108
+ return this.localItems.length > 0;
109
+ },
110
+ resolvedItemText() {
111
+ return this.options.itemText || this.itemText;
112
+ },
113
+ resolvedItemValue() {
114
+ return this.options.itemValue || 'value';
115
+ }
116
+ },
117
+ watch: {
118
+ value: {
119
+ handler(val) {
120
+ this.localValue = val;
121
+ },
122
+ immediate: true
123
+ },
124
+ items: {
125
+ handler(val) {
126
+ this.localItems = Array.isArray(val) ? val : [];
127
+ },
128
+ immediate: true
129
+ }
130
+ },
131
+ methods: {
132
+ getItemLabel(item) {
133
+ if (!item || typeof item !== 'object') {
134
+ return item;
135
+ }
136
+
137
+ return item[this.resolvedItemText] || item.label || item.name || '';
138
+ },
139
+ getItemValue(item) {
140
+ if (!item || typeof item !== 'object') {
141
+ return item;
142
+ }
143
+
144
+ return item[this.resolvedItemValue] || item.value || item.id || item;
145
+ },
146
+ handleSelect(item) {
147
+ var nextValue = this.getItemValue(item);
148
+ this.localValue = nextValue;
149
+ this.$emit('input', nextValue);
150
+ this.$emit('select', item);
151
+ this.$emit('change', nextValue);
152
+ },
153
+ handleAction() {
154
+ this.$emit('action', {
155
+ value: this.localValue,
156
+ items: this.localItems
157
+ });
158
+ }
159
+ }
160
+ }
161
+ </script>
162
+
@@ -14,7 +14,7 @@ Load: `fui skill ref references/a.md references/b.md` (several at once OK).
14
14
 
15
15
  - FUI anatomy, Project→Module hierarchy (import/component/set merge), runtime, vueData/v_Set → `platform-architecture.md`
16
16
  - module.json's 4 parts (data/watch/controls/set) → `module-json-anatomy.md`
17
- - `HTMLOnly: true`: server embeds NO library (Vue/Vuetify/jQuery/lodash/MDI/`projectdefaultstyle.css` absent); declare all in the module; `script-map.md` does NOT apply → `module-structure.md` §HTMLOnly=true: KHÔNG có thư viện nào được nhúng sẵn
17
+ - `HTMLOnly: true`: server embeds NO library (Vue/Vuetify/jQuery/lodash/MDI/`projectdefaultstyle.css` absent); declare all in the module; `script-map.md` does NOT apply → `module-structure.md` §"HTMLOnly=true: no library is embedded"
18
18
 
19
19
  ## UI / components
20
20
 
@@ -57,7 +57,7 @@ Load: `fui skill ref references/a.md references/b.md` (several at once OK).
57
57
  ## User permissions
58
58
 
59
59
  - `SystemRight` (level) vs `FunctionRight` (per function), `v-if`/menu `right`, `fui right system|function list/new/update/delete` (8 commands) → `permission-system.md`
60
- - Guarding control/menu/SP with a right code — it must exist; how to create → `permission-system.md` (§"mã quyền phải TỒN TẠI trước khi đem gác")
60
+ - Guarding control/menu/SP with a right code — it must exist; how to create → `permission-system.md` (§"A right code must EXIST before guarding with it")
61
61
  - SQL permission checks in SP body → `tapi-permission-patterns.md`
62
62
 
63
63
  ## Database
@@ -83,7 +83,7 @@ Load: `fui skill ref references/a.md references/b.md` (several at once OK).
83
83
  - Ordered commands (reset → reload → toast) in `CALLBACK`/`:action`/`watch`/`THEN` → `controls-patterns.md` §CORE RULE
84
84
  - v_old, deep-watch, cascading → `watcher-patterns.md`
85
85
  - EXE, MAP, complex expressions → `advanced-techniques.md`
86
- - Blank page with 0 JS errors and 0 Vue warns, or complex logic in `:attr` `:option` `:config` → `advanced-techniques.md` §1 + `fui module validate`
86
+ - Blank page (often with no JS error to trace), or complex logic in `:attr` `:option` `:config` → `advanced-techniques.md` §1 + `fui module validate`
87
87
  - `… is not defined` at render, or `EXE`/`FUN` doing nothing → `advanced-techniques.md` §2 (function must exist in `script.js`; `fui module publish script`). ⚠️ `fui module validate` misses this; use `fui module simulate --render`
88
88
  - Built-in utilities (openWindow, ajaxCALL, jsonToExcel, groupBy…) → `default-function.md`
89
89
  - Bundled libs (jQuery, lodash, moment, numeral, toast, jquery-confirm) — check before adding a CDN; ⚠️ `HTMLOnly=false` only → `script-map.md` §0
@@ -95,10 +95,9 @@ Load: `fui skill ref references/a.md references/b.md` (several at once OK).
95
95
  ## Operations / publish
96
96
 
97
97
  - "new session" / "phiên mới" / "cửa sổ mới": open another Claude Code CLI in its own terminal window (workspace root resolved dynamically, NEVER hard-coded) → `new-session.md`
98
- - Hand work / instructions to another running Claude session (coordinating several sessions, a multi-AI workflow, parallelizing work per module) — `ListAgents`/`SendMessage` → `new-session.md` §6
99
98
  - Per-command safety (R/M, Safe/Confirm/Destructive), strict mode, `fui sp verify`, error log → `tools-registry.md`
100
99
  - Pre-publish definition-of-done (`fui module validate` + `fui module outline` + `fui module simulate` + static `fui sp verify`) → `verification.md`
101
- - UI broken, cause unknown — cheapest verification layer (symptom → layer; read BEFORE `--render`, reread after ≥2 renders without progress) → `verification.md` §Chọn tầng kiểm chứng
100
+ - UI broken, cause unknown — cheapest verification layer (symptom → layer; read BEFORE `--render`, reread after ≥2 renders without progress) → `verification.md` §"Pick the tier by SYMPTOM"
102
101
 
103
102
  ## Design system
104
103