rails-active-ui 0.2.2 → 0.3.1

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 (226) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/datatables.css +15 -0
  3. data/app/assets/stylesheets.css +5 -1
  4. data/app/blocks/resource_list_block.rb +153 -0
  5. data/app/components/back_button_component.rb +34 -0
  6. data/app/components/button_component.rb +4 -2
  7. data/app/components/button_to_component.rb +3 -4
  8. data/app/components/column_component.rb +1 -1
  9. data/app/components/container_component.rb +1 -1
  10. data/app/components/dropdown_component.rb +8 -2
  11. data/app/components/grid_component.rb +5 -1
  12. data/app/components/link_to_component.rb +23 -0
  13. data/app/components/menu_item_component.rb +5 -1
  14. data/app/components/message_component.rb +3 -1
  15. data/app/components/modal_component.rb +23 -3
  16. data/app/components/paragraph_component.rb +13 -0
  17. data/app/components/row_component.rb +1 -1
  18. data/app/components/table_row_component.rb +3 -5
  19. data/app/components/template_component.rb +13 -0
  20. data/app/helpers/component_helper.rb +122 -76
  21. data/app/helpers/fui_helper.rb +37 -0
  22. data/app/javascript/datatables.js +10 -0
  23. data/app/javascript/ui/controllers/fui_datatable_controller.js +35 -0
  24. data/app/javascript/ui/controllers/fui_dropdown_controller.js +8 -1
  25. data/app/javascript/ui/controllers/fui_item_list_controller.js +40 -0
  26. data/app/javascript/ui/controllers/navigation_controller.js +23 -0
  27. data/app/javascript/ui/index.js +11 -0
  28. data/app/lib/component.rb +1 -1
  29. data/config/importmap.rb +3 -0
  30. data/config/initializers/ruby_template_handler.rb +4 -1
  31. data/formantic-ui/components/accordion.css +369 -0
  32. data/formantic-ui/components/accordion.js +595 -0
  33. data/formantic-ui/components/accordion.min.css +9 -0
  34. data/formantic-ui/components/accordion.min.js +11 -0
  35. data/formantic-ui/components/ad.css +264 -0
  36. data/formantic-ui/components/ad.min.css +10 -0
  37. data/formantic-ui/components/api.js +1225 -0
  38. data/formantic-ui/components/api.min.js +11 -0
  39. data/formantic-ui/components/breadcrumb.css +135 -0
  40. data/formantic-ui/components/breadcrumb.min.css +9 -0
  41. data/formantic-ui/components/button.css +4058 -0
  42. data/formantic-ui/components/button.min.css +9 -0
  43. data/formantic-ui/components/calendar.css +327 -0
  44. data/formantic-ui/components/calendar.js +2045 -0
  45. data/formantic-ui/components/calendar.min.css +9 -0
  46. data/formantic-ui/components/calendar.min.js +11 -0
  47. data/formantic-ui/components/card.css +1881 -0
  48. data/formantic-ui/components/card.min.css +9 -0
  49. data/formantic-ui/components/checkbox.css +785 -0
  50. data/formantic-ui/components/checkbox.js +888 -0
  51. data/formantic-ui/components/checkbox.min.css +9 -0
  52. data/formantic-ui/components/checkbox.min.js +11 -0
  53. data/formantic-ui/components/comment.css +283 -0
  54. data/formantic-ui/components/comment.min.css +9 -0
  55. data/formantic-ui/components/container.css +300 -0
  56. data/formantic-ui/components/container.min.css +9 -0
  57. data/formantic-ui/components/dimmer.css +367 -0
  58. data/formantic-ui/components/dimmer.js +732 -0
  59. data/formantic-ui/components/dimmer.min.css +9 -0
  60. data/formantic-ui/components/dimmer.min.js +11 -0
  61. data/formantic-ui/components/divider.css +287 -0
  62. data/formantic-ui/components/divider.min.css +9 -0
  63. data/formantic-ui/components/dropdown.css +2087 -0
  64. data/formantic-ui/components/dropdown.js +4432 -0
  65. data/formantic-ui/components/dropdown.min.css +9 -0
  66. data/formantic-ui/components/dropdown.min.js +11 -0
  67. data/formantic-ui/components/embed.css +155 -0
  68. data/formantic-ui/components/embed.js +688 -0
  69. data/formantic-ui/components/embed.min.css +9 -0
  70. data/formantic-ui/components/embed.min.js +11 -0
  71. data/formantic-ui/components/emoji.css +15311 -0
  72. data/formantic-ui/components/emoji.min.css +9 -0
  73. data/formantic-ui/components/feed.css +799 -0
  74. data/formantic-ui/components/feed.min.css +9 -0
  75. data/formantic-ui/components/flag.css +1149 -0
  76. data/formantic-ui/components/flag.min.css +9 -0
  77. data/formantic-ui/components/flyout.css +546 -0
  78. data/formantic-ui/components/flyout.js +1551 -0
  79. data/formantic-ui/components/flyout.min.css +9 -0
  80. data/formantic-ui/components/flyout.min.js +11 -0
  81. data/formantic-ui/components/form.css +1885 -0
  82. data/formantic-ui/components/form.js +2199 -0
  83. data/formantic-ui/components/form.min.css +9 -0
  84. data/formantic-ui/components/form.min.js +11 -0
  85. data/formantic-ui/components/grid.css +1952 -0
  86. data/formantic-ui/components/grid.min.css +9 -0
  87. data/formantic-ui/components/header.css +778 -0
  88. data/formantic-ui/components/header.min.css +9 -0
  89. data/formantic-ui/components/icon.css +7066 -0
  90. data/formantic-ui/components/icon.min.css +9 -0
  91. data/formantic-ui/components/image.css +315 -0
  92. data/formantic-ui/components/image.min.css +9 -0
  93. data/formantic-ui/components/input.css +1566 -0
  94. data/formantic-ui/components/input.min.css +9 -0
  95. data/formantic-ui/components/item.css +534 -0
  96. data/formantic-ui/components/item.min.css +9 -0
  97. data/formantic-ui/components/label.css +2114 -0
  98. data/formantic-ui/components/label.min.css +9 -0
  99. data/formantic-ui/components/list.css +955 -0
  100. data/formantic-ui/components/list.min.css +9 -0
  101. data/formantic-ui/components/loader.css +787 -0
  102. data/formantic-ui/components/loader.min.css +9 -0
  103. data/formantic-ui/components/menu.css +2131 -0
  104. data/formantic-ui/components/menu.min.css +9 -0
  105. data/formantic-ui/components/message.css +619 -0
  106. data/formantic-ui/components/message.min.css +9 -0
  107. data/formantic-ui/components/modal.css +779 -0
  108. data/formantic-ui/components/modal.js +1637 -0
  109. data/formantic-ui/components/modal.min.css +9 -0
  110. data/formantic-ui/components/modal.min.js +11 -0
  111. data/formantic-ui/components/nag.css +290 -0
  112. data/formantic-ui/components/nag.js +566 -0
  113. data/formantic-ui/components/nag.min.css +9 -0
  114. data/formantic-ui/components/nag.min.js +11 -0
  115. data/formantic-ui/components/placeholder.css +228 -0
  116. data/formantic-ui/components/placeholder.min.css +9 -0
  117. data/formantic-ui/components/popup.css +1184 -0
  118. data/formantic-ui/components/popup.js +1561 -0
  119. data/formantic-ui/components/popup.min.css +9 -0
  120. data/formantic-ui/components/popup.min.js +11 -0
  121. data/formantic-ui/components/progress.css +761 -0
  122. data/formantic-ui/components/progress.js +979 -0
  123. data/formantic-ui/components/progress.min.css +9 -0
  124. data/formantic-ui/components/progress.min.js +11 -0
  125. data/formantic-ui/components/rail.css +147 -0
  126. data/formantic-ui/components/rail.min.css +9 -0
  127. data/formantic-ui/components/rating.css +414 -0
  128. data/formantic-ui/components/rating.js +540 -0
  129. data/formantic-ui/components/rating.min.css +9 -0
  130. data/formantic-ui/components/rating.min.js +11 -0
  131. data/formantic-ui/components/reset.css +386 -0
  132. data/formantic-ui/components/reset.min.css +9 -0
  133. data/formantic-ui/components/reveal.css +277 -0
  134. data/formantic-ui/components/reveal.min.css +9 -0
  135. data/formantic-ui/components/search.css +541 -0
  136. data/formantic-ui/components/search.js +1641 -0
  137. data/formantic-ui/components/search.min.css +9 -0
  138. data/formantic-ui/components/search.min.js +11 -0
  139. data/formantic-ui/components/segment.css +1053 -0
  140. data/formantic-ui/components/segment.min.css +9 -0
  141. data/formantic-ui/components/shape.css +144 -0
  142. data/formantic-ui/components/shape.js +797 -0
  143. data/formantic-ui/components/shape.min.css +9 -0
  144. data/formantic-ui/components/shape.min.js +11 -0
  145. data/formantic-ui/components/sidebar.css +539 -0
  146. data/formantic-ui/components/sidebar.js +1054 -0
  147. data/formantic-ui/components/sidebar.min.css +9 -0
  148. data/formantic-ui/components/sidebar.min.js +11 -0
  149. data/formantic-ui/components/site.css +286 -0
  150. data/formantic-ui/components/site.js +455 -0
  151. data/formantic-ui/components/site.min.css +9 -0
  152. data/formantic-ui/components/site.min.js +11 -0
  153. data/formantic-ui/components/slider.css +926 -0
  154. data/formantic-ui/components/slider.js +1546 -0
  155. data/formantic-ui/components/slider.min.css +9 -0
  156. data/formantic-ui/components/slider.min.js +11 -0
  157. data/formantic-ui/components/state.js +697 -0
  158. data/formantic-ui/components/state.min.js +11 -0
  159. data/formantic-ui/components/statistic.css +586 -0
  160. data/formantic-ui/components/statistic.min.css +9 -0
  161. data/formantic-ui/components/step.css +1538 -0
  162. data/formantic-ui/components/step.min.css +9 -0
  163. data/formantic-ui/components/sticky.css +73 -0
  164. data/formantic-ui/components/sticky.js +917 -0
  165. data/formantic-ui/components/sticky.min.css +9 -0
  166. data/formantic-ui/components/sticky.min.js +11 -0
  167. data/formantic-ui/components/tab.css +84 -0
  168. data/formantic-ui/components/tab.js +967 -0
  169. data/formantic-ui/components/tab.min.css +9 -0
  170. data/formantic-ui/components/tab.min.js +11 -0
  171. data/formantic-ui/components/table.css +3473 -0
  172. data/formantic-ui/components/table.min.css +9 -0
  173. data/formantic-ui/components/text.css +155 -0
  174. data/formantic-ui/components/text.min.css +9 -0
  175. data/formantic-ui/components/toast.css +751 -0
  176. data/formantic-ui/components/toast.js +964 -0
  177. data/formantic-ui/components/toast.min.css +9 -0
  178. data/formantic-ui/components/toast.min.js +11 -0
  179. data/formantic-ui/components/transition.css +1148 -0
  180. data/formantic-ui/components/transition.js +1034 -0
  181. data/formantic-ui/components/transition.min.css +9 -0
  182. data/formantic-ui/components/transition.min.js +11 -0
  183. data/formantic-ui/components/visibility.js +1292 -0
  184. data/formantic-ui/components/visibility.min.js +11 -0
  185. data/formantic-ui/semantic.css +78485 -0
  186. data/formantic-ui/semantic.js +31036 -0
  187. data/formantic-ui/semantic.min.css +11 -0
  188. data/formantic-ui/semantic.min.js +11 -0
  189. data/formantic-ui/themes/basic/assets/fonts/LICENSE.txt +91 -0
  190. data/formantic-ui/themes/basic/assets/fonts/icons.woff +0 -0
  191. data/formantic-ui/themes/basic/assets/fonts/icons.woff2 +0 -0
  192. data/formantic-ui/themes/default/assets/fonts/LICENSE_Lato.txt +94 -0
  193. data/formantic-ui/themes/default/assets/fonts/LICENSE_icons.txt +165 -0
  194. data/formantic-ui/themes/default/assets/fonts/Lato-Bold.woff +0 -0
  195. data/formantic-ui/themes/default/assets/fonts/Lato-Bold.woff2 +0 -0
  196. data/formantic-ui/themes/default/assets/fonts/Lato-BoldItalic.woff +0 -0
  197. data/formantic-ui/themes/default/assets/fonts/Lato-BoldItalic.woff2 +0 -0
  198. data/formantic-ui/themes/default/assets/fonts/Lato-Italic.woff +0 -0
  199. data/formantic-ui/themes/default/assets/fonts/Lato-Italic.woff2 +0 -0
  200. data/formantic-ui/themes/default/assets/fonts/Lato-Regular.woff +0 -0
  201. data/formantic-ui/themes/default/assets/fonts/Lato-Regular.woff2 +0 -0
  202. data/formantic-ui/themes/default/assets/fonts/LatoLatin-Bold.woff +0 -0
  203. data/formantic-ui/themes/default/assets/fonts/LatoLatin-Bold.woff2 +0 -0
  204. data/formantic-ui/themes/default/assets/fonts/LatoLatin-BoldItalic.woff +0 -0
  205. data/formantic-ui/themes/default/assets/fonts/LatoLatin-BoldItalic.woff2 +0 -0
  206. data/formantic-ui/themes/default/assets/fonts/LatoLatin-Italic.woff +0 -0
  207. data/formantic-ui/themes/default/assets/fonts/LatoLatin-Italic.woff2 +0 -0
  208. data/formantic-ui/themes/default/assets/fonts/LatoLatin-Regular.woff +0 -0
  209. data/formantic-ui/themes/default/assets/fonts/LatoLatin-Regular.woff2 +0 -0
  210. data/formantic-ui/themes/default/assets/fonts/brand-icons.woff +0 -0
  211. data/formantic-ui/themes/default/assets/fonts/brand-icons.woff2 +0 -0
  212. data/formantic-ui/themes/default/assets/fonts/icons.woff +0 -0
  213. data/formantic-ui/themes/default/assets/fonts/icons.woff2 +0 -0
  214. data/formantic-ui/themes/default/assets/fonts/outline-icons.woff +0 -0
  215. data/formantic-ui/themes/default/assets/fonts/outline-icons.woff2 +0 -0
  216. data/formantic-ui/themes/famfamfam/assets/images/flags.png +0 -0
  217. data/formantic-ui/themes/github/assets/fonts/LICENSE.txt +94 -0
  218. data/formantic-ui/themes/github/assets/fonts/octicons.woff +0 -0
  219. data/formantic-ui/themes/github/assets/fonts/octicons.woff2 +0 -0
  220. data/formantic-ui/themes/material/assets/fonts/LICENSE.txt +202 -0
  221. data/formantic-ui/themes/material/assets/fonts/icons.woff +0 -0
  222. data/formantic-ui/themes/material/assets/fonts/icons.woff2 +0 -0
  223. data/lib/ui/engine.rb +7 -2
  224. data/lib/ui/version.rb +1 -1
  225. metadata +205 -7
  226. data/app/components/link_component.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 872e5a2ab490f5e51dfbd8e9dcd8ade657ddb2b9ede18f47519ca1761974eede
