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
@@ -1,219 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Hakumi
4
- module Table
5
- module Concerns
6
- # Column normalization and management for Table component
7
- module Columns
8
- extend ActiveSupport::Concern
9
-
10
- # Get all leaf columns (columns without children)
11
- def leaf_columns
12
- @leaf_columns ||= flatten_leaf_columns(normalized_columns)
13
- end
14
-
15
- # Count of leaf columns (minimum 1)
16
- def leaf_column_count
17
- [ leaf_columns.size, 1 ].max
18
- end
19
-
20
- # Check if table has selection column
21
- def selection_column?
22
- @row_selection.present?
23
- end
24
-
25
- # Check if table has expandable rows
26
- def expandable?
27
- @expandable.present?
28
- end
29
-
30
- # Check if table has expand column
31
- def expand_column?
32
- expandable? && @expandable[:show_expand_column] != false
33
- end
34
-
35
- # Get normalized columns with special columns inserted
36
- def normalized_columns
37
- @normalized_columns ||= begin
38
- columns = normalize_columns(columns_data)
39
- columns = insert_drag_handle_column(columns)
40
- columns = insert_selection_column(columns)
41
- columns = insert_expand_column(columns)
42
- columns = columns.compact
43
- compute_fixed_offsets(flatten_leaf_columns(columns))
44
- columns
45
- end
46
- end
47
-
48
- private
49
-
50
- # Normalize an array of column definitions
51
- def normalize_columns(columns)
52
- Array(columns).filter_map do |column|
53
- column = column.public_send(:to_h) if column.respond_to?(:to_h)
54
- if column == Hakumi::Table::Component::SELECTION_COLUMN
55
- selection_column_definition
56
- elsif column == Hakumi::Table::Component::EXPAND_COLUMN
57
- expand_column_definition
58
- elsif column.is_a?(Hash)
59
- normalize_column(column)
60
- end
61
- end
62
- end
63
-
64
- # Normalize a single column definition
65
- def normalize_column(column)
66
- normalized = column.deep_symbolize_keys
67
- return nil if normalized[:hidden]
68
-
69
- normalized[:key] ||= normalized[:data_index] || generate_id("col")
70
- normalized[:ellipsis] = normalize_ellipsis_option(normalized[:ellipsis])
71
- normalized[:responsive] = normalize_responsive_breakpoints(normalized[:responsive])
72
- normalized[:width] = dimension_to_css(normalized[:width])
73
- normalized[:fixed] = normalized[:fixed]&.to_sym if normalized[:fixed]
74
- normalized[:fixed] = nil unless Hakumi::Table::Component::FIXED_SIDES.include?(normalized[:fixed])
75
- normalized[:editable] = normalize_column_editable(normalized[:editable])
76
- normalized[:should_cell_update] = normalize_should_cell_update(normalized[:should_cell_update])
77
- if normalized[:children]
78
- normalized[:children] = normalize_columns(normalized[:children])
79
- end
80
- normalized
81
- end
82
-
83
- # Insert drag handle column if needed
84
- def insert_drag_handle_column(columns)
85
- return columns unless drag_handle_column?
86
-
87
- if columns.any? { |col| col.is_a?(Hash) && col[:drag_handle] }
88
- columns
89
- else
90
- [ drag_handle_column_definition, *columns ]
91
- end
92
- end
93
-
94
- # Insert selection column if needed
95
- def insert_selection_column(columns)
96
- return columns unless selection_column?
97
-
98
- if columns.any? { |col| col.is_a?(Hash) && col[:selection] }
99
- columns
100
- elsif columns.any? { |col| col == Hakumi::Table::Component::SELECTION_COLUMN }
101
- columns.map { |col| col == Hakumi::Table::Component::SELECTION_COLUMN ? selection_column_definition : col }
102
- else
103
- [ selection_column_definition, *columns ]
104
- end
105
- end
106
-
107
- # Insert expand column if needed
108
- def insert_expand_column(columns)
109
- return columns unless expand_column?
110
-
111
- if columns.any? { |col| col.is_a?(Hash) && col[:expand] }
112
- columns
113
- elsif columns.any? { |col| col == Hakumi::Table::Component::EXPAND_COLUMN }
114
- columns.map { |col| col == Hakumi::Table::Component::EXPAND_COLUMN ? expand_column_definition : col }
115
- else
116
- [ expand_column_definition, *columns ]
117
- end
118
- end
119
-
120
- # Definition for selection column
121
- def selection_column_definition
122
- {
123
- key: "__selection__",
124
- title: "",
125
- selection: true,
126
- width: "48px",
127
- align: :center
128
- }
129
- end
130
-
131
- # Definition for expand column
132
- def expand_column_definition
133
- {
134
- key: "__expand__",
135
- title: "",
136
- expand: true,
137
- width: "48px",
138
- align: :center
139
- }
140
- end
141
-
142
- # Check if drag handle column should be added
143
- def drag_handle_column?
144
- @row_drag&.dig(:handle)
145
- end
146
-
147
- # Definition for drag handle column
148
- def drag_handle_column_definition
149
- {
150
- key: "__drag__",
151
- title: "",
152
- drag_handle: true,
153
- width: "48px",
154
- align: :center
155
- }
156
- end
157
-
158
- # Get first data column (non-special column)
159
- def first_data_column
160
- @first_data_column ||= leaf_columns.find { |col| !col[:selection] && !col[:expand] }
161
- end
162
-
163
- # Recursively flatten all leaf columns
164
- def flatten_leaf_columns(columns)
165
- columns.flat_map do |column|
166
- children = column[:children]
167
- if children.is_a?(Array) && children.present?
168
- flatten_leaf_columns(children)
169
- else
170
- [ column ]
171
- end
172
- end
173
- end
174
-
175
- # Count leaf columns recursively
176
- def leaf_count(columns)
177
- columns.sum do |column|
178
- children = column[:children]
179
- children.is_a?(Array) && children.present? ? leaf_count(children) : 1
180
- end
181
- end
182
-
183
- # Calculate maximum depth of column hierarchy
184
- def max_depth(columns, depth = 1)
185
- columns.map do |column|
186
- children = column[:children]
187
- if children.is_a?(Array) && children.present?
188
- max_depth(children, depth + 1)
189
- else
190
- depth
191
- end
192
- end.max || depth
193
- end
194
-
195
- # Build header rows for rendering
196
- def build_header_rows(columns)
197
- depth = max_depth(columns)
198
- rows = Array.new(depth) { [] }
199
- build_rows_recursive(columns, 0, rows, depth)
200
- rows
201
- end
202
-
203
- # Recursively build header rows
204
- def build_rows_recursive(columns, level, rows, max_depth)
205
- columns.each do |column|
206
- children = column[:children]
207
- if children.is_a?(Array) && children.present?
208
- col_span = leaf_count(children)
209
- rows[level] << { column: column, col_span: col_span, row_span: 1 }
210
- build_rows_recursive(children, level + 1, rows, max_depth)
211
- else
212
- rows[level] << { column: column, col_span: 1, row_span: max_depth - level }
213
- end
214
- end
215
- end
216
- end
217
- end
218
- end
219
- end
@@ -1,121 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Hakumi
4
- module Table
5
- module Concerns
6
- # Editable cell and row functionality for Table component
7
- module Editable
8
- extend ActiveSupport::Concern
9
-
10
- EDITABLE_MODES = %i[cell row].freeze
11
- EDITABLE_TRIGGERS = %i[click dblclick].freeze
12
- EDITABLE_INPUT_TYPES = %i[text number textarea select].freeze
13
-
14
- # Returns JSON configuration for the table-level editable settings
15
- # to be passed to the Stimulus controller.
16
- #
17
- # @return [String, nil] JSON string or nil if not editable
18
- def editable_config_json
19
- return nil unless @editable
20
-
21
- @editable.to_json
22
- end
23
-
24
- private
25
-
26
- # Normalizes the table-level editable configuration.
27
- # Accepts boolean, symbol (:cell or :row), or hash with options.
28
- # Returns nil if editing is disabled, or a hash with normalized options.
29
- #
30
- # @param value [Boolean, Symbol, Hash, nil] editable configuration
31
- # @return [Hash, nil] normalized configuration
32
- def normalize_editable(value)
33
- return nil if value.nil? || value == false
34
-
35
- case value
36
- when true
37
- { mode: :cell, trigger: :click }
38
- when Symbol
39
- mode = EDITABLE_MODES.include?(value) ? value : :cell
40
- { mode: mode, trigger: :click }
41
- when Hash
42
- normalized = value.deep_symbolize_keys
43
- mode = normalized[:mode]&.to_sym
44
- normalized[:mode] = EDITABLE_MODES.include?(mode) ? mode : :cell
45
- trigger = normalized[:trigger]&.to_sym
46
- normalized[:trigger] = EDITABLE_TRIGGERS.include?(trigger) ? trigger : :click
47
- normalized
48
- end
49
- end
50
-
51
- # Normalizes column-level editable configuration.
52
- # Column editable can override table-level settings.
53
- #
54
- # @param value [Boolean, Hash, nil] column editable configuration
55
- # @return [Hash, nil] normalized configuration
56
- def normalize_column_editable(value)
57
- return nil if value.nil? || value == false
58
- return {} if value == true
59
- return nil unless value.is_a?(Hash)
60
-
61
- normalized = value.deep_symbolize_keys
62
- input_type = normalized[:type]&.to_sym || normalized[:input_type]&.to_sym
63
- normalized[:input_type] = EDITABLE_INPUT_TYPES.include?(input_type) ? input_type : :text
64
- normalized.except(:type)
65
- end
66
-
67
- def normalize_should_cell_update(value)
68
- case value
69
- when Symbol
70
- value.to_s
71
- when String
72
- value.strip.presence
73
- end
74
- end
75
-
76
- # Applies editable attributes to cell
77
- def apply_editable_attributes!(attrs, column)
78
- payload = cell_editable_payload(column)
79
- return unless payload
80
-
81
- attrs[:class] = [ attrs[:class], "hakumi-table-cell-editable" ].compact.join(" ")
82
- attrs[:data] ||= {}
83
- attrs[:data][:editable] = true
84
- attrs[:data][:editableConfig] = payload.to_json
85
- attrs[:data][:action] = "click->hakumi--table#editCell"
86
- end
87
-
88
- def apply_should_cell_update_attributes!(attrs, column)
89
- hook = column[:should_cell_update]
90
- return unless hook.present?
91
-
92
- attrs[:data] ||= {}
93
- attrs[:data][:should_cell_update] = hook
94
- end
95
-
96
- # Returns the editable payload for a specific cell/column.
97
- # Used to add data-editable-config attribute to editable cells.
98
- #
99
- # @param column [Hash] the column definition
100
- # @return [Hash, nil] editable configuration for the cell
101
- def cell_editable_payload(column)
102
- return nil if column[:selection] || column[:expand]
103
- return nil unless column[:data_index]
104
-
105
- column_config = column[:editable]
106
-
107
- # Column must explicitly opt-in to be editable
108
- return nil if column_config.nil? || column_config == false
109
-
110
- # Merge table-level and column-level config
111
- base_config = @editable&.dup || {}
112
- base_config.merge!(column_config) if column_config.is_a?(Hash)
113
-
114
- base_config[:data_index] = column[:data_index]
115
- base_config[:key] = column[:key]
116
- base_config
117
- end
118
- end
119
- end
120
- end
121
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Hakumi
4
- module Table
5
- module Concerns
6
- # Text ellipsis and tooltip handling for Table cells
7
- module Ellipsis
8
- extend ActiveSupport::Concern
9
-
10
- private
11
-
12
- def ellipsis_config(column)
13
- column[:ellipsis]
14
- end
15
-
16
- def normalize_ellipsis_option(option)
17
- return nil if option.nil? || option == false
18
-
19
- if option == true
20
- { show_title: true }
21
- elsif option.is_a?(Hash)
22
- normalized = option.deep_symbolize_keys
23
- normalized[:tooltip] = normalize_ellipsis_tooltip_option(normalized[:tooltip])
24
- normalized.compact.presence
25
- else
26
- { tooltip: normalize_ellipsis_tooltip_option(option) }
27
- end
28
- end
29
-
30
- def normalize_ellipsis_tooltip_option(option)
31
- return nil if option.nil? || option == false
32
- return {} if option == true
33
- return { title: option } if option.is_a?(String)
34
- return option.deep_symbolize_keys if option.is_a?(Hash)
35
-
36
- nil
37
- end
38
-
39
- def ellipsis_title(config, raw_value, content_fragment)
40
- return nil unless config&.dig(:show_title)
41
-
42
- value = raw_value.presence || content_fragment
43
- value = value.to_s if value.respond_to?(:to_s)
44
- value.present? ? value : nil
45
- end
46
-
47
- def ellipsis_tooltip_component(config, raw_value, row, row_index)
48
- tooltip = config&.dig(:tooltip)
49
- return nil unless tooltip
50
-
51
- options = tooltip.deep_dup
52
- title = options.delete(:title)
53
- title ||= raw_value
54
- title = title.call(row, row_index) if title.respond_to?(:call)
55
- title = title.to_s if title.respond_to?(:to_s)
56
- return nil if title.blank?
57
-
58
- Hakumi::Tooltip::Component.new(**{ title: title }.merge(options))
59
- end
60
- end
61
- end
62
- end
63
- end
@@ -1,87 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Hakumi
4
- module Table
5
- module Concerns
6
- # Fixed (sticky) column positioning for Table component
7
- module FixedColumns
8
- extend ActiveSupport::Concern
9
-
10
- # Check if table has any fixed columns
11
- def fixed_columns?
12
- fixed_offsets.present?
13
- end
14
-
15
- private
16
-
17
- def fixed_offsets
18
- @fixed_offsets ||= {}
19
- end
20
-
21
- # Applies fixed column positioning attributes to cell
22
- def apply_fixed_column_attributes!(attrs, column, header: false)
23
- info = fixed_offsets[column[:key]]
24
- return unless info
25
-
26
- attrs[:class] = [ attrs[:class], "hakumi-table-cell-fixed", "hakumi-table-cell-fixed-#{info[:side]}" ].compact.join(" ")
27
-
28
- style_parts = Array.new
29
- style_parts << attrs[:style] if attrs[:style].present?
30
- style_parts << "position: sticky"
31
- style_parts << "#{info[:side]}: #{info[:offset]}px"
32
- style_parts << "z-index: #{header ? 3 : 2}"
33
- attrs[:style] = style_parts.compact.join("; ")
34
-
35
- attrs[:data] ||= {}
36
- attrs[:data][:fixed] = info[:side]
37
- end
38
-
39
- # Compute fixed column offsets from left and right
40
- def compute_fixed_offsets(leaf_columns)
41
- @fixed_offsets = {}
42
- return if leaf_columns.blank?
43
-
44
- # Calculate left fixed columns
45
- left_offset = 0
46
- leaf_columns.each do |column|
47
- next unless column[:fixed] == :left
48
-
49
- width = fixed_column_width!(column)
50
- @fixed_offsets[column[:key]] = { side: :left, offset: left_offset }
51
- left_offset += width
52
- end
53
-
54
- # Calculate right fixed columns (from right to left)
55
- right_offset = 0
56
- leaf_columns.reverse_each do |column|
57
- next unless column[:fixed] == :right
58
-
59
- width = fixed_column_width!(column)
60
- @fixed_offsets[column[:key]] = { side: :right, offset: right_offset }
61
- right_offset += width
62
- end
63
- end
64
-
65
- def fixed_column_width!(column)
66
- width = numeric_width(column[:width])
67
- return width if width&.positive?
68
-
69
- raise ArgumentError, "Column #{column[:key] || column[:data_index] || column[:title]} must define a pixel width when fixed"
70
- end
71
-
72
- def numeric_width(value)
73
- case value
74
- when Integer, Float
75
- value.to_f
76
- when String
77
- stripped = value.strip
78
- return stripped.to_f if stripped.match?(/\A[\d.]+\z/)
79
-
80
- match = stripped.match(/\A([\d.]+)px\z/i)
81
- match ? match[1].to_f : nil
82
- end
83
- end
84
- end
85
- end
86
- end
87
- end
@@ -1,196 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Hakumi
4
- module Tabs
5
- class Component < Hakumi::BaseComponent
6
- TYPES = %i[line card editable_card].freeze
7
- SIZES = %i[large middle small].freeze
8
- TAB_POSITIONS = %i[top bottom left right].freeze
9
- INDICATOR_ALIGNS = %i[start center end].freeze
10
-
11
- renders_many :items, ->(
12
- key:,
13
- label: nil,
14
- icon: nil,
15
- disabled: false,
16
- closable: nil,
17
- close_icon: nil,
18
- force_render: false,
19
- **options,
20
- &block
21
- ) do
22
- item = Hakumi::Tabs::Item::Component.new(
23
- key: key,
24
- label: label,
25
- icon: icon,
26
- disabled: disabled,
27
- closable: closable.nil? ? (@type == :editable_card) : closable,
28
- close_icon: close_icon,
29
- force_render: force_render,
30
- parent: self,
31
- **options
32
- )
33
- item.content = capture(&block) if block
34
- item
35
- end
36
-
37
- def initialize(
38
- active_key: nil,
39
- default_active_key: nil,
40
- type: :line,
41
- size: :middle,
42
- tab_position: :top,
43
- centered: false,
44
- animated: true,
45
- indicator: nil,
46
- tab_bar_gutter: nil,
47
- tab_bar_extra_content_left: nil,
48
- tab_bar_extra_content_right: nil,
49
- add_icon: nil,
50
- hide_add: false,
51
- destroy_inactive_tab_pane: false,
52
- **html_options
53
- )
54
- @active_key = active_key
55
- @default_active_key = default_active_key
56
- @type = type
57
- @size = size
58
- @tab_position = tab_position
59
- @centered = centered
60
- @animated = animated
61
- @indicator = indicator || {}
62
- @tab_bar_gutter = tab_bar_gutter
63
- @tab_bar_extra_content_left = tab_bar_extra_content_left
64
- @tab_bar_extra_content_right = tab_bar_extra_content_right
65
- @add_icon = add_icon
66
- @hide_add = hide_add
67
- @destroy_inactive_tab_pane = destroy_inactive_tab_pane
68
- @html_options = html_options
69
-
70
- validate_props!
71
- end
72
-
73
- attr_reader :type, :size, :tab_position, :centered, :animated, :indicator,
74
- :tab_bar_gutter, :tab_bar_extra_content_left,
75
- :tab_bar_extra_content_right, :add_icon, :hide_add, :destroy_inactive_tab_pane
76
-
77
- def tabs_classes
78
- class_names(
79
- "tabs",
80
- {
81
- @type => @type != :line,
82
- @size => @size != :middle,
83
- @tab_position => @tab_position != :top,
84
- centered: @centered
85
- },
86
- [ @html_options[:class] ]
87
- )
88
- end
89
-
90
- def vertical?
91
- %i[left right].include?(@tab_position)
92
- end
93
-
94
- def editable?
95
- @type == :editable_card
96
- end
97
-
98
- def initial_active_key
99
- @active_key || @default_active_key
100
- end
101
-
102
- def indicator_size
103
- @indicator[:size]
104
- end
105
-
106
- def indicator_align
107
- @indicator[:align] || :center
108
- end
109
-
110
- def wrapper_attributes
111
- base_attrs = {
112
- class: tabs_classes,
113
- data: stimulus_data
114
- }
115
- merge_attributes(base_attrs, @html_options.except(:class))
116
- end
117
-
118
- def stimulus_controller
119
- "hakumi--tabs"
120
- end
121
-
122
- def stimulus_data
123
- data = {
124
- controller: stimulus_controller,
125
- "#{stimulus_controller}-active-key-value" => initial_active_key,
126
- "#{stimulus_controller}-tab-position-value" => @tab_position.to_s,
127
- "#{stimulus_controller}-indicator-align-value" => indicator_align.to_s
128
- }
129
-
130
- data["#{stimulus_controller}-indicator-size-value"] = indicator_size if indicator_size
131
- if editable?
132
- data["#{stimulus_controller}-tab-template-value"] = tab_template_html
133
- data["#{stimulus_controller}-pane-template-value"] = pane_template_html
134
- data["#{stimulus_controller}-close-button-template-value"] = close_button_template_html
135
- end
136
-
137
- data
138
- end
139
-
140
- def tab_template_html
141
- # Template for dynamically added tabs - uses {{key}}, {{label}}, {{closeButton}} placeholders
142
- '<div class="hakumi-tabs-tab" data-key="{{key}}" data-hakumi--tabs-target="tab" data-action="click->hakumi--tabs#selectTab"><div class="hakumi-tabs-tab-btn"><span class="hakumi-tabs-tab-label">{{label}}</span></div>{{closeButton}}</div>'.dup.force_encoding("UTF-8")
143
- end
144
-
145
- def pane_template_html
146
- '<div class="hakumi-tabs-tabpane hakumi-tabs-tabpane-hidden" data-key="{{key}}" data-hakumi--tabs-target="pane" aria-hidden="true">{{content}}</div>'.dup.force_encoding("UTF-8")
147
- end
148
-
149
- def close_button_template_html
150
- @close_button_template_html ||= ApplicationController.render(
151
- Hakumi::Button::Component.new(
152
- type: :text,
153
- size: :small,
154
- icon: :close,
155
- class: "hakumi-tabs-tab-remove",
156
- aria: { label: "Remove tab" },
157
- data: { action: "click->hakumi--tabs#removeTab", key: "{{key}}" }
158
- ),
159
- layout: false
160
- ).strip
161
- end
162
-
163
- def nav_list_style
164
- styles = []
165
- styles << "--tab-bar-gutter: #{@tab_bar_gutter}px" if @tab_bar_gutter
166
- styles.join("; ") if styles.any?
167
- end
168
-
169
- def has_extra_content?
170
- @tab_bar_extra_content_left.present? ||
171
- @tab_bar_extra_content_right.present?
172
- end
173
-
174
- def extra_content_left
175
- @tab_bar_extra_content_left
176
- end
177
-
178
- def extra_content_right
179
- @tab_bar_extra_content_right
180
- end
181
-
182
- private
183
-
184
- def validate_props!
185
- validate_inclusion!(:type, TYPES)
186
- validate_inclusion!(:size, SIZES)
187
- validate_inclusion!(:tab_position, TAB_POSITIONS)
188
- if @indicator[:align]
189
- unless INDICATOR_ALIGNS.include?(@indicator[:align])
190
- raise ArgumentError, "Invalid indicator align: #{@indicator[:align]}. Must be one of: #{INDICATOR_ALIGNS.join(', ')}"
191
- end
192
- end
193
- end
194
- end
195
- end
196
- end