hakumi_components 0.1.17.pre → 0.1.19.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 (647) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -3
  3. data/README.md +218 -369
  4. data/app/assets/javascripts/hakumi_components.js +40 -34
  5. data/app/assets/stylesheets/hakumi_components.css +1 -1
  6. data/app/components/{hakumi → hakumi_components}/admin_panel/component.html.erb +2 -2
  7. data/app/components/hakumi_components/admin_panel/component.rb +50 -0
  8. data/app/components/hakumi_components/affix/component.rb +112 -0
  9. data/app/components/{hakumi → hakumi_components}/alert/component.html.erb +3 -3
  10. data/app/components/hakumi_components/alert/component.rb +134 -0
  11. data/app/components/hakumi_components/anchor/component.rb +88 -0
  12. data/app/components/{hakumi → hakumi_components}/anchor/link/component.html.erb +1 -1
  13. data/app/components/hakumi_components/anchor/link/component.rb +53 -0
  14. data/app/components/hakumi_components/autocomplete/component.html.erb +94 -0
  15. data/app/components/hakumi_components/autocomplete/component.rb +228 -0
  16. data/app/components/hakumi_components/avatar/component.rb +124 -0
  17. data/app/components/hakumi_components/badge/component.rb +139 -0
  18. data/app/components/hakumi_components/base_component.rb +391 -0
  19. data/app/components/hakumi_components/breadcrumb/component.rb +38 -0
  20. data/app/components/hakumi_components/breadcrumb/item/component.html.erb +17 -0
  21. data/app/components/hakumi_components/breadcrumb/item/component.rb +83 -0
  22. data/app/components/hakumi_components/breadcrumb/item/menu_entry.rb +71 -0
  23. data/app/components/hakumi_components/button/component.rb +163 -0
  24. data/app/components/{hakumi → hakumi_components}/calendar/component.html.erb +24 -24
  25. data/app/components/hakumi_components/calendar/component.rb +471 -0
  26. data/app/components/hakumi_components/calendar/day_cell.rb +62 -0
  27. data/app/components/hakumi_components/calendar/display_model.rb +237 -0
  28. data/app/components/hakumi_components/calendar/event_entry.rb +54 -0
  29. data/app/components/hakumi_components/calendar/locale_pack.rb +28 -0
  30. data/app/components/hakumi_components/calendar/panel_entry.rb +48 -0
  31. data/app/components/hakumi_components/calendar/week_row.rb +28 -0
  32. data/app/components/{hakumi → hakumi_components}/card/component.html.erb +2 -2
  33. data/app/components/hakumi_components/card/component.rb +121 -0
  34. data/app/components/hakumi_components/card/grid/component.html.erb +3 -0
  35. data/app/components/hakumi_components/card/grid/component.rb +43 -0
  36. data/app/components/hakumi_components/card/meta/component.html.erb +23 -0
  37. data/app/components/hakumi_components/card/meta/component.rb +64 -0
  38. data/app/components/hakumi_components/carousel/autoplay_config.rb +27 -0
  39. data/app/components/{hakumi → hakumi_components}/carousel/component.html.erb +2 -2
  40. data/app/components/hakumi_components/carousel/component.rb +165 -0
  41. data/app/components/hakumi_components/carousel/dots_config.rb +36 -0
  42. data/app/components/hakumi_components/cascader/component.html.erb +59 -0
  43. data/app/components/hakumi_components/cascader/component.rb +168 -0
  44. data/app/components/{hakumi → hakumi_components}/checkbox/component.html.erb +5 -5
  45. data/app/components/hakumi_components/checkbox/component.rb +98 -0
  46. data/app/components/hakumi_components/checkbox/group/component.html.erb +12 -0
  47. data/app/components/hakumi_components/checkbox/group/component.rb +91 -0
  48. data/app/components/hakumi_components/checkbox/group/option.rb +34 -0
  49. data/app/components/{hakumi → hakumi_components}/collapse/component.html.erb +1 -1
  50. data/app/components/hakumi_components/collapse/component.rb +133 -0
  51. data/app/components/hakumi_components/collapse/panel/component.rb +108 -0
  52. data/app/components/{hakumi → hakumi_components}/color_picker/component.html.erb +21 -22
  53. data/app/components/hakumi_components/color_picker/component.rb +279 -0
  54. data/app/components/hakumi_components/color_picker/preset_group.rb +27 -0
  55. data/app/components/hakumi_components/concerns/form_field.rb +236 -0
  56. data/app/components/hakumi_components/concerns/form_field_contract.rb +57 -0
  57. data/app/components/hakumi_components/concerns/form_field_interface.rb +16 -0
  58. data/app/components/hakumi_components/concerns/input_control.rb +111 -0
  59. data/app/components/hakumi_components/concerns/input_control_contract.rb +47 -0
  60. data/app/components/hakumi_components/concerns/input_control_interface.rb +34 -0
  61. data/app/components/hakumi_components/concerns/selection_control.rb +122 -0
  62. data/app/components/hakumi_components/concerns/selection_control_contract.rb +47 -0
  63. data/app/components/hakumi_components/concerns/selection_control_interface.rb +34 -0
  64. data/app/components/{hakumi → hakumi_components}/container/component.rb +31 -16
  65. data/app/components/{hakumi → hakumi_components}/date_picker/component.html.erb +4 -6
  66. data/app/components/hakumi_components/date_picker/component.rb +254 -0
  67. data/app/components/{hakumi → hakumi_components}/date_picker/range_picker.html.erb +4 -4
  68. data/app/components/hakumi_components/date_picker/range_picker.rb +267 -0
  69. data/app/components/hakumi_components/date_picker/shared_rendering.rb +289 -0
  70. data/app/components/{hakumi → hakumi_components}/descriptions/component.html.erb +6 -6
  71. data/app/components/hakumi_components/descriptions/component.rb +219 -0
  72. data/app/components/hakumi_components/descriptions/item/component.rb +52 -0
  73. data/app/components/hakumi_components/divider/component.rb +86 -0
  74. data/app/components/{hakumi → hakumi_components}/drawer/component.html.erb +3 -3
  75. data/app/components/hakumi_components/drawer/component.rb +191 -0
  76. data/app/components/hakumi_components/dropdown/component.rb +94 -0
  77. data/app/components/{hakumi → hakumi_components}/dropdown/divider/component.rb +6 -2
  78. data/app/components/hakumi_components/dropdown/item/component.rb +73 -0
  79. data/app/components/{hakumi → hakumi_components}/empty/component.rb +68 -33
  80. data/app/components/hakumi_components/flex/component.rb +96 -0
  81. data/app/components/hakumi_components/float_button/back_top/component.rb +86 -0
  82. data/app/components/hakumi_components/float_button/component.rb +289 -0
  83. data/app/components/hakumi_components/float_button/group/component.rb +214 -0
  84. data/app/components/hakumi_components/float_button/group_cluster/component.rb +133 -0
  85. data/app/components/hakumi_components/float_button/group_spec.rb +259 -0
  86. data/app/components/hakumi_components/float_button/item_spec.rb +115 -0
  87. data/app/components/hakumi_components/float_button/position_config.rb +68 -0
  88. data/app/components/{hakumi → hakumi_components}/form/item/component.rb +36 -29
  89. data/app/components/hakumi_components/grid/col/component.rb +169 -0
  90. data/app/components/hakumi_components/grid/row/component.rb +97 -0
  91. data/app/components/{hakumi → hakumi_components}/icon/component.rb +53 -53
  92. data/app/components/{hakumi → hakumi_components}/image/component.html.erb +17 -17
  93. data/app/components/hakumi_components/image/component.rb +175 -0
  94. data/app/components/{hakumi → hakumi_components}/image/preview_group/component.html.erb +10 -10
  95. data/app/components/hakumi_components/image/preview_group/component.rb +75 -0
  96. data/app/components/hakumi_components/image/preview_group/item.rb +48 -0
  97. data/app/components/{hakumi → hakumi_components}/input/component.html.erb +1 -1
  98. data/app/components/hakumi_components/input/component.rb +261 -0
  99. data/app/components/hakumi_components/input/password/component.rb +84 -0
  100. data/app/components/{hakumi → hakumi_components}/input/text_area/component.html.erb +2 -2
  101. data/app/components/hakumi_components/input/text_area/component.rb +178 -0
  102. data/app/components/{hakumi → hakumi_components}/input_number/component.html.erb +9 -9
  103. data/app/components/hakumi_components/input_number/component.rb +280 -0
  104. data/app/components/hakumi_components/layout/component.html.erb +1 -0
  105. data/app/components/hakumi_components/layout/component.rb +28 -0
  106. data/app/components/hakumi_components/layout/content/component.html.erb +1 -0
  107. data/app/components/hakumi_components/layout/content/component.rb +29 -0
  108. data/app/components/hakumi_components/layout/footer/component.html.erb +1 -0
  109. data/app/components/hakumi_components/layout/footer/component.rb +29 -0
  110. data/app/components/hakumi_components/layout/header/component.html.erb +1 -0
  111. data/app/components/hakumi_components/layout/header/component.rb +29 -0
  112. data/app/components/hakumi_components/layout/sider/component.html.erb +1 -0
  113. data/app/components/hakumi_components/layout/sider/component.rb +90 -0
  114. data/app/components/hakumi_components/mentions/coercion.rb +46 -0
  115. data/app/components/{hakumi → hakumi_components}/mentions/component.html.erb +6 -6
  116. data/app/components/hakumi_components/mentions/component.rb +229 -0
  117. data/app/components/hakumi_components/mentions/option.rb +30 -0
  118. data/app/components/hakumi_components/menu/component.rb +117 -0
  119. data/app/components/{hakumi → hakumi_components}/menu/divider/component.rb +6 -2
  120. data/app/components/hakumi_components/menu/group/component.rb +48 -0
  121. data/app/components/hakumi_components/menu/item/component.rb +70 -0
  122. data/app/components/hakumi_components/menu/sub_menu/component.rb +104 -0
  123. data/app/components/hakumi_components/message/component.rb +141 -0
  124. data/app/components/{hakumi → hakumi_components}/modal/component.html.erb +7 -7
  125. data/app/components/hakumi_components/modal/component.rb +152 -0
  126. data/app/components/hakumi_components/modal/confirm/component.html.erb +23 -0
  127. data/app/components/hakumi_components/modal/confirm/component.rb +87 -0
  128. data/app/components/hakumi_components/modal/error/component.rb +20 -0
  129. data/app/components/hakumi_components/modal/info/component.rb +17 -0
  130. data/app/components/hakumi_components/modal/status_component.rb +150 -0
  131. data/app/components/hakumi_components/modal/success/component.rb +17 -0
  132. data/app/components/hakumi_components/modal/warning/component.rb +26 -0
  133. data/app/components/hakumi_components/notification/component.rb +160 -0
  134. data/app/components/{hakumi → hakumi_components}/pagination/component.html.erb +8 -12
  135. data/app/components/hakumi_components/pagination/component.rb +238 -0
  136. data/app/components/hakumi_components/pagination/page_item.rb +49 -0
  137. data/app/components/{hakumi → hakumi_components}/popconfirm/component.html.erb +2 -2
  138. data/app/components/hakumi_components/popconfirm/component.rb +120 -0
  139. data/app/components/{hakumi → hakumi_components}/popover/component.html.erb +2 -2
  140. data/app/components/hakumi_components/popover/component.rb +196 -0
  141. data/app/components/hakumi_components/progress/attribute_renderer.rb +354 -0
  142. data/app/components/hakumi_components/progress/circle_geometry.rb +76 -0
  143. data/app/components/{hakumi → hakumi_components}/progress/component.html.erb +19 -18
  144. data/app/components/hakumi_components/progress/component.rb +393 -0
  145. data/app/components/hakumi_components/progress/controller_locals_parser.rb +130 -0
  146. data/app/components/hakumi_components/progress/info_tooltip_policy.rb +39 -0
  147. data/app/components/hakumi_components/progress/info_value.rb +75 -0
  148. data/app/components/hakumi_components/progress/status_state.rb +31 -0
  149. data/app/components/hakumi_components/progress/steps_renderer.rb +149 -0
  150. data/app/components/hakumi_components/progress/stroke_gradient_value.rb +90 -0
  151. data/app/components/hakumi_components/qr_code/component.rb +405 -0
  152. data/app/components/{hakumi → hakumi_components}/radio/component.html.erb +3 -3
  153. data/app/components/hakumi_components/radio/component.rb +113 -0
  154. data/app/components/{hakumi → hakumi_components}/radio/group/component.html.erb +10 -10
  155. data/app/components/hakumi_components/radio/group/component.rb +181 -0
  156. data/app/components/hakumi_components/radio/group/option.rb +43 -0
  157. data/app/components/{hakumi → hakumi_components}/rate/component.html.erb +2 -2
  158. data/app/components/{hakumi → hakumi_components}/rate/component.rb +58 -12
  159. data/app/components/hakumi_components/result/component.rb +175 -0
  160. data/app/components/{hakumi → hakumi_components}/segmented/component.html.erb +1 -1
  161. data/app/components/hakumi_components/segmented/component.rb +232 -0
  162. data/app/components/hakumi_components/segmented/option.rb +191 -0
  163. data/app/components/{hakumi → hakumi_components}/select/component.html.erb +22 -22
  164. data/app/components/hakumi_components/select/component.rb +176 -0
  165. data/app/components/hakumi_components/selection_control/coercion.rb +161 -0
  166. data/app/components/hakumi_components/selection_control/entry.rb +22 -0
  167. data/app/components/hakumi_components/selection_control/option.rb +42 -0
  168. data/app/components/hakumi_components/selection_control/option_group.rb +34 -0
  169. data/app/components/hakumi_components/selection_control/tree_node.rb +123 -0
  170. data/app/components/hakumi_components/skeleton/avatar/component.rb +88 -0
  171. data/app/components/hakumi_components/skeleton/avatar_config.rb +79 -0
  172. data/app/components/hakumi_components/skeleton/button/component.rb +77 -0
  173. data/app/components/hakumi_components/skeleton/component.rb +186 -0
  174. data/app/components/{hakumi → hakumi_components}/skeleton/image/component.html.erb +1 -1
  175. data/app/components/hakumi_components/skeleton/image/component.rb +104 -0
  176. data/app/components/hakumi_components/skeleton/input/component.rb +66 -0
  177. data/app/components/hakumi_components/skeleton/node/component.rb +59 -0
  178. data/app/components/hakumi_components/skeleton/paragraph_config.rb +92 -0
  179. data/app/components/hakumi_components/skeleton/title_config.rb +31 -0
  180. data/app/components/{hakumi → hakumi_components}/slider/component.html.erb +11 -11
  181. data/app/components/hakumi_components/slider/component.rb +347 -0
  182. data/app/components/hakumi_components/slider/mark.rb +27 -0
  183. data/app/components/hakumi_components/space/compact/component.html.erb +1 -0
  184. data/app/components/hakumi_components/space/compact/component.rb +52 -0
  185. data/app/components/{hakumi → hakumi_components}/space/component.html.erb +1 -1
  186. data/app/components/hakumi_components/space/component.rb +109 -0
  187. data/app/components/hakumi_components/spin/component.rb +270 -0
  188. data/app/components/hakumi_components/splitter/component.html.erb +9 -0
  189. data/app/components/hakumi_components/splitter/component.rb +71 -0
  190. data/app/components/hakumi_components/splitter/panel/component.html.erb +1 -0
  191. data/app/components/hakumi_components/splitter/panel/component.rb +98 -0
  192. data/app/components/hakumi_components/statistic/component.rb +371 -0
  193. data/app/components/{hakumi → hakumi_components}/steps/component.html.erb +4 -4
  194. data/app/components/hakumi_components/steps/component.rb +177 -0
  195. data/app/components/hakumi_components/steps/item/component.rb +130 -0
  196. data/app/components/{hakumi → hakumi_components}/switch/component.html.erb +2 -3
  197. data/app/components/hakumi_components/switch/component.rb +150 -0
  198. data/app/components/hakumi_components/table/column/component.rb +137 -0
  199. data/app/components/hakumi_components/table/column_definition.rb +181 -0
  200. data/app/components/{hakumi → hakumi_components}/table/column_group/component.rb +35 -24
  201. data/app/components/{hakumi → hakumi_components}/table/component.html.erb +22 -31
  202. data/app/components/hakumi_components/table/component.rb +470 -0
  203. data/app/components/hakumi_components/table/concerns/attribute_helpers.rb +22 -0
  204. data/app/components/hakumi_components/table/concerns/cell_rendering.rb +277 -0
  205. data/app/components/hakumi_components/table/concerns/columns.rb +421 -0
  206. data/app/components/hakumi_components/table/concerns/editable.rb +68 -0
  207. data/app/components/hakumi_components/table/concerns/ellipsis.rb +64 -0
  208. data/app/components/hakumi_components/table/concerns/fixed_columns.rb +94 -0
  209. data/app/components/hakumi_components/table/concerns/surface_rendering.rb +365 -0
  210. data/app/components/hakumi_components/table/configs.rb +518 -0
  211. data/app/components/hakumi_components/table/definition_types.rb +40 -0
  212. data/app/components/hakumi_components/table/display_rows.rb +56 -0
  213. data/app/components/hakumi_components/table/ellipsis_config.rb +143 -0
  214. data/app/components/hakumi_components/table/fixed_offset.rb +36 -0
  215. data/app/components/hakumi_components/table/header_cell.rb +23 -0
  216. data/app/components/hakumi_components/table/row_record.rb +60 -0
  217. data/app/components/hakumi_components/table/row_render_state.rb +85 -0
  218. data/app/components/{hakumi → hakumi_components}/tabs/component.html.erb +11 -11
  219. data/app/components/hakumi_components/tabs/component.rb +246 -0
  220. data/app/components/hakumi_components/tabs/indicator_config.rb +34 -0
  221. data/app/components/hakumi_components/tabs/item/component.rb +147 -0
  222. data/app/components/hakumi_components/tag/component.rb +282 -0
  223. data/app/components/{hakumi → hakumi_components}/tag/group/component.rb +20 -8
  224. data/app/components/{hakumi → hakumi_components}/time_picker/component.html.erb +10 -10
  225. data/app/components/{hakumi → hakumi_components}/time_picker/component.rb +75 -21
  226. data/app/components/hakumi_components/timeline/component.html.erb +8 -0
  227. data/app/components/hakumi_components/timeline/component.rb +301 -0
  228. data/app/components/{hakumi → hakumi_components}/timeline/item/component.html.erb +2 -2
  229. data/app/components/hakumi_components/timeline/item/component.rb +198 -0
  230. data/app/components/{hakumi → hakumi_components}/tooltip/component.html.erb +1 -1
  231. data/app/components/hakumi_components/tooltip/component.rb +146 -0
  232. data/app/components/hakumi_components/tour/component.rb +183 -0
  233. data/app/components/hakumi_components/tour/step.rb +86 -0
  234. data/app/components/hakumi_components/transfer/coercion.rb +66 -0
  235. data/app/components/hakumi_components/transfer/component.html.erb +204 -0
  236. data/app/components/hakumi_components/transfer/component.rb +395 -0
  237. data/app/components/hakumi_components/transfer/item.rb +54 -0
  238. data/app/components/hakumi_components/transfer/operations.rb +31 -0
  239. data/app/components/{hakumi → hakumi_components}/tree/component.html.erb +1 -1
  240. data/app/components/hakumi_components/tree/component.rb +342 -0
  241. data/app/components/hakumi_components/tree/concerns/node_rendering.rb +365 -0
  242. data/app/components/hakumi_components/tree/node.rb +276 -0
  243. data/app/components/{hakumi → hakumi_components}/tree_select/component.html.erb +27 -13
  244. data/app/components/hakumi_components/tree_select/component.rb +270 -0
  245. data/app/components/hakumi_components/typography/base_component.rb +142 -0
  246. data/app/components/hakumi_components/typography/link/component.rb +91 -0
  247. data/app/components/{hakumi → hakumi_components}/typography/paragraph/component.rb +7 -1
  248. data/{sig/hakumi/typography/text/component.rbs → app/components/hakumi_components/typography/text/component.rb} +3 -1
  249. data/app/components/hakumi_components/typography/title/component.rb +84 -0
  250. data/app/components/hakumi_components/upload/component.html.erb +135 -0
  251. data/app/components/hakumi_components/upload/component.rb +367 -0
  252. data/app/components/hakumi_components/upload/file_entry.rb +53 -0
  253. data/app/controllers/{hakumi → hakumi_components}/components_controller.rb +3 -2
  254. data/app/form_builders/hakumi_components/form_builder/contracts.rb +55 -0
  255. data/app/form_builders/hakumi_components/form_builder/field_context.rb +43 -0
  256. data/app/form_builders/hakumi_components/form_builder/model_binding.rb +163 -0
  257. data/app/form_builders/hakumi_components/form_builder.rb +403 -0
  258. data/app/helpers/hakumi_components/form_helper.rb +43 -0
  259. data/app/javascript/hakumi_components/controllers/hakumi/admin_panel_controller.js +5 -7
  260. data/app/javascript/hakumi_components/controllers/hakumi/back_top_controller.js +1 -1
  261. data/app/javascript/hakumi_components/controllers/hakumi/button_controller.js +108 -2
  262. data/app/javascript/hakumi_components/controllers/hakumi/calendar_controller.js +183 -95
  263. data/app/javascript/hakumi_components/controllers/hakumi/color_picker_controller.js +23 -285
  264. data/app/javascript/hakumi_components/controllers/hakumi/date_picker_controller.js +274 -262
  265. data/app/javascript/hakumi_components/controllers/hakumi/float_button_group_controller.js +2 -2
  266. data/app/javascript/hakumi_components/controllers/hakumi/message_controller.js +4 -2
  267. data/app/javascript/hakumi_components/controllers/hakumi/modal_controller.js +119 -125
  268. data/app/javascript/hakumi_components/controllers/hakumi/table/editable.js +291 -0
  269. data/app/javascript/hakumi_components/controllers/hakumi/table_controller.js +166 -366
  270. data/app/javascript/hakumi_components/controllers/hakumi/tabs_controller.js +8 -2
  271. data/app/javascript/hakumi_components/controllers/hakumi/tag_controller.js +27 -25
  272. data/app/javascript/hakumi_components/controllers/hakumi/tag_group_controller.js +19 -18
  273. data/app/javascript/hakumi_components/controllers/hakumi/theme_controller.js +116 -117
  274. data/app/javascript/hakumi_components/controllers/hakumi/transfer_controller.js +17 -1
  275. data/app/javascript/hakumi_components/controllers/hakumi/tree_controller.js +363 -78
  276. data/app/javascript/hakumi_components/controllers/hakumi/typography_controller.js +3 -3
  277. data/app/javascript/hakumi_components/controllers/hakumi/upload_controller.js +320 -204
  278. data/app/javascript/hakumi_components/core/render_component.js +37 -11
  279. data/app/javascript/hakumi_components/utils/color_helper.js +262 -0
  280. data/app/javascript/stylesheets/_base.scss +9 -0
  281. data/app/javascript/stylesheets/_hakumi_components.scss +1 -0
  282. data/app/javascript/stylesheets/components/_breadcrumb.scss +2 -2
  283. data/app/javascript/stylesheets/components/_calendar.scss +13 -13
  284. data/app/javascript/stylesheets/components/_cascader.scss +5 -5
  285. data/app/javascript/stylesheets/components/_checkbox.scss +9 -11
  286. data/app/javascript/stylesheets/components/_color_picker.scss +11 -11
  287. data/app/javascript/stylesheets/components/_date_picker.scss +4 -4
  288. data/app/javascript/stylesheets/components/_descriptions.scss +2 -2
  289. data/app/javascript/stylesheets/components/_drawer.scss +3 -3
  290. data/app/javascript/stylesheets/components/_dropdown.scss +2 -2
  291. data/app/javascript/stylesheets/components/_flex.scss +1 -1
  292. data/app/javascript/stylesheets/components/_float_button.scss +5 -5
  293. data/app/javascript/stylesheets/components/_form_item.scss +92 -0
  294. data/app/javascript/stylesheets/components/_image.scss +15 -15
  295. data/app/javascript/stylesheets/components/_input.scss +23 -113
  296. data/app/javascript/stylesheets/components/_layout.scss +27 -26
  297. data/app/javascript/stylesheets/components/_menu.scss +15 -15
  298. data/app/javascript/stylesheets/components/_modal.scss +13 -13
  299. data/app/javascript/stylesheets/components/_notification.scss +3 -3
  300. data/app/javascript/stylesheets/components/_popover.scss +1 -1
  301. data/app/javascript/stylesheets/components/_segmented.scss +3 -3
  302. data/app/javascript/stylesheets/components/_select.scss +6 -6
  303. data/app/javascript/stylesheets/components/_slider.scss +1 -1
  304. data/app/javascript/stylesheets/components/_spin.scss +2 -2
  305. data/app/javascript/stylesheets/components/_steps.scss +10 -10
  306. data/app/javascript/stylesheets/components/_switch.scss +11 -10
  307. data/app/javascript/stylesheets/components/_table.scss +6 -6
  308. data/app/javascript/stylesheets/components/_tag.scss +2 -2
  309. data/app/javascript/stylesheets/components/_tooltip.scss +4 -4
  310. data/app/javascript/stylesheets/components/_tree_select.scss +3 -3
  311. data/app/javascript/stylesheets/components/_typography.scss +3 -3
  312. data/app/javascript/stylesheets/components/_upload.scss +4 -4
  313. data/app/services/hakumi_components/component_handler.rb +124 -0
  314. data/app/services/hakumi_components/icon/loader.rb +112 -0
  315. data/app/services/hakumi_components/illustrations/loader.rb +51 -0
  316. data/app/views/hakumi/_admin_panel.html.erb +1 -1
  317. data/app/views/hakumi/_affix.html.erb +1 -1
  318. data/app/views/hakumi/_alert.html.erb +4 -1
  319. data/app/views/hakumi/_confirm.html.erb +1 -1
  320. data/app/views/hakumi/_drawer.html.erb +2 -2
  321. data/app/views/hakumi/_message.html.erb +1 -1
  322. data/app/views/hakumi/_modal.html.erb +1 -1
  323. data/app/views/hakumi/_notification.html.erb +1 -1
  324. data/app/views/hakumi/_popconfirm.html.erb +1 -1
  325. data/app/views/hakumi/_popover.html.erb +1 -1
  326. data/app/views/hakumi/_qr_code.html.erb +1 -1
  327. data/app/views/hakumi/_result.html.erb +1 -1
  328. data/app/views/hakumi/_segmented.html.erb +1 -1
  329. data/app/views/hakumi/_skeleton.html.erb +1 -1
  330. data/app/views/hakumi/_spin.html.erb +1 -1
  331. data/app/views/hakumi/_statistic.html.erb +12 -12
  332. data/app/views/hakumi/_table.html.erb +1 -1
  333. data/app/views/hakumi/_tag.html.erb +1 -1
  334. data/app/views/hakumi/_timeline.html.erb +1 -1
  335. data/app/views/hakumi/_tree.html.erb +1 -1
  336. data/lib/generators/{hakumi → hakumi_components}/install_generator.rb +17 -4
  337. data/lib/hakumi_components/documentation/models.rb +290 -0
  338. data/lib/hakumi_components/documentation/node.rb +73 -0
  339. data/lib/hakumi_components/documentation.rb +141 -64
  340. data/lib/hakumi_components/engine.rb +26 -14
  341. data/lib/hakumi_components/file_size_checker.rb +215 -0
  342. data/lib/hakumi_components/locales/en.yml +115 -0
  343. data/lib/hakumi_components/rails/attribute_introspection.rb +40 -108
  344. data/lib/hakumi_components/rails/model_reflection.rb +154 -0
  345. data/lib/hakumi_components/rails/validation_introspection.rb +26 -74
  346. data/lib/hakumi_components/rails/validation_mapper.rb +149 -202
  347. data/lib/hakumi_components/rails.rb +3 -1
  348. data/lib/hakumi_components/stylesheet_ownership_checker.rb +191 -0
  349. data/lib/hakumi_components/types/form_field.rb +24 -0
  350. data/lib/hakumi_components/types/html.rb +28 -0
  351. data/lib/hakumi_components/types/rendering.rb +10 -0
  352. data/lib/hakumi_components/types/stimulus.rb +19 -0
  353. data/lib/hakumi_components/types/validation.rb +22 -0
  354. data/lib/hakumi_components/types.rb +13 -0
  355. data/lib/hakumi_components/version.rb +3 -2
  356. data/lib/hakumi_components.rb +26 -5
  357. data/lib/tasks/coverage.rake +1 -0
  358. metadata +310 -346
  359. data/app/components/hakumi/admin_panel/component.rb +0 -40
  360. data/app/components/hakumi/affix/component.rb +0 -88
  361. data/app/components/hakumi/alert/component.rb +0 -84
  362. data/app/components/hakumi/anchor/component.rb +0 -80
  363. data/app/components/hakumi/anchor/link/component.rb +0 -34
  364. data/app/components/hakumi/autocomplete/component.html.erb +0 -74
  365. data/app/components/hakumi/autocomplete/component.rb +0 -202
  366. data/app/components/hakumi/avatar/component.rb +0 -91
  367. data/app/components/hakumi/badge/component.rb +0 -85
  368. data/app/components/hakumi/base_component.rb +0 -192
  369. data/app/components/hakumi/breadcrumb/component.rb +0 -27
  370. data/app/components/hakumi/breadcrumb/item/component.html.erb +0 -17
  371. data/app/components/hakumi/breadcrumb/item/component.rb +0 -35
  372. data/app/components/hakumi/button/component.rb +0 -121
  373. data/app/components/hakumi/calendar/component.rb +0 -448
  374. data/app/components/hakumi/card/component.rb +0 -94
  375. data/app/components/hakumi/card/grid/component.html.erb +0 -3
  376. data/app/components/hakumi/card/grid/component.rb +0 -37
  377. data/app/components/hakumi/card/meta/component.html.erb +0 -23
  378. data/app/components/hakumi/card/meta/component.rb +0 -46
  379. data/app/components/hakumi/carousel/component.rb +0 -147
  380. data/app/components/hakumi/cascader/component.html.erb +0 -41
  381. data/app/components/hakumi/cascader/component.rb +0 -119
  382. data/app/components/hakumi/checkbox/component.rb +0 -64
  383. data/app/components/hakumi/checkbox/group/component.html.erb +0 -12
  384. data/app/components/hakumi/checkbox/group/component.rb +0 -64
  385. data/app/components/hakumi/collapse/component.rb +0 -117
  386. data/app/components/hakumi/collapse/panel/component.rb +0 -65
  387. data/app/components/hakumi/color_picker/component.rb +0 -169
  388. data/app/components/hakumi/concerns/form_field.rb +0 -135
  389. data/app/components/hakumi/date_picker/component.rb +0 -140
  390. data/app/components/hakumi/date_picker/range_picker.rb +0 -136
  391. data/app/components/hakumi/date_picker/shared_rendering.rb +0 -199
  392. data/app/components/hakumi/descriptions/component.rb +0 -182
  393. data/app/components/hakumi/descriptions/item/component.rb +0 -28
  394. data/app/components/hakumi/divider/component.rb +0 -66
  395. data/app/components/hakumi/drawer/component.rb +0 -108
  396. data/app/components/hakumi/dropdown/component.rb +0 -97
  397. data/app/components/hakumi/dropdown/item/component.rb +0 -47
  398. data/app/components/hakumi/flex/component.rb +0 -78
  399. data/app/components/hakumi/float_button/back_top/component.rb +0 -79
  400. data/app/components/hakumi/float_button/component.rb +0 -203
  401. data/app/components/hakumi/float_button/group/component.rb +0 -227
  402. data/app/components/hakumi/float_button/group_cluster/component.rb +0 -141
  403. data/app/components/hakumi/grid/col/component.rb +0 -98
  404. data/app/components/hakumi/grid/row/component.rb +0 -79
  405. data/app/components/hakumi/image/component.rb +0 -112
  406. data/app/components/hakumi/image/preview_group/component.rb +0 -70
  407. data/app/components/hakumi/input/component.rb +0 -185
  408. data/app/components/hakumi/input/password/component.rb +0 -95
  409. data/app/components/hakumi/input/text_area/component.rb +0 -131
  410. data/app/components/hakumi/input_number/component.rb +0 -198
  411. data/app/components/hakumi/layout/component.html.erb +0 -1
  412. data/app/components/hakumi/layout/component.rb +0 -21
  413. data/app/components/hakumi/layout/content/component.html.erb +0 -1
  414. data/app/components/hakumi/layout/content/component.rb +0 -19
  415. data/app/components/hakumi/layout/footer/component.html.erb +0 -1
  416. data/app/components/hakumi/layout/footer/component.rb +0 -19
  417. data/app/components/hakumi/layout/header/component.html.erb +0 -1
  418. data/app/components/hakumi/layout/header/component.rb +0 -19
  419. data/app/components/hakumi/layout/sider/component.html.erb +0 -1
  420. data/app/components/hakumi/layout/sider/component.rb +0 -56
  421. data/app/components/hakumi/mentions/component.rb +0 -165
  422. data/app/components/hakumi/menu/component.rb +0 -126
  423. data/app/components/hakumi/menu/group/component.rb +0 -47
  424. data/app/components/hakumi/menu/item/component.rb +0 -47
  425. data/app/components/hakumi/menu/sub_menu/component.rb +0 -92
  426. data/app/components/hakumi/message/component.rb +0 -106
  427. data/app/components/hakumi/modal/component.rb +0 -99
  428. data/app/components/hakumi/modal/confirm/component.html.erb +0 -23
  429. data/app/components/hakumi/modal/confirm/component.rb +0 -46
  430. data/app/components/hakumi/modal/error/component.rb +0 -51
  431. data/app/components/hakumi/modal/info/component.rb +0 -51
  432. data/app/components/hakumi/modal/success/component.rb +0 -51
  433. data/app/components/hakumi/modal/warning/component.rb +0 -56
  434. data/app/components/hakumi/notification/component.rb +0 -126
  435. data/app/components/hakumi/pagination/component.rb +0 -205
  436. data/app/components/hakumi/popconfirm/component.rb +0 -72
  437. data/app/components/hakumi/popover/component.rb +0 -132
  438. data/app/components/hakumi/progress/component.rb +0 -565
  439. data/app/components/hakumi/qr_code/component.rb +0 -339
  440. data/app/components/hakumi/radio/component.rb +0 -80
  441. data/app/components/hakumi/radio/group/component.rb +0 -132
  442. data/app/components/hakumi/result/component.rb +0 -125
  443. data/app/components/hakumi/segmented/component.rb +0 -269
  444. data/app/components/hakumi/select/component.rb +0 -125
  445. data/app/components/hakumi/skeleton/avatar/component.rb +0 -66
  446. data/app/components/hakumi/skeleton/button/component.rb +0 -59
  447. data/app/components/hakumi/skeleton/component.rb +0 -200
  448. data/app/components/hakumi/skeleton/image/component.rb +0 -80
  449. data/app/components/hakumi/skeleton/input/component.rb +0 -51
  450. data/app/components/hakumi/skeleton/node/component.rb +0 -43
  451. data/app/components/hakumi/slider/component.rb +0 -228
  452. data/app/components/hakumi/space/compact/component.html.erb +0 -3
  453. data/app/components/hakumi/space/compact/component.rb +0 -36
  454. data/app/components/hakumi/space/component.rb +0 -73
  455. data/app/components/hakumi/spin/component.rb +0 -209
  456. data/app/components/hakumi/splitter/component.html.erb +0 -3
  457. data/app/components/hakumi/splitter/component.rb +0 -38
  458. data/app/components/hakumi/splitter/panel/component.html.erb +0 -3
  459. data/app/components/hakumi/splitter/panel/component.rb +0 -73
  460. data/app/components/hakumi/statistic/component.rb +0 -287
  461. data/app/components/hakumi/steps/component.rb +0 -145
  462. data/app/components/hakumi/steps/item/component.rb +0 -91
  463. data/app/components/hakumi/switch/component.rb +0 -124
  464. data/app/components/hakumi/table/column/component.rb +0 -80
  465. data/app/components/hakumi/table/component.rb +0 -731
  466. data/app/components/hakumi/table/concerns/columns.rb +0 -219
  467. data/app/components/hakumi/table/concerns/editable.rb +0 -121
  468. data/app/components/hakumi/table/concerns/ellipsis.rb +0 -63
  469. data/app/components/hakumi/table/concerns/fixed_columns.rb +0 -87
  470. data/app/components/hakumi/tabs/component.rb +0 -196
  471. data/app/components/hakumi/tabs/item/component.rb +0 -87
  472. data/app/components/hakumi/tag/component.rb +0 -187
  473. data/app/components/hakumi/timeline/component.html.erb +0 -7
  474. data/app/components/hakumi/timeline/component.rb +0 -168
  475. data/app/components/hakumi/timeline/item/component.rb +0 -137
  476. data/app/components/hakumi/tooltip/component.rb +0 -121
  477. data/app/components/hakumi/tour/component.rb +0 -158
  478. data/app/components/hakumi/transfer/component.html.erb +0 -173
  479. data/app/components/hakumi/transfer/component.rb +0 -245
  480. data/app/components/hakumi/tree/component.rb +0 -523
  481. data/app/components/hakumi/tree_select/component.rb +0 -261
  482. data/app/components/hakumi/typography/base_component.rb +0 -109
  483. data/app/components/hakumi/typography/link/component.rb +0 -34
  484. data/app/components/hakumi/typography/text/component.rb +0 -8
  485. data/app/components/hakumi/typography/title/component.rb +0 -29
  486. data/app/components/hakumi/upload/component.html.erb +0 -117
  487. data/app/components/hakumi/upload/component.rb +0 -193
  488. data/app/form_builders/hakumi/form_builder.rb +0 -482
  489. data/app/helpers/hakumi/form_helper.rb +0 -39
  490. data/app/services/hakumi/component_handler.rb +0 -53
  491. data/app/services/hakumi/icon/loader.rb +0 -95
  492. data/app/services/hakumi/illustrations/loader.rb +0 -43
  493. data/sig/action_view/tag_builder.rbs +0 -24
  494. data/sig/active_support/concern_patch.rbs +0 -7
  495. data/sig/generators/hakumi/install_generator.rbs +0 -11
  496. data/sig/hakumi/admin_panel/component.rbs +0 -28
  497. data/sig/hakumi/affix/component.rbs +0 -44
  498. data/sig/hakumi/alert/component.rbs +0 -64
  499. data/sig/hakumi/anchor/component.rbs +0 -45
  500. data/sig/hakumi/anchor/link/component.rbs +0 -31
  501. data/sig/hakumi/autocomplete/component.rbs +0 -68
  502. data/sig/hakumi/avatar/component.rbs +0 -44
  503. data/sig/hakumi/badge/component.rbs +0 -41
  504. data/sig/hakumi/base_component.rbs +0 -82
  505. data/sig/hakumi/breadcrumb/component.rbs +0 -21
  506. data/sig/hakumi/breadcrumb/item/component.rbs +0 -36
  507. data/sig/hakumi/button/component.rbs +0 -56
  508. data/sig/hakumi/calendar/component.rbs +0 -41
  509. data/sig/hakumi/card/component.rbs +0 -50
  510. data/sig/hakumi/card/grid/component.rbs +0 -21
  511. data/sig/hakumi/card/meta/component.rbs +0 -25
  512. data/sig/hakumi/carousel/component.rbs +0 -88
  513. data/sig/hakumi/cascader/component.rbs +0 -52
  514. data/sig/hakumi/checkbox/component.rbs +0 -46
  515. data/sig/hakumi/checkbox/group/component.rbs +0 -34
  516. data/sig/hakumi/collapse/component.rbs +0 -57
  517. data/sig/hakumi/collapse/panel/component.rbs +0 -47
  518. data/sig/hakumi/color_picker/component.rbs +0 -80
  519. data/sig/hakumi/concerns/form_field.rbs +0 -89
  520. data/sig/hakumi/container/component.rbs +0 -37
  521. data/sig/hakumi/date_picker/component.rbs +0 -72
  522. data/sig/hakumi/date_picker/range_picker.rbs +0 -68
  523. data/sig/hakumi/date_picker/shared_rendering.rbs +0 -41
  524. data/sig/hakumi/descriptions/component.rbs +0 -59
  525. data/sig/hakumi/descriptions/item/component.rbs +0 -31
  526. data/sig/hakumi/divider/component.rbs +0 -39
  527. data/sig/hakumi/drawer/component.rbs +0 -66
  528. data/sig/hakumi/dropdown/component.rbs +0 -45
  529. data/sig/hakumi/dropdown/divider/component.rbs +0 -11
  530. data/sig/hakumi/dropdown/item/component.rbs +0 -45
  531. data/sig/hakumi/empty/component.rbs +0 -40
  532. data/sig/hakumi/flex/component.rbs +0 -47
  533. data/sig/hakumi/float_button/back_top/component.rbs +0 -45
  534. data/sig/hakumi/float_button/component.rbs +0 -80
  535. data/sig/hakumi/float_button/group/component.rbs +0 -95
  536. data/sig/hakumi/float_button/group_cluster/component.rbs +0 -60
  537. data/sig/hakumi/form/item/component.rbs +0 -39
  538. data/sig/hakumi/form_builder.rbs +0 -37
  539. data/sig/hakumi/grid/col/component.rbs +0 -50
  540. data/sig/hakumi/grid/row/component.rbs +0 -46
  541. data/sig/hakumi/icon/component.rbs +0 -56
  542. data/sig/hakumi/image/component.rbs +0 -56
  543. data/sig/hakumi/image/preview_group/component.rbs +0 -28
  544. data/sig/hakumi/input/component.rbs +0 -71
  545. data/sig/hakumi/input/password/component.rbs +0 -27
  546. data/sig/hakumi/input/text_area/component.rbs +0 -42
  547. data/sig/hakumi/input_number/component.rbs +0 -85
  548. data/sig/hakumi/layout/component.rbs +0 -21
  549. data/sig/hakumi/layout/content/component.rbs +0 -19
  550. data/sig/hakumi/layout/footer/component.rbs +0 -19
  551. data/sig/hakumi/layout/header/component.rbs +0 -19
  552. data/sig/hakumi/layout/sider/component.rbs +0 -19
  553. data/sig/hakumi/mentions/component.rbs +0 -75
  554. data/sig/hakumi/menu/component.rbs +0 -52
  555. data/sig/hakumi/menu/divider/component.rbs +0 -11
  556. data/sig/hakumi/menu/group/component.rbs +0 -20
  557. data/sig/hakumi/menu/item/component.rbs +0 -42
  558. data/sig/hakumi/menu/sub_menu/component.rbs +0 -37
  559. data/sig/hakumi/message/component.rbs +0 -50
  560. data/sig/hakumi/modal/component.rbs +0 -76
  561. data/sig/hakumi/modal/confirm/component.rbs +0 -32
  562. data/sig/hakumi/modal/error/component.rbs +0 -27
  563. data/sig/hakumi/modal/info/component.rbs +0 -27
  564. data/sig/hakumi/modal/success/component.rbs +0 -27
  565. data/sig/hakumi/modal/warning/component.rbs +0 -27
  566. data/sig/hakumi/notification/component.rbs +0 -64
  567. data/sig/hakumi/pagination/component.rbs +0 -113
  568. data/sig/hakumi/popconfirm/component.rbs +0 -52
  569. data/sig/hakumi/popover/component.rbs +0 -66
  570. data/sig/hakumi/progress/component.rbs +0 -201
  571. data/sig/hakumi/qr_code/component.rbs +0 -111
  572. data/sig/hakumi/radio/component.rbs +0 -55
  573. data/sig/hakumi/radio/group/component.rbs +0 -71
  574. data/sig/hakumi/rails/attribute_introspection.rbs +0 -16
  575. data/sig/hakumi/rails/validation_introspection.rbs +0 -18
  576. data/sig/hakumi/rails/validation_mapper.rbs +0 -53
  577. data/sig/hakumi/rails.rbs +0 -6
  578. data/sig/hakumi/rate/component.rbs +0 -56
  579. data/sig/hakumi/result/component.rbs +0 -65
  580. data/sig/hakumi/segmented/component.rbs +0 -72
  581. data/sig/hakumi/select/component.rbs +0 -73
  582. data/sig/hakumi/skeleton/avatar/component.rbs +0 -23
  583. data/sig/hakumi/skeleton/button/component.rbs +0 -24
  584. data/sig/hakumi/skeleton/component.rbs +0 -76
  585. data/sig/hakumi/skeleton/image/component.rbs +0 -22
  586. data/sig/hakumi/skeleton/input/component.rbs +0 -23
  587. data/sig/hakumi/skeleton/node/component.rbs +0 -21
  588. data/sig/hakumi/slider/component.rbs +0 -85
  589. data/sig/hakumi/space/compact/component.rbs +0 -21
  590. data/sig/hakumi/space/component.rbs +0 -47
  591. data/sig/hakumi/spin/component.rbs +0 -77
  592. data/sig/hakumi/splitter/component.rbs +0 -27
  593. data/sig/hakumi/splitter/panel/component.rbs +0 -36
  594. data/sig/hakumi/statistic/component.rbs +0 -97
  595. data/sig/hakumi/steps/component.rbs +0 -82
  596. data/sig/hakumi/steps/item/component.rbs +0 -29
  597. data/sig/hakumi/switch/component.rbs +0 -52
  598. data/sig/hakumi/table/column/component.rbs +0 -57
  599. data/sig/hakumi/table/column_group/component.rbs +0 -20
  600. data/sig/hakumi/table/component.rbs +0 -279
  601. data/sig/hakumi/table/concerns/columns.rbs +0 -95
  602. data/sig/hakumi/table/concerns/editable.rbs +0 -40
  603. data/sig/hakumi/table/concerns/ellipsis.rbs +0 -27
  604. data/sig/hakumi/table/concerns/fixed_columns.rbs +0 -33
  605. data/sig/hakumi/tabs/component.rbs +0 -66
  606. data/sig/hakumi/tabs/item/component.rbs +0 -29
  607. data/sig/hakumi/tag/component.rbs +0 -86
  608. data/sig/hakumi/tag/group/component.rbs +0 -24
  609. data/sig/hakumi/time_picker/component.rbs +0 -72
  610. data/sig/hakumi/timeline/component.rbs +0 -61
  611. data/sig/hakumi/timeline/item/component.rbs +0 -70
  612. data/sig/hakumi/tooltip/component.rbs +0 -73
  613. data/sig/hakumi/tour/component.rbs +0 -84
  614. data/sig/hakumi/transfer/component.rbs +0 -75
  615. data/sig/hakumi/tree/component.rbs +0 -126
  616. data/sig/hakumi/tree_select/component.rbs +0 -122
  617. data/sig/hakumi/typography/base_component.rbs +0 -57
  618. data/sig/hakumi/typography/link/component.rbs +0 -28
  619. data/sig/hakumi/typography/paragraph/component.rbs +0 -13
  620. data/sig/hakumi/typography/title/component.rbs +0 -28
  621. data/sig/hakumi/upload/component.rbs +0 -78
  622. data/sig/hakumi.rbs +0 -96
  623. data/sig/rails/active_model/validations/comparison_validator.rbs +0 -6
  624. data/sig/rails.rbs +0 -18
  625. data/sig/view_component/base.rbs +0 -28
  626. /data/app/components/{hakumi → hakumi_components}/affix/component.html.erb +0 -0
  627. /data/app/components/{hakumi → hakumi_components}/anchor/component.html.erb +0 -0
  628. /data/app/components/{hakumi → hakumi_components}/breadcrumb/component.html.erb +0 -0
  629. /data/app/components/{hakumi → hakumi_components}/dropdown/component.html.erb +0 -0
  630. /data/app/components/{hakumi → hakumi_components}/dropdown/item/component.html.erb +0 -0
  631. /data/app/components/{hakumi → hakumi_components}/icon/component.html.erb +0 -0
  632. /data/app/components/{hakumi → hakumi_components}/menu/component.html.erb +0 -0
  633. /data/app/components/{hakumi → hakumi_components}/menu/group/component.html.erb +0 -0
  634. /data/app/components/{hakumi → hakumi_components}/menu/item/component.html.erb +0 -0
  635. /data/app/components/{hakumi → hakumi_components}/menu/sub_menu/component.html.erb +0 -0
  636. /data/app/components/{hakumi → hakumi_components}/message/component.html.erb +0 -0
  637. /data/app/components/{hakumi → hakumi_components}/qr_code/component.html.erb +0 -0
  638. /data/app/components/{hakumi → hakumi_components}/result/component.html.erb +0 -0
  639. /data/app/components/{hakumi → hakumi_components}/skeleton/avatar/component.html.erb +0 -0
  640. /data/app/components/{hakumi → hakumi_components}/skeleton/button/component.html.erb +0 -0
  641. /data/app/components/{hakumi → hakumi_components}/skeleton/component.html.erb +0 -0
  642. /data/app/components/{hakumi → hakumi_components}/skeleton/input/component.html.erb +0 -0
  643. /data/app/components/{hakumi → hakumi_components}/skeleton/node/component.html.erb +0 -0
  644. /data/app/components/{hakumi → hakumi_components}/spin/component.html.erb +0 -0
  645. /data/app/components/{hakumi → hakumi_components}/statistic/component.html.erb +0 -0
  646. /data/app/components/{hakumi → hakumi_components}/steps/item/component.html.erb +0 -0
  647. /data/app/components/{hakumi → hakumi_components}/tour/component.html.erb +0 -0
