hakumi_components 0.1.3.pre

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 (1339) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +60 -0
  3. data/LICENSE +21 -0
  4. data/app/assets/icons/filled/account-book.svg +1 -0
  5. data/app/assets/icons/filled/alert.svg +1 -0
  6. data/app/assets/icons/filled/alipay-circle.svg +1 -0
  7. data/app/assets/icons/filled/alipay-square.svg +1 -0
  8. data/app/assets/icons/filled/aliwangwang.svg +1 -0
  9. data/app/assets/icons/filled/amazon-circle.svg +1 -0
  10. data/app/assets/icons/filled/amazon-square.svg +1 -0
  11. data/app/assets/icons/filled/android.svg +1 -0
  12. data/app/assets/icons/filled/api.svg +1 -0
  13. data/app/assets/icons/filled/apple.svg +1 -0
  14. data/app/assets/icons/filled/appstore.svg +1 -0
  15. data/app/assets/icons/filled/audio.svg +1 -0
  16. data/app/assets/icons/filled/backward.svg +1 -0
  17. data/app/assets/icons/filled/bank.svg +1 -0
  18. data/app/assets/icons/filled/behance-circle.svg +1 -0
  19. data/app/assets/icons/filled/behance-square.svg +1 -0
  20. data/app/assets/icons/filled/bell.svg +1 -0
  21. data/app/assets/icons/filled/bilibili.svg +1 -0
  22. data/app/assets/icons/filled/book.svg +1 -0
  23. data/app/assets/icons/filled/box-plot.svg +1 -0
  24. data/app/assets/icons/filled/bug.svg +1 -0
  25. data/app/assets/icons/filled/build.svg +1 -0
  26. data/app/assets/icons/filled/bulb.svg +1 -0
  27. data/app/assets/icons/filled/calculator.svg +1 -0
  28. data/app/assets/icons/filled/calendar.svg +1 -0
  29. data/app/assets/icons/filled/camera.svg +1 -0
  30. data/app/assets/icons/filled/car.svg +1 -0
  31. data/app/assets/icons/filled/caret-down.svg +1 -0
  32. data/app/assets/icons/filled/caret-left.svg +1 -0
  33. data/app/assets/icons/filled/caret-right.svg +1 -0
  34. data/app/assets/icons/filled/caret-up.svg +1 -0
  35. data/app/assets/icons/filled/carry-out.svg +1 -0
  36. data/app/assets/icons/filled/check-circle.svg +1 -0
  37. data/app/assets/icons/filled/check-square.svg +1 -0
  38. data/app/assets/icons/filled/chrome.svg +1 -0
  39. data/app/assets/icons/filled/ci-circle.svg +1 -0
  40. data/app/assets/icons/filled/clock-circle.svg +1 -0
  41. data/app/assets/icons/filled/close-circle.svg +1 -0
  42. data/app/assets/icons/filled/close-square.svg +1 -0
  43. data/app/assets/icons/filled/cloud.svg +1 -0
  44. data/app/assets/icons/filled/code-sandbox-circle.svg +1 -0
  45. data/app/assets/icons/filled/code-sandbox-square.svg +1 -0
  46. data/app/assets/icons/filled/code.svg +1 -0
  47. data/app/assets/icons/filled/codepen-circle.svg +1 -0
  48. data/app/assets/icons/filled/codepen-square.svg +1 -0
  49. data/app/assets/icons/filled/compass.svg +1 -0
  50. data/app/assets/icons/filled/contacts.svg +1 -0
  51. data/app/assets/icons/filled/container.svg +1 -0
  52. data/app/assets/icons/filled/control.svg +1 -0
  53. data/app/assets/icons/filled/copy.svg +1 -0
  54. data/app/assets/icons/filled/copyright-circle.svg +1 -0
  55. data/app/assets/icons/filled/credit-card.svg +1 -0
  56. data/app/assets/icons/filled/crown.svg +1 -0
  57. data/app/assets/icons/filled/customer-service.svg +1 -0
  58. data/app/assets/icons/filled/dashboard.svg +1 -0
  59. data/app/assets/icons/filled/database.svg +1 -0
  60. data/app/assets/icons/filled/delete.svg +1 -0
  61. data/app/assets/icons/filled/diff.svg +1 -0
  62. data/app/assets/icons/filled/dingtalk-circle.svg +1 -0
  63. data/app/assets/icons/filled/dingtalk-square.svg +1 -0
  64. data/app/assets/icons/filled/discord.svg +1 -0
  65. data/app/assets/icons/filled/dislike.svg +1 -0
  66. data/app/assets/icons/filled/dollar-circle.svg +1 -0
  67. data/app/assets/icons/filled/down-circle.svg +1 -0
  68. data/app/assets/icons/filled/down-square.svg +1 -0
  69. data/app/assets/icons/filled/dribbble-circle.svg +1 -0
  70. data/app/assets/icons/filled/dribbble-square.svg +1 -0
  71. data/app/assets/icons/filled/dropbox-circle.svg +1 -0
  72. data/app/assets/icons/filled/dropbox-square.svg +1 -0
  73. data/app/assets/icons/filled/edit.svg +1 -0
  74. data/app/assets/icons/filled/environment.svg +1 -0
  75. data/app/assets/icons/filled/euro-circle.svg +1 -0
  76. data/app/assets/icons/filled/exclamation-circle.svg +1 -0
  77. data/app/assets/icons/filled/experiment.svg +1 -0
  78. data/app/assets/icons/filled/eye-invisible.svg +1 -0
  79. data/app/assets/icons/filled/eye.svg +1 -0
  80. data/app/assets/icons/filled/facebook.svg +1 -0
  81. data/app/assets/icons/filled/fast-backward.svg +1 -0
  82. data/app/assets/icons/filled/fast-forward.svg +1 -0
  83. data/app/assets/icons/filled/file-add.svg +1 -0
  84. data/app/assets/icons/filled/file-excel.svg +1 -0
  85. data/app/assets/icons/filled/file-exclamation.svg +1 -0
  86. data/app/assets/icons/filled/file-image.svg +1 -0
  87. data/app/assets/icons/filled/file-markdown.svg +1 -0
  88. data/app/assets/icons/filled/file-pdf.svg +1 -0
  89. data/app/assets/icons/filled/file-ppt.svg +1 -0
  90. data/app/assets/icons/filled/file-text.svg +1 -0
  91. data/app/assets/icons/filled/file-unknown.svg +1 -0
  92. data/app/assets/icons/filled/file-word.svg +1 -0
  93. data/app/assets/icons/filled/file-zip.svg +1 -0
  94. data/app/assets/icons/filled/file.svg +1 -0
  95. data/app/assets/icons/filled/filter.svg +1 -0
  96. data/app/assets/icons/filled/fire.svg +1 -0
  97. data/app/assets/icons/filled/flag.svg +1 -0
  98. data/app/assets/icons/filled/folder-add.svg +1 -0
  99. data/app/assets/icons/filled/folder-open.svg +1 -0
  100. data/app/assets/icons/filled/folder.svg +1 -0
  101. data/app/assets/icons/filled/format-painter.svg +1 -0
  102. data/app/assets/icons/filled/forward.svg +1 -0
  103. data/app/assets/icons/filled/frown.svg +1 -0
  104. data/app/assets/icons/filled/fund.svg +1 -0
  105. data/app/assets/icons/filled/funnel-plot.svg +1 -0
  106. data/app/assets/icons/filled/gift.svg +1 -0
  107. data/app/assets/icons/filled/github.svg +1 -0
  108. data/app/assets/icons/filled/gitlab.svg +1 -0
  109. data/app/assets/icons/filled/gold.svg +1 -0
  110. data/app/assets/icons/filled/golden.svg +1 -0
  111. data/app/assets/icons/filled/google-circle.svg +1 -0
  112. data/app/assets/icons/filled/google-plus-circle.svg +1 -0
  113. data/app/assets/icons/filled/google-plus-square.svg +1 -0
  114. data/app/assets/icons/filled/google-square.svg +1 -0
  115. data/app/assets/icons/filled/hdd.svg +1 -0
  116. data/app/assets/icons/filled/heart.svg +1 -0
  117. data/app/assets/icons/filled/highlight.svg +1 -0
  118. data/app/assets/icons/filled/home.svg +1 -0
  119. data/app/assets/icons/filled/hourglass.svg +1 -0
  120. data/app/assets/icons/filled/html5.svg +1 -0
  121. data/app/assets/icons/filled/idcard.svg +1 -0
  122. data/app/assets/icons/filled/ie-circle.svg +1 -0
  123. data/app/assets/icons/filled/ie-square.svg +1 -0
  124. data/app/assets/icons/filled/info-circle.svg +1 -0
  125. data/app/assets/icons/filled/instagram.svg +1 -0
  126. data/app/assets/icons/filled/insurance.svg +1 -0
  127. data/app/assets/icons/filled/interaction.svg +1 -0
  128. data/app/assets/icons/filled/layout.svg +1 -0
  129. data/app/assets/icons/filled/left-circle.svg +1 -0
  130. data/app/assets/icons/filled/left-square.svg +1 -0
  131. data/app/assets/icons/filled/like.svg +1 -0
  132. data/app/assets/icons/filled/linkedin.svg +1 -0
  133. data/app/assets/icons/filled/lock.svg +1 -0
  134. data/app/assets/icons/filled/mac-command.svg +1 -0
  135. data/app/assets/icons/filled/mail.svg +1 -0
  136. data/app/assets/icons/filled/medicine-box.svg +1 -0
  137. data/app/assets/icons/filled/medium-circle.svg +1 -0
  138. data/app/assets/icons/filled/medium-square.svg +1 -0
  139. data/app/assets/icons/filled/meh.svg +1 -0
  140. data/app/assets/icons/filled/merge.svg +1 -0
  141. data/app/assets/icons/filled/message.svg +1 -0
  142. data/app/assets/icons/filled/minus-circle.svg +1 -0
  143. data/app/assets/icons/filled/minus-square.svg +1 -0
  144. data/app/assets/icons/filled/mobile.svg +1 -0
  145. data/app/assets/icons/filled/money-collect.svg +1 -0
  146. data/app/assets/icons/filled/moon.svg +1 -0
  147. data/app/assets/icons/filled/muted.svg +1 -0
  148. data/app/assets/icons/filled/notification.svg +1 -0
  149. data/app/assets/icons/filled/open-a-i.svg +1 -0
  150. data/app/assets/icons/filled/pause-circle.svg +1 -0
  151. data/app/assets/icons/filled/pay-circle.svg +1 -0
  152. data/app/assets/icons/filled/phone.svg +1 -0
  153. data/app/assets/icons/filled/picture.svg +1 -0
  154. data/app/assets/icons/filled/pie-chart.svg +1 -0
  155. data/app/assets/icons/filled/pinterest.svg +1 -0
  156. data/app/assets/icons/filled/play-circle.svg +1 -0
  157. data/app/assets/icons/filled/play-square.svg +1 -0
  158. data/app/assets/icons/filled/plus-circle.svg +1 -0
  159. data/app/assets/icons/filled/plus-square.svg +1 -0
  160. data/app/assets/icons/filled/pound-circle.svg +1 -0
  161. data/app/assets/icons/filled/printer.svg +1 -0
  162. data/app/assets/icons/filled/product.svg +1 -0
  163. data/app/assets/icons/filled/profile.svg +1 -0
  164. data/app/assets/icons/filled/project.svg +1 -0
  165. data/app/assets/icons/filled/property-safety.svg +1 -0
  166. data/app/assets/icons/filled/pushpin.svg +1 -0
  167. data/app/assets/icons/filled/qq-circle.svg +1 -0
  168. data/app/assets/icons/filled/qq-square.svg +1 -0
  169. data/app/assets/icons/filled/question-circle.svg +1 -0
  170. data/app/assets/icons/filled/read.svg +1 -0
  171. data/app/assets/icons/filled/reconciliation.svg +1 -0
  172. data/app/assets/icons/filled/red-envelope.svg +1 -0
  173. data/app/assets/icons/filled/reddit-circle.svg +1 -0
  174. data/app/assets/icons/filled/reddit-square.svg +1 -0
  175. data/app/assets/icons/filled/rest.svg +1 -0
  176. data/app/assets/icons/filled/right-circle.svg +1 -0
  177. data/app/assets/icons/filled/right-square.svg +1 -0
  178. data/app/assets/icons/filled/robot.svg +1 -0
  179. data/app/assets/icons/filled/rocket.svg +1 -0
  180. data/app/assets/icons/filled/safety-certificate.svg +1 -0
  181. data/app/assets/icons/filled/save.svg +1 -0
  182. data/app/assets/icons/filled/schedule.svg +1 -0
  183. data/app/assets/icons/filled/security-scan.svg +1 -0
  184. data/app/assets/icons/filled/setting.svg +1 -0
  185. data/app/assets/icons/filled/shop.svg +1 -0
  186. data/app/assets/icons/filled/shopping.svg +1 -0
  187. data/app/assets/icons/filled/signal.svg +1 -0
  188. data/app/assets/icons/filled/signature.svg +1 -0
  189. data/app/assets/icons/filled/sketch-circle.svg +1 -0
  190. data/app/assets/icons/filled/sketch-square.svg +1 -0
  191. data/app/assets/icons/filled/skin.svg +1 -0
  192. data/app/assets/icons/filled/skype.svg +1 -0
  193. data/app/assets/icons/filled/slack-circle.svg +1 -0
  194. data/app/assets/icons/filled/slack-square.svg +1 -0
  195. data/app/assets/icons/filled/sliders.svg +1 -0
  196. data/app/assets/icons/filled/smile.svg +1 -0
  197. data/app/assets/icons/filled/snippets.svg +1 -0
  198. data/app/assets/icons/filled/sound.svg +1 -0
  199. data/app/assets/icons/filled/spotify.svg +1 -0
  200. data/app/assets/icons/filled/star.svg +1 -0
  201. data/app/assets/icons/filled/step-backward.svg +1 -0
  202. data/app/assets/icons/filled/step-forward.svg +1 -0
  203. data/app/assets/icons/filled/stop.svg +1 -0
  204. data/app/assets/icons/filled/sun.svg +1 -0
  205. data/app/assets/icons/filled/switcher.svg +1 -0
  206. data/app/assets/icons/filled/tablet.svg +1 -0
  207. data/app/assets/icons/filled/tag.svg +1 -0
  208. data/app/assets/icons/filled/tags.svg +1 -0
  209. data/app/assets/icons/filled/taobao-circle.svg +1 -0
  210. data/app/assets/icons/filled/taobao-square.svg +1 -0
  211. data/app/assets/icons/filled/thunderbolt.svg +1 -0
  212. data/app/assets/icons/filled/tik-tok.svg +1 -0
  213. data/app/assets/icons/filled/tool.svg +1 -0
  214. data/app/assets/icons/filled/trademark-circle.svg +1 -0
  215. data/app/assets/icons/filled/trophy.svg +1 -0
  216. data/app/assets/icons/filled/truck.svg +1 -0
  217. data/app/assets/icons/filled/twitch.svg +1 -0
  218. data/app/assets/icons/filled/twitter-circle.svg +1 -0
  219. data/app/assets/icons/filled/twitter-square.svg +1 -0
  220. data/app/assets/icons/filled/unlock.svg +1 -0
  221. data/app/assets/icons/filled/up-circle.svg +1 -0
  222. data/app/assets/icons/filled/up-square.svg +1 -0
  223. data/app/assets/icons/filled/usb.svg +1 -0
  224. data/app/assets/icons/filled/video-camera.svg +1 -0
  225. data/app/assets/icons/filled/wallet.svg +1 -0
  226. data/app/assets/icons/filled/warning.svg +1 -0
  227. data/app/assets/icons/filled/wechat-work.svg +1 -0
  228. data/app/assets/icons/filled/wechat.svg +1 -0
  229. data/app/assets/icons/filled/weibo-circle.svg +1 -0
  230. data/app/assets/icons/filled/weibo-square.svg +1 -0
  231. data/app/assets/icons/filled/windows.svg +1 -0
  232. data/app/assets/icons/filled/x.svg +1 -0
  233. data/app/assets/icons/filled/yahoo.svg +1 -0
  234. data/app/assets/icons/filled/youtube.svg +1 -0
  235. data/app/assets/icons/filled/yuque.svg +1 -0
  236. data/app/assets/icons/filled/zhihu-circle.svg +1 -0
  237. data/app/assets/icons/filled/zhihu-square.svg +1 -0
  238. data/app/assets/icons/outlined/account-book.svg +1 -0
  239. data/app/assets/icons/outlined/aim.svg +1 -0
  240. data/app/assets/icons/outlined/alert.svg +1 -0
  241. data/app/assets/icons/outlined/alibaba.svg +1 -0
  242. data/app/assets/icons/outlined/align-center.svg +1 -0
  243. data/app/assets/icons/outlined/align-left.svg +1 -0
  244. data/app/assets/icons/outlined/align-right.svg +1 -0
  245. data/app/assets/icons/outlined/alipay-circle.svg +1 -0
  246. data/app/assets/icons/outlined/alipay.svg +1 -0
  247. data/app/assets/icons/outlined/aliwangwang.svg +1 -0
  248. data/app/assets/icons/outlined/aliyun.svg +1 -0
  249. data/app/assets/icons/outlined/amazon.svg +1 -0
  250. data/app/assets/icons/outlined/android.svg +1 -0
  251. data/app/assets/icons/outlined/ant-cloud.svg +1 -0
  252. data/app/assets/icons/outlined/ant-design.svg +1 -0
  253. data/app/assets/icons/outlined/apartment.svg +1 -0
  254. data/app/assets/icons/outlined/api.svg +1 -0
  255. data/app/assets/icons/outlined/apple.svg +1 -0
  256. data/app/assets/icons/outlined/appstore-add.svg +1 -0
  257. data/app/assets/icons/outlined/appstore.svg +1 -0
  258. data/app/assets/icons/outlined/area-chart.svg +1 -0
  259. data/app/assets/icons/outlined/arrow-down.svg +1 -0
  260. data/app/assets/icons/outlined/arrow-left.svg +1 -0
  261. data/app/assets/icons/outlined/arrow-right.svg +1 -0
  262. data/app/assets/icons/outlined/arrow-up.svg +1 -0
  263. data/app/assets/icons/outlined/arrows-alt.svg +1 -0
  264. data/app/assets/icons/outlined/audio-muted.svg +1 -0
  265. data/app/assets/icons/outlined/audio.svg +1 -0
  266. data/app/assets/icons/outlined/audit.svg +1 -0
  267. data/app/assets/icons/outlined/backward.svg +1 -0
  268. data/app/assets/icons/outlined/baidu.svg +1 -0
  269. data/app/assets/icons/outlined/bank.svg +1 -0
  270. data/app/assets/icons/outlined/bar-chart.svg +1 -0
  271. data/app/assets/icons/outlined/barcode.svg +1 -0
  272. data/app/assets/icons/outlined/bars.svg +1 -0
  273. data/app/assets/icons/outlined/behance-square.svg +1 -0
  274. data/app/assets/icons/outlined/behance.svg +1 -0
  275. data/app/assets/icons/outlined/bell.svg +1 -0
  276. data/app/assets/icons/outlined/bg-colors.svg +1 -0
  277. data/app/assets/icons/outlined/bilibili.svg +1 -0
  278. data/app/assets/icons/outlined/block.svg +1 -0
  279. data/app/assets/icons/outlined/bold.svg +1 -0
  280. data/app/assets/icons/outlined/book.svg +1 -0
  281. data/app/assets/icons/outlined/border-bottom.svg +1 -0
  282. data/app/assets/icons/outlined/border-horizontal.svg +1 -0
  283. data/app/assets/icons/outlined/border-inner.svg +1 -0
  284. data/app/assets/icons/outlined/border-left.svg +1 -0
  285. data/app/assets/icons/outlined/border-outer.svg +1 -0
  286. data/app/assets/icons/outlined/border-right.svg +1 -0
  287. data/app/assets/icons/outlined/border-top.svg +1 -0
  288. data/app/assets/icons/outlined/border-verticle.svg +1 -0
  289. data/app/assets/icons/outlined/border.svg +1 -0
  290. data/app/assets/icons/outlined/borderless-table.svg +1 -0
  291. data/app/assets/icons/outlined/box-plot.svg +1 -0
  292. data/app/assets/icons/outlined/branches.svg +1 -0
  293. data/app/assets/icons/outlined/bug.svg +1 -0
  294. data/app/assets/icons/outlined/build.svg +1 -0
  295. data/app/assets/icons/outlined/bulb.svg +1 -0
  296. data/app/assets/icons/outlined/calculator.svg +1 -0
  297. data/app/assets/icons/outlined/calendar.svg +1 -0
  298. data/app/assets/icons/outlined/camera.svg +1 -0
  299. data/app/assets/icons/outlined/car.svg +1 -0
  300. data/app/assets/icons/outlined/caret-down.svg +1 -0
  301. data/app/assets/icons/outlined/caret-left.svg +1 -0
  302. data/app/assets/icons/outlined/caret-right.svg +1 -0
  303. data/app/assets/icons/outlined/caret-up.svg +1 -0
  304. data/app/assets/icons/outlined/carry-out.svg +1 -0
  305. data/app/assets/icons/outlined/check-circle.svg +1 -0
  306. data/app/assets/icons/outlined/check-square.svg +1 -0
  307. data/app/assets/icons/outlined/check.svg +1 -0
  308. data/app/assets/icons/outlined/chrome.svg +1 -0
  309. data/app/assets/icons/outlined/ci-circle.svg +1 -0
  310. data/app/assets/icons/outlined/ci.svg +1 -0
  311. data/app/assets/icons/outlined/clear.svg +1 -0
  312. data/app/assets/icons/outlined/clock-circle.svg +1 -0
  313. data/app/assets/icons/outlined/close-circle.svg +1 -0
  314. data/app/assets/icons/outlined/close-square.svg +1 -0
  315. data/app/assets/icons/outlined/close.svg +1 -0
  316. data/app/assets/icons/outlined/cloud-download.svg +1 -0
  317. data/app/assets/icons/outlined/cloud-server.svg +1 -0
  318. data/app/assets/icons/outlined/cloud-sync.svg +1 -0
  319. data/app/assets/icons/outlined/cloud-upload.svg +1 -0
  320. data/app/assets/icons/outlined/cloud.svg +1 -0
  321. data/app/assets/icons/outlined/cluster.svg +1 -0
  322. data/app/assets/icons/outlined/code-sandbox.svg +1 -0
  323. data/app/assets/icons/outlined/code.svg +1 -0
  324. data/app/assets/icons/outlined/codepen-circle.svg +1 -0
  325. data/app/assets/icons/outlined/codepen.svg +1 -0
  326. data/app/assets/icons/outlined/coffee.svg +1 -0
  327. data/app/assets/icons/outlined/column-height.svg +1 -0
  328. data/app/assets/icons/outlined/column-width.svg +1 -0
  329. data/app/assets/icons/outlined/comment.svg +1 -0
  330. data/app/assets/icons/outlined/compass.svg +1 -0
  331. data/app/assets/icons/outlined/compress.svg +1 -0
  332. data/app/assets/icons/outlined/console-sql.svg +1 -0
  333. data/app/assets/icons/outlined/contacts.svg +1 -0
  334. data/app/assets/icons/outlined/container.svg +1 -0
  335. data/app/assets/icons/outlined/control.svg +1 -0
  336. data/app/assets/icons/outlined/copy.svg +1 -0
  337. data/app/assets/icons/outlined/copyright-circle.svg +1 -0
  338. data/app/assets/icons/outlined/copyright.svg +1 -0
  339. data/app/assets/icons/outlined/credit-card.svg +1 -0
  340. data/app/assets/icons/outlined/crown.svg +1 -0
  341. data/app/assets/icons/outlined/customer-service.svg +1 -0
  342. data/app/assets/icons/outlined/dash.svg +1 -0
  343. data/app/assets/icons/outlined/dashboard.svg +1 -0
  344. data/app/assets/icons/outlined/database.svg +1 -0
  345. data/app/assets/icons/outlined/delete-column.svg +1 -0
  346. data/app/assets/icons/outlined/delete-row.svg +1 -0
  347. data/app/assets/icons/outlined/delete.svg +1 -0
  348. data/app/assets/icons/outlined/delivered-procedure.svg +1 -0
  349. data/app/assets/icons/outlined/deployment-unit.svg +1 -0
  350. data/app/assets/icons/outlined/desktop.svg +1 -0
  351. data/app/assets/icons/outlined/diff.svg +1 -0
  352. data/app/assets/icons/outlined/dingding.svg +1 -0
  353. data/app/assets/icons/outlined/dingtalk.svg +1 -0
  354. data/app/assets/icons/outlined/disconnect.svg +1 -0
  355. data/app/assets/icons/outlined/discord.svg +1 -0
  356. data/app/assets/icons/outlined/dislike.svg +1 -0
  357. data/app/assets/icons/outlined/docker.svg +1 -0
  358. data/app/assets/icons/outlined/dollar-circle.svg +1 -0
  359. data/app/assets/icons/outlined/dollar.svg +1 -0
  360. data/app/assets/icons/outlined/dot-chart.svg +1 -0
  361. data/app/assets/icons/outlined/dot-net.svg +1 -0
  362. data/app/assets/icons/outlined/double-left.svg +1 -0
  363. data/app/assets/icons/outlined/double-right.svg +1 -0
  364. data/app/assets/icons/outlined/down-circle.svg +1 -0
  365. data/app/assets/icons/outlined/down-square.svg +1 -0
  366. data/app/assets/icons/outlined/down.svg +1 -0
  367. data/app/assets/icons/outlined/download.svg +1 -0
  368. data/app/assets/icons/outlined/drag.svg +1 -0
  369. data/app/assets/icons/outlined/dribbble-square.svg +1 -0
  370. data/app/assets/icons/outlined/dribbble.svg +1 -0
  371. data/app/assets/icons/outlined/dropbox.svg +1 -0
  372. data/app/assets/icons/outlined/edit.svg +1 -0
  373. data/app/assets/icons/outlined/ellipsis.svg +1 -0
  374. data/app/assets/icons/outlined/enter.svg +1 -0
  375. data/app/assets/icons/outlined/environment.svg +1 -0
  376. data/app/assets/icons/outlined/euro-circle.svg +1 -0
  377. data/app/assets/icons/outlined/euro.svg +1 -0
  378. data/app/assets/icons/outlined/exception.svg +1 -0
  379. data/app/assets/icons/outlined/exclamation-circle.svg +1 -0
  380. data/app/assets/icons/outlined/exclamation.svg +1 -0
  381. data/app/assets/icons/outlined/expand-alt.svg +1 -0
  382. data/app/assets/icons/outlined/expand.svg +1 -0
  383. data/app/assets/icons/outlined/experiment.svg +1 -0
  384. data/app/assets/icons/outlined/export.svg +1 -0
  385. data/app/assets/icons/outlined/eye-invisible.svg +1 -0
  386. data/app/assets/icons/outlined/eye.svg +1 -0
  387. data/app/assets/icons/outlined/facebook.svg +1 -0
  388. data/app/assets/icons/outlined/fall.svg +1 -0
  389. data/app/assets/icons/outlined/fast-backward.svg +1 -0
  390. data/app/assets/icons/outlined/fast-forward.svg +1 -0
  391. data/app/assets/icons/outlined/field-binary.svg +1 -0
  392. data/app/assets/icons/outlined/field-number.svg +1 -0
  393. data/app/assets/icons/outlined/field-string.svg +1 -0
  394. data/app/assets/icons/outlined/field-time.svg +1 -0
  395. data/app/assets/icons/outlined/file-add.svg +1 -0
  396. data/app/assets/icons/outlined/file-done.svg +1 -0
  397. data/app/assets/icons/outlined/file-excel.svg +1 -0
  398. data/app/assets/icons/outlined/file-exclamation.svg +1 -0
  399. data/app/assets/icons/outlined/file-gif.svg +1 -0
  400. data/app/assets/icons/outlined/file-image.svg +1 -0
  401. data/app/assets/icons/outlined/file-jpg.svg +1 -0
  402. data/app/assets/icons/outlined/file-markdown.svg +1 -0
  403. data/app/assets/icons/outlined/file-pdf.svg +1 -0
  404. data/app/assets/icons/outlined/file-ppt.svg +1 -0
  405. data/app/assets/icons/outlined/file-protect.svg +1 -0
  406. data/app/assets/icons/outlined/file-search.svg +1 -0
  407. data/app/assets/icons/outlined/file-sync.svg +1 -0
  408. data/app/assets/icons/outlined/file-text.svg +1 -0
  409. data/app/assets/icons/outlined/file-unknown.svg +1 -0
  410. data/app/assets/icons/outlined/file-word.svg +1 -0
  411. data/app/assets/icons/outlined/file-zip.svg +1 -0
  412. data/app/assets/icons/outlined/file.svg +1 -0
  413. data/app/assets/icons/outlined/filter.svg +1 -0
  414. data/app/assets/icons/outlined/fire.svg +1 -0
  415. data/app/assets/icons/outlined/flag.svg +1 -0
  416. data/app/assets/icons/outlined/folder-add.svg +1 -0
  417. data/app/assets/icons/outlined/folder-open.svg +1 -0
  418. data/app/assets/icons/outlined/folder-view.svg +1 -0
  419. data/app/assets/icons/outlined/folder.svg +1 -0
  420. data/app/assets/icons/outlined/font-colors.svg +1 -0
  421. data/app/assets/icons/outlined/font-size.svg +1 -0
  422. data/app/assets/icons/outlined/fork.svg +1 -0
  423. data/app/assets/icons/outlined/form.svg +1 -0
  424. data/app/assets/icons/outlined/format-painter.svg +1 -0
  425. data/app/assets/icons/outlined/forward.svg +1 -0
  426. data/app/assets/icons/outlined/frown.svg +1 -0
  427. data/app/assets/icons/outlined/fullscreen-exit.svg +1 -0
  428. data/app/assets/icons/outlined/fullscreen.svg +1 -0
  429. data/app/assets/icons/outlined/function.svg +1 -0
  430. data/app/assets/icons/outlined/fund-projection-screen.svg +1 -0
  431. data/app/assets/icons/outlined/fund-view.svg +1 -0
  432. data/app/assets/icons/outlined/fund.svg +1 -0
  433. data/app/assets/icons/outlined/funnel-plot.svg +1 -0
  434. data/app/assets/icons/outlined/gateway.svg +1 -0
  435. data/app/assets/icons/outlined/gif.svg +1 -0
  436. data/app/assets/icons/outlined/gift.svg +1 -0
  437. data/app/assets/icons/outlined/github.svg +1 -0
  438. data/app/assets/icons/outlined/gitlab.svg +1 -0
  439. data/app/assets/icons/outlined/global.svg +1 -0
  440. data/app/assets/icons/outlined/gold.svg +1 -0
  441. data/app/assets/icons/outlined/google-plus.svg +1 -0
  442. data/app/assets/icons/outlined/google.svg +1 -0
  443. data/app/assets/icons/outlined/group.svg +1 -0
  444. data/app/assets/icons/outlined/harmony-o-s.svg +1 -0
  445. data/app/assets/icons/outlined/hdd.svg +1 -0
  446. data/app/assets/icons/outlined/heart.svg +1 -0
  447. data/app/assets/icons/outlined/heat-map.svg +1 -0
  448. data/app/assets/icons/outlined/highlight.svg +1 -0
  449. data/app/assets/icons/outlined/history.svg +1 -0
  450. data/app/assets/icons/outlined/holder.svg +1 -0
  451. data/app/assets/icons/outlined/home.svg +1 -0
  452. data/app/assets/icons/outlined/hourglass.svg +1 -0
  453. data/app/assets/icons/outlined/html5.svg +1 -0
  454. data/app/assets/icons/outlined/idcard.svg +1 -0
  455. data/app/assets/icons/outlined/ie.svg +1 -0
  456. data/app/assets/icons/outlined/import.svg +1 -0
  457. data/app/assets/icons/outlined/inbox.svg +1 -0
  458. data/app/assets/icons/outlined/info-circle.svg +1 -0
  459. data/app/assets/icons/outlined/info.svg +1 -0
  460. data/app/assets/icons/outlined/insert-row-above.svg +1 -0
  461. data/app/assets/icons/outlined/insert-row-below.svg +1 -0
  462. data/app/assets/icons/outlined/insert-row-left.svg +1 -0
  463. data/app/assets/icons/outlined/insert-row-right.svg +1 -0
  464. data/app/assets/icons/outlined/instagram.svg +1 -0
  465. data/app/assets/icons/outlined/insurance.svg +1 -0
  466. data/app/assets/icons/outlined/interaction.svg +1 -0
  467. data/app/assets/icons/outlined/issues-close.svg +1 -0
  468. data/app/assets/icons/outlined/italic.svg +1 -0
  469. data/app/assets/icons/outlined/java-script.svg +1 -0
  470. data/app/assets/icons/outlined/java.svg +1 -0
  471. data/app/assets/icons/outlined/key.svg +1 -0
  472. data/app/assets/icons/outlined/kubernetes.svg +1 -0
  473. data/app/assets/icons/outlined/laptop.svg +1 -0
  474. data/app/assets/icons/outlined/layout.svg +1 -0
  475. data/app/assets/icons/outlined/left-circle.svg +1 -0
  476. data/app/assets/icons/outlined/left-square.svg +1 -0
  477. data/app/assets/icons/outlined/left.svg +1 -0
  478. data/app/assets/icons/outlined/like.svg +1 -0
  479. data/app/assets/icons/outlined/line-chart.svg +1 -0
  480. data/app/assets/icons/outlined/line-height.svg +1 -0
  481. data/app/assets/icons/outlined/line.svg +1 -0
  482. data/app/assets/icons/outlined/link.svg +1 -0
  483. data/app/assets/icons/outlined/linkedin.svg +1 -0
  484. data/app/assets/icons/outlined/linux.svg +1 -0
  485. data/app/assets/icons/outlined/loading-3-quarters.svg +1 -0
  486. data/app/assets/icons/outlined/loading.svg +1 -0
  487. data/app/assets/icons/outlined/lock.svg +1 -0
  488. data/app/assets/icons/outlined/login.svg +1 -0
  489. data/app/assets/icons/outlined/logout.svg +1 -0
  490. data/app/assets/icons/outlined/mac-command.svg +1 -0
  491. data/app/assets/icons/outlined/mail.svg +1 -0
  492. data/app/assets/icons/outlined/man.svg +1 -0
  493. data/app/assets/icons/outlined/medicine-box.svg +1 -0
  494. data/app/assets/icons/outlined/medium-workmark.svg +1 -0
  495. data/app/assets/icons/outlined/medium.svg +1 -0
  496. data/app/assets/icons/outlined/meh.svg +1 -0
  497. data/app/assets/icons/outlined/menu-fold.svg +1 -0
  498. data/app/assets/icons/outlined/menu-unfold.svg +1 -0
  499. data/app/assets/icons/outlined/menu.svg +1 -0
  500. data/app/assets/icons/outlined/merge-cells.svg +1 -0
  501. data/app/assets/icons/outlined/merge.svg +1 -0
  502. data/app/assets/icons/outlined/message.svg +1 -0
  503. data/app/assets/icons/outlined/minus-circle.svg +1 -0
  504. data/app/assets/icons/outlined/minus-square.svg +1 -0
  505. data/app/assets/icons/outlined/minus.svg +1 -0
  506. data/app/assets/icons/outlined/mobile.svg +1 -0
  507. data/app/assets/icons/outlined/money-collect.svg +1 -0
  508. data/app/assets/icons/outlined/monitor.svg +1 -0
  509. data/app/assets/icons/outlined/moon.svg +1 -0
  510. data/app/assets/icons/outlined/more.svg +1 -0
  511. data/app/assets/icons/outlined/muted.svg +1 -0
  512. data/app/assets/icons/outlined/node-collapse.svg +1 -0
  513. data/app/assets/icons/outlined/node-expand.svg +1 -0
  514. data/app/assets/icons/outlined/node-index.svg +1 -0
  515. data/app/assets/icons/outlined/notification.svg +1 -0
  516. data/app/assets/icons/outlined/number.svg +1 -0
  517. data/app/assets/icons/outlined/one-to-one.svg +1 -0
  518. data/app/assets/icons/outlined/open-a-i.svg +1 -0
  519. data/app/assets/icons/outlined/ordered-list.svg +1 -0
  520. data/app/assets/icons/outlined/paper-clip.svg +1 -0
  521. data/app/assets/icons/outlined/partition.svg +1 -0
  522. data/app/assets/icons/outlined/pause-circle.svg +1 -0
  523. data/app/assets/icons/outlined/pause.svg +1 -0
  524. data/app/assets/icons/outlined/pay-circle.svg +1 -0
  525. data/app/assets/icons/outlined/percentage.svg +1 -0
  526. data/app/assets/icons/outlined/phone.svg +1 -0
  527. data/app/assets/icons/outlined/pic-center.svg +1 -0
  528. data/app/assets/icons/outlined/pic-left.svg +1 -0
  529. data/app/assets/icons/outlined/pic-right.svg +1 -0
  530. data/app/assets/icons/outlined/picture.svg +1 -0
  531. data/app/assets/icons/outlined/pie-chart.svg +1 -0
  532. data/app/assets/icons/outlined/pinterest.svg +1 -0
  533. data/app/assets/icons/outlined/play-circle.svg +1 -0
  534. data/app/assets/icons/outlined/play-square.svg +1 -0
  535. data/app/assets/icons/outlined/plus-circle.svg +1 -0
  536. data/app/assets/icons/outlined/plus-square.svg +1 -0
  537. data/app/assets/icons/outlined/plus.svg +1 -0
  538. data/app/assets/icons/outlined/pound-circle.svg +1 -0
  539. data/app/assets/icons/outlined/pound.svg +1 -0
  540. data/app/assets/icons/outlined/poweroff.svg +1 -0
  541. data/app/assets/icons/outlined/printer.svg +1 -0
  542. data/app/assets/icons/outlined/product.svg +1 -0
  543. data/app/assets/icons/outlined/profile.svg +1 -0
  544. data/app/assets/icons/outlined/project.svg +1 -0
  545. data/app/assets/icons/outlined/property-safety.svg +1 -0
  546. data/app/assets/icons/outlined/pull-request.svg +1 -0
  547. data/app/assets/icons/outlined/pushpin.svg +1 -0
  548. data/app/assets/icons/outlined/python.svg +1 -0
  549. data/app/assets/icons/outlined/qq.svg +1 -0
  550. data/app/assets/icons/outlined/qrcode.svg +1 -0
  551. data/app/assets/icons/outlined/question-circle.svg +1 -0
  552. data/app/assets/icons/outlined/question.svg +1 -0
  553. data/app/assets/icons/outlined/radar-chart.svg +1 -0
  554. data/app/assets/icons/outlined/radius-bottomleft.svg +1 -0
  555. data/app/assets/icons/outlined/radius-bottomright.svg +1 -0
  556. data/app/assets/icons/outlined/radius-setting.svg +1 -0
  557. data/app/assets/icons/outlined/radius-upleft.svg +1 -0
  558. data/app/assets/icons/outlined/radius-upright.svg +1 -0
  559. data/app/assets/icons/outlined/read.svg +1 -0
  560. data/app/assets/icons/outlined/reconciliation.svg +1 -0
  561. data/app/assets/icons/outlined/red-envelope.svg +1 -0
  562. data/app/assets/icons/outlined/reddit.svg +1 -0
  563. data/app/assets/icons/outlined/redo.svg +1 -0
  564. data/app/assets/icons/outlined/reload.svg +1 -0
  565. data/app/assets/icons/outlined/rest.svg +1 -0
  566. data/app/assets/icons/outlined/retweet.svg +1 -0
  567. data/app/assets/icons/outlined/right-circle.svg +1 -0
  568. data/app/assets/icons/outlined/right-square.svg +1 -0
  569. data/app/assets/icons/outlined/right.svg +1 -0
  570. data/app/assets/icons/outlined/rise.svg +1 -0
  571. data/app/assets/icons/outlined/robot.svg +1 -0
  572. data/app/assets/icons/outlined/rocket.svg +1 -0
  573. data/app/assets/icons/outlined/rollback.svg +1 -0
  574. data/app/assets/icons/outlined/rotate-left.svg +1 -0
  575. data/app/assets/icons/outlined/rotate-right.svg +1 -0
  576. data/app/assets/icons/outlined/ruby.svg +1 -0
  577. data/app/assets/icons/outlined/safety-certificate.svg +1 -0
  578. data/app/assets/icons/outlined/safety.svg +1 -0
  579. data/app/assets/icons/outlined/save.svg +1 -0
  580. data/app/assets/icons/outlined/scan.svg +1 -0
  581. data/app/assets/icons/outlined/schedule.svg +1 -0
  582. data/app/assets/icons/outlined/scissor.svg +1 -0
  583. data/app/assets/icons/outlined/search.svg +1 -0
  584. data/app/assets/icons/outlined/security-scan.svg +1 -0
  585. data/app/assets/icons/outlined/select.svg +1 -0
  586. data/app/assets/icons/outlined/send.svg +1 -0
  587. data/app/assets/icons/outlined/setting.svg +1 -0
  588. data/app/assets/icons/outlined/shake.svg +1 -0
  589. data/app/assets/icons/outlined/share-alt.svg +1 -0
  590. data/app/assets/icons/outlined/shop.svg +1 -0
  591. data/app/assets/icons/outlined/shopping-cart.svg +1 -0
  592. data/app/assets/icons/outlined/shopping.svg +1 -0
  593. data/app/assets/icons/outlined/shrink.svg +1 -0
  594. data/app/assets/icons/outlined/signature.svg +1 -0
  595. data/app/assets/icons/outlined/sisternode.svg +1 -0
  596. data/app/assets/icons/outlined/sketch.svg +1 -0
  597. data/app/assets/icons/outlined/skin.svg +1 -0
  598. data/app/assets/icons/outlined/skype.svg +1 -0
  599. data/app/assets/icons/outlined/slack-square.svg +1 -0
  600. data/app/assets/icons/outlined/slack.svg +1 -0
  601. data/app/assets/icons/outlined/sliders.svg +1 -0
  602. data/app/assets/icons/outlined/small-dash.svg +1 -0
  603. data/app/assets/icons/outlined/smile.svg +1 -0
  604. data/app/assets/icons/outlined/snippets.svg +1 -0
  605. data/app/assets/icons/outlined/solution.svg +1 -0
  606. data/app/assets/icons/outlined/sort-ascending.svg +1 -0
  607. data/app/assets/icons/outlined/sort-descending.svg +1 -0
  608. data/app/assets/icons/outlined/sound.svg +1 -0
  609. data/app/assets/icons/outlined/split-cells.svg +1 -0
  610. data/app/assets/icons/outlined/spotify.svg +1 -0
  611. data/app/assets/icons/outlined/star.svg +1 -0
  612. data/app/assets/icons/outlined/step-backward.svg +1 -0
  613. data/app/assets/icons/outlined/step-forward.svg +1 -0
  614. data/app/assets/icons/outlined/stock.svg +1 -0
  615. data/app/assets/icons/outlined/stop.svg +1 -0
  616. data/app/assets/icons/outlined/strikethrough.svg +1 -0
  617. data/app/assets/icons/outlined/subnode.svg +1 -0
  618. data/app/assets/icons/outlined/sun.svg +1 -0
  619. data/app/assets/icons/outlined/swap-left.svg +1 -0
  620. data/app/assets/icons/outlined/swap-right.svg +1 -0
  621. data/app/assets/icons/outlined/swap.svg +1 -0
  622. data/app/assets/icons/outlined/switcher.svg +1 -0
  623. data/app/assets/icons/outlined/sync.svg +1 -0
  624. data/app/assets/icons/outlined/table.svg +1 -0
  625. data/app/assets/icons/outlined/tablet.svg +1 -0
  626. data/app/assets/icons/outlined/tag.svg +1 -0
  627. data/app/assets/icons/outlined/tags.svg +1 -0
  628. data/app/assets/icons/outlined/taobao-circle.svg +1 -0
  629. data/app/assets/icons/outlined/taobao.svg +1 -0
  630. data/app/assets/icons/outlined/team.svg +1 -0
  631. data/app/assets/icons/outlined/thunderbolt.svg +1 -0
  632. data/app/assets/icons/outlined/tik-tok.svg +1 -0
  633. data/app/assets/icons/outlined/to-top.svg +1 -0
  634. data/app/assets/icons/outlined/tool.svg +1 -0
  635. data/app/assets/icons/outlined/trademark-circle.svg +1 -0
  636. data/app/assets/icons/outlined/trademark.svg +1 -0
  637. data/app/assets/icons/outlined/transaction.svg +1 -0
  638. data/app/assets/icons/outlined/translation.svg +1 -0
  639. data/app/assets/icons/outlined/trophy.svg +1 -0
  640. data/app/assets/icons/outlined/truck.svg +1 -0
  641. data/app/assets/icons/outlined/twitch.svg +1 -0
  642. data/app/assets/icons/outlined/twitter.svg +1 -0
  643. data/app/assets/icons/outlined/underline.svg +1 -0
  644. data/app/assets/icons/outlined/undo.svg +1 -0
  645. data/app/assets/icons/outlined/ungroup.svg +1 -0
  646. data/app/assets/icons/outlined/unlock.svg +1 -0
  647. data/app/assets/icons/outlined/unordered-list.svg +1 -0
  648. data/app/assets/icons/outlined/up-circle.svg +1 -0
  649. data/app/assets/icons/outlined/up-square.svg +1 -0
  650. data/app/assets/icons/outlined/up.svg +1 -0
  651. data/app/assets/icons/outlined/upload.svg +1 -0
  652. data/app/assets/icons/outlined/usb.svg +1 -0
  653. data/app/assets/icons/outlined/user-add.svg +1 -0
  654. data/app/assets/icons/outlined/user-delete.svg +1 -0
  655. data/app/assets/icons/outlined/user-switch.svg +1 -0
  656. data/app/assets/icons/outlined/user.svg +1 -0
  657. data/app/assets/icons/outlined/usergroup-add.svg +1 -0
  658. data/app/assets/icons/outlined/usergroup-delete.svg +1 -0
  659. data/app/assets/icons/outlined/verified.svg +1 -0
  660. data/app/assets/icons/outlined/vertical-align-bottom.svg +1 -0
  661. data/app/assets/icons/outlined/vertical-align-middle.svg +1 -0
  662. data/app/assets/icons/outlined/vertical-align-top.svg +1 -0
  663. data/app/assets/icons/outlined/vertical-left.svg +1 -0
  664. data/app/assets/icons/outlined/vertical-right.svg +1 -0
  665. data/app/assets/icons/outlined/video-camera-add.svg +1 -0
  666. data/app/assets/icons/outlined/video-camera.svg +1 -0
  667. data/app/assets/icons/outlined/wallet.svg +1 -0
  668. data/app/assets/icons/outlined/warning.svg +1 -0
  669. data/app/assets/icons/outlined/wechat-work.svg +1 -0
  670. data/app/assets/icons/outlined/wechat.svg +1 -0
  671. data/app/assets/icons/outlined/weibo-circle.svg +1 -0
  672. data/app/assets/icons/outlined/weibo-square.svg +1 -0
  673. data/app/assets/icons/outlined/weibo.svg +1 -0
  674. data/app/assets/icons/outlined/whats-app.svg +1 -0
  675. data/app/assets/icons/outlined/wifi.svg +1 -0
  676. data/app/assets/icons/outlined/windows.svg +1 -0
  677. data/app/assets/icons/outlined/woman.svg +1 -0
  678. data/app/assets/icons/outlined/x.svg +1 -0
  679. data/app/assets/icons/outlined/yahoo.svg +1 -0
  680. data/app/assets/icons/outlined/youtube.svg +1 -0
  681. data/app/assets/icons/outlined/yuque.svg +1 -0
  682. data/app/assets/icons/outlined/zhihu.svg +1 -0
  683. data/app/assets/icons/outlined/zoom-in.svg +1 -0
  684. data/app/assets/icons/outlined/zoom-out.svg +1 -0
  685. data/app/assets/icons/twotone/account-book.svg +1 -0
  686. data/app/assets/icons/twotone/alert.svg +1 -0
  687. data/app/assets/icons/twotone/api.svg +1 -0
  688. data/app/assets/icons/twotone/appstore.svg +1 -0
  689. data/app/assets/icons/twotone/audio.svg +1 -0
  690. data/app/assets/icons/twotone/bank.svg +1 -0
  691. data/app/assets/icons/twotone/bell.svg +1 -0
  692. data/app/assets/icons/twotone/book.svg +1 -0
  693. data/app/assets/icons/twotone/box-plot.svg +1 -0
  694. data/app/assets/icons/twotone/bug.svg +1 -0
  695. data/app/assets/icons/twotone/build.svg +1 -0
  696. data/app/assets/icons/twotone/bulb.svg +1 -0
  697. data/app/assets/icons/twotone/calculator.svg +1 -0
  698. data/app/assets/icons/twotone/calendar.svg +1 -0
  699. data/app/assets/icons/twotone/camera.svg +1 -0
  700. data/app/assets/icons/twotone/car.svg +1 -0
  701. data/app/assets/icons/twotone/carry-out.svg +1 -0
  702. data/app/assets/icons/twotone/check-circle.svg +1 -0
  703. data/app/assets/icons/twotone/check-square.svg +1 -0
  704. data/app/assets/icons/twotone/ci-circle.svg +1 -0
  705. data/app/assets/icons/twotone/ci.svg +1 -0
  706. data/app/assets/icons/twotone/clock-circle.svg +1 -0
  707. data/app/assets/icons/twotone/close-circle.svg +1 -0
  708. data/app/assets/icons/twotone/close-square.svg +1 -0
  709. data/app/assets/icons/twotone/cloud.svg +1 -0
  710. data/app/assets/icons/twotone/code.svg +1 -0
  711. data/app/assets/icons/twotone/compass.svg +1 -0
  712. data/app/assets/icons/twotone/contacts.svg +1 -0
  713. data/app/assets/icons/twotone/container.svg +1 -0
  714. data/app/assets/icons/twotone/control.svg +1 -0
  715. data/app/assets/icons/twotone/copy.svg +1 -0
  716. data/app/assets/icons/twotone/copyright-circle.svg +1 -0
  717. data/app/assets/icons/twotone/copyright.svg +1 -0
  718. data/app/assets/icons/twotone/credit-card.svg +1 -0
  719. data/app/assets/icons/twotone/crown.svg +1 -0
  720. data/app/assets/icons/twotone/customer-service.svg +1 -0
  721. data/app/assets/icons/twotone/dashboard.svg +1 -0
  722. data/app/assets/icons/twotone/database.svg +1 -0
  723. data/app/assets/icons/twotone/delete.svg +1 -0
  724. data/app/assets/icons/twotone/diff.svg +1 -0
  725. data/app/assets/icons/twotone/dislike.svg +1 -0
  726. data/app/assets/icons/twotone/dollar-circle.svg +1 -0
  727. data/app/assets/icons/twotone/dollar.svg +1 -0
  728. data/app/assets/icons/twotone/down-circle.svg +1 -0
  729. data/app/assets/icons/twotone/down-square.svg +1 -0
  730. data/app/assets/icons/twotone/edit.svg +1 -0
  731. data/app/assets/icons/twotone/environment.svg +1 -0
  732. data/app/assets/icons/twotone/euro-circle.svg +1 -0
  733. data/app/assets/icons/twotone/euro.svg +1 -0
  734. data/app/assets/icons/twotone/exclamation-circle.svg +1 -0
  735. data/app/assets/icons/twotone/experiment.svg +1 -0
  736. data/app/assets/icons/twotone/eye-invisible.svg +1 -0
  737. data/app/assets/icons/twotone/eye.svg +1 -0
  738. data/app/assets/icons/twotone/file-add.svg +1 -0
  739. data/app/assets/icons/twotone/file-excel.svg +1 -0
  740. data/app/assets/icons/twotone/file-exclamation.svg +1 -0
  741. data/app/assets/icons/twotone/file-image.svg +1 -0
  742. data/app/assets/icons/twotone/file-markdown.svg +1 -0
  743. data/app/assets/icons/twotone/file-pdf.svg +1 -0
  744. data/app/assets/icons/twotone/file-ppt.svg +1 -0
  745. data/app/assets/icons/twotone/file-text.svg +1 -0
  746. data/app/assets/icons/twotone/file-unknown.svg +1 -0
  747. data/app/assets/icons/twotone/file-word.svg +1 -0
  748. data/app/assets/icons/twotone/file-zip.svg +1 -0
  749. data/app/assets/icons/twotone/file.svg +1 -0
  750. data/app/assets/icons/twotone/filter.svg +1 -0
  751. data/app/assets/icons/twotone/fire.svg +1 -0
  752. data/app/assets/icons/twotone/flag.svg +1 -0
  753. data/app/assets/icons/twotone/folder-add.svg +1 -0
  754. data/app/assets/icons/twotone/folder-open.svg +1 -0
  755. data/app/assets/icons/twotone/folder.svg +1 -0
  756. data/app/assets/icons/twotone/frown.svg +1 -0
  757. data/app/assets/icons/twotone/fund.svg +1 -0
  758. data/app/assets/icons/twotone/funnel-plot.svg +1 -0
  759. data/app/assets/icons/twotone/gift.svg +1 -0
  760. data/app/assets/icons/twotone/gold.svg +1 -0
  761. data/app/assets/icons/twotone/hdd.svg +1 -0
  762. data/app/assets/icons/twotone/heart.svg +1 -0
  763. data/app/assets/icons/twotone/highlight.svg +1 -0
  764. data/app/assets/icons/twotone/home.svg +1 -0
  765. data/app/assets/icons/twotone/hourglass.svg +1 -0
  766. data/app/assets/icons/twotone/html5.svg +1 -0
  767. data/app/assets/icons/twotone/idcard.svg +1 -0
  768. data/app/assets/icons/twotone/info-circle.svg +1 -0
  769. data/app/assets/icons/twotone/insurance.svg +1 -0
  770. data/app/assets/icons/twotone/interaction.svg +1 -0
  771. data/app/assets/icons/twotone/layout.svg +1 -0
  772. data/app/assets/icons/twotone/left-circle.svg +1 -0
  773. data/app/assets/icons/twotone/left-square.svg +1 -0
  774. data/app/assets/icons/twotone/like.svg +1 -0
  775. data/app/assets/icons/twotone/lock.svg +1 -0
  776. data/app/assets/icons/twotone/mail.svg +1 -0
  777. data/app/assets/icons/twotone/medicine-box.svg +1 -0
  778. data/app/assets/icons/twotone/meh.svg +1 -0
  779. data/app/assets/icons/twotone/message.svg +1 -0
  780. data/app/assets/icons/twotone/minus-circle.svg +1 -0
  781. data/app/assets/icons/twotone/minus-square.svg +1 -0
  782. data/app/assets/icons/twotone/mobile.svg +1 -0
  783. data/app/assets/icons/twotone/money-collect.svg +1 -0
  784. data/app/assets/icons/twotone/notification.svg +1 -0
  785. data/app/assets/icons/twotone/pause-circle.svg +1 -0
  786. data/app/assets/icons/twotone/phone.svg +1 -0
  787. data/app/assets/icons/twotone/picture.svg +1 -0
  788. data/app/assets/icons/twotone/pie-chart.svg +1 -0
  789. data/app/assets/icons/twotone/play-circle.svg +1 -0
  790. data/app/assets/icons/twotone/play-square.svg +1 -0
  791. data/app/assets/icons/twotone/plus-circle.svg +1 -0
  792. data/app/assets/icons/twotone/plus-square.svg +1 -0
  793. data/app/assets/icons/twotone/pound-circle.svg +1 -0
  794. data/app/assets/icons/twotone/printer.svg +1 -0
  795. data/app/assets/icons/twotone/profile.svg +1 -0
  796. data/app/assets/icons/twotone/project.svg +1 -0
  797. data/app/assets/icons/twotone/property-safety.svg +1 -0
  798. data/app/assets/icons/twotone/pushpin.svg +1 -0
  799. data/app/assets/icons/twotone/question-circle.svg +1 -0
  800. data/app/assets/icons/twotone/reconciliation.svg +1 -0
  801. data/app/assets/icons/twotone/red-envelope.svg +1 -0
  802. data/app/assets/icons/twotone/rest.svg +1 -0
  803. data/app/assets/icons/twotone/right-circle.svg +1 -0
  804. data/app/assets/icons/twotone/right-square.svg +1 -0
  805. data/app/assets/icons/twotone/rocket.svg +1 -0
  806. data/app/assets/icons/twotone/safety-certificate.svg +1 -0
  807. data/app/assets/icons/twotone/save.svg +1 -0
  808. data/app/assets/icons/twotone/schedule.svg +1 -0
  809. data/app/assets/icons/twotone/security-scan.svg +1 -0
  810. data/app/assets/icons/twotone/setting.svg +1 -0
  811. data/app/assets/icons/twotone/shop.svg +1 -0
  812. data/app/assets/icons/twotone/shopping.svg +1 -0
  813. data/app/assets/icons/twotone/skin.svg +1 -0
  814. data/app/assets/icons/twotone/sliders.svg +1 -0
  815. data/app/assets/icons/twotone/smile.svg +1 -0
  816. data/app/assets/icons/twotone/snippets.svg +1 -0
  817. data/app/assets/icons/twotone/sound.svg +1 -0
  818. data/app/assets/icons/twotone/star.svg +1 -0
  819. data/app/assets/icons/twotone/stop.svg +1 -0
  820. data/app/assets/icons/twotone/switcher.svg +1 -0
  821. data/app/assets/icons/twotone/tablet.svg +1 -0
  822. data/app/assets/icons/twotone/tag.svg +1 -0
  823. data/app/assets/icons/twotone/tags.svg +1 -0
  824. data/app/assets/icons/twotone/thunderbolt.svg +1 -0
  825. data/app/assets/icons/twotone/tool.svg +1 -0
  826. data/app/assets/icons/twotone/trademark-circle.svg +1 -0
  827. data/app/assets/icons/twotone/trophy.svg +1 -0
  828. data/app/assets/icons/twotone/unlock.svg +1 -0
  829. data/app/assets/icons/twotone/up-circle.svg +1 -0
  830. data/app/assets/icons/twotone/up-square.svg +1 -0
  831. data/app/assets/icons/twotone/usb.svg +1 -0
  832. data/app/assets/icons/twotone/video-camera.svg +1 -0
  833. data/app/assets/icons/twotone/wallet.svg +1 -0
  834. data/app/assets/icons/twotone/warning.svg +1 -0
  835. data/app/assets/illustrations/success.svg +1 -0
  836. data/app/assets/javascripts/hakumi_components.js +1 -0
  837. data/app/assets/stylesheets/hakumi/alert.scss +1 -0
  838. data/app/assets/stylesheets/hakumi_components.css +1 -0
  839. data/app/components/hakumi/admin_panel/component.html.erb +61 -0
  840. data/app/components/hakumi/admin_panel/component.rb +40 -0
  841. data/app/components/hakumi/affix/component.html.erb +7 -0
  842. data/app/components/hakumi/affix/component.rb +88 -0
  843. data/app/components/hakumi/alert/component.html.erb +30 -0
  844. data/app/components/hakumi/alert/component.rb +128 -0
  845. data/app/components/hakumi/anchor/component.html.erb +8 -0
  846. data/app/components/hakumi/anchor/component.rb +80 -0
  847. data/app/components/hakumi/anchor/link/component.html.erb +12 -0
  848. data/app/components/hakumi/anchor/link/component.rb +34 -0
  849. data/app/components/hakumi/autocomplete/component.html.erb +74 -0
  850. data/app/components/hakumi/autocomplete/component.rb +202 -0
  851. data/app/components/hakumi/avatar/component.rb +91 -0
  852. data/app/components/hakumi/badge/component.rb +85 -0
  853. data/app/components/hakumi/base_component.rb +179 -0
  854. data/app/components/hakumi/breadcrumb/component.html.erb +12 -0
  855. data/app/components/hakumi/breadcrumb/component.rb +27 -0
  856. data/app/components/hakumi/breadcrumb/item/component.html.erb +17 -0
  857. data/app/components/hakumi/breadcrumb/item/component.rb +35 -0
  858. data/app/components/hakumi/button/component.rb +121 -0
  859. data/app/components/hakumi/calendar/component.html.erb +163 -0
  860. data/app/components/hakumi/calendar/component.rb +448 -0
  861. data/app/components/hakumi/card/component.html.erb +65 -0
  862. data/app/components/hakumi/card/component.rb +87 -0
  863. data/app/components/hakumi/card/grid/component.html.erb +3 -0
  864. data/app/components/hakumi/card/grid/component.rb +37 -0
  865. data/app/components/hakumi/card/meta/component.html.erb +23 -0
  866. data/app/components/hakumi/card/meta/component.rb +46 -0
  867. data/app/components/hakumi/carousel/component.html.erb +56 -0
  868. data/app/components/hakumi/carousel/component.rb +147 -0
  869. data/app/components/hakumi/cascader/component.html.erb +41 -0
  870. data/app/components/hakumi/cascader/component.rb +119 -0
  871. data/app/components/hakumi/checkbox/component.html.erb +21 -0
  872. data/app/components/hakumi/checkbox/component.rb +54 -0
  873. data/app/components/hakumi/checkbox/group/component.html.erb +12 -0
  874. data/app/components/hakumi/checkbox/group/component.rb +64 -0
  875. data/app/components/hakumi/collapse/component.html.erb +31 -0
  876. data/app/components/hakumi/collapse/component.rb +117 -0
  877. data/app/components/hakumi/collapse/panel/component.rb +56 -0
  878. data/app/components/hakumi/color_picker/component.html.erb +166 -0
  879. data/app/components/hakumi/color_picker/component.rb +173 -0
  880. data/app/components/hakumi/concerns/form_field.rb +135 -0
  881. data/app/components/hakumi/container/component.rb +76 -0
  882. data/app/components/hakumi/date_picker/component.html.erb +80 -0
  883. data/app/components/hakumi/date_picker/component.rb +140 -0
  884. data/app/components/hakumi/date_picker/range_picker.html.erb +54 -0
  885. data/app/components/hakumi/date_picker/range_picker.rb +136 -0
  886. data/app/components/hakumi/date_picker/shared_rendering.rb +199 -0
  887. data/app/components/hakumi/descriptions/component.html.erb +52 -0
  888. data/app/components/hakumi/descriptions/component.rb +182 -0
  889. data/app/components/hakumi/descriptions/item/component.rb +28 -0
  890. data/app/components/hakumi/divider/component.rb +66 -0
  891. data/app/components/hakumi/drawer/component.html.erb +44 -0
  892. data/app/components/hakumi/drawer/component.rb +115 -0
  893. data/app/components/hakumi/dropdown/component.html.erb +20 -0
  894. data/app/components/hakumi/dropdown/component.rb +97 -0
  895. data/app/components/hakumi/dropdown/divider/component.rb +13 -0
  896. data/app/components/hakumi/dropdown/item/component.html.erb +17 -0
  897. data/app/components/hakumi/dropdown/item/component.rb +47 -0
  898. data/app/components/hakumi/empty/component.rb +110 -0
  899. data/app/components/hakumi/flex/component.rb +78 -0
  900. data/app/components/hakumi/float_button/back_top/component.rb +79 -0
  901. data/app/components/hakumi/float_button/component.rb +203 -0
  902. data/app/components/hakumi/float_button/group/component.rb +227 -0
  903. data/app/components/hakumi/float_button/group_cluster/component.rb +141 -0
  904. data/app/components/hakumi/form/item/component.rb +114 -0
  905. data/app/components/hakumi/grid/col/component.rb +98 -0
  906. data/app/components/hakumi/grid/row/component.rb +79 -0
  907. data/app/components/hakumi/icon/component.html.erb +3 -0
  908. data/app/components/hakumi/icon/component.rb +167 -0
  909. data/app/components/hakumi/image/component.html.erb +81 -0
  910. data/app/components/hakumi/image/component.rb +112 -0
  911. data/app/components/hakumi/image/preview_group/component.html.erb +83 -0
  912. data/app/components/hakumi/image/preview_group/component.rb +70 -0
  913. data/app/components/hakumi/input/component.html.erb +27 -0
  914. data/app/components/hakumi/input/component.rb +187 -0
  915. data/app/components/hakumi/input/password/component.rb +95 -0
  916. data/app/components/hakumi/input/text_area/component.html.erb +21 -0
  917. data/app/components/hakumi/input/text_area/component.rb +133 -0
  918. data/app/components/hakumi/input_number/component.html.erb +73 -0
  919. data/app/components/hakumi/input_number/component.rb +199 -0
  920. data/app/components/hakumi/layout/component.html.erb +1 -0
  921. data/app/components/hakumi/layout/component.rb +21 -0
  922. data/app/components/hakumi/layout/content/component.html.erb +1 -0
  923. data/app/components/hakumi/layout/content/component.rb +19 -0
  924. data/app/components/hakumi/layout/footer/component.html.erb +1 -0
  925. data/app/components/hakumi/layout/footer/component.rb +19 -0
  926. data/app/components/hakumi/layout/header/component.html.erb +1 -0
  927. data/app/components/hakumi/layout/header/component.rb +19 -0
  928. data/app/components/hakumi/layout/sider/component.html.erb +1 -0
  929. data/app/components/hakumi/layout/sider/component.rb +56 -0
  930. data/app/components/hakumi/mentions/component.html.erb +51 -0
  931. data/app/components/hakumi/mentions/component.rb +166 -0
  932. data/app/components/hakumi/menu/component.html.erb +5 -0
  933. data/app/components/hakumi/menu/component.rb +126 -0
  934. data/app/components/hakumi/menu/divider/component.rb +13 -0
  935. data/app/components/hakumi/menu/group/component.html.erb +8 -0
  936. data/app/components/hakumi/menu/group/component.rb +47 -0
  937. data/app/components/hakumi/menu/item/component.html.erb +22 -0
  938. data/app/components/hakumi/menu/item/component.rb +47 -0
  939. data/app/components/hakumi/menu/sub_menu/component.html.erb +23 -0
  940. data/app/components/hakumi/menu/sub_menu/component.rb +92 -0
  941. data/app/components/hakumi/message/component.html.erb +1 -0
  942. data/app/components/hakumi/message/component.rb +106 -0
  943. data/app/components/hakumi/modal/component.rb +177 -0
  944. data/app/components/hakumi/modal/confirm/component.rb +64 -0
  945. data/app/components/hakumi/modal/error/component.rb +50 -0
  946. data/app/components/hakumi/modal/info/component.rb +50 -0
  947. data/app/components/hakumi/modal/success/component.rb +50 -0
  948. data/app/components/hakumi/modal/warning/component.rb +51 -0
  949. data/app/components/hakumi/notification/component.rb +126 -0
  950. data/app/components/hakumi/pagination/component.html.erb +115 -0
  951. data/app/components/hakumi/pagination/component.rb +205 -0
  952. data/app/components/hakumi/popconfirm/component.html.erb +55 -0
  953. data/app/components/hakumi/popconfirm/component.rb +88 -0
  954. data/app/components/hakumi/popover/component.html.erb +25 -0
  955. data/app/components/hakumi/popover/component.rb +132 -0
  956. data/app/components/hakumi/progress/component.html.erb +81 -0
  957. data/app/components/hakumi/progress/component.rb +565 -0
  958. data/app/components/hakumi/qr_code/component.html.erb +15 -0
  959. data/app/components/hakumi/qr_code/component.rb +339 -0
  960. data/app/components/hakumi/radio/component.html.erb +43 -0
  961. data/app/components/hakumi/radio/component.rb +80 -0
  962. data/app/components/hakumi/radio/group/component.html.erb +49 -0
  963. data/app/components/hakumi/radio/group/component.rb +132 -0
  964. data/app/components/hakumi/rate/component.html.erb +48 -0
  965. data/app/components/hakumi/rate/component.rb +132 -0
  966. data/app/components/hakumi/result/component.html.erb +23 -0
  967. data/app/components/hakumi/result/component.rb +125 -0
  968. data/app/components/hakumi/segmented/component.html.erb +17 -0
  969. data/app/components/hakumi/segmented/component.rb +273 -0
  970. data/app/components/hakumi/select/component.html.erb +103 -0
  971. data/app/components/hakumi/select/component.rb +125 -0
  972. data/app/components/hakumi/skeleton/avatar/component.html.erb +3 -0
  973. data/app/components/hakumi/skeleton/avatar/component.rb +66 -0
  974. data/app/components/hakumi/skeleton/button/component.html.erb +3 -0
  975. data/app/components/hakumi/skeleton/button/component.rb +59 -0
  976. data/app/components/hakumi/skeleton/component.html.erb +25 -0
  977. data/app/components/hakumi/skeleton/component.rb +200 -0
  978. data/app/components/hakumi/skeleton/image/component.html.erb +5 -0
  979. data/app/components/hakumi/skeleton/image/component.rb +80 -0
  980. data/app/components/hakumi/skeleton/input/component.html.erb +3 -0
  981. data/app/components/hakumi/skeleton/input/component.rb +51 -0
  982. data/app/components/hakumi/skeleton/node/component.html.erb +5 -0
  983. data/app/components/hakumi/skeleton/node/component.rb +43 -0
  984. data/app/components/hakumi/slider/component.html.erb +67 -0
  985. data/app/components/hakumi/slider/component.rb +232 -0
  986. data/app/components/hakumi/space/compact/component.html.erb +3 -0
  987. data/app/components/hakumi/space/compact/component.rb +36 -0
  988. data/app/components/hakumi/space/component.html.erb +12 -0
  989. data/app/components/hakumi/space/component.rb +73 -0
  990. data/app/components/hakumi/spin/component.html.erb +13 -0
  991. data/app/components/hakumi/spin/component.rb +209 -0
  992. data/app/components/hakumi/splitter/component.html.erb +3 -0
  993. data/app/components/hakumi/splitter/component.rb +38 -0
  994. data/app/components/hakumi/splitter/panel/component.html.erb +3 -0
  995. data/app/components/hakumi/splitter/panel/component.rb +73 -0
  996. data/app/components/hakumi/statistic/component.html.erb +16 -0
  997. data/app/components/hakumi/statistic/component.rb +291 -0
  998. data/app/components/hakumi/steps/component.html.erb +57 -0
  999. data/app/components/hakumi/steps/component.rb +145 -0
  1000. data/app/components/hakumi/steps/item/component.html.erb +1 -0
  1001. data/app/components/hakumi/steps/item/component.rb +91 -0
  1002. data/app/components/hakumi/switch/component.html.erb +28 -0
  1003. data/app/components/hakumi/switch/component.rb +125 -0
  1004. data/app/components/hakumi/table/column/component.rb +80 -0
  1005. data/app/components/hakumi/table/column_group/component.rb +78 -0
  1006. data/app/components/hakumi/table/component.html.erb +196 -0
  1007. data/app/components/hakumi/table/component.rb +957 -0
  1008. data/app/components/hakumi/table/concerns/columns.rb +219 -0
  1009. data/app/components/hakumi/tabs/component.html.erb +84 -0
  1010. data/app/components/hakumi/tabs/component.rb +196 -0
  1011. data/app/components/hakumi/tabs/item/component.rb +87 -0
  1012. data/app/components/hakumi/tag/component.rb +187 -0
  1013. data/app/components/hakumi/tag/group/component.rb +48 -0
  1014. data/app/components/hakumi/time_picker/component.html.erb +63 -0
  1015. data/app/components/hakumi/time_picker/component.rb +159 -0
  1016. data/app/components/hakumi/timeline/component.html.erb +7 -0
  1017. data/app/components/hakumi/timeline/component.rb +168 -0
  1018. data/app/components/hakumi/timeline/item/component.html.erb +19 -0
  1019. data/app/components/hakumi/timeline/item/component.rb +137 -0
  1020. data/app/components/hakumi/tooltip/component.html.erb +20 -0
  1021. data/app/components/hakumi/tooltip/component.rb +121 -0
  1022. data/app/components/hakumi/tour/component.html.erb +66 -0
  1023. data/app/components/hakumi/tour/component.rb +158 -0
  1024. data/app/components/hakumi/transfer/component.html.erb +173 -0
  1025. data/app/components/hakumi/transfer/component.rb +249 -0
  1026. data/app/components/hakumi/tree/component.html.erb +23 -0
  1027. data/app/components/hakumi/tree/component.rb +523 -0
  1028. data/app/components/hakumi/tree_select/component.html.erb +76 -0
  1029. data/app/components/hakumi/tree_select/component.rb +261 -0
  1030. data/app/components/hakumi/typography/base_component.rb +109 -0
  1031. data/app/components/hakumi/typography/link/component.rb +34 -0
  1032. data/app/components/hakumi/typography/paragraph/component.rb +13 -0
  1033. data/app/components/hakumi/typography/text/component.rb +8 -0
  1034. data/app/components/hakumi/typography/title/component.rb +29 -0
  1035. data/app/components/hakumi/upload/component.html.erb +117 -0
  1036. data/app/components/hakumi/upload/component.rb +193 -0
  1037. data/app/controllers/hakumi_components/components_controller.rb +27 -0
  1038. data/app/form_builders/hakumi/form_builder.rb +440 -0
  1039. data/app/javascript/hakumi_components/boot.js +8 -0
  1040. data/app/javascript/hakumi_components/controllers/base/registry_controller.js +101 -0
  1041. data/app/javascript/hakumi_components/controllers/hakumi/admin_panel_controller.js +363 -0
  1042. data/app/javascript/hakumi_components/controllers/hakumi/affix_controller.js +206 -0
  1043. data/app/javascript/hakumi_components/controllers/hakumi/alert_controller.js +46 -0
  1044. data/app/javascript/hakumi_components/controllers/hakumi/anchor_controller.js +212 -0
  1045. data/app/javascript/hakumi_components/controllers/hakumi/autocomplete_controller.js +357 -0
  1046. data/app/javascript/hakumi_components/controllers/hakumi/avatar_text_controller.js +48 -0
  1047. data/app/javascript/hakumi_components/controllers/hakumi/back_top_controller.js +83 -0
  1048. data/app/javascript/hakumi_components/controllers/hakumi/button_controller.js +65 -0
  1049. data/app/javascript/hakumi_components/controllers/hakumi/calendar_controller.js +1101 -0
  1050. data/app/javascript/hakumi_components/controllers/hakumi/carousel_controller.js +348 -0
  1051. data/app/javascript/hakumi_components/controllers/hakumi/cascader_controller.js +287 -0
  1052. data/app/javascript/hakumi_components/controllers/hakumi/checkbox_controller.js +84 -0
  1053. data/app/javascript/hakumi_components/controllers/hakumi/checkbox_group_controller.js +132 -0
  1054. data/app/javascript/hakumi_components/controllers/hakumi/collapse_controller.js +181 -0
  1055. data/app/javascript/hakumi_components/controllers/hakumi/color_picker_controller.js +735 -0
  1056. data/app/javascript/hakumi_components/controllers/hakumi/date_picker_controller.js +906 -0
  1057. data/app/javascript/hakumi_components/controllers/hakumi/drawer_controller.js +126 -0
  1058. data/app/javascript/hakumi_components/controllers/hakumi/dropdown_controller.js +103 -0
  1059. data/app/javascript/hakumi_components/controllers/hakumi/float_button_group_controller.js +52 -0
  1060. data/app/javascript/hakumi_components/controllers/hakumi/form_item_controller.js +348 -0
  1061. data/app/javascript/hakumi_components/controllers/hakumi/image_controller.js +437 -0
  1062. data/app/javascript/hakumi_components/controllers/hakumi/input_controller.js +84 -0
  1063. data/app/javascript/hakumi_components/controllers/hakumi/input_number_controller.js +302 -0
  1064. data/app/javascript/hakumi_components/controllers/hakumi/input_password_controller.js +112 -0
  1065. data/app/javascript/hakumi_components/controllers/hakumi/input_textarea_controller.js +102 -0
  1066. data/app/javascript/hakumi_components/controllers/hakumi/mentions_controller.js +412 -0
  1067. data/app/javascript/hakumi_components/controllers/hakumi/menu_controller.js +485 -0
  1068. data/app/javascript/hakumi_components/controllers/hakumi/message_controller.js +344 -0
  1069. data/app/javascript/hakumi_components/controllers/hakumi/modal_controller.js +167 -0
  1070. data/app/javascript/hakumi_components/controllers/hakumi/modal_trigger_controller.js +53 -0
  1071. data/app/javascript/hakumi_components/controllers/hakumi/notification_controller.js +433 -0
  1072. data/app/javascript/hakumi_components/controllers/hakumi/pagination_controller.js +406 -0
  1073. data/app/javascript/hakumi_components/controllers/hakumi/popconfirm_controller.js +357 -0
  1074. data/app/javascript/hakumi_components/controllers/hakumi/popover_controller.js +473 -0
  1075. data/app/javascript/hakumi_components/controllers/hakumi/progress_controller.js +185 -0
  1076. data/app/javascript/hakumi_components/controllers/hakumi/qr_code_controller.js +315 -0
  1077. data/app/javascript/hakumi_components/controllers/hakumi/radio_controller.js +86 -0
  1078. data/app/javascript/hakumi_components/controllers/hakumi/rate_controller.js +262 -0
  1079. data/app/javascript/hakumi_components/controllers/hakumi/segmented_controller.js +171 -0
  1080. data/app/javascript/hakumi_components/controllers/hakumi/select_controller.js +315 -0
  1081. data/app/javascript/hakumi_components/controllers/hakumi/slider_controller.js +471 -0
  1082. data/app/javascript/hakumi_components/controllers/hakumi/spin_controller.js +130 -0
  1083. data/app/javascript/hakumi_components/controllers/hakumi/splitter_controller.js +184 -0
  1084. data/app/javascript/hakumi_components/controllers/hakumi/statistic_controller.js +249 -0
  1085. data/app/javascript/hakumi_components/controllers/hakumi/steps_controller.js +125 -0
  1086. data/app/javascript/hakumi_components/controllers/hakumi/switch_controller.js +147 -0
  1087. data/app/javascript/hakumi_components/controllers/hakumi/table_controller.js +1198 -0
  1088. data/app/javascript/hakumi_components/controllers/hakumi/tabs_controller.js +567 -0
  1089. data/app/javascript/hakumi_components/controllers/hakumi/tag_controller.js +103 -0
  1090. data/app/javascript/hakumi_components/controllers/hakumi/tag_group_controller.js +94 -0
  1091. data/app/javascript/hakumi_components/controllers/hakumi/theme_controller.js +114 -0
  1092. data/app/javascript/hakumi_components/controllers/hakumi/time_picker_controller.js +291 -0
  1093. data/app/javascript/hakumi_components/controllers/hakumi/timeline_controller.js +88 -0
  1094. data/app/javascript/hakumi_components/controllers/hakumi/tooltip_controller.js +295 -0
  1095. data/app/javascript/hakumi_components/controllers/hakumi/tour_controller.js +508 -0
  1096. data/app/javascript/hakumi_components/controllers/hakumi/transfer_controller.js +315 -0
  1097. data/app/javascript/hakumi_components/controllers/hakumi/tree_controller.js +708 -0
  1098. data/app/javascript/hakumi_components/controllers/hakumi/tree_select_controller.js +281 -0
  1099. data/app/javascript/hakumi_components/controllers/hakumi/typography_controller.js +100 -0
  1100. data/app/javascript/hakumi_components/controllers/hakumi/upload_controller.js +1101 -0
  1101. data/app/javascript/hakumi_components/core/config.js +7 -0
  1102. data/app/javascript/hakumi_components/core/dom.js +27 -0
  1103. data/app/javascript/hakumi_components/core/persistence.js +132 -0
  1104. data/app/javascript/hakumi_components/core/registry.js +23 -0
  1105. data/app/javascript/hakumi_components/core/render_component.js +177 -0
  1106. data/app/javascript/hakumi_components/esbuild_loader.js +149 -0
  1107. data/app/javascript/hakumi_components/index.js +79 -0
  1108. data/app/javascript/hakumi_components/plugins/persisted_singletons.js +19 -0
  1109. data/app/javascript/hakumi_components/utils/date_helper.js +111 -0
  1110. data/app/javascript/lib/validation_manager.js +238 -0
  1111. data/app/javascript/stylesheets/_base.scss +63 -0
  1112. data/app/javascript/stylesheets/_hakumi_components.scss +83 -0
  1113. data/app/javascript/stylesheets/_theme-helpers.scss +53 -0
  1114. data/app/javascript/stylesheets/_theme-tokens.scss +270 -0
  1115. data/app/javascript/stylesheets/_variables.scss +229 -0
  1116. data/app/javascript/stylesheets/components/_admin_panel.scss +264 -0
  1117. data/app/javascript/stylesheets/components/_affix.scss +33 -0
  1118. data/app/javascript/stylesheets/components/_alert.scss +116 -0
  1119. data/app/javascript/stylesheets/components/_anchor.scss +132 -0
  1120. data/app/javascript/stylesheets/components/_autocomplete.scss +190 -0
  1121. data/app/javascript/stylesheets/components/_avatar.scss +99 -0
  1122. data/app/javascript/stylesheets/components/_badge.scss +121 -0
  1123. data/app/javascript/stylesheets/components/_breadcrumb.scss +77 -0
  1124. data/app/javascript/stylesheets/components/_button.scss +354 -0
  1125. data/app/javascript/stylesheets/components/_calendar.scss +859 -0
  1126. data/app/javascript/stylesheets/components/_card.scss +323 -0
  1127. data/app/javascript/stylesheets/components/_carousel.scss +180 -0
  1128. data/app/javascript/stylesheets/components/_cascader.scss +276 -0
  1129. data/app/javascript/stylesheets/components/_checkbox.scss +217 -0
  1130. data/app/javascript/stylesheets/components/_collapse.scss +148 -0
  1131. data/app/javascript/stylesheets/components/_color_picker.scss +387 -0
  1132. data/app/javascript/stylesheets/components/_container.scss +45 -0
  1133. data/app/javascript/stylesheets/components/_date_picker.scss +312 -0
  1134. data/app/javascript/stylesheets/components/_descriptions.scss +209 -0
  1135. data/app/javascript/stylesheets/components/_divider.scss +110 -0
  1136. data/app/javascript/stylesheets/components/_drawer.scss +168 -0
  1137. data/app/javascript/stylesheets/components/_dropdown.scss +162 -0
  1138. data/app/javascript/stylesheets/components/_empty.scss +151 -0
  1139. data/app/javascript/stylesheets/components/_flex.scss +70 -0
  1140. data/app/javascript/stylesheets/components/_float_button.scss +306 -0
  1141. data/app/javascript/stylesheets/components/_grid.scss +138 -0
  1142. data/app/javascript/stylesheets/components/_icon.scss +35 -0
  1143. data/app/javascript/stylesheets/components/_image.scss +373 -0
  1144. data/app/javascript/stylesheets/components/_input.scss +407 -0
  1145. data/app/javascript/stylesheets/components/_input_number.scss +266 -0
  1146. data/app/javascript/stylesheets/components/_layout.scss +198 -0
  1147. data/app/javascript/stylesheets/components/_mentions.scss +211 -0
  1148. data/app/javascript/stylesheets/components/_menu.scss +674 -0
  1149. data/app/javascript/stylesheets/components/_message.scss +127 -0
  1150. data/app/javascript/stylesheets/components/_modal.scss +210 -0
  1151. data/app/javascript/stylesheets/components/_notification.scss +245 -0
  1152. data/app/javascript/stylesheets/components/_pagination.scss +402 -0
  1153. data/app/javascript/stylesheets/components/_popconfirm.scss +125 -0
  1154. data/app/javascript/stylesheets/components/_popover.scss +162 -0
  1155. data/app/javascript/stylesheets/components/_progress.scss +197 -0
  1156. data/app/javascript/stylesheets/components/_qr_code.scss +121 -0
  1157. data/app/javascript/stylesheets/components/_radio.scss +316 -0
  1158. data/app/javascript/stylesheets/components/_rate.scss +96 -0
  1159. data/app/javascript/stylesheets/components/_result.scss +90 -0
  1160. data/app/javascript/stylesheets/components/_segmented.scss +163 -0
  1161. data/app/javascript/stylesheets/components/_select.scss +414 -0
  1162. data/app/javascript/stylesheets/components/_skeleton.scss +205 -0
  1163. data/app/javascript/stylesheets/components/_slider.scss +222 -0
  1164. data/app/javascript/stylesheets/components/_space.scss +161 -0
  1165. data/app/javascript/stylesheets/components/_spin.scss +185 -0
  1166. data/app/javascript/stylesheets/components/_splitter.scss +89 -0
  1167. data/app/javascript/stylesheets/components/_statistic.scss +78 -0
  1168. data/app/javascript/stylesheets/components/_steps.scss +1092 -0
  1169. data/app/javascript/stylesheets/components/_switch.scss +232 -0
  1170. data/app/javascript/stylesheets/components/_table.scss +493 -0
  1171. data/app/javascript/stylesheets/components/_tabs.scss +522 -0
  1172. data/app/javascript/stylesheets/components/_tag.scss +315 -0
  1173. data/app/javascript/stylesheets/components/_time_picker.scss +317 -0
  1174. data/app/javascript/stylesheets/components/_timeline.scss +361 -0
  1175. data/app/javascript/stylesheets/components/_tooltip.scss +331 -0
  1176. data/app/javascript/stylesheets/components/_tour.scss +196 -0
  1177. data/app/javascript/stylesheets/components/_transfer.scss +244 -0
  1178. data/app/javascript/stylesheets/components/_tree.scss +341 -0
  1179. data/app/javascript/stylesheets/components/_tree_select.scss +295 -0
  1180. data/app/javascript/stylesheets/components/_typography.scss +155 -0
  1181. data/app/javascript/stylesheets/components/_upload.scss +528 -0
  1182. data/app/services/hakumi/icon/loader.rb +95 -0
  1183. data/app/services/hakumi/illustrations/loader.rb +43 -0
  1184. data/app/services/hakumi_components/component_handler.rb +53 -0
  1185. data/app/views/hakumi/time_picker/_columns.html.erb +73 -0
  1186. data/app/views/hakumi_components/_admin_panel.html.erb +1 -0
  1187. data/app/views/hakumi_components/_affix.html.erb +1 -0
  1188. data/app/views/hakumi_components/_alert.html.erb +1 -0
  1189. data/app/views/hakumi_components/_confirm.html.erb +1 -0
  1190. data/app/views/hakumi_components/_drawer.html.erb +3 -0
  1191. data/app/views/hakumi_components/_message.html.erb +1 -0
  1192. data/app/views/hakumi_components/_modal.html.erb +3 -0
  1193. data/app/views/hakumi_components/_notification.html.erb +1 -0
  1194. data/app/views/hakumi_components/_popconfirm.html.erb +1 -0
  1195. data/app/views/hakumi_components/_popover.html.erb +1 -0
  1196. data/app/views/hakumi_components/_qr_code.html.erb +1 -0
  1197. data/app/views/hakumi_components/_result.html.erb +1 -0
  1198. data/app/views/hakumi_components/_segmented.html.erb +1 -0
  1199. data/app/views/hakumi_components/_skeleton.html.erb +1 -0
  1200. data/app/views/hakumi_components/_spin.html.erb +1 -0
  1201. data/app/views/hakumi_components/_statistic.html.erb +13 -0
  1202. data/app/views/hakumi_components/_table.html.erb +1 -0
  1203. data/app/views/hakumi_components/_tag.html.erb +3 -0
  1204. data/app/views/hakumi_components/_timeline.html.erb +16 -0
  1205. data/app/views/hakumi_components/_tree.html.erb +1 -0
  1206. data/lib/hakumi_components/engine.rb +29 -0
  1207. data/lib/hakumi_components/rails/attribute_introspection.rb +156 -0
  1208. data/lib/hakumi_components/rails/validation_introspection.rb +192 -0
  1209. data/lib/hakumi_components/rails.rb +9 -0
  1210. data/lib/hakumi_components/version.rb +5 -0
  1211. data/lib/hakumi_components.rb +26 -0
  1212. data/sig/action_view/tag_builder.rbs +24 -0
  1213. data/sig/active_support/concern_patch.rbs +7 -0
  1214. data/sig/hakumi/admin_panel/component.rbs +28 -0
  1215. data/sig/hakumi/affix/component.rbs +44 -0
  1216. data/sig/hakumi/alert/component.rbs +64 -0
  1217. data/sig/hakumi/anchor/component.rbs +45 -0
  1218. data/sig/hakumi/anchor/link/component.rbs +31 -0
  1219. data/sig/hakumi/autocomplete/component.rbs +68 -0
  1220. data/sig/hakumi/avatar/component.rbs +44 -0
  1221. data/sig/hakumi/badge/component.rbs +41 -0
  1222. data/sig/hakumi/base_component.rbs +77 -0
  1223. data/sig/hakumi/breadcrumb/component.rbs +21 -0
  1224. data/sig/hakumi/breadcrumb/item/component.rbs +36 -0
  1225. data/sig/hakumi/button/component.rbs +56 -0
  1226. data/sig/hakumi/calendar/component.rbs +41 -0
  1227. data/sig/hakumi/card/component.rbs +50 -0
  1228. data/sig/hakumi/card/grid/component.rbs +21 -0
  1229. data/sig/hakumi/card/meta/component.rbs +25 -0
  1230. data/sig/hakumi/carousel/component.rbs +88 -0
  1231. data/sig/hakumi/cascader/component.rbs +52 -0
  1232. data/sig/hakumi/checkbox/component.rbs +36 -0
  1233. data/sig/hakumi/checkbox/group/component.rbs +34 -0
  1234. data/sig/hakumi/collapse/component.rbs +57 -0
  1235. data/sig/hakumi/collapse/panel/component.rbs +47 -0
  1236. data/sig/hakumi/color_picker/component.rbs +81 -0
  1237. data/sig/hakumi/concerns/form_field.rbs +89 -0
  1238. data/sig/hakumi/container/component.rbs +37 -0
  1239. data/sig/hakumi/date_picker/component.rbs +72 -0
  1240. data/sig/hakumi/date_picker/range_picker.rbs +68 -0
  1241. data/sig/hakumi/date_picker/shared_rendering.rbs +41 -0
  1242. data/sig/hakumi/descriptions/component.rbs +59 -0
  1243. data/sig/hakumi/descriptions/item/component.rbs +31 -0
  1244. data/sig/hakumi/divider/component.rbs +39 -0
  1245. data/sig/hakumi/drawer/component.rbs +66 -0
  1246. data/sig/hakumi/dropdown/component.rbs +45 -0
  1247. data/sig/hakumi/dropdown/divider/component.rbs +11 -0
  1248. data/sig/hakumi/dropdown/item/component.rbs +45 -0
  1249. data/sig/hakumi/empty/component.rbs +40 -0
  1250. data/sig/hakumi/flex/component.rbs +47 -0
  1251. data/sig/hakumi/float_button/back_top/component.rbs +45 -0
  1252. data/sig/hakumi/float_button/component.rbs +80 -0
  1253. data/sig/hakumi/float_button/group/component.rbs +95 -0
  1254. data/sig/hakumi/float_button/group_cluster/component.rbs +60 -0
  1255. data/sig/hakumi/form/item/component.rbs +39 -0
  1256. data/sig/hakumi/grid/col/component.rbs +50 -0
  1257. data/sig/hakumi/grid/row/component.rbs +46 -0
  1258. data/sig/hakumi/icon/component.rbs +56 -0
  1259. data/sig/hakumi/image/component.rbs +56 -0
  1260. data/sig/hakumi/image/preview_group/component.rbs +28 -0
  1261. data/sig/hakumi/input/component.rbs +71 -0
  1262. data/sig/hakumi/input/password/component.rbs +27 -0
  1263. data/sig/hakumi/input/text_area/component.rbs +42 -0
  1264. data/sig/hakumi/input_number/component.rbs +85 -0
  1265. data/sig/hakumi/layout/component.rbs +21 -0
  1266. data/sig/hakumi/layout/content/component.rbs +19 -0
  1267. data/sig/hakumi/layout/footer/component.rbs +19 -0
  1268. data/sig/hakumi/layout/header/component.rbs +19 -0
  1269. data/sig/hakumi/layout/sider/component.rbs +19 -0
  1270. data/sig/hakumi/mentions/component.rbs +75 -0
  1271. data/sig/hakumi/menu/component.rbs +52 -0
  1272. data/sig/hakumi/menu/divider/component.rbs +11 -0
  1273. data/sig/hakumi/menu/group/component.rbs +20 -0
  1274. data/sig/hakumi/menu/item/component.rbs +42 -0
  1275. data/sig/hakumi/menu/sub_menu/component.rbs +37 -0
  1276. data/sig/hakumi/message/component.rbs +50 -0
  1277. data/sig/hakumi/modal/component.rbs +76 -0
  1278. data/sig/hakumi/modal/confirm/component.rbs +32 -0
  1279. data/sig/hakumi/modal/error/component.rbs +27 -0
  1280. data/sig/hakumi/modal/info/component.rbs +27 -0
  1281. data/sig/hakumi/modal/success/component.rbs +27 -0
  1282. data/sig/hakumi/modal/warning/component.rbs +27 -0
  1283. data/sig/hakumi/notification/component.rbs +64 -0
  1284. data/sig/hakumi/pagination/component.rbs +113 -0
  1285. data/sig/hakumi/popconfirm/component.rbs +52 -0
  1286. data/sig/hakumi/popover/component.rbs +66 -0
  1287. data/sig/hakumi/progress/component.rbs +201 -0
  1288. data/sig/hakumi/qr_code/component.rbs +111 -0
  1289. data/sig/hakumi/radio/component.rbs +55 -0
  1290. data/sig/hakumi/radio/group/component.rbs +71 -0
  1291. data/sig/hakumi/rate/component.rbs +56 -0
  1292. data/sig/hakumi/result/component.rbs +65 -0
  1293. data/sig/hakumi/segmented/component.rbs +73 -0
  1294. data/sig/hakumi/select/component.rbs +73 -0
  1295. data/sig/hakumi/skeleton/avatar/component.rbs +23 -0
  1296. data/sig/hakumi/skeleton/button/component.rbs +24 -0
  1297. data/sig/hakumi/skeleton/component.rbs +76 -0
  1298. data/sig/hakumi/skeleton/image/component.rbs +22 -0
  1299. data/sig/hakumi/skeleton/input/component.rbs +23 -0
  1300. data/sig/hakumi/skeleton/node/component.rbs +21 -0
  1301. data/sig/hakumi/slider/component.rbs +86 -0
  1302. data/sig/hakumi/space/compact/component.rbs +21 -0
  1303. data/sig/hakumi/space/component.rbs +47 -0
  1304. data/sig/hakumi/spin/component.rbs +77 -0
  1305. data/sig/hakumi/splitter/component.rbs +27 -0
  1306. data/sig/hakumi/splitter/panel/component.rbs +36 -0
  1307. data/sig/hakumi/statistic/component.rbs +99 -0
  1308. data/sig/hakumi/steps/component.rbs +82 -0
  1309. data/sig/hakumi/steps/item/component.rbs +29 -0
  1310. data/sig/hakumi/switch/component.rbs +52 -0
  1311. data/sig/hakumi/table/column/component.rbs +57 -0
  1312. data/sig/hakumi/table/column_group/component.rbs +20 -0
  1313. data/sig/hakumi/table/component.rbs +280 -0
  1314. data/sig/hakumi/table/concerns/columns.rbs +94 -0
  1315. data/sig/hakumi/tabs/component.rbs +66 -0
  1316. data/sig/hakumi/tabs/item/component.rbs +29 -0
  1317. data/sig/hakumi/tag/component.rbs +86 -0
  1318. data/sig/hakumi/tag/group/component.rbs +24 -0
  1319. data/sig/hakumi/time_picker/component.rbs +72 -0
  1320. data/sig/hakumi/timeline/component.rbs +61 -0
  1321. data/sig/hakumi/timeline/item/component.rbs +70 -0
  1322. data/sig/hakumi/tooltip/component.rbs +73 -0
  1323. data/sig/hakumi/tour/component.rbs +84 -0
  1324. data/sig/hakumi/transfer/component.rbs +76 -0
  1325. data/sig/hakumi/tree/component.rbs +126 -0
  1326. data/sig/hakumi/tree_select/component.rbs +122 -0
  1327. data/sig/hakumi/typography/base_component.rbs +57 -0
  1328. data/sig/hakumi/typography/link/component.rbs +28 -0
  1329. data/sig/hakumi/typography/paragraph/component.rbs +13 -0
  1330. data/sig/hakumi/typography/text/component.rbs +10 -0
  1331. data/sig/hakumi/typography/title/component.rbs +28 -0
  1332. data/sig/hakumi/upload/component.rbs +78 -0
  1333. data/sig/hakumi_components/rails/attribute_introspection.rbs +16 -0
  1334. data/sig/hakumi_components/rails/validation_introspection.rbs +18 -0
  1335. data/sig/hakumi_components/rails.rbs +6 -0
  1336. data/sig/hakumi_components.rbs +79 -0
  1337. data/sig/rails.rbs +18 -0
  1338. data/sig/view_component/base.rbs +28 -0
  1339. metadata +1439 -0
