@kupola/kupola 1.2.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 (354) hide show
  1. package/CHANGELOG.md +130 -0
  2. package/INTEGRATION.md +440 -0
  3. package/PROJECT_SUMMARY.md +312 -0
  4. package/README.md +286 -0
  5. package/SKILL.md +572 -0
  6. package/css/accessibility.css +119 -0
  7. package/css/animations.css +224 -0
  8. package/css/brand-themes.css +300 -0
  9. package/css/colors_and_type.css +441 -0
  10. package/css/components-ext.css +4165 -0
  11. package/css/components.css +1483 -0
  12. package/css/kupola.css +12 -0
  13. package/css/responsive.css +697 -0
  14. package/css/scaffold.css +145 -0
  15. package/css/states.css +316 -0
  16. package/css/theme-dark.css +296 -0
  17. package/css/theme-light.css +296 -0
  18. package/css/utilities.css +171 -0
  19. package/dist/css/kupola.css +12 -0
  20. package/dist/icons/icons/activity.svg +3 -0
  21. package/dist/icons/icons/alert-circle.svg +1 -0
  22. package/dist/icons/icons/alert-triangle.svg +1 -0
  23. package/dist/icons/icons/alert.d27e24.svg +1 -0
  24. package/dist/icons/icons/alert.svg +1 -0
  25. package/dist/icons/icons/apple.svg +1 -0
  26. package/dist/icons/icons/arrow-down.svg +1 -0
  27. package/dist/icons/icons/arrow-expand.svg +1 -0
  28. package/dist/icons/icons/arrow-left.svg +1 -0
  29. package/dist/icons/icons/arrow-minimize.svg +1 -0
  30. package/dist/icons/icons/arrow-right-to-line.svg +1 -0
  31. package/dist/icons/icons/arrow-right.svg +1 -0
  32. package/dist/icons/icons/arrow-up-right.svg +1 -0
  33. package/dist/icons/icons/arrow-up.0c0c0d.svg +1 -0
  34. package/dist/icons/icons/arrow-up.svg +1 -0
  35. package/dist/icons/icons/at.svg +1 -0
  36. package/dist/icons/icons/atom.0c0c0d.svg +1 -0
  37. package/dist/icons/icons/atom.svg +1 -0
  38. package/dist/icons/icons/bar-chart-2.svg +1 -0
  39. package/dist/icons/icons/bar.svg +1 -0
  40. package/dist/icons/icons/bell.svg +1 -0
  41. package/dist/icons/icons/box.svg +1 -0
  42. package/dist/icons/icons/bug.svg +1 -0
  43. package/dist/icons/icons/button.svg +1 -0
  44. package/dist/icons/icons/calendar.svg +1 -0
  45. package/dist/icons/icons/check-circle.33c192.svg +1 -0
  46. package/dist/icons/icons/check-circle.svg +1 -0
  47. package/dist/icons/icons/check-square.svg +4 -0
  48. package/dist/icons/icons/check.d1d3db.svg +1 -0
  49. package/dist/icons/icons/check.svg +1 -0
  50. package/dist/icons/icons/chevron-down.svg +1 -0
  51. package/dist/icons/icons/chevron-left.svg +1 -0
  52. package/dist/icons/icons/chevron-right.svg +1 -0
  53. package/dist/icons/icons/chevron-up.svg +1 -0
  54. package/dist/icons/icons/circle.svg +1 -0
  55. package/dist/icons/icons/clock.svg +1 -0
  56. package/dist/icons/icons/cmd.svg +1 -0
  57. package/dist/icons/icons/code.svg +1 -0
  58. package/dist/icons/icons/columns.svg +1 -0
  59. package/dist/icons/icons/copy.svg +1 -0
  60. package/dist/icons/icons/cpu.svg +1 -0
  61. package/dist/icons/icons/dashboard.0c0c0d.svg +1 -0
  62. package/dist/icons/icons/dashboard.svg +1 -0
  63. package/dist/icons/icons/dollar.svg +1 -0
  64. package/dist/icons/icons/download.svg +1 -0
  65. package/dist/icons/icons/edit.svg +1 -0
  66. package/dist/icons/icons/extensions.svg +1 -0
  67. package/dist/icons/icons/external.svg +1 -0
  68. package/dist/icons/icons/eye.svg +1 -0
  69. package/dist/icons/icons/file-text.svg +1 -0
  70. package/dist/icons/icons/file.svg +1 -0
  71. package/dist/icons/icons/files.svg +1 -0
  72. package/dist/icons/icons/filter.svg +1 -0
  73. package/dist/icons/icons/folder-open.svg +4 -0
  74. package/dist/icons/icons/folder.svg +1 -0
  75. package/dist/icons/icons/gear.svg +1 -0
  76. package/dist/icons/icons/git.svg +1 -0
  77. package/dist/icons/icons/github.svg +1 -0
  78. package/dist/icons/icons/globe.svg +1 -0
  79. package/dist/icons/icons/grid-2x2.svg +1 -0
  80. package/dist/icons/icons/hash.svg +1 -0
  81. package/dist/icons/icons/heart.svg +1 -0
  82. package/dist/icons/icons/help-circle.svg +5 -0
  83. package/dist/icons/icons/help.svg +1 -0
  84. package/dist/icons/icons/home.svg +1 -0
  85. package/dist/icons/icons/icons.svg +153 -0
  86. package/dist/icons/icons/image.svg +1 -0
  87. package/dist/icons/icons/info-circle.svg +1 -0
  88. package/dist/icons/icons/info-square.svg +1 -0
  89. package/dist/icons/icons/info.387bff.svg +1 -0
  90. package/dist/icons/icons/info.svg +1 -0
  91. package/dist/icons/icons/input.svg +1 -0
  92. package/dist/icons/icons/key.svg +1 -0
  93. package/dist/icons/icons/layers.svg +1 -0
  94. package/dist/icons/icons/layout-grid.svg +6 -0
  95. package/dist/icons/icons/layout.svg +1 -0
  96. package/dist/icons/icons/link.svg +1 -0
  97. package/dist/icons/icons/list.svg +1 -0
  98. package/dist/icons/icons/lock.svg +1 -0
  99. package/dist/icons/icons/log-out.svg +1 -0
  100. package/dist/icons/icons/logo.svg +1 -0
  101. package/dist/icons/icons/mail.svg +1 -0
  102. package/dist/icons/icons/menu.svg +1 -0
  103. package/dist/icons/icons/message-circle.svg +1 -0
  104. package/dist/icons/icons/message-plus.svg +1 -0
  105. package/dist/icons/icons/message-square.svg +1 -0
  106. package/dist/icons/icons/mic.svg +1 -0
  107. package/dist/icons/icons/minus.svg +1 -0
  108. package/dist/icons/icons/moon.svg +1 -0
  109. package/dist/icons/icons/more-h.svg +1 -0
  110. package/dist/icons/icons/mouse.svg +1 -0
  111. package/dist/icons/icons/palette.svg +1 -0
  112. package/dist/icons/icons/panel-bottom.svg +1 -0
  113. package/dist/icons/icons/pause.svg +1 -0
  114. package/dist/icons/icons/play.svg +1 -0
  115. package/dist/icons/icons/plug.svg +1 -0
  116. package/dist/icons/icons/plus.0c0c0d.svg +1 -0
  117. package/dist/icons/icons/plus.svg +1 -0
  118. package/dist/icons/icons/refresh.svg +1 -0
  119. package/dist/icons/icons/ruler.svg +1 -0
  120. package/dist/icons/icons/scroll-text.svg +1 -0
  121. package/dist/icons/icons/search-menu.svg +1 -0
  122. package/dist/icons/icons/search.svg +1 -0
  123. package/dist/icons/icons/send.0c0c0d.svg +1 -0
  124. package/dist/icons/icons/send.svg +1 -0
  125. package/dist/icons/icons/settings.0c0c0d.svg +1 -0
  126. package/dist/icons/icons/settings.svg +1 -0
  127. package/dist/icons/icons/shield.svg +1 -0
  128. package/dist/icons/icons/sidebar-left.svg +1 -0
  129. package/dist/icons/icons/sidebar-right.svg +1 -0
  130. package/dist/icons/icons/sliders.svg +1 -0
  131. package/dist/icons/icons/sparkles.32f08c.svg +1 -0
  132. package/dist/icons/icons/sparkles.svg +1 -0
  133. package/dist/icons/icons/square.svg +1 -0
  134. package/dist/icons/icons/star.svg +1 -0
  135. package/dist/icons/icons/sun.svg +1 -0
  136. package/dist/icons/icons/table.svg +1 -0
  137. package/dist/icons/icons/terminal.svg +1 -0
  138. package/dist/icons/icons/trash.svg +1 -0
  139. package/dist/icons/icons/trending-down.svg +1 -0
  140. package/dist/icons/icons/trending-up.svg +1 -0
  141. package/dist/icons/icons/type.svg +1 -0
  142. package/dist/icons/icons/upload.svg +1 -0
  143. package/dist/icons/icons/user-circle.svg +1 -0
  144. package/dist/icons/icons/user-plus.svg +6 -0
  145. package/dist/icons/icons/user.svg +1 -0
  146. package/dist/icons/icons/users.svg +1 -0
  147. package/dist/icons/icons/warning.svg +1 -0
  148. package/dist/icons/icons/wrench.svg +1 -0
  149. package/dist/icons/icons/x-circle.svg +1 -0
  150. package/dist/icons/icons/x.svg +1 -0
  151. package/dist/icons/icons/zap.0c0c0d.svg +1 -0
  152. package/dist/icons/icons/zap.svg +1 -0
  153. package/dist/kupola.cjs.js +258 -0
  154. package/dist/kupola.cjs.js.map +1 -0
  155. package/dist/kupola.esm.js +7640 -0
  156. package/dist/kupola.esm.js.map +1 -0
  157. package/dist/kupola.umd.js +258 -0
  158. package/dist/kupola.umd.js.map +1 -0
  159. package/dist/types/kupola.d.ts +1359 -0
  160. package/dist/utils/utils/Kupola.cs +77 -0
  161. package/dist/utils/utils/Kupola.java +104 -0
  162. package/dist/utils/utils/kupola.go +120 -0
  163. package/dist/utils/utils/kupola.js +63 -0
  164. package/dist/utils/utils/kupola.py +1392 -0
  165. package/dist/utils/utils/kupola.rb +69 -0
  166. package/icons/activity.svg +3 -0
  167. package/icons/alert-circle.svg +1 -0
  168. package/icons/alert-triangle.svg +1 -0
  169. package/icons/alert.d27e24.svg +1 -0
  170. package/icons/alert.svg +1 -0
  171. package/icons/apple.svg +1 -0
  172. package/icons/arrow-down.svg +1 -0
  173. package/icons/arrow-expand.svg +1 -0
  174. package/icons/arrow-left.svg +1 -0
  175. package/icons/arrow-minimize.svg +1 -0
  176. package/icons/arrow-right-to-line.svg +1 -0
  177. package/icons/arrow-right.svg +1 -0
  178. package/icons/arrow-up-right.svg +1 -0
  179. package/icons/arrow-up.0c0c0d.svg +1 -0
  180. package/icons/arrow-up.svg +1 -0
  181. package/icons/at.svg +1 -0
  182. package/icons/atom.0c0c0d.svg +1 -0
  183. package/icons/atom.svg +1 -0
  184. package/icons/bar-chart-2.svg +1 -0
  185. package/icons/bar.svg +1 -0
  186. package/icons/bell.svg +1 -0
  187. package/icons/box.svg +1 -0
  188. package/icons/bug.svg +1 -0
  189. package/icons/button.svg +1 -0
  190. package/icons/calendar.svg +1 -0
  191. package/icons/check-circle.33c192.svg +1 -0
  192. package/icons/check-circle.svg +1 -0
  193. package/icons/check-square.svg +4 -0
  194. package/icons/check.d1d3db.svg +1 -0
  195. package/icons/check.svg +1 -0
  196. package/icons/chevron-down.svg +1 -0
  197. package/icons/chevron-left.svg +1 -0
  198. package/icons/chevron-right.svg +1 -0
  199. package/icons/chevron-up.svg +1 -0
  200. package/icons/circle.svg +1 -0
  201. package/icons/clock.svg +1 -0
  202. package/icons/cmd.svg +1 -0
  203. package/icons/code.svg +1 -0
  204. package/icons/columns.svg +1 -0
  205. package/icons/copy.svg +1 -0
  206. package/icons/cpu.svg +1 -0
  207. package/icons/dashboard.0c0c0d.svg +1 -0
  208. package/icons/dashboard.svg +1 -0
  209. package/icons/dollar.svg +1 -0
  210. package/icons/download.svg +1 -0
  211. package/icons/edit.svg +1 -0
  212. package/icons/extensions.svg +1 -0
  213. package/icons/external.svg +1 -0
  214. package/icons/eye.svg +1 -0
  215. package/icons/file-text.svg +1 -0
  216. package/icons/file.svg +1 -0
  217. package/icons/files.svg +1 -0
  218. package/icons/filter.svg +1 -0
  219. package/icons/folder-open.svg +4 -0
  220. package/icons/folder.svg +1 -0
  221. package/icons/gear.svg +1 -0
  222. package/icons/git.svg +1 -0
  223. package/icons/github.svg +1 -0
  224. package/icons/globe.svg +1 -0
  225. package/icons/grid-2x2.svg +1 -0
  226. package/icons/hash.svg +1 -0
  227. package/icons/heart.svg +1 -0
  228. package/icons/help-circle.svg +5 -0
  229. package/icons/help.svg +1 -0
  230. package/icons/home.svg +1 -0
  231. package/icons/icons.svg +153 -0
  232. package/icons/image.svg +1 -0
  233. package/icons/info-circle.svg +1 -0
  234. package/icons/info-square.svg +1 -0
  235. package/icons/info.387bff.svg +1 -0
  236. package/icons/info.svg +1 -0
  237. package/icons/input.svg +1 -0
  238. package/icons/key.svg +1 -0
  239. package/icons/layers.svg +1 -0
  240. package/icons/layout-grid.svg +6 -0
  241. package/icons/layout.svg +1 -0
  242. package/icons/link.svg +1 -0
  243. package/icons/list.svg +1 -0
  244. package/icons/lock.svg +1 -0
  245. package/icons/log-out.svg +1 -0
  246. package/icons/logo.svg +1 -0
  247. package/icons/mail.svg +1 -0
  248. package/icons/menu.svg +1 -0
  249. package/icons/message-circle.svg +1 -0
  250. package/icons/message-plus.svg +1 -0
  251. package/icons/message-square.svg +1 -0
  252. package/icons/mic.svg +1 -0
  253. package/icons/minus.svg +1 -0
  254. package/icons/moon.svg +1 -0
  255. package/icons/more-h.svg +1 -0
  256. package/icons/mouse.svg +1 -0
  257. package/icons/palette.svg +1 -0
  258. package/icons/panel-bottom.svg +1 -0
  259. package/icons/pause.svg +1 -0
  260. package/icons/play.svg +1 -0
  261. package/icons/plug.svg +1 -0
  262. package/icons/plus.0c0c0d.svg +1 -0
  263. package/icons/plus.svg +1 -0
  264. package/icons/refresh.svg +1 -0
  265. package/icons/ruler.svg +1 -0
  266. package/icons/scroll-text.svg +1 -0
  267. package/icons/search-menu.svg +1 -0
  268. package/icons/search.svg +1 -0
  269. package/icons/send.0c0c0d.svg +1 -0
  270. package/icons/send.svg +1 -0
  271. package/icons/settings.0c0c0d.svg +1 -0
  272. package/icons/settings.svg +1 -0
  273. package/icons/shield.svg +1 -0
  274. package/icons/sidebar-left.svg +1 -0
  275. package/icons/sidebar-right.svg +1 -0
  276. package/icons/sliders.svg +1 -0
  277. package/icons/sparkles.32f08c.svg +1 -0
  278. package/icons/sparkles.svg +1 -0
  279. package/icons/square.svg +1 -0
  280. package/icons/star.svg +1 -0
  281. package/icons/sun.svg +1 -0
  282. package/icons/table.svg +1 -0
  283. package/icons/terminal.svg +1 -0
  284. package/icons/trash.svg +1 -0
  285. package/icons/trending-down.svg +1 -0
  286. package/icons/trending-up.svg +1 -0
  287. package/icons/type.svg +1 -0
  288. package/icons/upload.svg +1 -0
  289. package/icons/user-circle.svg +1 -0
  290. package/icons/user-plus.svg +6 -0
  291. package/icons/user.svg +1 -0
  292. package/icons/users.svg +1 -0
  293. package/icons/warning.svg +1 -0
  294. package/icons/wrench.svg +1 -0
  295. package/icons/x-circle.svg +1 -0
  296. package/icons/x.svg +1 -0
  297. package/icons/zap.0c0c0d.svg +1 -0
  298. package/icons/zap.svg +1 -0
  299. package/js/calendar.js +184 -0
  300. package/js/carousel.js +173 -0
  301. package/js/collapse.js +127 -0
  302. package/js/color-picker.js +144 -0
  303. package/js/component.js +276 -0
  304. package/js/composition-api.js +458 -0
  305. package/js/countdown.js +144 -0
  306. package/js/data-bind.js +1286 -0
  307. package/js/datepicker.js +270 -0
  308. package/js/dialog.js +131 -0
  309. package/js/drawer.js +118 -0
  310. package/js/dropdown.js +122 -0
  311. package/js/dynamic-tags.js +156 -0
  312. package/js/error-handler.js +181 -0
  313. package/js/fileupload.js +392 -0
  314. package/js/form.js +291 -0
  315. package/js/global-events.js +203 -0
  316. package/js/heatmap.js +405 -0
  317. package/js/http.js +419 -0
  318. package/js/i18n.js +228 -0
  319. package/js/icons.js +165 -0
  320. package/js/image-preview.js +218 -0
  321. package/js/initializer.js +162 -0
  322. package/js/kupola-core.js +66 -0
  323. package/js/kupola-devtools.js +598 -0
  324. package/js/kupola-lifecycle.js +510 -0
  325. package/js/message.js +60 -0
  326. package/js/modal.js +191 -0
  327. package/js/notification.js +73 -0
  328. package/js/numberinput.js +146 -0
  329. package/js/performance.js +250 -0
  330. package/js/registry.js +205 -0
  331. package/js/router.js +396 -0
  332. package/js/security.js +189 -0
  333. package/js/select.js +143 -0
  334. package/js/slide-captcha.js +504 -0
  335. package/js/slider.js +94 -0
  336. package/js/statcard.js +219 -0
  337. package/js/tag.js +83 -0
  338. package/js/test-utils.js +251 -0
  339. package/js/theme.js +363 -0
  340. package/js/timepicker.js +238 -0
  341. package/js/tooltip.js +122 -0
  342. package/js/utils.js +1458 -0
  343. package/js/validation.js +553 -0
  344. package/js/virtual-list.js +593 -0
  345. package/package.json +105 -0
  346. package/templates/base.html +30 -0
  347. package/templates/base_dashboard.html +99 -0
  348. package/types/kupola.d.ts +1359 -0
  349. package/utils/Kupola.cs +77 -0
  350. package/utils/Kupola.java +104 -0
  351. package/utils/kupola.go +120 -0
  352. package/utils/kupola.js +63 -0
  353. package/utils/kupola.py +1392 -0
  354. package/utils/kupola.rb +69 -0