data/README.md CHANGED
@@ -1,130 +1,100 @@
1
- <div align="center">
2
- <a href="https://github.com/hakumi-dev/hakumi-components">
3
- <img src="logo-hakumi-full.png" alt="Logo" width="250">
4
- </a>
1
+ <p align="center">
2
+ <br />
3
+ <img src="logo-hakumi-full.png" alt="Hakumi Components" width="250" />
4
+ <br />
5
+ </p>
6
+
7
+ <h1 align="center">Hakumi Components</h1>
8
+
9
+ <p align="center">
10
+ ViewComponent-based UI library for Ruby on Rails — 65 components, Ant Design conventions, Stimulus controllers
11
+ <br />
12
+ <a href="https://github.com/hakumi-dev/hakumi-components"><strong>Source Code</strong></a>
13
+ &middot;
14
+ <a href="https://components.hakumi.dev">Playground</a>
15
+ &middot;
16
+ <a href="https://github.com/hakumi-dev/hakumi-components/issues">Report Bug</a>
17
+ &middot;
18
+ <a href="https://github.com/hakumi-dev/hakumi-components/blob/main/CHANGELOG.md">Changelog</a>
19
+ </p>
20
+
21
+ <p align="center">
22
+ <a href="https://github.com/hakumi-dev/hakumi-components/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License" /></a>
23
+ <a href="https://ruby-doc.org/"><img src="https://img.shields.io/badge/ruby-%3E%3D%203.0-CC342D.svg?logo=ruby" alt="Ruby >= 3.0" /></a>
24
+ </p>
5
25
 
