@fui-org/fui-cli 0.1.1 → 0.3.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 (212) hide show
  1. package/README.md +18 -3
  2. package/dist/fui.js +160 -43
  3. package/package.json +4 -2
  4. package/skills/fui/SKILL.md +131 -66
  5. package/skills/fui-skill/README.md +112 -0
  6. package/skills/fui-skill/SKILL.md +269 -0
  7. package/skills/fui-skill/assets/projectdefaultstyle.css +518 -0
  8. package/skills/fui-skill/design-md/airbnb/DESIGN.md +545 -0
  9. package/skills/fui-skill/design-md/airbnb/README.md +5 -0
  10. package/skills/fui-skill/design-md/airtable/DESIGN.md +554 -0
  11. package/skills/fui-skill/design-md/airtable/README.md +5 -0
  12. package/skills/fui-skill/design-md/apple/DESIGN.md +562 -0
  13. package/skills/fui-skill/design-md/apple/README.md +5 -0
  14. package/skills/fui-skill/design-md/asu/DESIGN.md +179 -0
  15. package/skills/fui-skill/design-md/asu/README.md +107 -0
  16. package/skills/fui-skill/design-md/binance/DESIGN.md +634 -0
  17. package/skills/fui-skill/design-md/binance/README.md +5 -0
  18. package/skills/fui-skill/design-md/bmw/DESIGN.md +544 -0
  19. package/skills/fui-skill/design-md/bmw/README.md +5 -0
  20. package/skills/fui-skill/design-md/bmw-m/DESIGN.md +503 -0
  21. package/skills/fui-skill/design-md/bmw-m/README.md +5 -0
  22. package/skills/fui-skill/design-md/bugatti/DESIGN.md +454 -0
  23. package/skills/fui-skill/design-md/bugatti/README.md +5 -0
  24. package/skills/fui-skill/design-md/cal/DESIGN.md +542 -0
  25. package/skills/fui-skill/design-md/cal/README.md +5 -0
  26. package/skills/fui-skill/design-md/claude/DESIGN.md +589 -0
  27. package/skills/fui-skill/design-md/claude/README.md +5 -0
  28. package/skills/fui-skill/design-md/clay/DESIGN.md +541 -0
  29. package/skills/fui-skill/design-md/clay/README.md +5 -0
  30. package/skills/fui-skill/design-md/clickhouse/DESIGN.md +544 -0
  31. package/skills/fui-skill/design-md/clickhouse/README.md +5 -0
  32. package/skills/fui-skill/design-md/cohere/DESIGN.md +451 -0
  33. package/skills/fui-skill/design-md/cohere/README.md +5 -0
  34. package/skills/fui-skill/design-md/coinbase/DESIGN.md +570 -0
  35. package/skills/fui-skill/design-md/coinbase/README.md +5 -0
  36. package/skills/fui-skill/design-md/composio/DESIGN.md +506 -0
  37. package/skills/fui-skill/design-md/composio/README.md +5 -0
  38. package/skills/fui-skill/design-md/cursor/DESIGN.md +537 -0
  39. package/skills/fui-skill/design-md/cursor/README.md +5 -0
  40. package/skills/fui-skill/design-md/elevenlabs/DESIGN.md +504 -0
  41. package/skills/fui-skill/design-md/elevenlabs/README.md +5 -0
  42. package/skills/fui-skill/design-md/expo/DESIGN.md +526 -0
  43. package/skills/fui-skill/design-md/expo/README.md +5 -0
  44. package/skills/fui-skill/design-md/ferrari/DESIGN.md +531 -0
  45. package/skills/fui-skill/design-md/ferrari/README.md +5 -0
  46. package/skills/fui-skill/design-md/figma/DESIGN.md +578 -0
  47. package/skills/fui-skill/design-md/figma/README.md +5 -0
  48. package/skills/fui-skill/design-md/framer/DESIGN.md +544 -0
  49. package/skills/fui-skill/design-md/framer/README.md +5 -0
  50. package/skills/fui-skill/design-md/fui/DESIGN.md +532 -0
  51. package/skills/fui-skill/design-md/hashicorp/DESIGN.md +575 -0
  52. package/skills/fui-skill/design-md/hashicorp/README.md +5 -0
  53. package/skills/fui-skill/design-md/ibm/DESIGN.md +550 -0
  54. package/skills/fui-skill/design-md/ibm/README.md +5 -0
  55. package/skills/fui-skill/design-md/intercom/DESIGN.md +546 -0
  56. package/skills/fui-skill/design-md/intercom/README.md +5 -0
  57. package/skills/fui-skill/design-md/kraken/DESIGN.md +125 -0
  58. package/skills/fui-skill/design-md/kraken/README.md +5 -0
  59. package/skills/fui-skill/design-md/lamborghini/DESIGN.md +288 -0
  60. package/skills/fui-skill/design-md/lamborghini/README.md +5 -0
  61. package/skills/fui-skill/design-md/linear.app/DESIGN.md +548 -0
  62. package/skills/fui-skill/design-md/linear.app/README.md +5 -0
  63. package/skills/fui-skill/design-md/lovable/DESIGN.md +298 -0
  64. package/skills/fui-skill/design-md/lovable/README.md +5 -0
  65. package/skills/fui-skill/design-md/mastercard/DESIGN.md +365 -0
  66. package/skills/fui-skill/design-md/mastercard/README.md +5 -0
  67. package/skills/fui-skill/design-md/meta/DESIGN.md +683 -0
  68. package/skills/fui-skill/design-md/meta/README.md +5 -0
  69. package/skills/fui-skill/design-md/minimax/DESIGN.md +746 -0
  70. package/skills/fui-skill/design-md/minimax/README.md +5 -0
  71. package/skills/fui-skill/design-md/mintlify/DESIGN.md +852 -0
  72. package/skills/fui-skill/design-md/mintlify/README.md +5 -0
  73. package/skills/fui-skill/design-md/miro/DESIGN.md +825 -0
  74. package/skills/fui-skill/design-md/miro/README.md +5 -0
  75. package/skills/fui-skill/design-md/mistral.ai/DESIGN.md +773 -0
  76. package/skills/fui-skill/design-md/mistral.ai/README.md +5 -0
  77. package/skills/fui-skill/design-md/mongodb/DESIGN.md +767 -0
  78. package/skills/fui-skill/design-md/mongodb/README.md +5 -0
  79. package/skills/fui-skill/design-md/nike/DESIGN.md +575 -0
  80. package/skills/fui-skill/design-md/nike/README.md +5 -0
  81. package/skills/fui-skill/design-md/notion/DESIGN.md +821 -0
  82. package/skills/fui-skill/design-md/notion/README.md +5 -0
  83. package/skills/fui-skill/design-md/nvidia/DESIGN.md +640 -0
  84. package/skills/fui-skill/design-md/nvidia/README.md +5 -0
  85. package/skills/fui-skill/design-md/ollama/DESIGN.md +539 -0
  86. package/skills/fui-skill/design-md/ollama/README.md +5 -0
  87. package/skills/fui-skill/design-md/opencode.ai/DESIGN.md +521 -0
  88. package/skills/fui-skill/design-md/opencode.ai/README.md +5 -0
  89. package/skills/fui-skill/design-md/pinterest/DESIGN.md +597 -0
  90. package/skills/fui-skill/design-md/pinterest/README.md +5 -0
  91. package/skills/fui-skill/design-md/playstation/DESIGN.md +661 -0
  92. package/skills/fui-skill/design-md/playstation/README.md +5 -0
  93. package/skills/fui-skill/design-md/posthog/DESIGN.md +690 -0
  94. package/skills/fui-skill/design-md/posthog/README.md +5 -0
  95. package/skills/fui-skill/design-md/raycast/DESIGN.md +669 -0
  96. package/skills/fui-skill/design-md/raycast/README.md +5 -0
  97. package/skills/fui-skill/design-md/renault/DESIGN.md +589 -0
  98. package/skills/fui-skill/design-md/renault/README.md +5 -0
  99. package/skills/fui-skill/design-md/replicate/DESIGN.md +616 -0
  100. package/skills/fui-skill/design-md/replicate/README.md +5 -0
  101. package/skills/fui-skill/design-md/resend/DESIGN.md +585 -0
  102. package/skills/fui-skill/design-md/resend/README.md +5 -0
  103. package/skills/fui-skill/design-md/revolut/DESIGN.md +636 -0
  104. package/skills/fui-skill/design-md/revolut/README.md +5 -0
  105. package/skills/fui-skill/design-md/runwayml/DESIGN.md +244 -0
  106. package/skills/fui-skill/design-md/runwayml/README.md +5 -0
  107. package/skills/fui-skill/design-md/sanity/DESIGN.md +357 -0
  108. package/skills/fui-skill/design-md/sanity/README.md +5 -0
  109. package/skills/fui-skill/design-md/sentry/DESIGN.md +551 -0
  110. package/skills/fui-skill/design-md/sentry/README.md +5 -0
  111. package/skills/fui-skill/design-md/shopify/DESIGN.md +516 -0
  112. package/skills/fui-skill/design-md/shopify/README.md +5 -0
  113. package/skills/fui-skill/design-md/slack/DESIGN.md +482 -0
  114. package/skills/fui-skill/design-md/spacex/DESIGN.md +363 -0
  115. package/skills/fui-skill/design-md/spacex/README.md +5 -0
  116. package/skills/fui-skill/design-md/spotify/DESIGN.md +246 -0
  117. package/skills/fui-skill/design-md/spotify/README.md +5 -0
  118. package/skills/fui-skill/design-md/starbucks/DESIGN.md +580 -0
  119. package/skills/fui-skill/design-md/starbucks/README.md +5 -0
  120. package/skills/fui-skill/design-md/stripe/DESIGN.md +487 -0
  121. package/skills/fui-skill/design-md/stripe/README.md +5 -0
  122. package/skills/fui-skill/design-md/supabase/DESIGN.md +462 -0
  123. package/skills/fui-skill/design-md/supabase/README.md +5 -0
  124. package/skills/fui-skill/design-md/superhuman/DESIGN.md +448 -0
  125. package/skills/fui-skill/design-md/superhuman/README.md +5 -0
  126. package/skills/fui-skill/design-md/tesla/DESIGN.md +286 -0
  127. package/skills/fui-skill/design-md/tesla/README.md +5 -0
  128. package/skills/fui-skill/design-md/theverge/DESIGN.md +339 -0
  129. package/skills/fui-skill/design-md/theverge/README.md +5 -0
  130. package/skills/fui-skill/design-md/together.ai/DESIGN.md +633 -0
  131. package/skills/fui-skill/design-md/together.ai/README.md +5 -0
  132. package/skills/fui-skill/design-md/uber/DESIGN.md +636 -0
  133. package/skills/fui-skill/design-md/uber/README.md +5 -0
  134. package/skills/fui-skill/design-md/vercel/DESIGN.md +736 -0
  135. package/skills/fui-skill/design-md/vercel/README.md +5 -0
  136. package/skills/fui-skill/design-md/vodafone/DESIGN.md +538 -0
  137. package/skills/fui-skill/design-md/vodafone/README.md +5 -0
  138. package/skills/fui-skill/design-md/voltagent/DESIGN.md +521 -0
  139. package/skills/fui-skill/design-md/voltagent/README.md +5 -0
  140. package/skills/fui-skill/design-md/warp/DESIGN.md +526 -0
  141. package/skills/fui-skill/design-md/warp/README.md +5 -0
  142. package/skills/fui-skill/design-md/webflow/DESIGN.md +588 -0
  143. package/skills/fui-skill/design-md/webflow/README.md +5 -0
  144. package/skills/fui-skill/design-md/wired/DESIGN.md +497 -0
  145. package/skills/fui-skill/design-md/wired/README.md +5 -0
  146. package/skills/fui-skill/design-md/wise/DESIGN.md +544 -0
  147. package/skills/fui-skill/design-md/wise/README.md +5 -0
  148. package/skills/fui-skill/design-md/x.ai/DESIGN.md +465 -0
  149. package/skills/fui-skill/design-md/x.ai/README.md +5 -0
  150. package/skills/fui-skill/design-md/zapier/DESIGN.md +537 -0
  151. package/skills/fui-skill/design-md/zapier/README.md +5 -0
  152. package/skills/fui-skill/examples/component.vue +162 -0
  153. package/skills/fui-skill/examples/f-table-patterns.json +331 -0
  154. package/skills/fui-skill/examples/module-patterns.json +973 -0
  155. package/skills/fui-skill/examples/project-patterns.json +222 -0
  156. package/skills/fui-skill/metadata.json +75 -0
  157. package/skills/fui-skill/references/INDEX.md +144 -0
  158. package/skills/fui-skill/references/advanced-techniques.md +160 -0
  159. package/skills/fui-skill/references/coding-standards.md +112 -0
  160. package/skills/fui-skill/references/component-design.md +455 -0
  161. package/skills/fui-skill/references/component-quickref.md +77 -0
  162. package/skills/fui-skill/references/component-table.md +276 -0
  163. package/skills/fui-skill/references/components-dialog.md +192 -0
  164. package/skills/fui-skill/references/components-display.md +147 -0
  165. package/skills/fui-skill/references/components-echart.md +391 -0
  166. package/skills/fui-skill/references/components-input.md +359 -0
  167. package/skills/fui-skill/references/controls-patterns.md +847 -0
  168. package/skills/fui-skill/references/controls-styling-vocabulary.md +140 -0
  169. package/skills/fui-skill/references/db-table-design.md +77 -0
  170. package/skills/fui-skill/references/db-workflow.md +504 -0
  171. package/skills/fui-skill/references/default-function.md +415 -0
  172. package/skills/fui-skill/references/design-modes.md +85 -0
  173. package/skills/fui-skill/references/echart-templates.md +481 -0
  174. package/skills/fui-skill/references/fastproject.md +97 -0
  175. package/skills/fui-skill/references/fsheet.md +218 -0
  176. package/skills/fui-skill/references/fullstack-workflow.md +351 -0
  177. package/skills/fui-skill/references/module-data-patterns.md +126 -0
  178. package/skills/fui-skill/references/module-json-anatomy.md +137 -0
  179. package/skills/fui-skill/references/module-structure.md +260 -0
  180. package/skills/fui-skill/references/new-session.md +108 -0
  181. package/skills/fui-skill/references/pdfmake.md +60 -0
  182. package/skills/fui-skill/references/permission-system.md +169 -0
  183. package/skills/fui-skill/references/platform-architecture.md +294 -0
  184. package/skills/fui-skill/references/project-config.md +335 -0
  185. package/skills/fui-skill/references/project-provisioning.md +383 -0
  186. package/skills/fui-skill/references/script-map.md +296 -0
  187. package/skills/fui-skill/references/sql-clr-functions.md +224 -0
  188. package/skills/fui-skill/references/system-design.md +116 -0
  189. package/skills/fui-skill/references/tapi-file-api.md +191 -0
  190. package/skills/fui-skill/references/tapi-permission-patterns.md +158 -0
  191. package/skills/fui-skill/references/tapi-reference.md +549 -0
  192. package/skills/fui-skill/references/tools-registry.md +460 -0
  193. package/skills/fui-skill/references/ui-crosswindow-patterns.md +317 -0
  194. package/skills/fui-skill/references/ui-dialog-patterns.md +229 -0
  195. package/skills/fui-skill/references/ui-layout-patterns.md +176 -0
  196. package/skills/fui-skill/references/ui-patterns.md +315 -0
  197. package/skills/fui-skill/references/ui-screenshot-review.md +94 -0
  198. package/skills/fui-skill/references/ui-table-cell-patterns.md +316 -0
  199. package/skills/fui-skill/references/ui-templates.md +29 -0
  200. package/skills/fui-skill/references/verification.md +246 -0
  201. package/skills/fui-skill/references/watcher-patterns.md +196 -0
  202. package/skills/fui-skill/references/websocket-realtime.md +254 -0
  203. package/skills/fui-skill/scripts/component-3.0.js +2549 -0
  204. package/skills/fui-skill/scripts/component.js +3142 -0
  205. package/skills/fui-skill/scripts/componentTable-3.0.js +909 -0
  206. package/skills/fui-skill/scripts/componentTable.js +769 -0
  207. package/skills/fui-skill/scripts/defaultfunction-3.0.js +781 -0
  208. package/skills/fui-skill/scripts/defaultfunction.js +966 -0
  209. package/skills/fui-skill/scripts/fastproject-3.0.js +870 -0
  210. package/skills/fui-skill/scripts/fastproject.js +828 -0
  211. package/skills/fui-skill/scripts/fechart.js +890 -0
  212. package/skills/fui-skill/scripts/fsheet.js +1330 -0