4
- data.tar.gz: c3c221fd3708d5cdde7475696d5919a261a0e3f711f69a59cde430e13ea0b916
3
+ metadata.gz: a70daa9b847fa52ee063ef90694eea50a456b16a9cbe8ca8ce9ec1bdaca9b0e0
4
+ data.tar.gz: '096388fdb8403767f418f32bebb5adc342f6e9c7ed00dd7357c2af19e3bf25c6'
5
5
  SHA512:
6
- metadata.gz: afd7bbad781f178f14db5a5367da062c317bd24d72e265ca899bf6e916cc86f80624f43b3ffbac0d7d5e46f352ea75ff83b79fdbce246b39d3e8017573d1e531
7
- data.tar.gz: faaa7bbea4d8eaa2802f39cafaada5df565aeed7fe4708c2c251f105455caf0acdbf4701b49b73303a8b405a74fc86c517d673d0eb0368a5fccca359dc956c31
6
+ metadata.gz: 5109f5f732977a5daa4ea9b5aef21aabf752d057d39ee555fe2aae8c314a30bec280d3cd3c532d5cf21dcc711146c3d761240904577d825af767d35929968296
7
+ data.tar.gz: d016457e239f948d4dec2264a609a21e3cc68bc3a45205e7bdd54ac1003d5094a57507bb99db790b3c811f1a36f251f6259a42e9721a7aa2fa41fff89cd2c6b9
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This combined file was created by the DataTables downloader builder:
3
+ * https://datatables.net/download
4
+ *
5
+ * To rebuild or modify this file with the latest versions of the included
6
+ * software please visit:
7
+ * https://datatables.net/download/#se/jq-3.7.0/dt-2.3.7
8
+ *
9
+ * Included libraries:
10
+ * jQuery 3.7.0, DataTables 2.3.7
11
+ */
12
+
13
+ :root{--dt-row-selected: 224, 224, 224;--dt-row-selected-text: 0, 0, 0;--dt-row-selected-link: 228, 228, 228;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-header-align-items: center;--dt-header-vertical-align: middle;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable tbody td.dt-control{text-align:center;cursor:pointer}table.dataTable tbody td.dt-control:before{display:inline-block;box-sizing:border-box;content:"";border-top:5px solid transparent;border-left:10px solid rgba(0, 0, 0, 0.5);border-bottom:5px solid transparent;border-right:0px solid transparent}table.dataTable tbody tr.dt-hasChild td.dt-control:before{border-top:10px solid rgba(0, 0, 0, 0.5);border-left:5px solid transparent;border-bottom:0px solid transparent;border-right:5px solid transparent}table.dataTable tfoot:empty{display:none}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before,:root[data-theme=dark] table.dataTable td.dt-control:before{border-left-color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{border-top-color:rgba(255, 255, 255, 0.5);border-left-color:transparent}div.dt-scroll{width:100%}div.dt-scroll-body thead tr,div.dt-scroll-body tfoot tr{height:0}div.dt-scroll-body thead tr th,div.dt-scroll-body thead tr td,div.dt-scroll-body tfoot tr th,div.dt-scroll-body tfoot tr td{height:0 !important;padding-top:0px !important;padding-bottom:0px !important;border-top-width:0px !important;border-bottom-width:0px !important}div.dt-scroll-body thead tr th div.dt-scroll-sizing,div.dt-scroll-body thead tr td div.dt-scroll-sizing,div.dt-scroll-body tfoot tr th div.dt-scroll-sizing,div.dt-scroll-body tfoot tr td div.dt-scroll-sizing{height:0 !important;overflow:hidden !important}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before{position:absolute;display:block;bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{position:absolute;display:block;top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order{position:relative;width:12px;height:20px}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{left:0;opacity:.125;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer}table.dataTable thead>tr>th.dt-orderable-asc:hover,table.dataTable thead>tr>th.dt-orderable-desc:hover,table.dataTable thead>tr>td.dt-orderable-asc:hover,table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(0, 0, 0, 0.05);outline-offset:-2px}table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{opacity:.6}table.dataTable thead>tr>th.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>th.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>th.sorting_asc_disabled .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>td.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>td.sorting_asc_disabled .dt-column-order:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th div.dt-column-header,table.dataTable thead>tr>th div.dt-column-footer,table.dataTable thead>tr>td div.dt-column-header,table.dataTable thead>tr>td div.dt-column-footer,table.dataTable tfoot>tr>th div.dt-column-header,table.dataTable tfoot>tr>th div.dt-column-footer,table.dataTable tfoot>tr>td div.dt-column-header,table.dataTable tfoot>tr>td div.dt-column-footer{display:flex;justify-content:space-between;align-items:var(--dt-header-align-items);gap:4px}table.dataTable thead>tr>th div.dt-column-header .dt-column-title,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title,table.dataTable thead>tr>td div.dt-column-header .dt-column-title,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title{flex-grow:1}table.dataTable thead>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title:empty{display:none}div.dt-scroll-body>table.dataTable>thead>tr>th,div.dt-scroll-body>table.dataTable>thead>tr>td{overflow:hidden}:root.dark table.dataTable thead>tr>th.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>th.dt-orderable-desc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(255, 255, 255, 0.05)}div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-22px;text-align:center;padding:2px;z-index:10}div.dt-processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dt-processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(224, 224, 224);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dt-processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dt-processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dt-processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.ui.table.nowrap th,table.dataTable.ui.table.nowrap td{white-space:nowrap}table.dataTable.ui.table th,table.dataTable.ui.table td{box-sizing:border-box}table.dataTable.ui.table th.dt-type-numeric,table.dataTable.ui.table th.dt-type-date,table.dataTable.ui.table td.dt-type-numeric,table.dataTable.ui.table td.dt-type-date{text-align:right}table.dataTable.ui.table th.dt-type-numeric div.dt-column-header,table.dataTable.ui.table th.dt-type-numeric div.dt-column-footer,table.dataTable.ui.table th.dt-type-date div.dt-column-header,table.dataTable.ui.table th.dt-type-date div.dt-column-footer,table.dataTable.ui.table td.dt-type-numeric div.dt-column-header,table.dataTable.ui.table td.dt-type-numeric div.dt-column-footer,table.dataTable.ui.table td.dt-type-date div.dt-column-header,table.dataTable.ui.table td.dt-type-date div.dt-column-footer{flex-direction:row-reverse}table.dataTable.ui.table th.dt-left,table.dataTable.ui.table td.dt-left{text-align:left}table.dataTable.ui.table th.dt-left div.dt-column-header,table.dataTable.ui.table th.dt-left div.dt-column-footer,table.dataTable.ui.table td.dt-left div.dt-column-header,table.dataTable.ui.table td.dt-left div.dt-column-footer{flex-direction:row}table.dataTable.ui.table th.dt-center,table.dataTable.ui.table td.dt-center{text-align:center}table.dataTable.ui.table th.dt-right,table.dataTable.ui.table td.dt-right{text-align:right}table.dataTable.ui.table th.dt-right div.dt-column-header,table.dataTable.ui.table th.dt-right div.dt-column-footer,table.dataTable.ui.table td.dt-right div.dt-column-header,table.dataTable.ui.table td.dt-right div.dt-column-footer{flex-direction:row-reverse}table.dataTable.ui.table th.dt-justify,table.dataTable.ui.table td.dt-justify{text-align:justify}table.dataTable.ui.table th.dt-justify div.dt-column-header,table.dataTable.ui.table th.dt-justify div.dt-column-footer,table.dataTable.ui.table td.dt-justify div.dt-column-header,table.dataTable.ui.table td.dt-justify div.dt-column-footer{flex-direction:row}table.dataTable.ui.table th.dt-nowrap,table.dataTable.ui.table td.dt-nowrap{white-space:nowrap}table.dataTable.ui.table th.dt-empty,table.dataTable.ui.table td.dt-empty{text-align:center;vertical-align:top}table.dataTable.ui.table thead th,table.dataTable.ui.table thead td,table.dataTable.ui.table tfoot th,table.dataTable.ui.table tfoot td{text-align:left;vertical-align:var(--dt-header-vertical-align)}table.dataTable.ui.table thead th.dt-head-left,table.dataTable.ui.table thead td.dt-head-left,table.dataTable.ui.table tfoot th.dt-head-left,table.dataTable.ui.table tfoot td.dt-head-left{text-align:left}table.dataTable.ui.table thead th.dt-head-left div.dt-column-header,table.dataTable.ui.table thead th.dt-head-left div.dt-column-footer,table.dataTable.ui.table thead td.dt-head-left div.dt-column-header,table.dataTable.ui.table thead td.dt-head-left div.dt-column-footer,table.dataTable.ui.table tfoot th.dt-head-left div.dt-column-header,table.dataTable.ui.table tfoot th.dt-head-left div.dt-column-footer,table.dataTable.ui.table tfoot td.dt-head-left div.dt-column-header,table.dataTable.ui.table tfoot td.dt-head-left div.dt-column-footer{flex-direction:row}table.dataTable.ui.table thead th.dt-head-center,table.dataTable.ui.table thead td.dt-head-center,table.dataTable.ui.table tfoot th.dt-head-center,table.dataTable.ui.table tfoot td.dt-head-center{text-align:center}table.dataTable.ui.table thead th.dt-head-right,table.dataTable.ui.table thead td.dt-head-right,table.dataTable.ui.table tfoot th.dt-head-right,table.dataTable.ui.table tfoot td.dt-head-right{text-align:right}table.dataTable.ui.table thead th.dt-head-right div.dt-column-header,table.dataTable.ui.table thead th.dt-head-right div.dt-column-footer,table.dataTable.ui.table thead td.dt-head-right div.dt-column-header,table.dataTable.ui.table thead td.dt-head-right div.dt-column-footer,table.dataTable.ui.table tfoot th.dt-head-right div.dt-column-header,table.dataTable.ui.table tfoot th.dt-head-right div.dt-column-footer,table.dataTable.ui.table tfoot td.dt-head-right div.dt-column-header,table.dataTable.ui.table tfoot td.dt-head-right div.dt-column-footer{flex-direction:row-reverse}table.dataTable.ui.table thead th.dt-head-justify,table.dataTable.ui.table thead td.dt-head-justify,table.dataTable.ui.table tfoot th.dt-head-justify,table.dataTable.ui.table tfoot td.dt-head-justify{text-align:justify}table.dataTable.ui.table thead th.dt-head-justify div.dt-column-header,table.dataTable.ui.table thead th.dt-head-justify div.dt-column-footer,table.dataTable.ui.table thead td.dt-head-justify div.dt-column-header,table.dataTable.ui.table thead td.dt-head-justify div.dt-column-footer,table.dataTable.ui.table tfoot th.dt-head-justify div.dt-column-header,table.dataTable.ui.table tfoot th.dt-head-justify div.dt-column-footer,table.dataTable.ui.table tfoot td.dt-head-justify div.dt-column-header,table.dataTable.ui.table tfoot td.dt-head-justify div.dt-column-footer{flex-direction:row}table.dataTable.ui.table thead th.dt-head-nowrap,table.dataTable.ui.table thead td.dt-head-nowrap,table.dataTable.ui.table tfoot th.dt-head-nowrap,table.dataTable.ui.table tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable.ui.table tbody th.dt-body-left,table.dataTable.ui.table tbody td.dt-body-left{text-align:left}table.dataTable.ui.table tbody th.dt-body-center,table.dataTable.ui.table tbody td.dt-body-center{text-align:center}table.dataTable.ui.table tbody th.dt-body-right,table.dataTable.ui.table tbody td.dt-body-right{text-align:right}table.dataTable.ui.table tbody th.dt-body-justify,table.dataTable.ui.table tbody td.dt-body-justify{text-align:justify}table.dataTable.ui.table tbody th.dt-body-nowrap,table.dataTable.ui.table tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable.table{margin:0}table.dataTable.table.ui.striped>tbody>tr:nth-child(2n){background-color:transparent}table.dataTable.table>tbody>tr{background-color:transparent}table.dataTable.table>tbody>tr.selected>*{box-shadow:inset 0 0 0 9999px rgb(224, 224, 224);box-shadow:inset 0 0 0 9999px rgb(var(--dt-row-selected));color:rgb(0, 0, 0);color:rgb(var(--dt-row-selected-text))}table.dataTable.table>tbody>tr.selected a{color:rgb(228, 228, 228);color:rgb(var(--dt-row-selected-link))}table.dataTable.table.striped>tbody>tr:nth-child(2n)>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.02)}table.dataTable.table.striped>tbody>tr:nth-child(2n).selected>*{box-shadow:inset 0 0 0 9999px rgba(224, 224, 224, 0.92);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.92)}table.dataTable.table.hover>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.05)}table.dataTable.table.hover>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px rgba(224, 224, 224, 0.95);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.95)}table.dataTable.table>thead>tr>td{text-align:inherit;color:rgba(0, 0, 0, 0.87);padding:.5em .78571429em;vertical-align:inherit;font-style:none;text-transform:none;border-bottom:1px solid rgba(34, 36, 38, 0.1)}table.dataTable.table.celled>thead>tr>td:not(:first-child){border-left:1px solid rgba(34, 36, 38, 0.1)}:root{--dt-row-selected: 224, 224, 224;--dt-row-selected-text: 0, 0, 0;--dt-row-selected-link: 228, 228, 228;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-header-align-items: center;--dt-header-vertical-align: middle;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable tbody td.dt-control{text-align:center;cursor:pointer}table.dataTable tbody td.dt-control:before{display:inline-block;box-sizing:border-box;content:"";border-top:5px solid transparent;border-left:10px solid rgba(0, 0, 0, 0.5);border-bottom:5px solid transparent;border-right:0px solid transparent}table.dataTable tbody tr.dt-hasChild td.dt-control:before{border-top:10px solid rgba(0, 0, 0, 0.5);border-left:5px solid transparent;border-bottom:0px solid transparent;border-right:5px solid transparent}table.dataTable tfoot:empty{display:none}html.dark table.dataTable td.dt-control:before,:root[data-bs-theme=dark] table.dataTable td.dt-control:before,:root[data-theme=dark] table.dataTable td.dt-control:before{border-left-color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-bs-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before,:root[data-theme=dark] table.dataTable tr.dt-hasChild td.dt-control:before{border-top-color:rgba(255, 255, 255, 0.5);border-left-color:transparent}div.dt-scroll{width:100%}div.dt-scroll-body thead tr,div.dt-scroll-body tfoot tr{height:0}div.dt-scroll-body thead tr th,div.dt-scroll-body thead tr td,div.dt-scroll-body tfoot tr th,div.dt-scroll-body tfoot tr td{height:0 !important;padding-top:0px !important;padding-bottom:0px !important;border-top-width:0px !important;border-bottom-width:0px !important}div.dt-scroll-body thead tr th div.dt-scroll-sizing,div.dt-scroll-body thead tr td div.dt-scroll-sizing,div.dt-scroll-body tfoot tr th div.dt-scroll-sizing,div.dt-scroll-body tfoot tr td div.dt-scroll-sizing{height:0 !important;overflow:hidden !important}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before{position:absolute;display:block;bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{position:absolute;display:block;top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order{position:relative;width:12px;height:20px}table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{left:0;opacity:.125;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.dt-orderable-asc,table.dataTable thead>tr>th.dt-orderable-desc,table.dataTable thead>tr>td.dt-orderable-asc,table.dataTable thead>tr>td.dt-orderable-desc{cursor:pointer}table.dataTable thead>tr>th.dt-orderable-asc:hover,table.dataTable thead>tr>th.dt-orderable-desc:hover,table.dataTable thead>tr>td.dt-orderable-asc:hover,table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(0, 0, 0, 0.05);outline-offset:-2px}table.dataTable thead>tr>th.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>th.dt-ordering-desc .dt-column-order:after,table.dataTable thead>tr>td.dt-ordering-asc .dt-column-order:before,table.dataTable thead>tr>td.dt-ordering-desc .dt-column-order:after{opacity:.6}table.dataTable thead>tr>th.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>th.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>th.sorting_asc_disabled .dt-column-order:before,table.dataTable thead>tr>td.dt-orderable-none:not(.dt-ordering-asc,.dt-ordering-desc) .dt-column-order:empty,table.dataTable thead>tr>td.sorting_desc_disabled .dt-column-order:after,table.dataTable thead>tr>td.sorting_asc_disabled .dt-column-order:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}table.dataTable thead>tr>th div.dt-column-header,table.dataTable thead>tr>th div.dt-column-footer,table.dataTable thead>tr>td div.dt-column-header,table.dataTable thead>tr>td div.dt-column-footer,table.dataTable tfoot>tr>th div.dt-column-header,table.dataTable tfoot>tr>th div.dt-column-footer,table.dataTable tfoot>tr>td div.dt-column-header,table.dataTable tfoot>tr>td div.dt-column-footer{display:flex;justify-content:space-between;align-items:var(--dt-header-align-items);gap:4px}table.dataTable thead>tr>th div.dt-column-header .dt-column-title,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title,table.dataTable thead>tr>td div.dt-column-header .dt-column-title,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title{flex-grow:1}table.dataTable thead>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable thead>tr>td div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>th div.dt-column-footer .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-header .dt-column-title:empty,table.dataTable tfoot>tr>td div.dt-column-footer .dt-column-title:empty{display:none}div.dt-scroll-body>table.dataTable>thead>tr>th,div.dt-scroll-body>table.dataTable>thead>tr>td{overflow:hidden}:root.dark table.dataTable thead>tr>th.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>th.dt-orderable-desc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-asc:hover,:root.dark table.dataTable thead>tr>td.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>th.dt-orderable-desc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-asc:hover,:root[data-bs-theme=dark] table.dataTable thead>tr>td.dt-orderable-desc:hover{outline:2px solid rgba(255, 255, 255, 0.05)}div.dt-container div.dt-layout-row{display:flex;justify-content:space-between;align-items:center;width:100%;margin:.75em 0}div.dt-container div.dt-layout-row div.dt-layout-cell{display:flex;justify-content:space-between;align-items:center}div.dt-container div.dt-layout-row div.dt-layout-cell.dt-layout-start{justify-content:flex-start;margin-right:auto}div.dt-container div.dt-layout-row div.dt-layout-cell.dt-layout-end{justify-content:flex-end;margin-left:auto}div.dt-container div.dt-layout-row div.dt-layout-cell:empty{display:none}@media screen and (max-width: 767px){div.dt-container div.dt-layout-row:not(.dt-layout-table){display:block}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell{display:block;text-align:center}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell>*{margin:.5em 0}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell.dt-layout-start{margin-right:0}div.dt-container div.dt-layout-row:not(.dt-layout-table) div.dt-layout-cell.dt-layout-end{margin-left:0}}div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:1em}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:1em}div.dt-container div.dt-layout-full{width:100%}div.dt-container div.dt-layout-full>*:only-child{margin-left:auto;margin-right:auto}div.dt-container div.dt-layout-table>div{display:block !important}@media screen and (max-width: 767px){div.dt-container div.dt-layout-start>*:not(:last-child){margin-right:0}div.dt-container div.dt-layout-end>*:not(:first-child){margin-left:0}}div.dt-container.dt-semanticUI{position:relative}div.dt-container.dt-semanticUI>div.row{display:flex;padding-top:.5rem;padding-bottom:.5rem}div.dt-container.dt-semanticUI>div.row:first-child{padding-top:1rem}div.dt-container.dt-semanticUI>div.row:last-child{padding-bottom:1rem}div.dt-container.dt-semanticUI div.dt-length select{vertical-align:middle;min-height:2.7142em}div.dt-container.dt-semanticUI div.dt-length .ui.selection.dropdown{min-width:0}div.dt-container.dt-semanticUI div.dt-search span.input{margin-left:.5em}div.dt-container.dt-semanticUI div.dt-info{white-space:nowrap}div.dt-container.dt-semanticUI div.dt-processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;text-align:center}div.dt-container.dt-semanticUI div.dt-scroll{width:100%;padding:0}div.dt-container.dt-semanticUI div.dt-scroll-head table.dataTable{border-bottom-right-radius:0;border-bottom-left-radius:0;border-bottom:none}div.dt-container.dt-semanticUI div.dt-scroll-body thead .dt-orderable-asc:before,div.dt-container.dt-semanticUI div.dt-scroll-body thead .dt-orderable-desc:after{display:none}div.dt-container.dt-semanticUI div.dt-scroll-body table.dataTable{border-radius:0;border-top:none;border-bottom-width:0}div.dt-container.dt-semanticUI div.dt-scroll-body table.dataTable.no-footer{border-bottom-width:1px}div.dt-container.dt-semanticUI div.dt-scroll-foot table.dataTable{border-top-right-radius:0;border-top-left-radius:0;border-top:none}@media screen and (max-width: 767px){div.dt-container div.left,div.dt-container div.right{text-align:center !important}}
14
+
15
+
@@ -73552,4 +73552,8 @@ body.pushable > .pusher {
73552
73552
  100% {
73553
73553
  background-color: #fcfcfd;
73554
73554
  }
73555
- }
73555
+ }
73556
+
73557
+ .padding {
73558
+ padding: 1rem;
73559
+ }
@@ -0,0 +1,153 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ResourceListBlock — a searchable, scrollable list panel for any resource.
4
+ #
5
+ # Composes Header, Input, Button, and turbo-framed partial iteration into
6
+ # a single reusable block. Designed for sidebar/master-list patterns where
7
+ # a Ransack search filters a collection rendered via a per-item partial.
8
+ #
9
+ # Usage:
10
+ # ResourceListBlock(
11
+ # heading: "Notes",
12
+ # search_url: notes_path,
13
+ # search_query: @q,
14
+ # search_predicate: "title_cont",
15
+ # resources: @notes,
16
+ # item_partial: "notes/note_card",
17
+ # item_local: "note",
18
+ # new_path: new_note_path,
19
+ # turbo_frame: "notes-list",
20
+ # id: "item-list-panel"
21
+ # )
22
+ #
23
+ # The search section is omitted when search_query is nil.
24
+ # The "new" button is omitted when new_path is nil.
25
+ # The list is wrapped in a turbo frame when turbo_frame is provided.
26
+ #
27
+ # For auto-submit / live-search behaviour, pass Stimulus wiring via
28
+ # search_form_data:
29
+ #
30
+ # ResourceListBlock(
31
+ # ...,
32
+ # search_form_data: {
33
+ # controller: "auto-submit",
34
+ # action: "input->auto-submit#submit",
35
+ # turbo_frame: "notes-list"
36
+ # }
37
+ # )
38
+ #
39
+ # HTML structure (all sections wrapped for predictable styling):
40
+ #
41
+ # div.resource-list-block
42
+ # div.resource-list-header
43
+ # [HStack with heading + button]
44
+ # div.resource-list-search
45
+ # [search_form_for with Input]
46
+ # turbo-frame (optional)
47
+ # div.resource-list-items
48
+ # [rendered partials]
49
+
50
+ class ResourceListBlock < Component
51
+ attribute :heading, :string, default: nil
52
+ attribute :search_url, default: nil
53
+ attribute :search_query, default: nil
54
+ attribute :search_predicate, :string, default: "title_cont"
55
+ attribute :search_placeholder, :string, default: "Search\u2026"
56
+ attribute :search_form_data, default: nil
57
+ attribute :new_path, :string, default: nil
58
+ attribute :resources, default: nil
59
+ attribute :item_partial, :string, default: nil
60
+ attribute :item_local, :string, default: "resource"
61
+ attribute :turbo_frame, :string, default: nil
62
+
63
+ def to_s
64
+ tag.div(**merge_html_options(class: "resource-list-block")) {
65
+ safe_join([
66
+ render_header,
67
+ render_search,
68
+ render_list,
69
+ @content
70
+ ])
71
+ }
72
+ end
73
+
74
+ private
75
+
76
+ # ── Header ──────────────────────────────────────────────────────────
77
+ # Heading text on the left, optional "new" button on the right.
78
+
79
+ def render_header
80
+ return if heading.nil? && new_path.nil?
81
+
82
+ heading_html = heading ? render_component(HeaderComponent, size: :h3) { heading } : nil
83
+ button_html = new_path ? render_component(ButtonComponent, href: new_path, size: :mini, icon: "plus", variant: :primary) : nil
84
+
85
+ tag.div(class: "resource-list-header") {
86
+ render_component(HStackComponent, spacing: 8, justify: "between", align: "center") {
87
+ safe_join([ heading_html, button_html ])
88
+ }
89
+ }
90
+ end
91
+
92
+ # ── Search ──────────────────────────────────────────────────────────
93
+ # Ransack search_form_for wrapping an Input. Omitted when search_query
94
+ # is nil. The form targets the turbo frame so only the list refreshes.
95
+
96
+ def render_search
97
+ return if search_query.nil?
98
+
99
+ form_html_opts = { class: "ui form" }
100
+ form_data = build_search_form_data
101
+ form_html_opts[:data] = form_data if form_data.present?
102
+
103
+ search_value = search_query.try(search_predicate)
104
+
105
+ tag.div(class: "resource-list-search") {
106
+ @view_context.search_form_for(search_query, url: search_url, html: form_html_opts) {
107
+ InputComponent.new(
108
+ fluid: true,
109
+ icon: "search",
110
+ placeholder: search_placeholder,
111
+ name: "q[#{search_predicate}]",
112
+ value: search_value
113
+ ).render_in(@view_context)
114
+ }
115
+ }
116
+ end
117
+
118
+ # ── List ────────────────────────────────────────────────────────────
119
+ # Iterates resources and renders the item partial for each one.
120
+ # Optionally wrapped in a turbo frame for scoped replacement.
121
+
122
+ def render_list
123
+ items = tag.div(class: "resource-list-items") {
124
+ safe_join(
125
+ Array(resources).map { |resource|
126
+ @view_context.render(partial: item_partial, locals: { item_local.to_sym => resource })
127
+ }
128
+ )
129
+ }
130
+
131
+ if turbo_frame
132
+ @view_context.turbo_frame_tag(turbo_frame) { items }
133
+ else
134
+ items
135
+ end
136
+ end
137
+
138
+ # ── Helpers ─────────────────────────────────────────────────────────
139
+
140
+ def render_component(klass, **kwargs, &block)
141
+ klass.new(**kwargs).render_in(@view_context, &block)
142
+ end
143
+
144
+ def build_search_form_data
145
+ data = (search_form_data || {}).dup
146
+ # When a turbo frame is configured and the consumer hasn't explicitly
147
+ # set a turbo_frame on the form, default to targeting the list frame.
148
+ if turbo_frame && !data.key?(:turbo_frame)
149
+ data[:turbo_frame] = turbo_frame
150
+ end
151
+ data
152
+ end
153
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ # BackButton - link that restores Turbo history when possible.
4
+ #
5
+ # Usage:
6
+ # BackButton(href: "/dashboard")
7
+ # BackButton(href: "/notes", icon: "arrow left")
8
+
9
+ class BackButtonComponent < Component
10
+ attribute :href, :string, default: "#"
11
+ attribute :label, :string, default: "Back"
12
+ attribute :icon, :string, default: nil
13
+ attribute :css_class, :string, default: "item"
14
+ attribute :controller, :string, default: "navigation"
15
+ attribute :action, :string, default: "navigation#back"
16
+ attribute :turbo_action, :string, default: "replace"
17
+
18
+ def to_s
19
+ icon_el = icon ? tag.i(class: "#{icon} icon") : nil
20
+ content = @content.presence || ERB::Util.html_escape(label)
21
+
22
+ tag.a(
23
+ **merge_html_options(
24
+ href: href,
25
+ class: css_class,
26
+ data: {
27
+ controller: controller,
28
+ action: action,
29
+ turbo_action: turbo_action
30
+ }
31
+ )
32
+ ) { safe_join([ icon_el, content ]) }
33
+ end
34
+ end
@@ -40,10 +40,12 @@ class ButtonComponent < Component
40
40
  icon_el = icon ? tag.i(class: "#{icon} icon") : nil