@@ -0,0 +1,77 @@
1
+ using System;
2
+
3
+ namespace Kupola
4
+ {
5
+ public static class Components
6
+ {
7
+ public static string Button(string label, string variant = "brand", string size = "md")
8
+ {
9
+ return $"<button class=\"ds-btn ds-btn--{variant} ds-btn--{size}\">{label}</button>";
10
+ }
11
+
12
+ public static string Input(string label, string name, string placeholder, string validate = "")
13
+ {
14
+ string validateAttr = string.IsNullOrEmpty(validate) ? "" : $" data-validate=\"{validate}\"";
15
+ return $@"<div class=""ds-form-item"">
16
+ <label class=""ds-form-item__label"">{label}</label>
17
+ <input type=""text"" class=""ds-input"" name=""{name}"" placeholder=""{placeholder}""{validateAttr}>
18
+ </div>";
19
+ }
20
+
21
+ public static string Card(string title, string body, string footer = "")
22
+ {
23
+ string footerHtml = string.IsNullOrEmpty(footer) ? "" : $"<div class=\"ds-card__footer\">{footer}</div>";
24
+ return $@"<div class=""ds-card"">
25
+ <div class=""ds-card__header"">
26
+ <h3 class=""ds-card__title"">{title}</h3>
27
+ </div>
28
+ <div class=""ds-card__body"">{body}</div>
29
+ {footerHtml}
30
+ </div>";
31
+ }
32
+
33
+ public static string StatCard(string title, string value, string trend = "", string trendType = "up")
34
+ {
35
+ string trendHtml = string.IsNullOrEmpty(trend) ? "" :
36
+ $"<span class=\"ds-stat-card__trend {(trendType == "down" ? "ds-stat-card__trend--down" : "ds-stat-card__trend--up")}\">{trend}</span>";
37
+ return $@"<div class=""ds-stat-card"">
38
+ <div class=""ds-stat-card__title"">{title}</div>
39
+ <div class=""ds-stat-card__value"">{value}</div>
40
+ {trendHtml}
41
+ </div>";
42
+ }
43
+
44
+ public static string Badge(string text, string variant = "default")
45
+ {
46
+ return $"<span class=\"ds-badge ds-badge--{variant}\">{text}</span>";
47
+ }
48
+
49
+ public static string Avatar(string initials, string size = "md", string variant = "default")
50
+ {
51
+ return $"<div class=\"ds-avatar ds-avatar--{size} ds-avatar--{variant}\">{initials}</div>";
52
+ }
53
+
54
+ public static string ThemeScript(string theme = "dark", string brand = "zengqing")
55
+ {
56
+ return $@"<script>
57
+ if (typeof setTheme === 'function') setTheme('{theme}');
58
+ if (typeof setBrand === 'function') setBrand('{brand}');
59
+ </script>";
60
+ }
61
+
62
+ public static string DataBind(string key, string bindType)
63
+ {
64
+ return $"data-bind=\"{key}:{bindType}\"";
65
+ }
66
+
67
+ public static string DataComponent(string name)
68
+ {
69
+ return $"data-component=\"{name}\"";
70
+ }
71
+
72
+ public static string DataValidate(string rules)
73
+ {
74
+ return $"data-validate=\"{rules}\"";
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,104 @@
1
+ package com.kupola;
2
+
3
+ public class Kupola {
4
+
5
+ public static String button(String label, String variant, String size) {
6
+ if (variant == null || variant.isEmpty()) variant = "brand";
7
+ if (size == null || size.isEmpty()) size = "md";
8
+ return String.format(
9
+ "<button class=\"ds-btn ds-btn--%s ds-btn--%s\">%s</button>",
10
+ variant, size, label
11
+ );
12
+ }
13
+
14
+ public static String input(String label, String name, String placeholder, String validate) {
15
+ String validateAttr = "";
16
+ if (validate != null && !validate.isEmpty()) {
17
+ validateAttr = String.format(" data-validate=\"%s\"", validate);
18
+ }
19
+ return String.format(
20
+ "<div class=\"ds-form-item\">\n" +
21
+ " <label class=\"ds-form-item__label\">%s</label>\n" +
22
+ " <input type=\"text\" class=\"ds-input\" name=\"%s\" placeholder=\"%s\"%s>\n" +
23
+ "</div>",
24
+ label, name, placeholder, validateAttr
25
+ );
26
+ }
27
+
28
+ public static String card(String title, String body, String footer) {
29
+ String footerHtml = "";
30
+ if (footer != null && !footer.isEmpty()) {
31
+ footerHtml = String.format("<div class=\"ds-card__footer\">%s</div>", footer);
32
+ }
33
+ return String.format(
34
+ "<div class=\"ds-card\">\n" +
35
+ " <div class=\"ds-card__header\">\n" +
36
+ " <h3 class=\"ds-card__title\">%s</h3>\n" +
37
+ " </div>\n" +
38
+ " <div class=\"ds-card__body\">%s</div>\n" +
39
+ " %s\n" +
40
+ "</div>",
41
+ title, body, footerHtml
42
+ );
43
+ }
44
+
45
+ public static String statCard(String title, String value, String trend, String trendType) {
46
+ String trendHtml = "";
47
+ if (trend != null && !trend.isEmpty()) {
48
+ String trendClass = "ds-stat-card__trend--up";
49
+ if ("down".equals(trendType)) {
50
+ trendClass = "ds-stat-card__trend--down";
51
+ }
52
+ trendHtml = String.format("<span class=\"ds-stat-card__trend %s\">%s</span>", trendClass, trend);
53
+ }
54
+ return String.format(
55
+ "<div class=\"ds-stat-card\">\n" +
56
+ " <div class=\"ds-stat-card__title\">%s</div>\n" +
57
+ " <div class=\"ds-stat-card__value\">%s</div>\n" +
58
+ " %s\n" +
59
+ "</div>",
60
+ title, value, trendHtml
61
+ );
62
+ }
63
+
64
+ public static String badge(String text, String variant) {
65
+ if (variant == null || variant.isEmpty()) variant = "default";
66
+ return String.format(
67
+ "<span class=\"ds-badge ds-badge--%s\">%s</span>",
68
+ variant, text
69
+ );
70
+ }
71
+
72
+ public static String avatar(String initials, String size, String variant) {
73
+ if (size == null || size.isEmpty()) size = "md";
74
+ if (variant == null || variant.isEmpty()) variant = "default";
75
+ return String.format(
76
+ "<div class=\"ds-avatar ds-avatar--%s ds-avatar--%s\">%s</div>",
77
+ size, variant, initials
78
+ );
79
+ }
80
+
81
+ public static String themeScript(String theme, String brand) {
82
+ if (theme == null || theme.isEmpty()) theme = "dark";
83
+ if (brand == null || brand.isEmpty()) brand = "zengqing";
84
+ return String.format(
85
+ "<script>\n" +
86
+ " if (typeof setTheme === 'function') setTheme('%s');\n" +
87
+ " if (typeof setBrand === 'function') setBrand('%s');\n" +
88
+ "</script>",
89
+ theme, brand
90
+ );
91
+ }
92
+
93
+ public static String dataBind(String key, String bindType) {
94
+ return String.format("data-bind=\"%s:%s\"", key, bindType);
95
+ }
96
+
97
+ public static String dataComponent(String name) {
98
+ return String.format("data-component=\"%s\"", name);
99
+ }
100
+
101
+ public static String dataValidate(String rules) {
102
+ return String.format("data-validate=\"%s\"", rules);
103
+ }
104
+ }
@@ -0,0 +1,120 @@
1
+ package kupola
2
+
3
+ import (
4
+ "fmt"
5
+ "html/template"
6
+ )
7
+
8
+ func Button(label string, variant string, size string) template.HTML {
9
+ if variant == "" {
10
+ variant = "brand"
11
+ }
12
+ if size == "" {
13
+ size = "md"
14
+ }
15
+ return template.HTML(fmt.Sprintf(
16
+ `<button class="ds-btn ds-btn--%s ds-btn--%s">%s</button>`,
17
+ variant, size, label,
18
+ ))
19
+ }
20
+
21
+ func Input(label string, name string, placeholder string, validate string) template.HTML {
22
+ validateAttr := ""
23
+ if validate != "" {
24
+ validateAttr = fmt.Sprintf(` data-validate="%s"`, validate)
25
+ }
26
+ return template.HTML(fmt.Sprintf(
27
+ `<div class="ds-form-item">
28
+ <label class="ds-form-item__label">%s</label>
29
+ <input type="text" class="ds-input" name="%s" placeholder="%s"%s>
30
+ </div>`,
31
+ label, name, placeholder, validateAttr,
32
+ ))
33
+ }
34
+
35
+ func Card(title string, body string, footer string) template.HTML {
36
+ footerHTML := ""
37
+ if footer != "" {
38
+ footerHTML = fmt.Sprintf(`<div class="ds-card__footer">%s</div>`, footer)
39
+ }
40
+ return template.HTML(fmt.Sprintf(
41
+ `<div class="ds-card">
42
+ <div class="ds-card__header">
43
+ <h3 class="ds-card__title">%s</h3>
44
+ </div>
45
+ <div class="ds-card__body">%s</div>
46
+ %s
47
+ </div>`,
48
+ title, body, footerHTML,
49
+ ))
50
+ }
51
+
52
+ func StatCard(title string, value string, trend string, trendType string) template.HTML {
53
+ trendHTML := ""
54
+ if trend != "" {
55
+ trendClass := "ds-stat-card__trend--up"
56
+ if trendType == "down" {
57
+ trendClass = "ds-stat-card__trend--down"
58
+ }
59
+ trendHTML = fmt.Sprintf(`<span class="ds-stat-card__trend %s">%s</span>`, trendClass, trend)
60
+ }
61
+ return template.HTML(fmt.Sprintf(
62
+ `<div class="ds-stat-card">
63
+ <div class="ds-stat-card__title">%s</div>
64
+ <div class="ds-stat-card__value">%s</div>
65
+ %s
66
+ </div>`,
67
+ title, value, trendHTML,
68
+ ))
69
+ }
70
+
71
+ func Badge(text string, variant string) template.HTML {
72
+ if variant == "" {
73
+ variant = "default"
74
+ }
75
+ return template.HTML(fmt.Sprintf(
76
+ `<span class="ds-badge ds-badge--%s">%s</span>`,
77
+ variant, text,
78
+ ))
79
+ }
80
+
81
+ func Avatar(initials string, size string, variant string) template.HTML {
82
+ if size == "" {
83
+ size = "md"
84
+ }
85
+ if variant == "" {
86
+ variant = "default"
87
+ }
88
+ return template.HTML(fmt.Sprintf(
89
+ `<div class="ds-avatar ds-avatar--%s ds-avatar--%s">%s</div>`,
90
+ size, variant, initials,
91
+ ))
92
+ }
93
+
94
+ func ThemeScript(theme string, brand string) template.HTML {
95
+ if theme == "" {
96
+ theme = "dark"
97
+ }
98
+ if brand == "" {
99
+ brand = "zengqing"
100
+ }
101
+ return template.HTML(fmt.Sprintf(
102
+ `<script>
103
+ if (typeof setTheme === 'function') setTheme('%s');
104
+ if (typeof setBrand === 'function') setBrand('%s');
105
+ </script>`,
106
+ theme, brand,
107
+ ))
108
+ }
109
+
110
+ func DataBind(key string, bindType string) template.HTML {
111
+ return template.HTML(fmt.Sprintf(`data-bind="%s:%s"`, key, bindType))
112
+ }
113
+
114
+ func DataComponent(name string) template.HTML {
115
+ return template.HTML(fmt.Sprintf(`data-component="%s"`, name))
116
+ }
117
+
118
+ func DataValidate(rules string) template.HTML {
119
+ return template.HTML(fmt.Sprintf(`data-validate="%s"`, rules))
120
+ }
@@ -0,0 +1,63 @@
1
+ export function button(label, variant = 'brand', size = 'md') {
2
+ return `<button class="ds-btn ds-btn--${variant} ds-btn--${size}">${label}</button>`;
3
+ }
4
+
5
+ export function input(label, name, placeholder, validate = '') {
6
+ const validateAttr = validate ? ` data-validate="${validate}"` : '';
7
+ return `
8
+ <div class="ds-form-item">
9
+ <label class="ds-form-item__label">${label}</label>
10
+ <input type="text" class="ds-input" name="${name}" placeholder="${placeholder}"${validateAttr}>
11
+ </div>`;
12
+ }
13
+
14
+ export function card(title, body, footer = '') {
15
+ const footerHtml = footer ? `<div class="ds-card__footer">${footer}</div>` : '';
16
+ return `
17
+ <div class="ds-card">
18
+ <div class="ds-card__header">
19
+ <h3 class="ds-card__title">${title}</h3>
20
+ </div>
21
+ <div class="ds-card__body">${body}</div>
22
+ ${footerHtml}
23
+ </div>`;
24
+ }
25
+
26
+ export function statCard(title, value, trend = '', trendType = 'up') {
27
+ const trendHtml = trend ?
28
+ `<span class="ds-stat-card__trend ${trendType === 'down' ? 'ds-stat-card__trend--down' : 'ds-stat-card__trend--up'}">${trend}</span>` : '';
29
+ return `
30
+ <div class="ds-stat-card">
31
+ <div class="ds-stat-card__title">${title}</div>
32
+ <div class="ds-stat-card__value">${value}</div>
33
+ ${trendHtml}
34
+ </div>`;
35
+ }
36
+
37
+ export function badge(text, variant = 'default') {
38
+ return `<span class="ds-badge ds-badge--${variant}">${text}</span>`;
39
+ }
40
+
41
+ export function avatar(initials, size = 'md', variant = 'default') {
42
+ return `<div class="ds-avatar ds-avatar--${size} ds-avatar--${variant}">${initials}</div>`;
43
+ }
44
+
45
+ export function themeScript(theme = 'dark', brand = 'zengqing') {
46
+ return `
47
+ <script>
48
+ if (typeof setTheme === 'function') setTheme('${theme}');
49
+ if (typeof setBrand === 'function') setBrand('${brand}');
50
+ </script>`;
51
+ }
52
+
53
+ export function dataBind(key, bindType) {
54
+ return `data-bind="${key}:${bindType}"`;
55
+ }
56
+
57
+ export function dataComponent(name) {
58
+ return `data-component="${name}"`;
59
+ }
60
+
61
+ export function dataValidate(rules) {
62
+ return `data-validate="${rules}"`;
63
+ }