6
- <h3 align="center">Hakumi Components</h3>
7
-
8
- <p align="center">
9
- Elegant UI component library for Ruby on Rails
10
- <br />
11
- <a href="https://components.hakumi.dev"><strong>View Live Playground »</strong></a>
12
- ·
13
- <a href="https://github.com/hakumi-dev/hakumi-components/issues">Report Bug</a>
14
- ·
15
- <a href="https://www.npmjs.com/package/@hakumi-dev/hakumi-components">npm Package</a>
16
- ·
17
- <a href="https://rubygems.org/gems/hakumi_components">RubyGems</a>
18
- </p>
19
- </div>
20
-
21
- ## About The Project
22
-
23
- Hakumi Components is a comprehensive UI component library for Ruby on Rails applications, inspired by Ant Design. It provides 65 production-ready, accessible components with light/dark theme support, combining the power of ViewComponent, Stimulus, and modern CSS.
26
+ ---
24
27
 
25
- **✨ Key Features:**
26
- - 🎨 **65 Components** - Button, Form, Table, Modal, Menu, Calendar, and more
27
- - 🌓 **Light/Dark Theme** - Built-in theme support with CSS variables
28
- - 📦 **Rails Engine** - Drop-in integration with ViewComponent
29
- - ⚡ **Modern Stack** - Stimulus controllers with clean JavaScript API
30
- - 🎯 **Ant Design Inspired** - Familiar design patterns and conventions
31
- - 🔧 **Customizable** - Override styles and behavior easily
28
+ ## Table of Contents
32
29
 