41
41
  content = safe_join([ icon_el, @content ])
42
42
 
43
+ opts = merge_html_options(class: classes)
44
+
43
45
  if href
44
- tag.a(class: classes, href: href) { content }
46
+ tag.a(**opts, href: href) { content }
45
47
  else
46
- tag.button(class: classes, type: type) { content }
48
+ tag.button(**opts, type: type) { content }
47
49
  end
48
50
  end
49
51
  end
@@ -31,13 +31,12 @@ class ButtonToComponent < Component
31
31
  "button"
32
32
  )
33
33
 
34
- form_opts = { method: method.to_sym }
35
- form_opts[:data] = { turbo_confirm: confirm } if confirm
34
+ html_opts = { method: method.to_sym }
35
+ html_opts[:form] = { data: { turbo_confirm: confirm } } if confirm
36
36
 
37
37
  @view_context.button_to(
38
38
  url,
39
- form: form_opts,
40
- class: classes
39
+ html_opts.merge(class: classes)
41
40
  ) { @content }
42
41
  end
43
42
  end
@@ -40,7 +40,7 @@ class ColumnComponent < Component
40
40
  "column"
41
41
  ].compact.join(" ")
42
42
 
43
- tag.div(class: classes) { @content }
43
+ tag.div(**merge_html_options(class: classes)) { @content }
44
44
  end