@@ -0,0 +1,1101 @@
1
+ import RegistryController from "../base/registry_controller.js"
2
+ import DateHelper from "../../utils/date_helper.js"
3
+
4
+ export default class extends RegistryController {
5
+ static targets = ["yearSelect", "monthSelect", "modeSegmented", "body"]
6
+
7
+ static values = {
8
+ mode: { type: String, default: "month" },
9
+ year: { type: Number, default: new Date().getFullYear() },
10
+ month: { type: Number, default: new Date().getMonth() + 1 },
11
+ fullscreen: { type: Boolean, default: true },
12
+ locale: { type: String, default: "en" },
13
+ selectedDate: { type: String, default: "" },
14
+ static: { type: Boolean, default: false },
15
+ events: { type: Object, default: {} },
16
+ // In week mode, tracks the user's preferred display month
17
+ // This is set when user clicks a day, and preserved when reopening
18
+ userPreferredMonth: { type: Number, default: 0 },
19
+ userPreferredYear: { type: Number, default: 0 },
20
+ // Range selection support
21
+ rangeStartDate: { type: String, default: "" },
22
+ rangeEndDate: { type: String, default: "" },
23
+ hoveredDate: { type: String, default: "" }
24
+ }
25
+
26
+ static locales = {
27
+ en: {
28
+ daysShort: ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"], // ISO week: Monday first
29
+ monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
30
+ monthsFull: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
31
+ },
32
+ es: {
33
+ daysShort: ["Lu", "Ma", "Mi", "Ju", "Vi", "Sá", "Do"], // ISO week: Lunes primero
34
+ monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
35
+ monthsFull: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
36
+ }
37
+ }
38
+
39
+ setup() {
40
+ this.#bindNestedEvents()
41
+ }
42
+
43
+ teardown() {
44
+ delete this.element.hakumiCalendar
45
+ }
46
+
47
+ #bindNestedEvents() {
48
+ this.boundChangeYear = this.changeYear.bind(this)
49
+ this.boundChangeMonth = this.changeMonth.bind(this)
50
+ this.boundChangeMode = this.changeMode.bind(this)
51
+
52
+ this.element.addEventListener("hakumi--select:change", (event) => {
53
+ const target = event.target
54
+ if (target.matches("[data-hakumi--calendar-target='yearSelect']")) {
55
+ this.boundChangeYear(event)
56
+ } else if (target.matches("[data-hakumi--calendar-target='monthSelect']")) {
57
+ this.boundChangeMonth(event)
58
+ }
59
+ })
60
+
61
+ this.element.addEventListener("hakumi--segmented:change", this.boundChangeMode)
62
+ }
63
+
64
+ yearValueChanged() {
65
+ this.#renderCalendar()
66
+ this.#updateYearSelect()
67
+ }
68
+
69
+ monthValueChanged() {
70
+ this.#renderCalendar()
71
+ this.#updateMonthSelect()
72
+ }
73
+
74
+ modeValueChanged() {
75
+ this.#renderCalendar()
76
+ this.#updateModeSegmented()
77
+ this.#syncAllControls()
78
+ }
79
+
80
+ #syncAllControls() {
81
+ if (this.hasMonthSelectTarget) {
82
+ this.#waitForComponent(this.monthSelectTarget, (api) => {
83
+ api.setValue(this.monthValue)
84
+ })
85
+ }
86
+
87
+ if (this.hasYearSelectTarget) {
88
+ this.#waitForComponent(this.yearSelectTarget, (api) => {
89
+ api.setValue(this.yearValue)
90
+ })
91
+ }
92
+ }
93
+
94
+ #waitForComponent(element, callback, maxAttempts = 10) {
95
+ if (!element) return
96
+
97
+ let attempts = 0
98
+ const check = () => {
99
+ const api = element.hakumiComponent?.api
100
+ if (api) {
101
+ callback(api)
102
+ } else if (attempts < maxAttempts) {
103
+ attempts++
104
+ requestAnimationFrame(check)
105
+ }
106
+ }
107
+ check()
108
+ }
109
+
110
+ changeYear(event) {
111
+ const year = parseInt(event.target.value || event.detail?.value, 10)
112
+ if (!isNaN(year)) {
113
+ this.yearValue = year
114
+ this.#dispatchChange()
115
+ }
116
+ }
117
+
118
+ changeMonth(event) {
119
+ const month = parseInt(event.target.value || event.detail?.value, 10)
120
+ if (!isNaN(month)) {
121
+ this.monthValue = month
122
+ this.#dispatchChange()
123
+ }
124
+ }
125
+
126
+ changeMode(event) {
127
+ const mode = event.detail?.value || event.target?.value
128
+ if (mode && (mode === "month" || mode === "year")) {
129
+ this.modeValue = mode
130
+ this.#dispatchModeChange()
131
+ }
132
+ }
133
+
134
+ selectDate(event) {
135
+ const cell = event.currentTarget
136
+ const dateStr = cell.dataset.date
137
+ if (!dateStr) return
138
+ if (cell.classList.contains("hakumi-calendar-cell-disabled")) return
139
+
140
+ const showWeek = this.element.classList.contains("hakumi-calendar-show-week")
141
+
142
+ if (showWeek) {
143
+ const date = DateHelper.parseDataDate(dateStr)
144
+ const monday = DateHelper.getMondayOfWeek(date)
145
+ const isChangingMonth = !DateHelper.isInMonth(date, this.monthValue, this.yearValue)
146
+
147
+ // IMPORTANT: Update selectedDateValue BEFORE changing month/year
148
+ // This ensures the selection is available when monthValueChanged/yearValueChanged trigger renders
149
+ this.selectedDateValue = DateHelper.formatDataDate(monday)
150
+
151
+ // If changing month, monthValueChanged() will trigger re-render which will mark the row
152
+ // If staying in same month, we need to manually mark the row
153
+ if (isChangingMonth) {
154
+ // Navigate to the month of the clicked day
155
+ this.monthValue = date.month() + 1
156
+ this.yearValue = date.year()
157
+
158
+ // IMPORTANT: Remember this as the user's preferred display month
159
+ // This will be used when reopening the picker to show the same month
160
+ this.userPreferredMonthValue = this.monthValue
161
+ this.userPreferredYearValue = this.yearValue
162
+
163
+ // The re-render triggered by monthValueChanged will mark the correct row
164
+ } else {
165
+ // Manual row selection only when staying in current month
166
+ const row = cell.closest("tr")
167
+ if (row) {
168
+ this.element.querySelectorAll(".hakumi-calendar-row-selected")
169
+ .forEach(el => el.classList.remove("hakumi-calendar-row-selected"))
170
+ row.classList.add("hakumi-calendar-row-selected")
171
+ }
172
+ }
173
+
174
+ this.#dispatchSelect(monday.toDate())
175
+ } else {
176
+ const date = DateHelper.parseDataDate(dateStr)
177
+
178
+ // If selecting a day from another month, navigate to that month
179
+ if (!DateHelper.isInMonth(date, this.monthValue, this.yearValue)) {
180
+ this.monthValue = date.month() + 1
181
+ this.yearValue = date.year()
182
+ }
183
+
184
+ this.selectedDateValue = dateStr
185
+ this.#updateSelection(cell)
186
+ this.#dispatchSelect(date.toDate())
187
+ }
188
+ }
189
+
190
+ handleCellHover(event) {
191
+ const cell = event.currentTarget
192
+ const dateStr = cell.dataset.date
193
+ if (!dateStr) return
194
+ if (cell.classList.contains("hakumi-calendar-cell-disabled")) return
195
+
196
+ // Only handle hover if we're in range mode with a start date but no end date
197
+ if (this.rangeStartDateValue && !this.rangeEndDateValue) {
198
+ this.setHoveredDate(dateStr)
199
+
200
+ // Dispatch hover event for DatePicker to sync across calendars
201
+ this.dispatch("cell-hover", {
202
+ detail: { date: DateHelper.parseDataDate(dateStr).toDate() }
203
+ })
204
+ }
205
+ }
206
+
207
+ selectWeek(event) {
208
+ const cell = event.currentTarget
209
+ const row = cell.closest("tr")
210
+ if (!row) return
211
+
212
+ // Get all day cells in the row (skip the week number cell)
213
+ const dayCells = row.querySelectorAll("[data-date]")
214
+ if (dayCells.length < 7) return
215
+
216
+ // Use Thursday (4th day, index 3) to determine the correct ISO week
217
+ // According to ISO 8601, Thursday always belongs to the correct week
218
+ const thursdayCell = dayCells[3]
219
+ const thursday = DateHelper.parseDataDate(thursdayCell.dataset.date)
220
+ const monday = DateHelper.getMondayOfWeek(thursday)
221
+ const isChangingMonth = !DateHelper.isInMonth(thursday, this.monthValue, this.yearValue)
222
+
223
+ // IMPORTANT: Update selectedDateValue BEFORE changing month/year
224
+ this.selectedDateValue = DateHelper.formatDataDate(monday)
225
+
226
+ // If the week belongs to a different month (Thursday is in another month), navigate to it
227
+ if (isChangingMonth) {
228
+ // Navigate to the month of the Thursday (ISO 8601: Thursday determines the month)
229
+ this.monthValue = thursday.month() + 1
230
+ this.yearValue = thursday.year()
231
+
232
+ // IMPORTANT: Remember this as the user's preferred display month
233
+ this.userPreferredMonthValue = this.monthValue
234
+ this.userPreferredYearValue = this.yearValue
235
+
236
+ // The re-render triggered by monthValueChanged will mark the correct row
237
+ } else {
238
+ // Manual row selection only when staying in current month
239
+ this.element.querySelectorAll(".hakumi-calendar-row-selected")
240
+ .forEach(el => el.classList.remove("hakumi-calendar-row-selected"))
241
+ row.classList.add("hakumi-calendar-row-selected")
242
+ }
243
+
244
+ this.#dispatchSelect(monday.toDate())
245
+ }
246
+
247
+ selectMonth(event) {
248
+ const cell = event.currentTarget
249
+ const month = parseInt(cell.dataset.month, 10)
250
+ if (isNaN(month)) return
251
+
252
+ this.monthValue = month
253
+ const selectedDate = new Date(this.yearValue, month - 1, 1)
254
+ this.selectedDateValue = DateHelper.formatDataDate(selectedDate)
255
+
256
+ if (!this.staticValue) {
257
+ this.modeValue = "month"
258
+ }
259
+
260
+ this.#dispatchSelect(selectedDate)
261
+ }
262
+
263
+ selectQuarter(event) {
264
+ const cell = event.currentTarget
265
+ const quarter = parseInt(cell.dataset.quarter, 10)
266
+ if (isNaN(quarter)) return
267
+
268
+
269
+ const month = (quarter - 1) * 3 + 1
270
+ this.monthValue = month
271
+ const selectedDate = new Date(this.yearValue, month - 1, 1)
272
+ this.selectedDateValue = DateHelper.formatDataDate(selectedDate)
273
+ this.#dispatchSelect({ year: this.yearValue, quarter: quarter })
274
+ }
275
+
276
+ selectYear(event) {
277
+ const cell = event.currentTarget
278
+ const year = parseInt(cell.dataset.year, 10)
279
+ if (isNaN(year)) return
280
+
281
+ this.yearValue = year
282
+ const selectedDate = new Date(year, 0, 1)
283
+ this.selectedDateValue = DateHelper.formatDataDate(selectedDate)
284
+ this.#dispatchSelect(selectedDate)
285
+ }
286
+
287
+
288
+ getValue() {
289
+ return new Date(this.yearValue, this.monthValue - 1, 1)
290
+ }
291
+
292
+ getSelectedDate() {
293
+ return this.selectedDateValue ? DateHelper.parseDataDate(this.selectedDateValue).toDate() : null
294
+ }
295
+
296
+ setValue(date, options = {}) {
297
+ if (date instanceof Date) {
298
+ const showWeek = this.element.classList.contains("hakumi-calendar-show-week")
299
+ const forceNavigate = options.navigate === true
300
+
301
+ // IMPORTANT: Update selectedDateValue BEFORE yearValue/monthValue
302
+ // This ensures the selection is available when yearValueChanged/monthValueChanged trigger renders
303
+ this.selectedDateValue = DateHelper.formatDataDate(date)
304
+
305
+ if (showWeek) {
306
+ // In week mode, prioritize user's preferred display month
307
+ // This enables navigation when clicking days from other months
308
+ const parsedDate = DateHelper.parseDataDate(DateHelper.formatDataDate(date))
309
+
310
+ // Priority 1: Use userPreferredMonth/Year if set (user clicked a day and navigated)
311
+ if (this.userPreferredMonthValue > 0 && this.userPreferredYearValue > 0) {
312
+ this.yearValue = this.userPreferredYearValue
313
+ this.monthValue = this.userPreferredMonthValue
314
+ }
315
+ // Priority 2: If not initialized yet (first time), navigate to selected date's month
316
+ else if (!this.monthValue || !this.yearValue || (this.monthValue === 1 && this.yearValue === 1970)) {
317
+ this.yearValue = parsedDate.year()
318
+ this.monthValue = parsedDate.month() + 1
319
+ }
320
+ // Priority 3: Keep current month/year (already viewing a specific month)
321
+ // This branch shouldn't normally be reached with the userPreferred logic
322
+ } else if (forceNavigate) {
323
+ // Explicit navigation requested (e.g., from range picker sync)
324
+ this.yearValue = date.getFullYear()
325
+ this.monthValue = date.getMonth() + 1
326
+ } else {
327
+ // In non-week mode (date picker), navigate to selected date's month
328
+ // BUT only in default month view mode (not in month/quarter/year picker modes)
329
+ if (this.modeValue !== "month" && this.modeValue !== "quarter" && this.modeValue !== "year") {
330
+ this.yearValue = date.getFullYear()
331
+ this.monthValue = date.getMonth() + 1
332
+ }
333
+ // For month/quarter/year pickers, keep current yearValue (don't navigate)
334
+ }
335
+
336
+ this.#renderCalendar()
337
+ this.#dispatchChange()
338
+ }
339
+ }
340
+
341
+ clearSelection() {
342
+ this.selectedDateValue = ""
343
+ this.#renderCalendar()
344
+ }
345
+
346
+ // Range API methods
347
+ setRange(startDate, endDate, hoveredDate = null) {
348
+ this.rangeStartDateValue = this.#formatDateKey(startDate) || ""
349
+ this.rangeEndDateValue = this.#formatDateKey(endDate) || ""
350
+ this.hoveredDateValue = hoveredDate ? this.#formatDateKey(hoveredDate) : ""
351
+ this.#renderCalendar()
352
+ }
353
+
354
+ clearRange() {
355
+ this.rangeStartDateValue = ""
356
+ this.rangeEndDateValue = ""
357
+ this.hoveredDateValue = ""
358
+ this.#renderCalendar()
359
+ }
360
+
361
+ getRange() {
362
+ return {
363
+ start: this.rangeStartDateValue || null,
364
+ end: this.rangeEndDateValue || null,
365
+ hovered: this.hoveredDateValue || null
366
+ }
367
+ }
368
+
369
+ setHoveredDate(date) {
370
+ this.hoveredDateValue = date ? this.#formatDateKey(date) : ""
371
+ this.#renderCalendar()
372
+ }
373
+
374
+ getMode() {
375
+ return this.modeValue
376
+ }
377
+
378
+ setMode(mode) {
379
+ if (mode === "month" || mode === "year") {
380
+ this.modeValue = mode
381
+ this.#dispatchModeChange()
382
+ }
383
+ }
384
+
385
+ goToToday() {
386
+ const today = new Date()
387
+ this.yearValue = today.getFullYear()
388
+ this.monthValue = today.getMonth() + 1
389
+ this.#dispatchChange()
390
+ }
391
+
392
+ nextMonth() {
393
+ if (this.monthValue === 12) {
394
+ this.monthValue = 1
395
+ this.yearValue += 1
396
+ } else {
397
+ this.monthValue += 1
398
+ }
399
+ this.#dispatchChange()
400
+ }
401
+
402
+ prevMonth() {
403
+ if (this.monthValue === 1) {
404
+ this.monthValue = 12
405
+ this.yearValue -= 1
406
+ } else {
407
+ this.monthValue -= 1
408
+ }
409
+ this.#dispatchChange()
410
+ }
411
+
412
+ nextYear() {
413
+ this.yearValue += 1
414
+ this.#dispatchChange()
415
+ }
416
+
417
+ prevYear() {
418
+ this.yearValue -= 1
419
+ this.#dispatchChange()
420
+ }
421
+
422
+ nextDecade() {
423
+ this.yearValue += 10
424
+ this.#dispatchChange()
425
+ }
426
+
427
+ prevDecade() {
428
+ this.yearValue -= 10
429
+ this.#dispatchChange()
430
+ }
431
+
432
+ getEvents() {
433
+ return { ...this.eventsValue }
434
+ }
435
+
436
+ setEvents(events) {
437
+ this.eventsValue = this.#normalizeEventsInput(events)
438
+ if (!this.staticValue) {
439
+ this.#renderCalendar()
440
+ }
441
+ this.#dispatchEventsChange()
442
+ }
443
+
444
+ addEvent(date, event) {
445
+ const dateStr = this.#formatDateKey(date)
446
+ const events = { ...this.eventsValue }
447
+
448
+ if (!events[dateStr]) {
449
+ events[dateStr] = []
450
+ }
451
+ events[dateStr].push({
452
+ id: event.id || null,
453
+ type: event.type || 'default',
454
+ content: event.content || '',
455
+ html: event.html || null
456
+ })
457
+
458
+ this.eventsValue = events
459
+ if (!this.staticValue) {
460
+ this.#renderCalendar()
461
+ }
462
+ this.#dispatchEventsChange()
463
+ }
464
+
465
+ updateEvent(id, updates) {
466
+ const events = { ...this.eventsValue }
467
+ let found = false
468
+
469
+ Object.keys(events).forEach(dateStr => {
470
+ const idx = events[dateStr].findIndex(e => e.id === id)
471
+ if (idx !== -1) {
472
+ events[dateStr][idx] = { ...events[dateStr][idx], ...updates }
473
+ found = true
474
+ }
475
+ })
476
+
477
+ if (found) {
478
+ this.eventsValue = events
479
+ if (!this.staticValue) {
480
+ this.#renderCalendar()
481
+ }
482
+ this.#dispatchEventsChange()
483
+ }
484
+ return found
485
+ }
486
+
487
+ removeEvent(date, indexOrId = null) {
488
+ const dateStr = this.#formatDateKey(date)
489
+ const events = { ...this.eventsValue }
490
+
491
+ if (!events[dateStr]) return false
492
+
493
+ if (indexOrId === null) {
494
+
495
+ delete events[dateStr]
496
+ } else if (typeof indexOrId === 'number') {
497
+
498
+ if (indexOrId >= 0 && indexOrId < events[dateStr].length) {
499
+ events[dateStr].splice(indexOrId, 1)
500
+ if (events[dateStr].length === 0) {
501
+ delete events[dateStr]
502
+ }
503
+ }
504
+ }
505
+
506
+ this.eventsValue = events
507
+ if (!this.staticValue) {
508
+ this.#renderCalendar()
509
+ }
510
+ this.#dispatchEventsChange()
511
+ return true
512
+ }
513
+
514
+ removeEventById(id) {
515
+ const events = { ...this.eventsValue }
516
+ let found = false
517
+
518
+ Object.keys(events).forEach(dateStr => {
519
+ const idx = events[dateStr].findIndex(e => e.id === id)
520
+ if (idx !== -1) {
521
+ events[dateStr].splice(idx, 1)
522
+ if (events[dateStr].length === 0) {
523
+ delete events[dateStr]
524
+ }
525
+ found = true
526
+ }
527
+ })
528
+
529
+ if (found) {
530
+ this.eventsValue = events
531
+ if (!this.staticValue) {
532
+ this.#renderCalendar()
533
+ }
534
+ this.#dispatchEventsChange()
535
+ }
536
+ return found
537
+ }
538
+
539
+ getEventById(id) {
540
+ for (const dateStr of Object.keys(this.eventsValue)) {
541
+ const event = this.eventsValue[dateStr].find(e => e.id === id)
542
+ if (event) {
543
+ return { ...event, date: dateStr }
544
+ }
545
+ }
546
+ return null
547
+ }
548
+
549
+ getEventsForDate(date) {
550
+ const dateStr = this.#formatDateKey(date)
551
+ return this.eventsValue[dateStr] || []
552
+ }
553
+
554
+ clearEvents() {
555
+ this.eventsValue = {}
556
+ if (!this.staticValue) {
557
+ this.#renderCalendar()
558
+ }
559
+ this.#dispatchEventsChange()
560
+ }
561
+
562
+ #formatDateKey(date) {
563
+ if (date instanceof Date) {
564
+ return DateHelper.formatDataDate(date)
565
+ }
566
+ return String(date)
567
+ }
568
+
569
+ #normalizeEventsInput(events) {
570
+ if (!events || typeof events !== 'object') return {}
571
+
572
+ const normalized = {}
573
+ Object.keys(events).forEach(key => {
574
+ const dateStr = this.#formatDateKey(key)
575
+ normalized[dateStr] = events[key].map(e => ({
576
+ id: e.id || null,
577
+ type: e.type || 'default',
578
+ content: e.content || '',
579
+ html: e.html || null
580
+ }))
581
+ })
582
+ return normalized
583
+ }
584
+
585
+ #dispatchEventsChange() {
586
+ this.dispatch("eventsChange", {
587
+ detail: { events: this.getEvents() }
588
+ })
589
+ }
590
+
591
+
592
+
593
+
594
+ #getLocale() {
595
+ return this.constructor.locales[this.localeValue] || this.constructor.locales.en
596
+ }
597
+
598
+ #renderCalendar() {
599
+ const body = this.element.querySelector(".hakumi-calendar-body")
600
+ if (!body) return
601
+
602
+ switch (this.modeValue) {
603
+ case "month":
604
+ body.innerHTML = this.#renderMonthView()
605
+ break
606
+ case "year":
607
+ body.innerHTML = this.#renderYearView()
608
+ break
609
+ case "quarter":
610
+ body.innerHTML = this.#renderQuarterView()
611
+ break
612
+ case "decade":
613
+ body.innerHTML = this.#renderDecadeView()
614
+ break
615
+ default:
616
+ body.innerHTML = this.#renderMonthView()
617
+ }
618
+ }
619
+
620
+ #renderMonthView() {
621
+ const locale = this.#getLocale()
622
+ const weeks = this.#buildWeeksForMonth(this.yearValue, this.monthValue)
623
+ const showWeek = this.element.classList.contains("hakumi-calendar-show-week")
624
+ const today = DateHelper.formatDataDate(new Date())
625
+
626
+ let html = `<table class="hakumi-calendar-table">
627
+ <thead class="hakumi-calendar-thead">
628
+ <tr>`
629
+
630
+ if (showWeek) {
631
+ html += `<th class="hakumi-calendar-cell hakumi-calendar-cell-week-header"></th>`
632
+ }
633
+
634
+ locale.daysShort.forEach(day => {
635
+ html += `<th class="hakumi-calendar-cell hakumi-calendar-column-header">
636
+ <span class="hakumi-calendar-column-header-inner">${day}</span>
637
+ </th>`
638
+ })
639
+
640
+ html += `</tr></thead><tbody class="hakumi-calendar-tbody">`
641
+
642
+ weeks.forEach(week => {
643
+ const rowClass = week.weekSelected ? "hakumi-calendar-row hakumi-calendar-row-selected" : "hakumi-calendar-row"
644
+ html += `<tr class="${rowClass}">`
645
+
646
+ if (showWeek) {
647
+ html += `<td class="hakumi-calendar-cell hakumi-calendar-cell-week" data-action="click->hakumi--calendar#selectWeek">
648
+ <div class="hakumi-calendar-week-number">${week.weekNumber}</div>
649
+ </td>`
650
+ }
651
+
652
+ week.days.forEach(day => {
653
+ const classes = this.#getCellClasses(day, today)
654
+ const eventsHtml = this.#renderEventsForDate(day.dateStr)
655
+ const actions = this.rangeStartDateValue && !this.rangeEndDateValue
656
+ ? "click->hakumi--calendar#selectDate mouseenter->hakumi--calendar#handleCellHover"
657
+ : "click->hakumi--calendar#selectDate"
658
+ html += `<td class="${classes}" data-date="${day.dateStr}" data-action="${actions}">
659
+ <div class="hakumi-calendar-date">
660
+ <div class="hakumi-calendar-date-value">${day.day}</div>
661
+ ${eventsHtml ? `<div class="hakumi-calendar-date-content">${eventsHtml}</div>` : ''}
662
+ </div>
663
+ </td>`
664
+ })
665
+
666
+ html += `</tr>`
667
+ })
668
+
669
+ html += `</tbody></table>`
670
+ return html
671
+ }
672
+
673
+ #renderYearView() {
674
+ const locale = this.#getLocale()
675
+ const currentMonth = new Date().getMonth() + 1
676
+ const currentYear = new Date().getFullYear()
677
+
678
+
679
+ const selectedDate = this.selectedDateValue ? DateHelper.parseDataDate(this.selectedDateValue) : null
680
+ const selectedMonth = selectedDate ? selectedDate.month() + 1 : null
681
+ const selectedYear = selectedDate ? selectedDate.year() : null
682
+
683
+ let html = `<div class="hakumi-calendar-month-panel">`
684
+
685
+ for (let row = 0; row < 4; row++) {
686
+ html += `<div class="hakumi-calendar-month-panel-row">`
687
+ for (let col = 0; col < 3; col++) {
688
+ const month = row * 3 + col + 1
689
+ const isCurrent = month === currentMonth && this.yearValue === currentYear
690
+ const isSelected = selectedMonth && month === selectedMonth && this.yearValue === selectedYear
691
+
692
+ let classes = "hakumi-calendar-cell hakumi-calendar-cell-month"
693
+ if (isSelected) classes += " hakumi-calendar-cell-selected"
694
+ // In static mode (date picker), don't show current month indicator
695
+ if (isCurrent && !this.staticValue) classes += " hakumi-calendar-cell-current"
696
+
697
+ const eventIndicators = this.#getMonthEventIndicators(this.yearValue, month)
698
+
699
+ html += `<div class="${classes}" data-month="${month}" data-action="click->hakumi--calendar#selectMonth">
700
+ <div class="hakumi-calendar-month-cell-inner">
701
+ <div class="hakumi-calendar-month-value">${locale.monthsShort[month - 1]}</div>
702
+ ${eventIndicators}
703
+ </div>
704
+ </div>`
705
+ }
706
+ html += `</div>`
707
+ }
708
+
709
+ html += `</div>`
710
+ return html
711
+ }
712
+
713
+ #getMonthEventIndicators(year, month) {
714
+ const events = this.eventsValue
715
+ if (!events || Object.keys(events).length === 0) return ''
716
+
717
+
718
+ const eventTypes = new Set()
719
+
720
+ Object.keys(events).forEach(dateStr => {
721
+ const date = DateHelper.parseDataDate(dateStr)
722
+ if (date.year() === year && date.month() + 1 === month) {
723
+ events[dateStr].forEach(event => {
724
+ eventTypes.add(event.type || 'default')
725
+ })
726
+ }
727
+ })
728
+
729
+ if (eventTypes.size === 0) return ''
730
+
731
+ let html = '<div class="hakumi-calendar-month-events">'
732
+ eventTypes.forEach(type => {
733
+ html += `<span class="hakumi-calendar-month-event-dot hakumi-calendar-month-event-${type}"></span>`
734
+ })
735
+ html += '</div>'
736
+
737
+ return html
738
+ }
739
+
740
+ #renderQuarterView() {
741
+ const currentYear = new Date().getFullYear()
742
+ const currentQuarter = Math.floor(new Date().getMonth() / 3) + 1
743
+
744
+
745
+ const selectedDate = this.selectedDateValue ? DateHelper.parseDataDate(this.selectedDateValue) : null
746
+ const selectedQuarter = selectedDate ? Math.floor(selectedDate.month() / 3) + 1 : null
747
+ const selectedYear = selectedDate ? selectedDate.year() : null
748
+
749
+ let html = `<div class="hakumi-calendar-quarter-panel">`
750
+
751
+
752
+ for (let row = 0; row < 2; row++) {
753
+ html += `<div class="hakumi-calendar-quarter-panel-row">`
754
+ for (let col = 0; col < 2; col++) {
755
+ const quarter = row * 2 + col + 1
756
+ const isCurrent = quarter === currentQuarter && this.yearValue === currentYear
757
+ const isSelected = selectedQuarter && quarter === selectedQuarter && this.yearValue === selectedYear
758
+
759
+ let classes = "hakumi-calendar-cell hakumi-calendar-cell-quarter"
760
+ if (isSelected) classes += " hakumi-calendar-cell-selected"
761
+ // In static mode (date picker), don't show current quarter indicator
762
+ if (isCurrent && !this.staticValue) classes += " hakumi-calendar-cell-current"
763
+
764
+ html += `<div class="${classes}" data-quarter="${quarter}" data-action="click->hakumi--calendar#selectQuarter">
765
+ <div class="hakumi-calendar-quarter-cell-inner">
766
+ <div class="hakumi-calendar-quarter-value">Q${quarter}</div>
767
+ </div>
768
+ </div>`
769
+ }
770
+ html += `</div>`
771
+ }
772
+
773
+ html += `</div>`
774
+ return html
775
+ }
776
+
777
+ #renderDecadeView() {
778
+ const currentYear = new Date().getFullYear()
779
+
780
+
781
+ const selectedDate = this.selectedDateValue ? DateHelper.parseDataDate(this.selectedDateValue) : null
782
+ const selectedYear = selectedDate ? selectedDate.year() : null
783
+
784
+
785
+ const decadeStart = Math.floor(this.yearValue / 10) * 10
786
+ const startYear = decadeStart - 1
787
+ const endYear = decadeStart + 10
788
+
789
+ let html = `<div class="hakumi-calendar-year-panel">`
790
+
791
+
792
+ for (let row = 0; row < 4; row++) {
793
+ html += `<div class="hakumi-calendar-year-panel-row">`
794
+ for (let col = 0; col < 3; col++) {
795
+ const year = startYear + row * 3 + col
796
+ const isCurrent = year === currentYear
797
+ const isSelected = selectedYear && year === selectedYear
798
+ const inDecade = year >= decadeStart && year < decadeStart + 10
799
+
800
+ let classes = "hakumi-calendar-cell hakumi-calendar-cell-year"
801
+ if (isSelected) classes += " hakumi-calendar-cell-selected"
802
+ // In static mode (date picker), don't show current year indicator
803
+ if (isCurrent && !this.staticValue) classes += " hakumi-calendar-cell-current"
804
+ if (!inDecade) classes += " hakumi-calendar-cell-disabled"
805
+
806
+ html += `<div class="${classes}" data-year="${year}" data-action="click->hakumi--calendar#selectYear">
807
+ <div class="hakumi-calendar-year-cell-inner">
808
+ <div class="hakumi-calendar-year-value">${year}</div>
809
+ </div>
810
+ </div>`
811
+ }
812
+ html += `</div>`
813
+ }
814
+
815
+ html += `</div>`
816
+ return html
817
+ }
818
+
819
+ #buildWeeksForMonth(year, month) {
820
+ const firstDay = DateHelper.parseDataDate(`${year}-${String(month).padStart(2, "0")}-01`)
821
+ const lastDay = firstDay.endOf("month")
822
+
823
+ // Start from Monday of the week containing the 1st day (ISO week)
824
+ const startDate = DateHelper.getMondayOfWeek(firstDay)
825
+
826
+ // Always show 6 rows (42 days) for consistent calendar height
827
+ // This ensures the calendar doesn't jump in size between months
828
+ const endDate = startDate.add(41, "day")
829
+
830
+ const selectedDate = this.selectedDateValue ? DateHelper.parseDataDate(this.selectedDateValue) : null
831
+ const selectedWeekNumber = selectedDate ? DateHelper.getISOWeek(selectedDate) : null
832
+ const selectedWeekYear = selectedDate ? DateHelper.getISOWeekYear(selectedDate) : null
833
+ const showWeek = this.element.classList.contains("hakumi-calendar-show-week")
834
+
835
+ const weeks = []
836
+ let current = startDate
837
+
838
+ while (current.isBefore(endDate.add(1, "day"), "day")) {
839
+ const week = {
840
+ weekNumber: null, // Will be set after we know the thursday
841
+ weekSelected: false, // Will be set after we know the week number
842
+ days: []
843
+ }
844
+
845
+ // Collect all 7 days first
846
+ for (let i = 0; i < 7; i++) {
847
+ week.days.push({
848
+ date: current.toDate(),
849
+ dateStr: DateHelper.formatDataDate(current),
850
+ day: current.date(),
851
+ inMonth: current.month() + 1 === month,
852
+ weekend: current.day() === 0 || current.day() === 6
853
+ })
854
+ current = current.add(1, "day")
855
+ }
856
+
857
+ // Calculate week number based on Thursday (4th day, index 3) of the row
858
+ // According to ISO 8601, the week containing the first Thursday is week 1
859
+ // So Thursday always belongs to the correct week
860
+ const thursday = week.days[3]
861
+ const thursdayDate = DateHelper.parseDataDate(thursday.dateStr)
862
+ const weekNumber = DateHelper.getISOWeek(thursdayDate)
863
+ const weekYear = DateHelper.getISOWeekYear(thursdayDate)
864
+
865
+ week.weekNumber = weekNumber
866
+ week.weekSelected = showWeek && selectedWeekNumber === weekNumber && selectedWeekYear === weekYear
867
+
868
+ weeks.push(week)
869
+ }
870
+
871
+ return weeks
872
+ }
873
+
874
+ #getCellClasses(day, today) {
875
+ const classes = ["hakumi-calendar-cell"]
876
+ const showWeek = this.element.classList.contains("hakumi-calendar-show-week")
877
+
878
+ // Only mark days as "in-view" (current month styling) if they're actually in the current month
879
+ // This ensures days from other months always have muted styling, even when in a selected week
880
+ if (day.inMonth) {
881
+ classes.push("hakumi-calendar-cell-in-view")
882
+ }
883
+
884
+ // In week picker mode, don't show "today" marker since we're selecting weeks, not individual days
885
+ if (day.dateStr === today && !showWeek) {
886
+ classes.push("hakumi-calendar-cell-today")
887
+ }
888
+
889
+ // In week picker mode, don't mark individual cells as "selected"
890
+ // Only the row should be selected (.hakumi-calendar-row-selected)
891
+ // This prevents CSS like .hakumi-calendar-cell-selected .hakumi-calendar-date from applying
892
+ // blue background to Monday when it's in the previous month
893
+ if (day.dateStr === this.selectedDateValue && !showWeek) {
894
+ classes.push("hakumi-calendar-cell-selected")
895
+ }
896
+
897
+ if (day.weekend && day.dateStr !== this.selectedDateValue) {
898
+ classes.push("hakumi-calendar-cell-weekend")
899
+ }
900
+
901
+ // Range selection support
902
+ if (this.rangeStartDateValue || this.rangeEndDateValue) {
903
+ const rangeStart = this.rangeStartDateValue ? new Date(this.rangeStartDateValue) : null
904
+ const rangeEnd = this.rangeEndDateValue ? new Date(this.rangeEndDateValue) : null
905
+ const hovered = this.hoveredDateValue ? new Date(this.hoveredDateValue) : null
906
+ const currentDate = new Date(day.dateStr)
907
+
908
+ // Mark range start
909
+ if (rangeStart && day.dateStr === this.rangeStartDateValue) {
910
+ classes.push("hakumi-calendar-cell-range-start")
911
+ }
912
+
913
+ // Mark range end
914
+ if (rangeEnd && day.dateStr === this.rangeEndDateValue) {
915
+ classes.push("hakumi-calendar-cell-range-end")
916
+ }
917
+
918
+ // Mark dates in range (between start and end)
919
+ if (rangeStart && rangeEnd) {
920
+ if (currentDate > rangeStart && currentDate < rangeEnd) {
921
+ classes.push("hakumi-calendar-cell-in-range")
922
+ }
923
+ }
924
+ // Mark hover range (between start and hovered date when no end is selected)
925
+ else if (rangeStart && hovered && !rangeEnd) {
926
+ if ((currentDate > rangeStart && currentDate <= hovered) ||
927
+ (currentDate < rangeStart && currentDate >= hovered)) {
928
+ classes.push("hakumi-calendar-cell-in-range")
929
+ classes.push("hakumi-calendar-cell-range-hover")
930
+ }
931
+ }
932
+ }
933
+
934
+ return classes.join(" ")
935
+ }
936
+
937
+ #renderEventsForDate(dateStr) {
938
+ const events = this.eventsValue[dateStr]
939
+ if (!events || events.length === 0) return ''
940
+
941
+ return events.map(event => {
942
+ const type = event.type || 'default'
943
+ const content = this.#escapeHtml(event.content)
944
+
945
+
946
+ const badgeHtml = event.html || this.#renderBadgeHtml(type, content)
947
+
948
+ return `<div class="hakumi-calendar-event hakumi-calendar-event-${type}" title="${content}">${badgeHtml}</div>`
949
+ }).join('')
950
+ }
951
+
952
+ #renderBadgeHtml(type, content) {
953
+ const statusClass = this.#getStatusClass(type)
954
+ return `<span class="hakumi-badge hakumi-badge-status">
955
+ <span class="hakumi-badge-status-dot ${statusClass}"></span>
956
+ <span class="hakumi-badge-status-text">${content}</span>
957
+ </span>`
958
+ }
959
+
960
+ #getStatusClass(type) {
961
+ const statusMap = {
962
+ success: 'hakumi-badge-status-success',
963
+ warning: 'hakumi-badge-status-warning',
964
+ error: 'hakumi-badge-status-error',
965
+ default: 'hakumi-badge-status-default'
966
+ }
967
+ return statusMap[type] || statusMap.default
968
+ }
969
+
970
+ #escapeHtml(text) {
971
+ const div = document.createElement('div')
972
+ div.textContent = text
973
+ return div.innerHTML
974
+ }
975
+
976
+ #updateSelection(cell) {
977
+ this.element.querySelectorAll(".hakumi-calendar-cell-selected")
978
+ .forEach(el => el.classList.remove("hakumi-calendar-cell-selected"))
979
+ cell.classList.add("hakumi-calendar-cell-selected")
980
+ }
981
+
982
+ #updateMonthSelection(cell) {
983
+ this.element.querySelectorAll(".hakumi-calendar-cell-month.hakumi-calendar-cell-selected")
984
+ .forEach(el => el.classList.remove("hakumi-calendar-cell-selected"))
985
+ cell.classList.add("hakumi-calendar-cell-selected")
986
+ }
987
+
988
+ #updateYearSelect() {
989
+ if (this.hasYearSelectTarget) {
990
+ const select = this.yearSelectTarget
991
+ const api = select.hakumiComponent?.api
992
+ if (api?.setValue) {
993
+ api.setValue(this.yearValue)
994
+ }
995
+ }
996
+ }
997
+
998
+ #updateMonthSelect() {
999
+ if (this.hasMonthSelectTarget) {
1000
+ const select = this.monthSelectTarget
1001
+ const api = select.hakumiComponent?.api
1002
+ if (api?.setValue) {
1003
+ api.setValue(this.monthValue)
1004
+ }
1005
+ }
1006
+ }
1007
+
1008
+ #updateModeSegmented() {
1009
+ if (this.hasModeSegmentedTarget) {
1010
+ const segmented = this.modeSegmentedTarget
1011
+ const api = segmented.hakumiComponent?.api
1012
+ if (api?.setValue) {
1013
+ api.setValue(this.modeValue)
1014
+ }
1015
+ }
1016
+ }
1017
+
1018
+ #dispatchChange() {
1019
+ this.dispatch("change", {
1020
+ detail: {
1021
+ year: this.yearValue,
1022
+ month: this.monthValue,
1023
+ date: this.getValue()
1024
+ }
1025
+ })
1026
+ }
1027
+
1028
+ #dispatchModeChange() {
1029
+ this.dispatch("panelChange", {
1030
+ detail: {
1031
+ mode: this.modeValue,
1032
+ year: this.yearValue,
1033
+ month: this.monthValue
1034
+ }
1035
+ })
1036
+ }
1037
+
1038
+ #dispatchSelect(data) {
1039
+
1040
+
1041
+
1042
+ const detail = data instanceof Date
1043
+ ? {
1044
+ date: data,
1045
+ source: this.modeValue === "month" ? "date" : "month"
1046
+ }
1047
+ : {
1048
+ ...data,
1049
+ source: "quarter"
1050
+ }
1051
+
1052
+ this.dispatch("select", { detail })
1053
+ }
1054
+
1055
+ registerApi() {
1056
+ const api = {
1057
+
1058
+ getValue: () => this.getValue(),
1059
+ getSelectedDate: () => this.getSelectedDate(),
1060
+ setValue: (date, options) => this.setValue(date, options),
1061
+ clearSelection: () => this.clearSelection(),
1062
+ getMode: () => this.getMode(),
1063
+ setMode: (mode) => this.setMode(mode),
1064
+ goToToday: () => this.goToToday(),
1065
+ nextMonth: () => this.nextMonth(),
1066
+ prevMonth: () => this.prevMonth(),
1067
+ nextYear: () => this.nextYear(),
1068
+ prevYear: () => this.prevYear(),
1069
+ nextDecade: () => this.nextDecade(),
1070
+ prevDecade: () => this.prevDecade(),
1071
+ refresh: () => this.#renderCalendar(),
1072
+
1073
+ getEvents: () => this.getEvents(),
1074
+ setEvents: (events) => this.setEvents(events),
1075
+ addEvent: (date, event) => this.addEvent(date, event),
1076
+ updateEvent: (id, updates) => this.updateEvent(id, updates),
1077
+ removeEvent: (date, indexOrId) => this.removeEvent(date, indexOrId),
1078
+ removeEventById: (id) => this.removeEventById(id),
1079
+ getEventById: (id) => this.getEventById(id),
1080
+ getEventsForDate: (date) => this.getEventsForDate(date),
1081
+ clearEvents: () => this.clearEvents(),
1082
+
1083
+ // Range API
1084
+ setRange: (startDate, endDate, hoveredDate) => this.setRange(startDate, endDate, hoveredDate),
1085
+ clearRange: () => this.clearRange(),
1086
+ getRange: () => this.getRange(),
1087
+ setHoveredDate: (date) => this.setHoveredDate(date)
1088
+ }
1089
+
1090
+
1091
+ this.element.hakumiComponent = {
1092
+ name: "calendar",
1093
+ version: 1,
1094
+ singleton: false,
1095
+ api
1096
+ }
1097
+
1098
+
1099
+ this.element.hakumiCalendar = api
1100
+ }
1101
+ }