33
- **🎮 [Try the Interactive Playground](https://components.hakumi.dev)** - See all components in action with live examples
30
+ | | |
31
+ |---|---|
32
+ | [About](#about) | What Hakumi Components is and why it exists |
33
+ | [Installation](#installation) | Gem and npm setup |
34
+ | [Configuration](#configuration) | Initializer options |
35
+ | [Usage](#usage) | Basic examples |
36
+ | [Components](#components) | All 65 components by category |
37
+ | [JavaScript API](#javascript-api) | Programmatic control |
38
+ | [Architecture](#architecture) | How components are structured |
39
+ | [Development](#development) | Local playground, tests |
40
+ | [Contributing](#contributing) | How to contribute |
34
41
 
35
- ## Built With
42
+ ---
36
43
 
37
- [![Ruby][Ruby-badge]][Ruby-url] [![ViewComponent][ViewComponent-badge]][ViewComponent-url] [![Stimulus][Stimulus-badge]][Stimulus-url]
44
+ ## About
38
45
 
39
- **Core Technologies:**
40
- - Ruby on Rails 7.1+ as a Rails Engine
41
- - ViewComponent 3.0+ for Ruby components
42
- - Stimulus 3.0+ for JavaScript interactivity
43
- - SCSS with CSS variables for theming
46
+ Hakumi Components is a Rails UI component library built on ViewComponent, Stimulus, and SCSS. It follows Ant Design conventions and ships 65 server-rendered components with optional JavaScript interactivity. Light and dark themes are supported via CSS variables.
44
47
 
45
- ## Getting Started
48
+ Stack: ViewComponent 3.0+, Stimulus 3.0+, Rails 7.1+, SCSS.
46
49
 
47
- ### Prerequisites
50
+ ---
48
51
 
49
- **Required:**
50
- - Ruby 3.0 or higher
51
- - Rails 7.1 or higher
52
- - Node.js 16.9+ (for npm package)
53
- - A JavaScript bundler (Vite, Webpack, esbuild, etc.)
54
- - SCSS processor (sass, sass-embedded, etc.)
52
+ ## Installation
55
53
 
56
- **Recommended:**
57
- - Vite (via `vite_rails` gem)
58
- - Yarn or npm for package management
54
+ ### Requirements
59
55
 
60
- ### Installation
56
+ - Ruby 3.0+
57
+ - Rails 7.1+
58
+ - Node.js 16.9+
59
+ - A JavaScript bundler (Vite, Webpack, esbuild)
60
+ - SCSS processor
61
61
 
62
- #### Option A: Automatic Installation (Recommended)
62
+ ### Automatic (recommended)
63
63
 
64
- **1. Add the gem to your Gemfile:**
64
+ Add the gem:
65
65
 
66
66
  ```ruby
67
- # Always use the latest pre-release version (recommended during development)
68
67
  gem 'hakumi_components', '>= 0.1.0.pre'
69
-
70
- # Or pin to a specific version for stability
71
- gem 'hakumi_components', '0.1.16.pre'
72
68
  ```
73
69
 
74
- **2. Run the installer:**
70
+ Run the installer:
75
71
 
76
72
  ```bash
77
73
  bundle install
78
74
  bin/rails generate hakumi:install
79
75
  ```
80
76
 
81
- The generator will automatically:
82
- - ✅ Install the npm package with correct version (`@pre`)
83
- - ✅ Detect your JavaScript entry point (Vite/Webpack/Sprockets)
84
- - ✅ Add imports with complete configuration
85
- - ✅ Setup stylesheets with appropriate syntax (`@use` or `@import`)
86
- - ✅ Configure the FormBuilder (optional)
87
-
88
- **3. Restart your server and you're done! 🎉**
89
-
90
- ---
91
-
92
- #### Option B: Manual Installation
77
+ The generator detects your JavaScript entry point and SCSS setup, installs the npm package, and wires up imports automatically.
93
78
 
94
- If you prefer manual setup or the generator doesn't work for your setup:
79
+ ### Manual
95
80
 
96
81
  **1. Add the gem:**
97
82
 
98
83
  ```ruby
99
- # Always use the latest pre-release version
100
84
  gem 'hakumi_components', '>= 0.1.0.pre'
101
-
102
- # Or pin to a specific version
103
- gem 'hakumi_components', '0.1.16.pre'
104
85
  ```
105
86
 
106
- **2. Install dependencies:**
87
+ **2. Install the npm package:**
107
88
 
108
89
  ```bash
109
- bundle install
110
-
111
- # Using Yarn - latest pre-release
112
90
  yarn add @hakumi-dev/hakumi-components@pre
113
-
114
- # Using Yarn - specific version
115
- yarn add @hakumi-dev/hakumi-components@0.1.16-pre
116
-
117
- # Using npm - latest pre-release
91
+ # or
118
92
  npm install @hakumi-dev/hakumi-components@pre
119
-
120
- # Using npm - specific version
121
- npm install @hakumi-dev/hakumi-components@0.1.16-pre
122
93
  ```
123
94
 
124
- **3. Setup JavaScript:**
95
+ **3. JavaScript:**
125
96
 
126
97
  ```javascript
127
- // app/javascript/application.js (or entrypoints/application.js for Vite)
128
98
  import { Application } from "@hotwired/stimulus"
129
99
  import HakumiComponents, { registerHakumiControllers } from "@hakumi-dev/hakumi-components"
130
100
 
@@ -133,355 +103,234 @@ window.HakumiComponents = HakumiComponents
133
103
  registerHakumiControllers(application)
134
104
  ```
135
105
 
136
- **4. Setup stylesheets:**
106
+ **4. Stylesheets:**
137
107
 
138
108
  ```scss
139
- // For Vite/Webpack (modern bundlers)
140
- // app/javascript/stylesheets/application.scss
109
+ // Vite / Webpack
141
110
  @use '@hakumi-dev/hakumi-components/styles';
142
111
 
143
- // OR for Sprockets/traditional setup
144
- // app/assets/stylesheets/application.scss
112
+ // Sprockets
145
113
  @import "@hakumi-dev/hakumi-components/styles";
146
114
  ```
147
115
 
148
- **5. (Optional) Configure FormBuilder:**
116
+ ---
117
+
118
+ ## Configuration
149
119
 
150
120
  ```ruby
151
121
  # config/initializers/hakumi_components.rb
152
- Rails.application.config.action_view.default_form_builder = Hakumi::FormBuilder
122
+ HakumiComponents.configure do |config|
123
+ config.default_form_builder = true # Use HakumiComponents::FormBuilder as default
124
+ config.base_path = "hakumi/components" # Base URL for modal/drawer routes
125
+ end
153
126
  ```
154
127
 
155
- ## Usage
128
+ | Option | Default | Description |
129
+ |--------|---------|-------------|
130
+ | `default_form_builder` | `false` | Set `HakumiComponents::FormBuilder` as the application default |
131
+ | `base_path` | `"hakumi/components"` | Base URL path for components that require server routes |
132
+
133
+ ---
156
134
 
157
- ### Basic Component Example
135
+ ## Usage
158
136
 
159
137
  ```erb
160
- <%# Simple button %>
161
- <%= render Hakumi::Button::Component.new(type: :primary) do %>
162
- Click me
138
+ <%= render HakumiComponents::Button::Component.new(type: :primary) do %>
139
+ Save
163
140
  <% end %>
164
141
 
165
- <%# Form with automatic validation detection %>
166
- <%= form_with model: @user, builder: Hakumi::FormBuilder do |f| %>
142
+ <%= form_with model: @user, builder: HakumiComponents::FormBuilder do |f| %>
167
143
  <%= f.text_field :email %>
168
144
  <%= f.text_field :name %>
169
145
  <%= f.submit "Save", type: :primary %>
170
146
  <% end %>
171
147
 
172
- <%# Modal with programmatic control %>
173
- <%= render Hakumi::Modal::Component.new(
174
- id: "my-modal",
175
- title: "Confirm Action"
176
- ) do %>
177
- Are you sure you want to proceed?
148
+ <%= render HakumiComponents::Modal::Component.new(id: "confirm-modal", title: "Confirm") do %>
149
+ Are you sure?
178
150
  <% end %>
179
151
  ```
180
152
 
181
- ### Component Reference
182
-
183
- Browse all **65 components** organized by category. Each component includes detailed documentation, examples, and API reference.
184
-
185
- #### General (4)
186
- - [Button](./app/components/hakumi/button/docs/README.md) - Clickable button element
187
- - [Float Button](./app/components/hakumi/float_button/docs/README.md) - Floating action button
188
- - [Icon](./app/components/hakumi/icon/docs/README.md) - Icon display component
189
- - [Typography](./app/components/hakumi/typography/docs/README.md) - Text styling and formatting
190
-
191
- #### Layout (6)
192
- - [Divider](./app/components/hakumi/divider/docs/README.md) - Horizontal or vertical divider line
193
- - [Flex](./app/components/hakumi/flex/docs/README.md) - Flexbox layout container
194
- - [Grid](./app/components/hakumi/grid/docs/README.md) - Grid layout system
195
- - [Layout](./app/components/hakumi/layout/docs/README.md) - Page layout structure
196
- - [Space](./app/components/hakumi/space/docs/README.md) - Spacing between elements
197
- - [Splitter](./app/components/hakumi/splitter/docs/README.md) - Resizable split panels
198
-
199
- #### Navigation (6)
200
- - [Anchor](./app/components/hakumi/anchor/docs/README.md) - Anchor navigation for page sections
201
- - [Breadcrumb](./app/components/hakumi/breadcrumb/docs/README.md) - Breadcrumb navigation trail
202
- - [Dropdown](./app/components/hakumi/dropdown/docs/README.md) - Dropdown menu
203
- - [Menu](./app/components/hakumi/menu/docs/README.md) - Navigation menu
204
- - [Pagination](./app/components/hakumi/pagination/docs/README.md) - Pagination controls
205
- - [Steps](./app/components/hakumi/steps/docs/README.md) - Step-by-step navigation
206
-
207
- #### Data Entry (18)
208
- - [Autocomplete](./app/components/hakumi/autocomplete/docs/README.md) - Input with autocomplete suggestions
209
- - [Cascader](./app/components/hakumi/cascader/docs/README.md) - Cascading selection dropdown
210
- - [Checkbox](./app/components/hakumi/checkbox/docs/README.md) - Checkbox input
211
- - [Color Picker](./app/components/hakumi/color_picker/docs/README.md) - Color selection input
212
- - [Date Picker](./app/components/hakumi/date_picker/docs/README.md) - Date selection input
213
- - [Form](./app/components/hakumi/form/docs/README.md) - Form wrapper with validation
214
- - [Input](./app/components/hakumi/input/docs/README.md) - Text input field
215
- - [Input Number](./app/components/hakumi/input_number/docs/README.md) - Numeric input field
216
- - [Mentions](./app/components/hakumi/mentions/docs/README.md) - @mentions input
217
- - [Radio](./app/components/hakumi/radio/docs/README.md) - Radio button input
218
- - [Rate](./app/components/hakumi/rate/docs/README.md) - Star rating input
219
- - [Select](./app/components/hakumi/select/docs/README.md) - Dropdown select input
220
- - [Slider](./app/components/hakumi/slider/docs/README.md) - Range slider input
221
- - [Switch](./app/components/hakumi/switch/docs/README.md) - Toggle switch input
222
- - [Time Picker](./app/components/hakumi/time_picker/docs/README.md) - Time selection input
223
- - [Transfer](./app/components/hakumi/transfer/docs/README.md) - Dual list transfer
224
- - [Tree Select](./app/components/hakumi/tree_select/docs/README.md) - Tree structure select
225
- - [Upload](./app/components/hakumi/upload/docs/README.md) - File upload component
226
-
227
- #### Data Display (20)
228
- - [Avatar](./app/components/hakumi/avatar/docs/README.md) - User avatar display
229
- - [Badge](./app/components/hakumi/badge/docs/README.md) - Badge and status dot
230
- - [Calendar](./app/components/hakumi/calendar/docs/README.md) - Calendar display
231
- - [Card](./app/components/hakumi/card/docs/README.md) - Card container
232
- - [Carousel](./app/components/hakumi/carousel/docs/README.md) - Image/content carousel
233
- - [Collapse](./app/components/hakumi/collapse/docs/README.md) - Collapsible accordion panels
234
- - [Descriptions](./app/components/hakumi/descriptions/docs/README.md) - Description list display
235
- - [Empty](./app/components/hakumi/empty/docs/README.md) - Empty state placeholder
236
- - [Image](./app/components/hakumi/image/docs/README.md) - Image display with preview
237
- - [Popover](./app/components/hakumi/popover/docs/README.md) - Popover overlay
238
- - [QR Code](./app/components/hakumi/qr_code/docs/README.md) - QR code generator
239
- - [Segmented](./app/components/hakumi/segmented/docs/README.md) - Segmented control
240
- - [Statistic](./app/components/hakumi/statistic/docs/README.md) - Statistic display
241
- - [Table](./app/components/hakumi/table/docs/README.md) - Data table
242
- - [Tabs](./app/components/hakumi/tabs/docs/README.md) - Tab navigation
243
- - [Tag](./app/components/hakumi/tag/docs/README.md) - Tag label
244
- - [Timeline](./app/components/hakumi/timeline/docs/README.md) - Timeline display
245
- - [Tooltip](./app/components/hakumi/tooltip/docs/README.md) - Tooltip overlay
246
- - [Tour](./app/components/hakumi/tour/docs/README.md) - Guided tour
247
- - [Tree](./app/components/hakumi/tree/docs/README.md) - Tree structure display
248
-
249
- #### Feedback (10)
250
- - [Alert](./app/components/hakumi/alert/docs/README.md) - Alert message display
251
- - [Drawer](./app/components/hakumi/drawer/docs/README.md) - Slide-out drawer panel
252
- - [Message](./app/components/hakumi/message/docs/README.md) - Global message notification
253
- - [Modal](./app/components/hakumi/modal/docs/README.md) - Modal dialog
254
- - [Notification](./app/components/hakumi/notification/docs/README.md) - Notification message
255
- - [Popconfirm](./app/components/hakumi/popconfirm/docs/README.md) - Confirmation popover
256
- - [Progress](./app/components/hakumi/progress/docs/README.md) - Progress indicator
257
- - [Result](./app/components/hakumi/result/docs/README.md) - Result status page
258
- - [Skeleton](./app/components/hakumi/skeleton/docs/README.md) - Skeleton loading placeholder
259
- - [Spin](./app/components/hakumi/spin/docs/README.md) - Loading spinner
260
-
261
- #### Other (1)
262
- - [Affix](./app/components/hakumi/affix/docs/README.md) - Pin element to viewport
153
+ ---
154
+
155
+ ## Components
156
+
157
+ 65 components organized by category. Each links to its own documentation with API reference and examples.
158
+
159
+ ### General
160
+
161
+ - [Button](./app/components/hakumi_components/button/docs/README.md)
162
+ - [Float Button](./app/components/hakumi_components/float_button/docs/README.md)
163
+ - [Icon](./app/components/hakumi_components/icon/docs/README.md)
164
+ - [Typography](./app/components/hakumi_components/typography/docs/README.md)
165
+
166
+ ### Layout
167
+
168
+ - [Divider](./app/components/hakumi_components/divider/docs/README.md)
169
+ - [Flex](./app/components/hakumi_components/flex/docs/README.md)
170
+ - [Grid](./app/components/hakumi_components/grid/docs/README.md)
171
+ - [Layout](./app/components/hakumi_components/layout/docs/README.md)
172
+ - [Space](./app/components/hakumi_components/space/docs/README.md)
173
+ - [Splitter](./app/components/hakumi_components/splitter/docs/README.md)
174
+
175
+ ### Navigation
176
+
177
+ - [Anchor](./app/components/hakumi_components/anchor/docs/README.md)
178
+ - [Breadcrumb](./app/components/hakumi_components/breadcrumb/docs/README.md)
179
+ - [Dropdown](./app/components/hakumi_components/dropdown/docs/README.md)
180
+ - [Menu](./app/components/hakumi_components/menu/docs/README.md)
181
+ - [Pagination](./app/components/hakumi_components/pagination/docs/README.md)
182
+ - [Steps](./app/components/hakumi_components/steps/docs/README.md)
183
+
184
+ ### Data Entry
185
+
186
+ - [Autocomplete](./app/components/hakumi_components/autocomplete/docs/README.md)
187
+ - [Cascader](./app/components/hakumi_components/cascader/docs/README.md)
188
+ - [Checkbox](./app/components/hakumi_components/checkbox/docs/README.md)
189
+ - [Color Picker](./app/components/hakumi_components/color_picker/docs/README.md)
190
+ - [Date Picker](./app/components/hakumi_components/date_picker/docs/README.md)
191
+ - [Form](./app/components/hakumi_components/form/docs/README.md)
192
+ - [Input](./app/components/hakumi_components/input/docs/README.md)
193
+ - [Input Number](./app/components/hakumi_components/input_number/docs/README.md)
194
+ - [Mentions](./app/components/hakumi_components/mentions/docs/README.md)
195
+ - [Radio](./app/components/hakumi_components/radio/docs/README.md)
196
+ - [Rate](./app/components/hakumi_components/rate/docs/README.md)
197
+ - [Select](./app/components/hakumi_components/select/docs/README.md)
198
+ - [Slider](./app/components/hakumi_components/slider/docs/README.md)
199
+ - [Switch](./app/components/hakumi_components/switch/docs/README.md)
200
+ - [Time Picker](./app/components/hakumi_components/time_picker/docs/README.md)
201
+ - [Transfer](./app/components/hakumi_components/transfer/docs/README.md)
202
+ - [Tree Select](./app/components/hakumi_components/tree_select/docs/README.md)
203
+ - [Upload](./app/components/hakumi_components/upload/docs/README.md)
204
+
205
+ ### Data Display
206
+
207
+ - [Avatar](./app/components/hakumi_components/avatar/docs/README.md)
208
+ - [Badge](./app/components/hakumi_components/badge/docs/README.md)
209
+ - [Calendar](./app/components/hakumi_components/calendar/docs/README.md)
210
+ - [Card](./app/components/hakumi_components/card/docs/README.md)
211
+ - [Carousel](./app/components/hakumi_components/carousel/docs/README.md)
212
+ - [Collapse](./app/components/hakumi_components/collapse/docs/README.md)
213
+ - [Descriptions](./app/components/hakumi_components/descriptions/docs/README.md)
214
+ - [Empty](./app/components/hakumi_components/empty/docs/README.md)
215
+ - [Image](./app/components/hakumi_components/image/docs/README.md)
216
+ - [Popover](./app/components/hakumi_components/popover/docs/README.md)
217
+ - [QR Code](./app/components/hakumi_components/qr_code/docs/README.md)
218
+ - [Segmented](./app/components/hakumi_components/segmented/docs/README.md)
219
+ - [Statistic](./app/components/hakumi_components/statistic/docs/README.md)
220
+ - [Table](./app/components/hakumi_components/table/docs/README.md)
221
+ - [Tabs](./app/components/hakumi_components/tabs/docs/README.md)
222
+ - [Tag](./app/components/hakumi_components/tag/docs/README.md)
223
+ - [Timeline](./app/components/hakumi_components/timeline/docs/README.md)
224
+ - [Tooltip](./app/components/hakumi_components/tooltip/docs/README.md)
225
+ - [Tour](./app/components/hakumi_components/tour/docs/README.md)
226
+ - [Tree](./app/components/hakumi_components/tree/docs/README.md)
227
+
228
+ ### Feedback
229
+
230
+ - [Alert](./app/components/hakumi_components/alert/docs/README.md)
231
+ - [Drawer](./app/components/hakumi_components/drawer/docs/README.md)
232
+ - [Message](./app/components/hakumi_components/message/docs/README.md)
233
+ - [Modal](./app/components/hakumi_components/modal/docs/README.md)
234
+ - [Notification](./app/components/hakumi_components/notification/docs/README.md)
235
+ - [Popconfirm](./app/components/hakumi_components/popconfirm/docs/README.md)
236
+ - [Progress](./app/components/hakumi_components/progress/docs/README.md)
237
+ - [Result](./app/components/hakumi_components/result/docs/README.md)
238
+ - [Skeleton](./app/components/hakumi_components/skeleton/docs/README.md)
239
+ - [Spin](./app/components/hakumi_components/spin/docs/README.md)
240
+
241
+ ### Other
242
+
243
+ - [Affix](./app/components/hakumi_components/affix/docs/README.md)
244
+
245
+ ---
263
246
 
264
247
  ## JavaScript API
265
248
 
266
- Components with interactivity expose programmatic APIs:
249
+ Interactive components expose a programmatic API:
267
250
 
268
251
  ```javascript
269
- // Access component API via element
270
- const modal = document.getElementById('my-modal')
271
- modal.hakumiComponent.api.open()
272
- modal.hakumiComponent.api.close()
252
+ // Via element
253
+ document.getElementById('my-modal').hakumiComponent.api.open()
254
+ document.getElementById('my-modal').hakumiComponent.api.close()
273
255
 
274
- // Or via global registry
256
+ // Via global registry
275
257
  window.HakumiComponents.get('my-modal').open()
276
258
  ```
277
259
 
278
- Common API methods by component type:
279
- - **Toggleables** (Modal, Drawer): `open()`, `close()`, `toggle()`, `isOpen()`
280
- - **Inputs** (Input, Select): `getValue()`, `setValue(value)`, `clear()`, `focus()`
281
- - **Navigation** (Carousel, Tabs): `next()`, `prev()`, `goTo(index)`, `getCurrent()`
282
-
283
- ## Architecture
284
-
285
- Components follow a three-layer pattern:
286
- 1. **Ruby Component** (`component.rb`) - Props and rendering logic
287
- 2. **ERB Template** (`component.html.erb`) - HTML structure (optional)
288
- 3. **Stimulus Controller** (`{component}_controller.js`) - Interactivity (when needed)
289
-
290
- **Note:** Not all components need JavaScript controllers. Many are purely presentational (Typography, Space, Divider, etc.).
291
-
292
- ## Troubleshooting
293
-
294
- ### Installation Issues
295
-
296
- If you encounter problems during installation:
297
-
298
- 1. **Try the automatic installer first:**
299
- ```bash
300
- bin/rails generate hakumi:install
301
- ```
302
-
303
- 2. **If the installer fails**, follow the manual installation steps above
304
-
305
- 3. **Check compatibility:**
306
- - Ruby 3.0+
307
- - Rails 7.1+
308
- - Node.js 16.9+
309
- - A JavaScript bundler (Vite, Webpack, esbuild)
310
-
311
- ### Controllers not registering
312
-
313
- If components don't respond to interactions:
314
-
315
- 1. **Verify the npm package is installed:**
316
- ```bash
317
- yarn list @hakumi-dev/hakumi-components
318
- # or
319
- npm list @hakumi-dev/hakumi-components
320
- ```
321
-
322
- 2. **Check browser console:**
323
- - Should see: `"[HakumiComponents] Registered X controllers"`
324
- - If you see errors, check your import paths
325
-
326
- 3. **Verify Stimulus is properly configured:**
327
- ```javascript
328
- console.log(window.Stimulus) // Should not be undefined
329
- console.log(window.HakumiComponents) // Should be an object with methods
330
- ```
331
-
332
- 4. **Ensure imports are complete:**
333
- ```javascript
334
- // ✅ Correct - includes both exports
335
- import HakumiComponents, { registerHakumiControllers } from "@hakumi-dev/hakumi-components"
336
-
337
- // ❌ Wrong - missing default export
338
- import { registerHakumiControllers } from "@hakumi-dev/hakumi-components"
339
- ```
340
-
341
- ### Styles not loading
342
-
343
- 1. Verify you're using SCSS (not plain CSS)
344
- 2. Check your bundler configuration supports node_modules imports
345
- 3. For Vite, ensure `@use` syntax is used (not `@import`)
346
-
347
- ### Version mismatches
348
-
349
- Keep gem and npm versions in sync:
350
-
351
- ```ruby
352
- # Gemfile - pin to specific version
353
- gem 'hakumi_components', '0.1.16.pre'
354
- ```
355
- ```bash
356
- # package.json - matching version
357
- yarn add @hakumi-dev/hakumi-components@0.1.16-pre
358
- ```
359
-
360
- Or use dynamic versioning to always get the latest:
361
- ```ruby
362
- # Gemfile - always latest pre-release
363
- gem 'hakumi_components', '>= 0.1.0.pre'
364
- ```
365
- ```bash
366
- # package.json - always latest pre-release
367
- yarn add @hakumi-dev/hakumi-components@pre
368
- ```
260
+ | Component type | Methods |
261
+ |----------------|---------|
262
+ | Toggleables (Modal, Drawer) | `open()`, `close()`, `toggle()`, `isOpen()` |
263
+ | Inputs (Input, Select) | `getValue()`, `setValue(value)`, `clear()`, `focus()` |
264
+ | Navigation (Carousel, Tabs) | `next()`, `prev()`, `goTo(index)`, `getCurrent()` |
369
265
 
370
- ## Updating
266
+ ---
371
267
 
372
- To update to the latest version:
268
+ ## Architecture
373
269
 
374
- ```bash
375
- # Update Ruby gem
376
- bundle update hakumi_components
270
+ Each component follows a three-layer pattern:
377
271
 
378
- # Update npm package to latest pre-release
379
- yarn add @hakumi-dev/hakumi-components@pre
380
- # or
381
- npm install @hakumi-dev/hakumi-components@pre
382
- ```
272
+ 1. **Ruby component** (`component.rb`) props, validation, rendering logic
273
+ 2. **ERB template** (`component.html.erb`) — HTML structure
274
+ 3. **Stimulus controller** (`*_controller.js`) — JavaScript interactivity (only when needed)
383
275
 
384
- **Version Strategy:**
385
- - **During development:** Use `>= 0.1.0.pre` (gem) and `@pre` (npm) to always get the latest features
386
- - **For production:** Pin to a specific version like `0.1.16.pre` for stability
276
+ Purely presentational components (Typography, Space, Divider, etc.) have no JavaScript layer.
387
277
 
388
- **Note:** Currently in pre-release (`0.1.x.pre`). Stable `1.0.0` release coming soon.
278
+ ---
389
279
 
390
280
  ## Development
391
281
 
392
- ### Local Playground
393
-
394
- Want to see and test components locally? We have a built-in playground:
282
+ ### Playground
395
283
 
396
284
  ```bash
397
- # From the gem root directory
398
285
  bin/playground
399
286
  ```
400
287
 
401
- Then visit http://localhost:3000 to browse all components and examples.
402
-
403
- **Features:**
404
- - 📋 Browse all 65 components
405
- - 🎨 See examples in action
406
- - 🔍 Test component behavior
407
- - 💻 Perfect for development
408
-
409
- The playground is located in `test/dummy/` and is **not included** in the published gem.
288
+ Opens a local Rails app at `http://localhost:3000` with all components and examples. Located in `test/dummy/`, not included in the published gem.
410
289
 
411
- ### Adding Examples
412
-
413
- To add a new example for testing:
290
+ To add an example:
414
291
 
415
292
  ```bash
416
- # Create a new example partial
417
293
  touch test/dummy/app/views/test_examples/[component]/_[example_name].html.erb
418
294
  ```
419
295
 
420
- It will automatically appear in the playground at `/test/[component]/[example_name]`.
296
+ It appears automatically at `/test/[component]/[example_name]`.
421
297
 
422
- ### Running Tests
298
+ ### Tests
423
299
 
424
300
  ```bash
425
- # All tests
426
- bundle exec rake test
301
+ bundle exec rake test # all tests
302
+ bundle exec rake test TEST=test/components/hakumi/button/component_test.rb # single file
303
+ bundle exec rake test:system # browser tests
304
+ ```
427
305
 
428
- # Specific test file
429
- bundle exec rake test TEST=test/components/hakumi/button/component_test.rb
306
+ ### Versioning
430
307
 
431
- # System tests (browser tests)
432
- bundle exec rake test:system
433
- ```
308
+ Gem and npm versions must be kept in sync:
434
309
 
435
- ## Contributing
310
+ ```ruby
311
+ # Gemfile
312
+ gem 'hakumi_components', '0.1.16.pre'
313
+ ```
436
314
 
437
- Contributions are welcome! This is an open-source project and we'd love your help.
438
-
439
- **For Contributors:**
440
-
441
- 1. Fork the Project
442
- 2. Clone your fork and setup:
443
- ```bash
444
- git clone https://github.com/your-username/hakumi-components.git
445
- cd hakumi-components
446
- bin/setup
447
- ```
448
- 3. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
449
- 4. Make your changes and add tests
450
- 5. Run tests: `bundle exec rake test`
451
- 6. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
452
- 7. Push to the Branch (`git push origin feature/AmazingFeature`)
453
- 8. Open a Pull Request
454
-
455
- **Development Commands:**
456
315
  ```bash
457
- bin/setup # Initial setup
458
- bundle exec rake test # Run Ruby tests
459
- yarn test # Run JavaScript tests
460
- bin/ci # Run full CI suite locally
316
+ yarn add @hakumi-dev/hakumi-components@0.1.16-pre
461
317
  ```
462
318
 
463
- ## License
319
+ Use `>= 0.1.0.pre` / `@pre` to always track the latest pre-release.
464
320
 
465
- Distributed under the MIT License. See `LICENSE` for more information.
321
+ ---
466
322
 
467
- ## Contact
323
+ ## Contributing
468
324
 
469
- Project Link: [https://github.com/hakumi-dev/hakumi-components](https://github.com/hakumi-dev/hakumi-components)
325
+ 1. Fork the repository
326
+ 2. Set up locally: `bin/setup`
327
+ 3. Create a branch: `git checkout -b my-feature`
328
+ 4. Make changes and add tests
329
+ 5. Run the test suite: `bundle exec rake test`
330
+ 6. Open a pull request
470
331
 
471
- ## Acknowledgments
332
+ ---
472
333
 
473
- - Inspired by [Ant Design](https://ant.design/)
474
- - Built with [ViewComponent](https://viewcomponent.org/)
475
- - Powered by [Stimulus](https://stimulus.hotwired.dev/)
334
+ ## License
476
335
 
477
- <!-- MARKDOWN LINKS & IMAGES -->
478
- [Ruby-badge]: https://img.shields.io/badge/Ruby-CC342D?style=for-the-badge&logo=ruby&logoColor=white
479
- [Ruby-url]: https://www.ruby-lang.org/
480
- [Rails-badge]: https://img.shields.io/badge/Rails-CC0000?style=for-the-badge&logo=ruby-on-rails&logoColor=white
481
- [Rails-url]: https://rubyonrails.org/
482
- [ViewComponent-badge]: https://img.shields.io/badge/ViewComponent-FE7A16?style=for-the-badge&logo=ruby&logoColor=white
483
- [ViewComponent-url]: https://viewcomponent.org/
484
- [Stimulus-badge]: https://img.shields.io/badge/Stimulus-77E8B9?style=for-the-badge&logo=stimulus&logoColor=black
485
- [Stimulus-url]: https://stimulus.hotwired.dev/
486
- [Vite-badge]: https://img.shields.io/badge/Vite-646CFF?style=for-the-badge&logo=vite&logoColor=white
487
- [Vite-url]: https://vitejs.dev/
336
+ MIT. See [LICENSE](./LICENSE).