45
45
 
46
46
  private
@@ -18,6 +18,6 @@ class ContainerComponent < Component
18
18
  "container"
19
19
  )
20
20
 
21
- tag.div(class: classes) { @content }
21
+ tag.div(**merge_html_options(class: classes)) { @content }
22
22
  end
23
23
  end
@@ -26,6 +26,7 @@ class DropdownComponent < Component
26
26
  attribute :labeled, :boolean, default: false
27
27
  attribute :loading, :boolean, default: false
28
28
  attribute :disabled, :boolean, default: false
29
+ attribute :action, :string, default: nil
29
30
 
30
31
  def to_s
31
32
  classes = class_names(
@@ -41,13 +42,18 @@ class DropdownComponent < Component
41
42
 
42
43
  data = { controller: "fui-dropdown" }
43
44
  data[:fui_dropdown_clearable_value] = "true" if clearable
44
- data[:fui_dropdown_placeholder_value] = placeholder if placeholder
45
+ data[:fui_dropdown_placeholder_value] = placeholder if placeholder && !inline
46
+ data[:fui_dropdown_action_value] = action if action
45
47
 
46
48
  hidden_opts = { type: "hidden", value: default_value || "" }
47
49
  hidden_opts[:name] = name if name
48
50
 
49
51
  search_el = search ? tag.input(class: "search") : nil
50
- text_el = tag.div(class: "default text") { placeholder || "" }
52
+ text_el = if inline
53
+ tag.div(class: "text") { tag.h2(class: "ui header") { placeholder || "" } }
54
+ else
55
+ tag.div(class: "text") { placeholder || "" }
56
+ end
51
57
  menu_el = tag.div(class: "menu") { @content }
52
58
 
53
59
  tag.div(class: classes, data: data) {
@@ -45,13 +45,14 @@ class GridComponent < Component
45
45
  "grid"
46
46
  )
47
47
 
48
- tag.div(class: classes) { @content }
48
+ tag.div(**merge_html_options(class: classes)) { @content }
49
49
  end
50
50
 
51
51
  private
52
52
 
53
53
  def divided_class
54
54
  case divided
55
+ when "t", "1" then "divided"
55
56
  when "vertically" then "vertically divided"
56
57
  when "true", true then "divided"
57
58
  when String then "#{divided} divided"
@@ -60,6 +61,7 @@ class GridComponent < Component
60
61
 
61
62
  def celled_class
62
63
  case celled
64
+ when "t", "1" then "celled"
63
65
  when "internally" then "internally celled"
64
66
  when "true", true then "celled"
65
67
  when String then "#{celled} celled"
@@ -68,6 +70,7 @@ class GridComponent < Component
68
70
 
69
71
  def padded_class
70
72
  case padded
73
+ when "t", "1" then "padded"
71
74
  when "vertically" then "vertically padded"
72
75
  when "horizontally" then "horizontally padded"
73
76
  when "true", true then "padded"
@@ -77,6 +80,7 @@ class GridComponent < Component
77
80
 
78
81
  def relaxed_class
79
82
  case relaxed
83
+ when "t", "1" then "relaxed"
80
84
  when "very" then "very relaxed"
81
85
  when "true", true then "relaxed"
82
86
  when String then "#{relaxed} relaxed"
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ # LinkTo - anchor element.
4
+ #
5
+ # Usage:
6
+ # LinkTo(href: "/about") { text "About Us" }
7
+ # LinkTo(href: "/help", target: "_blank") { text "Help" }
8
+
9
+ class LinkToComponent < Component
10
+ attribute :href, :string, default: "#"
11
+ attribute :target, :string, default: nil
12
+ attribute :rel, :string, default: nil
13
+ attribute :css_class, :string, default: nil
14
+
15
+ def to_s
16
+ opts = { href: href }
17
+ opts[:class] = css_class if css_class
18
+ opts[:target] = target if target
19
+ opts[:rel] = rel if rel
20
+
21
+ tag.a(**merge_html_options(**opts)) { @content }
22
+ end
23
+ end
@@ -23,6 +23,8 @@ class MenuItemComponent < Component
23
23
  attribute :color, :string, default: nil
24
24
  attribute :dropdown, :boolean, default: false
25
25
  attribute :value, :string, default: nil
26
+ attribute :target, :string, default: nil
27
+ attribute :rel, :string, default: nil
26
28
 
27
29
  def to_s
28
30
  classes = class_names(
@@ -41,8 +43,10 @@ class MenuItemComponent < Component
41
43
  icon_el = icon ? tag.i(class: "#{icon} icon") : nil
42
44
  inner = icon_el ? safe_join([ icon_el, @content ]) : @content
43
45
 
44
- opts = { class: classes }
46
+ opts = merge_html_options(class: classes)
45
47
  opts["data-value"] = value if value
48
+ opts[:target] = target if target
49
+ opts[:rel] = rel if rel
46
50
 
47
51
  if href
48
52
  tag.a(**opts, href: href) { inner }
@@ -47,7 +47,9 @@ class MessageComponent < Component
47
47
  content_parts = safe_join([ header_el, @content.presence ])
48
48
  content_wrapper = icon ? tag.div(class: "content") { content_parts } : content_parts
49
49
 
50
- tag.div(class: classes) {
50
+ opts = merge_html_options(class: classes)
51
+
52
+ tag.div(**opts) {
51
53
  safe_join([ close_el, icon_el, content_wrapper ])
52
54
  }
53
55
  end
@@ -16,6 +16,10 @@
16
16
  # c.header { text "Targeted Modal" }
17
17
  # c.content { text "This modal can be targeted by DOM id." }
18
18
  # }
19
+ #
20
+ # # Turbo-powered modal: drop in layout once, target from any link/button
21
+ # # with data: { turbo_frame: "modal" }
22
+ # Modal(turbo: true, blurring: true)
19
23
 
20
24
  class ModalComponent < Component
21
25
  attribute :id, :string, default: nil
@@ -26,6 +30,7 @@ class ModalComponent < Component
26
30
  attribute :longer, :boolean, default: false
27
31
  attribute :fullscreen, :boolean, default: false
28
32
  attribute :scrolling, :boolean, default: false
33
+ attribute :turbo, :boolean, default: false
29
34
 
30
35
  slot :header
31
36
  slot :content
@@ -41,17 +46,32 @@ class ModalComponent < Component
41
46
  "modal"
42
47
  )
43
48
 
44
- data = { controller: "fui-modal" }
49
+ controllers = "fui-modal"
50
+ controllers = "fui-modal turbo-modal" if turbo
51
+
52
+ data = { controller: controllers }
45
53
  data[:fui_modal_closable_value] = "false" unless closable
46
54
  data[:fui_modal_blurring_value] = "true" if blurring
47
55
 
56
+ if turbo
57
+ data[:action] = "turbo:frame-load->turbo-modal#open turbo:submit-end->turbo-modal#closeOnSuccess"
58
+ end
59
+
48
60
  close_el = closable ? tag.i(class: "close icon") : nil
49
61
  header_el = @slots[:header] ? tag.div(class: "header") { @slots[:header] } : nil
50
62
  content_cls = scrolling ? "scrolling content" : "content"
51
- content_el = @slots[:content] ? tag.div(class: content_cls) { @slots[:content] } : nil
63
+
64
+ if turbo
65
+ frame_el = @view_context.turbo_frame_tag("modal")
66
+ inner = @slots[:content] ? safe_join([ @slots[:content], frame_el ]) : frame_el
67
+ content_el = tag.div(class: content_cls) { inner }
68
+ else
69
+ content_el = @slots[:content] ? tag.div(class: content_cls) { @slots[:content] } : nil
70
+ end
71
+
52
72
  actions_el = @slots[:actions] ? tag.div(class: "actions") { @slots[:actions] } : nil
53
73
 
54
- opts = { class: classes, data: data }
74
+ opts = merge_html_options(class: classes, data: data)
55
75
  opts[:id] = id if id
56
76
 
57
77
  tag.div(**opts) {
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Paragraph — a plain <p> element.
4
+ #
5
+ # Usage:
6
+ # Paragraph { text "Some text content" }
7
+ # Paragraph(id: "intro") { text "Introduction" }
8
+
9
+ class ParagraphComponent < Component
10
+ def to_s
11
+ tag.p(**merge_html_options) { @content }
12
+ end
13
+ end
@@ -34,6 +34,6 @@ class RowComponent < Component
34
34
  "row"
35
35
  )
36
36
 
37
- tag.div(class: classes) { @content }
37
+ tag.div(**merge_html_options(class: classes)) { @content }
38
38
  end
39
39
  end
@@ -34,10 +34,8 @@ class TableRowComponent < Component
34
34
  ("disabled" if disabled)
35
35
  ].compact
36
36
 
37
- if classes.any?
38
- tag.tr(class: classes.join(" ")) { @content }
39
- else
40
- tag.tr { @content }
41
- end
37
+ opts = {}
38
+ opts[:class] = classes.join(" ") if classes.any?
39
+ tag.tr(**merge_html_options(**opts)) { @content }
42
40
  end
43
41
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Template - a plain <template> element.
4
+ #
5
+ # Usage:
6
+ # Template { text "content" }
7
+ # Template(data: { nested_form_target: "template" }) { text "..." }
8
+
9
+ class TemplateComponent < Component
10
+ def to_s
11
+ tag.template(**merge_html_options) { @content }
12
+ end
13
+ end