@@ -0,0 +1,140 @@
1
+ # Controls Styling — Bộ từ vựng layout được duyệt (chỉ dùng thế này)
2
+
3
+ > File này sở hữu: **bộ class/prop/style được duyệt cho `controls` và `.vue`, thứ tự ưu tiên khi trình bày**. Chọn chế độ thẩm mỹ + giới hạn `border-radius` xem [design-modes.md](design-modes.md).
4
+
5
+ **Quy tắc số 1: KHÔNG tự thêm `style` và `class` để "làm đẹp" UI.** Chỉ dùng đúng bộ từ vựng dưới đây — được rút trích từ 78 file `module.json` thực tế của 5 dự án (contest-score, security-manager, fp, lhu-test, lhu-lib). Nếu người mô tả không yêu cầu một hiệu ứng/khoảng cách/màu cụ thể → **không thêm gì cả**. Layout của FUI (grid + Vuetify + theme project) đã đủ đẹp và nhất quán.
6
+
7
+ > Thống kê thực tế: trong 1.284 control object, chỉ ~12% dùng `attr.style` (gần như chỉ để đặt `width`), và **không có class tùy chỉnh nào** — 100% là class tiện ích chuẩn của Vuetify. AI hay mắc lỗi thêm `style="padding/margin/border/box-shadow/border-radius/background"` và class tự chế → **đừng làm vậy.**
8
+
9
+ ---
10
+
11
+ ## Nguyên tắc
12
+
13
+ 1. **Mặc định: không style, không class.** Chỉ đặt `el`, `attr` (v-model/label/:items/:action…), `w`, `col` khi cần chia cột.
14
+ 2. Cần khoảng cách/căn lề → dùng **class tiện ích Vuetify** trong bảng dưới, KHÔNG viết `style`.
15
+ 3. `style` chỉ dùng cho **`width` cố định** của field lọc (`style: "width:200px"`) — không dùng cho padding/margin/border/color/background.
16
+ 4. Màu sắc: dùng prop component (`color="primary"`) hoặc class `primary--text`/`error--text` — không `style="color:#..."`.
17
+ 5. **Không** tự thêm `border`, `border-radius`, `box-shadow`, `background`, `padding`, custom class → trừ khi user yêu cầu rõ.
18
+ 6. **Padding gọn — mặc định `pa-2`.** Khi cần padding, dùng `pa-2` (hoặc `pa-1`/`pa-0`); **KHÔNG dùng padding lớn** (`pa-4`, `pa-6`, `pa-8`...) gây lãng phí không gian màn hình. Tương tự margin: ưu tiên `-1`/`-2`, tránh `-6`/`-8`.
19
+ 7. **Khi user *có* yêu cầu trình bày cụ thể — theo đúng thứ tự ưu tiên này**, chỉ xuống nấc sau khi nấc trước không đáp ứng được:
20
+ `prop của component` (`color`, `outlined`, `dense`, `elevation`) → `class tiện ích Vuetify` (`pa-*`, `ma-*`, `d-flex`, `text-*`, `primary--text`) → `mw-*` cho bề rộng → custom class → inline `style` (**cuối cùng**).
21
+
22
+ ---
23
+
24
+ ## 1. `prop` của container / row (grid wrapper)
25
+
26
+ Container ngoài cùng và mỗi row chỉ dùng các token sau (theo tần suất thực tế):
27
+
28
+ | Token | Dùng để | Tần suất |
29
+ |---|---|---|
30
+ | `grid-list-md` | Khoảng cách chuẩn giữa các cột (container) | rất cao |
31
+ | `fluid` | Container rộng hết chiều ngang | cao |
32
+ | `row` | Đánh dấu row | rất cao |
33
+ | `align-center` | **Canh giữa theo chiều dọc** các control trong cùng một row, nhất là khi khác loại/khác chiều cao | cao |
34
+ | `justify-center` | Căn giữa nội dung theo chiều ngang | rất cao |
35
+ | `justify-left` / `justify-end` / `justify-start` | Căn trái / phải | vừa |
36
+ | `text-center` / `text-left` | Căn text | vừa |
37
+ | `mw-800` `mw-1000` `mw-1200` `mw-1400` | **Giới hạn bề rộng nội dung** (FUI class) — trang form/nhập liệu căn giữa | vừa |
38
+ | `hidden-container` | Bọc dialog (v-dialog/f-dialog) — không chiếm layout | dùng cho dialog |
39
+ | `grid-list-lg` | Khoảng cách rộng hơn grid-list-md | thấp |
40
+ | `pa-0` / `py-0` | Bỏ padding container khi cần sát mép | thấp |
41
+ | `page-container` / `page-navigation` | Layout filter-bar sticky (xem ui-layout-patterns.md) | hiếm |
42
+
43
+ > **Công thức mặc định** cho một trang bình thường: container `"fluid grid-list-md"`, mỗi row `"row"`. Hàng có nhiều loại control/chiều cao khác nhau dùng `"row wrap align-center"` để cùng trục giữa theo chiều dọc; `justify-center` chỉ là căn giữa theo chiều ngang. Trang form nhập liệu: thêm `mw-1000`/`mw-1200` để giới hạn bề rộng.
44
+
45
+ ## 2. `col` (cột grid bao ngoài control)
46
+
47
+ `col` chỉ dùng cho: chia độ rộng, hoặc căn/thu gọn cột. Token thực dùng:
48
+
49
+ | Token | Dùng để |
50
+ |---|---|
51
+ | `shrink` | **Field lọc bề rộng cố định** (không giãn) — phổ biến nhất. **Bắt buộc mỗi khi `w` là px**; viết `"class": "shrink"`, KHÔNG phải `"shrink": true` (dạng sau trơ ở V3) |
52
+ | `text-end` / `text-start` / `text-center` | Căn nội dung trong cột |
53
+ | `pa-0` | Bỏ padding cột |
54
+ | `align-self-center` | Căn giữa theo chiều dọc |
55
+
56
+ `col` có thể viết dạng chuỗi ngắn `"text-end"` hoặc object `{ "class": "shrink" }`. Thêm `"v-if": "..."` vào `col` để ẩn/hiện cả cột theo quyền/điều kiện.
57
+
58
+ > Ưu tiên `align-center` trên row để canh đồng bộ cả hàng. Chỉ dùng `align-self-center` trên `col`
59
+ > khi duy nhất một control cần sửa trục. Không bù lệch dọc bằng margin hoặc inline style.
60
+
61
+ ## 3. `attr.class` (class trên chính control)
62
+
63
+ Chỉ dùng class tiện ích Vuetify. Nhóm thực dùng:
64
+
65
+ | Nhóm | Token |
66
+ |---|---|
67
+ | Margin | `mt-1 mt-2 mt-3` · `mb-1 mb-2 mb-4` · `my-2` · `ml-1 ml-2` · `mr-1 mr-2` |
68
+ | Padding | `pa-0 pa-2` · `pt-3` · `py-1` — **tránh `pa-4/6/8`** (lãng phí không gian) |
69
+ | Flex | `d-flex` · `flex-column` · `align-center` · `justify-center` · `justify-end` · `flex-grow-0` · `flex-wrap` · `flex-md-grow-0` |
70
+ | Text | `text-center` · `text-left` · `text-right` |
71
+ | Cỡ chữ / đậm | `text-h6` · `subtitle-1` · `body-2` · `caption` · `font-weight-bold` · `font-weight-medium` |
72
+ | Màu chữ (V2) | `primary--text` · `error--text` · `grey--text` · `white--text` — **chỉ hoạt động trên FUI V2 (Vuetify 1.5)** (cú pháp `--text` suffix) |
73
+ | Màu chữ (V3) | `text-primary` · `text-error` · `text-grey` · `text-white` — cú pháp utility class của **Vuetify 3** (`text-{color}`). Dùng sai version thì class không có effect, không báo lỗi |
74
+ | Màu nền | prop `color="primary"` trên component, hoặc class nền Vuetify `primary` · `grey lighten-4` |
75
+ | Bo góc | `rounded` · `rounded-lg` · `rounded-0` |
76
+ | Đổ bóng / phẳng | prop `elevation="0"` / `flat` / `outlined` trên `v-card`/`v-btn` |
77
+ | Ẩn/hiện theo breakpoint | `d-none d-md-flex`... |
78
+ | Kích thước | prop component (`max-width`, `width`, `dense`, `small`, `x-large`) — không `style="width:..."` trừ khi cần px cố định. Riêng icon: giữ kích thước mặc định, **không tự thêm `small`/`:small`** |
79
+
80
+ ### Kích thước icon
81
+
82
+ - Khi thiết kế UI, icon dùng kích thước mặc định của component và theme.
83
+ - **Không tự ý đặt `small` hoặc `:small`** cho `v-icon`, nút icon, hay button có icon chỉ để làm giao diện “gọn” hơn.
84
+ - Chỉ thu nhỏ icon khi user yêu cầu rõ, hoặc một component/pattern chuyên biệt đã quy định kích thước đó; khi ấy ghi đúng prop ở đúng component, không thu nhỏ cả button ngoài ý muốn.
85
+
86
+ **Trước khi đặt một class mới → tra bảng trên.** Chỉ được định nghĩa class riêng khi cần thứ Vuetify
87
+ không có sẵn: grid-template phức tạp, animation, pseudo-element (`::before`), selector con đặc thù.
88
+ Khi đó đặt trong `header.html`, tên class có prefix rõ ràng, **số lượng tối thiểu** — không tái tạo
89
+ lại card/badge/spacing mà Vuetify đã có.
90
+
91
+ > `flex-md-grow-0` + `col: { class: "shrink" }` + `style: "width:200px"` = **field lọc bề rộng cố định** — pattern chuẩn cho toolbar (xem [ui-patterns.md](ui-patterns.md) §4). Đây là chỗ hợp lệ duy nhất để dùng `style` (chỉ `width`).
92
+
93
+ ---
94
+
95
+ ## 4. Cách chia độ rộng: `w` (KHÔNG dùng style/class cho việc này)
96
+
97
+ | `w` | Ý nghĩa |
98
+ |---|---|
99
+ | `1`–`12` | Số cột grid (12 = full row) |
100
+ | `>= 25` (vd `250`) | Bề rộng cố định theo px — **bắt buộc kèm `col: { "class": "shrink" }`**, thiếu thì con số px vô tác dụng |
101
+ | `13`–`24` | **Không dùng** — vùng chết, V2 ra px còn V3 ra class không tồn tại |
102
+ | `""` (rỗng) | Tự co theo nội dung |
103
+
104
+ Chia cột **luôn dùng `w`**, không dùng `style="width:..%"` hay class `col-6` tự chế.
105
+
106
+ Số đo và lý do đầy đủ: [controls-patterns.md](controls-patterns.md) §`w` dạng pixel.
107
+
108
+ ---
109
+
110
+ ## 5. Đối chiếu ĐÚNG / SAI
111
+
112
+ ```json
113
+ // ✅ ĐÚNG — gọn, dùng w + prop chuẩn, không style thừa
114
+ { "el": "v-text-field", "w": 6, "attr": { "v-model": "hoTen", "label": "Họ tên" } }
115
+
116
+ // ❌ SAI — style/class tự chế không cần thiết
117
+ { "el": "v-text-field", "w": 6, "attr": {
118
+ "v-model": "hoTen", "label": "Họ tên",
119
+ "style": "padding:8px; border:1px solid #ddd; border-radius:8px; margin-bottom:12px",
120
+ "class": "my-custom-input rounded-lg shadow" } }
121
+ ```
122
+
123
+ ```json
124
+ // ✅ ĐÚNG — card mặc định của Vuetify, không tự style
125
+ { "el": "v-card", "attr": { "class": "pa-2" }, "innerHTML": [ ... ] }
126
+
127
+ // ❌ SAI — tự vẽ lại card
128
+ { "el": "v-card", "attr": { "style": "background:#fff; box-shadow:0 4px 12px rgba(0,0,0,.1); border-radius:16px; padding:24px" } }
129
+ ```
130
+
131
+ ---
132
+
133
+ ## 6. Khi nào ĐƯỢC thêm style/class
134
+
135
+ Chỉ khi **người mô tả yêu cầu rõ** một yêu cầu trình bày cụ thể (ví dụ "cho khối này nền xám", "giới hạn bề rộng 800px", "chữ này màu đỏ"). Kể cả khi đó:
136
+ - Ưu tiên prop component → class tiện ích Vuetify → `mw-*` cho bề rộng → cuối cùng mới `style`.
137
+ - Nếu áp `border-radius` theo yêu cầu: tuân giới hạn trong [design-modes.md](design-modes.md) (khung lớn ≤12px, vừa ≤8px, nhỏ ≤6px).
138
+ - Không viết `<style>` trong `.vue`; CSS đặt ở `header.html`.
139
+
140
+ > Tóm lại: **thấy mình sắp gõ `style` hoặc đặt tên class mới → dừng lại và hỏi "user có yêu cầu cái này không?". Nếu không → bỏ đi.**
@@ -0,0 +1,77 @@
1
+ # Quy tắc thiết kế bảng (Table Design Conventions)
2
+
3
+ > File này sở hữu: **quy tắc thiết kế bảng: đặt tên, PK/FK, cột audit, kiểu dữ liệu**. Workflow kết nối/SP xem [db-workflow.md](db-workflow.md).
4
+
5
+ Quy ước đặt tên bảng, khóa chính, và cột audit khi thiết kế database cho FUI. Load file này khi thiết kế schema mới.
6
+
7
+ > **Lưu ý về DDL — sửa cấu trúc thì được, mất dữ liệu thì không:** `ALTER TABLE ... ADD` (thêm cột/ràng buộc) và `DROP CONSTRAINT` **chạy thẳng qua tool**; `ALTER COLUMN` (đổi kiểu) chạy được nhưng **cần `confirmWrite: true`** vì thu hẹp độ chính xác số/thời gian mất dữ liệu âm thầm. `CREATE TABLE`, `DROP COLUMN`, `DROP TABLE` thì **chặn cứng**, phải do lập trình viên tự chạy. Quy ước đặt tên dưới đây là tài liệu — AI trình bày DDL để user duyệt trước khi chạy.
8
+ >
9
+ > Kết nối DB, dbToken, schema, workflow SP: xem [db-workflow.md](db-workflow.md). Thiết kế app nhiều bảng/module: xem [system-design.md](system-design.md).
10
+
11
+ ---
12
+
13
+ ## Đặt tên bảng
14
+
15
+ | Nhóm | Quy tắc | Ví dụ |
16
+ |---|---|---|
17
+ | Bảng hệ thống / danh mục bổ trợ | Chữ thường, không tiền tố | `syslog`, `syslogtype`, `syspermission` |
18
+ | Bảng nghiệp vụ / thực thể chính | Tiền tố `tbl` + PascalCase | `tblUsers`, `tblDepartments`, `tblSession` |
19
+
20
+ **Khóa chính:** `[TênThựcThể]ID` — ghép tên thực thể + `ID`
21
+
22
+ | Bảng | Khóa chính |
23
+ |---|---|
24
+ | `tblUsers` | `UserID` |
25
+ | `tblDepartments` | `DepartmentID` |
26
+ | `tblSession` | `SessionID` |
27
+
28
+ > Nhất quán: FK ở bảng con dùng cùng tên với PK bảng cha — `UserID` không đổi thành `CreatorID` hay `OwnerID`.
29
+
30
+ ---
31
+
32
+ ## Trường thời gian (Timestamp)
33
+
34
+ Mỗi bảng nên có ít nhất một trường timestamp để truy vết mốc thời gian:
35
+
36
+ ```sql
37
+ [CreateTime] [datetime] DEFAULT (getdate())
38
+ [UpdateTime] [datetime] DEFAULT (getdate())
39
+ ```
40
+
41
+ - Kiểu dữ liệu: `datetime`
42
+ - `DEFAULT (getdate())` — SQL Server **tự điền** khi INSERT, không cần truyền từ code
43
+ - Dùng `CreateTime` cho bảng chỉ ghi một lần; `UpdateTime` cho bảng cập nhật thường xuyên; cả hai khi cần phân biệt ngày tạo vs ngày sửa cuối
44
+
45
+ ---
46
+
47
+ ## Trường định danh người thực hiện (User Tracking)
48
+
49
+ ```sql
50
+ [CreateUser] [char](9) NULL
51
+ [UpdateUser] [char](9) NULL
52
+ ```
53
+
54
+ - Kiểu dữ liệu: `char(9)` hoặc `varchar(20)` — **đồng bộ với kiểu dữ liệu của `UserID` trong `tblUsers`**
55
+ - **Không có DEFAULT** — ứng dụng bắt buộc phải truyền `UserID` của user đang đăng nhập
56
+ - SQL Server không tự biết user nào đang thao tác qua FUI/tAPI — trách nhiệm thuộc về code
57
+ - Trong SP: nhận qua `@sys_UserID` (tAPI auto-inject), lưu vào `[CreateUser]` / `[UpdateUser]`
58
+
59
+ ```sql
60
+ CREATE PROCEDURE spAPI_EntityInsert
61
+ @Name nvarchar(100),
62
+ @sys_UserID int -- tAPI auto-inject UserID
63
+ AS
64
+ INSERT INTO tblEntity (Name, CreateUser, CreateTime)
65
+ VALUES (@Name, @sys_UserID, DEFAULT)
66
+ ```
67
+
68
+ ---
69
+
70
+ ## Template cột audit — copy-paste khi tạo bảng mới
71
+
72
+ ```sql
73
+ [CreateUser] [char](9) NULL,
74
+ [CreateTime] [datetime] DEFAULT (getdate()),
75
+ [UpdateUser] [char](9) NULL,
76
+ [UpdateTime] [datetime] DEFAULT (getdate()),
77
+ ```