rails-active-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +6 -0
  3. data/app/assets/stylesheets.css +73555 -0
  4. data/app/components/accordion_component.rb +34 -0
  5. data/app/components/ad_component.rb +28 -0
  6. data/app/components/api_component.rb +24 -0
  7. data/app/components/breadcrumb_component.rb +26 -0
  8. data/app/components/button_component.rb +49 -0
  9. data/app/components/calendar_component.rb +34 -0
  10. data/app/components/card_component.rb +56 -0
  11. data/app/components/checkbox_component.rb +41 -0
  12. data/app/components/column_component.rb +62 -0
  13. data/app/components/comment_component.rb +45 -0
  14. data/app/components/concerns/alignable.rb +21 -0
  15. data/app/components/concerns/attachable.rb +16 -0
  16. data/app/components/concerns/orientable.rb +21 -0
  17. data/app/components/concerns/positionable.rb +21 -0
  18. data/app/components/concerns/sizeable.rb +18 -0
  19. data/app/components/container_component.rb +23 -0
  20. data/app/components/dimmer_component.rb +30 -0
  21. data/app/components/divider_component.rb +30 -0
  22. data/app/components/dropdown_component.rb +63 -0
  23. data/app/components/embed_component.rb +32 -0
  24. data/app/components/emoji_component.rb +15 -0
  25. data/app/components/feed_component.rb +22 -0
  26. data/app/components/flag_component.rb +15 -0
  27. data/app/components/flyout_component.rb +41 -0
  28. data/app/components/form_component.rb +39 -0
  29. data/app/components/grid_component.rb +85 -0
  30. data/app/components/h_stack_component.rb +67 -0
  31. data/app/components/header_component.rb +60 -0
  32. data/app/components/icon_component.rb +41 -0
  33. data/app/components/image_component.rb +46 -0
  34. data/app/components/input_component.rb +52 -0
  35. data/app/components/item_component.rb +39 -0
  36. data/app/components/item_group_component.rb +30 -0
  37. data/app/components/label_component.rb +49 -0
  38. data/app/components/link_component.rb +23 -0
  39. data/app/components/list_component.rb +39 -0
  40. data/app/components/loader_component.rb +33 -0
  41. data/app/components/menu_component.rb +64 -0
  42. data/app/components/menu_item_component.rb +52 -0
  43. data/app/components/message_component.rb +54 -0
  44. data/app/components/modal_component.rb +50 -0
  45. data/app/components/nag_component.rb +25 -0
  46. data/app/components/overlay_component.rb +16 -0
  47. data/app/components/placeholder_component.rb +39 -0
  48. data/app/components/popup_component.rb +31 -0
  49. data/app/components/progress_component.rb +48 -0
  50. data/app/components/pusher_component.rb +18 -0
  51. data/app/components/rail_component.rb +31 -0
  52. data/app/components/rating_component.rb +41 -0
  53. data/app/components/reset_component.rb +12 -0
  54. data/app/components/reveal_component.rb +39 -0
  55. data/app/components/row_component.rb +39 -0
  56. data/app/components/search_component.rb +44 -0
  57. data/app/components/segment_component.rb +57 -0
  58. data/app/components/segment_group_component.rb +36 -0
  59. data/app/components/shape_component.rb +25 -0
  60. data/app/components/sidebar_component.rb +33 -0
  61. data/app/components/site_component.rb +12 -0
  62. data/app/components/slider_component.rb +46 -0
  63. data/app/components/state_component.rb +25 -0
  64. data/app/components/statistic_component.rb +43 -0
  65. data/app/components/step_component.rb +56 -0
  66. data/app/components/step_group_component.rb +38 -0
  67. data/app/components/sticky_component.rb +22 -0
  68. data/app/components/sub_header_component.rb +15 -0
  69. data/app/components/sub_menu_component.rb +24 -0
  70. data/app/components/tab_component.rb +24 -0
  71. data/app/components/table_cell_component.rb +60 -0
  72. data/app/components/table_component.rb +160 -0
  73. data/app/components/table_row_component.rb +43 -0
  74. data/app/components/text_component.rb +73 -0
  75. data/app/components/toast_component.rb +36 -0
  76. data/app/components/transition_component.rb +32 -0
  77. data/app/components/v_stack_component.rb +31 -0
  78. data/app/components/visibility_component.rb +22 -0
  79. data/app/helpers/component_helper.rb +109 -0
  80. data/app/helpers/fui_helper.rb +53 -0
  81. data/app/javascript/accordion.js +547 -0
  82. data/app/javascript/accordion.min.js +11 -0
  83. data/app/javascript/api.js +1112 -0
  84. data/app/javascript/api.min.js +11 -0
  85. data/app/javascript/calendar.js +1960 -0
  86. data/app/javascript/calendar.min.js +11 -0
  87. data/app/javascript/checkbox.js +819 -0
  88. data/app/javascript/checkbox.min.js +11 -0
  89. data/app/javascript/dimmer.js +686 -0
  90. data/app/javascript/dimmer.min.js +11 -0
  91. data/app/javascript/dropdown.js +4019 -0
  92. data/app/javascript/dropdown.min.js +11 -0
  93. data/app/javascript/embed.js +646 -0
  94. data/app/javascript/embed.min.js +11 -0
  95. data/app/javascript/flyout.js +1405 -0
  96. data/app/javascript/flyout.min.js +11 -0
  97. data/app/javascript/form.js +2070 -0
  98. data/app/javascript/form.min.js +11 -0
  99. data/app/javascript/jquery.js +10716 -0
  100. data/app/javascript/jquery.min.js +2 -0
  101. data/app/javascript/modal.js +1507 -0
  102. data/app/javascript/modal.min.js +11 -0
  103. data/app/javascript/nag.js +522 -0
  104. data/app/javascript/nag.min.js +11 -0
  105. data/app/javascript/popup.js +1457 -0
  106. data/app/javascript/popup.min.js +11 -0
  107. data/app/javascript/progress.js +922 -0
  108. data/app/javascript/progress.min.js +11 -0
  109. data/app/javascript/rating.js +496 -0
  110. data/app/javascript/rating.min.js +11 -0
  111. data/app/javascript/search.js +1519 -0
  112. data/app/javascript/search.min.js +11 -0
  113. data/app/javascript/shape.js +721 -0
  114. data/app/javascript/shape.min.js +11 -0
  115. data/app/javascript/sidebar.js +952 -0
  116. data/app/javascript/sidebar.min.js +11 -0
  117. data/app/javascript/site.js +415 -0
  118. data/app/javascript/site.min.js +11 -0
  119. data/app/javascript/slider.js +1449 -0
  120. data/app/javascript/slider.min.js +11 -0
  121. data/app/javascript/state.js +653 -0
  122. data/app/javascript/state.min.js +11 -0
  123. data/app/javascript/sticky.js +852 -0
  124. data/app/javascript/sticky.min.js +11 -0
  125. data/app/javascript/tab.js +867 -0
  126. data/app/javascript/tab.min.js +11 -0
  127. data/app/javascript/toast.js +916 -0
  128. data/app/javascript/toast.min.js +11 -0
  129. data/app/javascript/transition.js +955 -0
  130. data/app/javascript/transition.min.js +11 -0
  131. data/app/javascript/ui/controllers/fui_accordion_controller.js +45 -0
  132. data/app/javascript/ui/controllers/fui_api_controller.js +80 -0
  133. data/app/javascript/ui/controllers/fui_calendar_controller.js +66 -0
  134. data/app/javascript/ui/controllers/fui_checkbox_controller.js +48 -0
  135. data/app/javascript/ui/controllers/fui_dimmer_controller.js +45 -0
  136. data/app/javascript/ui/controllers/fui_dropdown_controller.js +68 -0
  137. data/app/javascript/ui/controllers/fui_embed_controller.js +49 -0
  138. data/app/javascript/ui/controllers/fui_flyout_controller.js +49 -0
  139. data/app/javascript/ui/controllers/fui_form_controller.js +62 -0
  140. data/app/javascript/ui/controllers/fui_modal_controller.js +61 -0
  141. data/app/javascript/ui/controllers/fui_nag_controller.js +52 -0
  142. data/app/javascript/ui/controllers/fui_popup_controller.js +58 -0
  143. data/app/javascript/ui/controllers/fui_progress_controller.js +60 -0
  144. data/app/javascript/ui/controllers/fui_rating_controller.js +49 -0
  145. data/app/javascript/ui/controllers/fui_search_controller.js +76 -0
  146. data/app/javascript/ui/controllers/fui_shape_controller.js +45 -0
  147. data/app/javascript/ui/controllers/fui_sidebar_controller.js +48 -0
  148. data/app/javascript/ui/controllers/fui_site_controller.js +29 -0
  149. data/app/javascript/ui/controllers/fui_slider_controller.js +53 -0
  150. data/app/javascript/ui/controllers/fui_state_controller.js +63 -0
  151. data/app/javascript/ui/controllers/fui_sticky_controller.js +50 -0
  152. data/app/javascript/ui/controllers/fui_tab_controller.js +57 -0
  153. data/app/javascript/ui/controllers/fui_toast_controller.js +60 -0
  154. data/app/javascript/ui/controllers/fui_transition_controller.js +60 -0
  155. data/app/javascript/ui/controllers/fui_visibility_controller.js +55 -0
  156. data/app/javascript/ui/index.js +114 -0
  157. data/app/javascript/visibility.js +1196 -0
  158. data/app/javascript/visibility.min.js +11 -0
  159. data/app/lib/component.rb +63 -0
  160. data/config/importmap.rb +27 -0
  161. data/config/initializers/ruby_template_handler.rb +31 -0
  162. data/config/routes.rb +2 -0
  163. data/lib/tasks/ui_tasks.rake +4 -0
  164. data/lib/ui/engine.rb +27 -0
  165. data/lib/ui/version.rb +3 -0
  166. data/lib/ui.rb +6 -0
  167. metadata +220 -0
@@ -0,0 +1,11 @@
1
+ /*
2
+ * # Fomantic UI - 2.9.4
3
+ * https://github.com/fomantic/Fomantic-UI
4
+ * https://fomantic-ui.com/
5
+ *
6
+ * Copyright 2026 Contributors
7
+ * Released under the MIT license
8
+ * https://opensource.org/licenses/MIT
9
+ *
10
+ */
11
+ !function(k,T,O){"use strict";function A(e){return"function"==typeof e&&"number"!=typeof e.nodeType}T=void 0!==T&&T.Math===Math?T:globalThis,k.fn.visibility=function(...e){const o=k(this);let p=Date.now(),h=[];const P=e[0],x="string"==typeof P,y=e.slice(1),C=function(e,o){let n;return[T,O].includes(e)?n=k(e):0===(n=k(o.document).find(e)).length&&(n=o.frameElement?C(e,o.parent):T),n};let S;const V=o.length;let R=0;return o.each(function(){const i=k.isPlainObject(P)?k.extend(!0,{},k.fn.visibility.settings,P):k.extend({},k.fn.visibility.settings),n=i.className;var e=i.namespace;const r=i.error,o=i.metadata,t="."+e,s="module-"+e,c=k(T),a=k(this),l=C(i.context,T);let d,u=a.data(s);const f=this;let b=!1,v,g;const m={initialize:function(){m.debug("Initializing",i),m.setup.cache(),m.should.trackChanges()&&("image"===i.type&&m.setup.image(),"fixed"===i.type&&m.setup.fixed(),i.observeChanges&&m.observeChanges(),m.bind.events()),m.save.position(),m.is.visible()||m.error(r.visible,a),i.initialCheck&&m.checkVisibility(),m.instantiate()},instantiate:function(){m.debug("Storing instance",m),a.data(s,m),u=m},destroy:function(){m.verbose("Destroying previous module"),g&&g.disconnect(),v&&v.disconnect(),c.off("load"+t,m.event.load).off("resize"+t,m.event.resize),l.off("scroll"+t,m.event.scroll).off("scrollchange"+t,m.event.scrollchange),"fixed"===i.type&&(m.resetFixed(),m.remove.placeholder()),a.off(t).removeData(s)},observeChanges:function(){v=new MutationObserver(m.event.contextChanged),g=new MutationObserver(m.event.changed),v.observe(O,{childList:!0,subtree:!0}),g.observe(f,{childList:!0,subtree:!0}),m.debug("Setting up mutation observer",g)},bind:{events:function(){m.verbose("Binding visibility events to scroll and resize"),i.refreshOnLoad&&c.on("load"+t,m.event.load),c.on("resize"+t,m.event.resize),l.off("scroll"+t).on("scroll"+t,m.event.scroll).on("scrollchange"+t,m.event.scrollchange)}},event:{changed:function(e){m.verbose("DOM tree modified, updating visibility calculations"),m.timer=setTimeout(function(){m.verbose("DOM tree modified, updating sticky menu"),m.refresh()},100)},contextChanged:function(e){for(const o of e)for(const n of o.removedNodes)(n===f||0<k(n).find(f).length)&&(m.debug("Element removed from DOM, tearing down events"),m.destroy())},resize:function(){m.debug("Window resized"),i.refreshOnResize&&requestAnimationFrame(m.refresh)},load:function(){m.debug("Page finished loading"),requestAnimationFrame(m.refresh)},scroll:function(){i.throttle?(clearTimeout(m.timer),m.timer=setTimeout(function(){l.triggerHandler("scrollchange"+t,[l.scrollTop()])},i.throttle)):requestAnimationFrame(function(){l.triggerHandler("scrollchange"+t,[l.scrollTop()])})},scrollchange:function(e,o){m.checkVisibility(o)}},precache:function(e,o){let n=(e=Array.isArray(e)?e:[e]).length,t=0;const i=[];let s=O.createElement("img");for(var c=function(){++t>=e.length&&A(o)&&o()};n--;)(s=O.createElement("img")).addEventListener("load",c),s.addEventListener("error",c),s.src=e[n],i.push(s)},enableCallbacks:function(){m.debug("Allowing callbacks to occur"),b=!1},disableCallbacks:function(){m.debug("Disabling all callbacks temporarily"),b=!0},should:{trackChanges:function(){return x?(m.debug("One time query, no need to bind events"),!1):(m.debug("Callbacks being attached"),!0)}},setup:{cache:function(){m.cache={occurred:{},screen:{},element:{}}},image:function(){const e=a.data(o.src);e&&(m.verbose("Lazy loading image",e),i.once=!0,i.observeChanges=!1,i.onOnScreen=function(){m.debug("Image on screen",f),m.precache(e,function(){m.set.image(e,function(){++R===V&&i.onAllLoaded.call(this),i.onLoad.call(this)})})})},fixed:function(){m.debug("Setting up fixed"),i.once=!1,i.observeChanges=!1,i.initialCheck=!0,i.refreshOnLoad=!0,P.transition||(i.transition=!1),m.create.placeholder(),m.debug("Added placeholder",d),i.onTopPassed=function(){m.debug("Element passed, adding fixed position",a),m.show.placeholder(),m.set.fixed(),i.transition&&void 0!==k.fn.transition&&a.transition(i.transition,i.duration)},i.onTopPassedReverse=function(){m.debug("Element returned to position, removing fixed",a),m.hide.placeholder(),m.remove.fixed()}}},create:{placeholder:function(){m.verbose("Creating fixed position placeholder"),d=a.clone(!1).css("display","none").addClass(n.placeholder).insertAfter(a)}},show:{placeholder:function(){m.verbose("Showing placeholder"),d.css("display","block").css("visibility","hidden")}},hide:{placeholder:function(){m.verbose("Hiding placeholder"),d.css("display","none").css("visibility","")}},set:{fixed:function(){m.verbose("Setting element to fixed position"),a.addClass(n.fixed).css({position:"fixed",top:i.offset+"px",left:"auto",zIndex:i.zIndex}),i.onFixed.call(f)},image:function(e,o){a.attr("src",e),i.transition?void 0!==k.fn.transition?a.hasClass(n.visible)?m.debug("Transition already occurred on this image, skipping animation"):a.transition(i.transition,i.duration,o):a.fadeIn(i.duration,o):a.show()}},is:{onScreen:function(){return m.get.elementCalculations().onScreen},offScreen:function(){return m.get.elementCalculations().offScreen},visible:function(){return!(!m.cache||!m.cache.element)&&!(0===m.cache.element.width&&0===m.cache.element.offset.top)},verticallyScrollableContext:function(){var e=l[0]!==T&&l.css("overflow-y");return"auto"===e||"scroll"===e},horizontallyScrollableContext:function(){var e=l[0]!==T&&l.css("overflow-x");return"auto"===e||"scroll"===e}},refresh:function(){m.debug("Refreshing constants (width/height)"),"fixed"===i.type&&m.resetFixed(),m.reset(),m.save.position(),i.checkOnRefresh&&m.checkVisibility(),i.onRefresh.call(f)},resetFixed:function(){m.remove.fixed(),m.remove.occurred()},reset:function(){m.verbose("Resetting all cached values"),k.isPlainObject(m.cache)&&(m.cache.screen={},m.cache.element={})},checkVisibility:function(e){m.verbose("Checking visibility of element",m.cache.element),!b&&m.is.visible()&&(m.save.scroll(e),m.save.calculations(),m.passed(),m.passingReverse(),m.topVisibleReverse(),m.bottomVisibleReverse(),m.topPassedReverse(),m.bottomPassedReverse(),m.onScreen(),m.offScreen(),m.passing(),m.topVisible(),m.bottomVisible(),m.topPassed(),m.bottomPassed(),i.onUpdate&&i.onUpdate.call(f,m.get.elementCalculations()))},passed:function(e,o){const n=m.get.elementCalculations();if(e&&o)i.onPassed[e]=o;else{if(void 0!==e)return m.get.pixelsPassed(e)>n.pixelsPassed;n.passing&&k.each(i.onPassed,function(e,o){n.bottomVisible||n.pixelsPassed>m.get.pixelsPassed(e)?m.execute(o,e):i.once||m.remove.occurred(o)})}},onScreen:function(e){var o=m.get.elementCalculations(),n=e||i.onOnScreen,t="onScreen";if(e&&(m.debug("Adding callback for onScreen",e),i.onOnScreen=e),o.onScreen?m.execute(n,t):i.once||m.remove.occurred(t),void 0!==e)return o.onOnScreen},offScreen:function(e){var o=m.get.elementCalculations(),n=e||i.onOffScreen,t="offScreen";if(e&&(m.debug("Adding callback for offScreen",e),i.onOffScreen=e),o.offScreen?m.execute(n,t):i.once||m.remove.occurred(t),void 0!==e)return o.onOffScreen},passing:function(e){var o=m.get.elementCalculations(),n=e||i.onPassing,t="passing";if(e&&(m.debug("Adding callback for passing",e),i.onPassing=e),o.passing?m.execute(n,t):i.once||m.remove.occurred(t),void 0!==e)return o.passing},topVisible:function(e){var o=m.get.elementCalculations(),n=e||i.onTopVisible,t="topVisible";if(e&&(m.debug("Adding callback for top visible",e),i.onTopVisible=e),o.topVisible?m.execute(n,t):i.once||m.remove.occurred(t),void 0===e)return o.topVisible},bottomVisible:function(e){var o=m.get.elementCalculations(),n=e||i.onBottomVisible,t="bottomVisible";if(e&&(m.debug("Adding callback for bottom visible",e),i.onBottomVisible=e),o.bottomVisible?m.execute(n,t):i.once||m.remove.occurred(t),void 0===e)return o.bottomVisible},topPassed:function(e){var o=m.get.elementCalculations(),n=e||i.onTopPassed,t="topPassed";if(e&&(m.debug("Adding callback for top passed",e),i.onTopPassed=e),o.topPassed?m.execute(n,t):i.once||m.remove.occurred(t),void 0===e)return o.topPassed},bottomPassed:function(e){var o=m.get.elementCalculations(),n=e||i.onBottomPassed,t="bottomPassed";if(e&&(m.debug("Adding callback for bottom passed",e),i.onBottomPassed=e),o.bottomPassed?m.execute(n,t):i.once||m.remove.occurred(t),void 0===e)return o.bottomPassed},passingReverse:function(e){var o=m.get.elementCalculations(),n=e||i.onPassingReverse,t="passingReverse";if(e&&(m.debug("Adding callback for passing reverse",e),i.onPassingReverse=e),o.passing?i.once||m.remove.occurred(t):m.get.occurred("passing")&&m.execute(n,t),void 0!==e)return!o.passing},topVisibleReverse:function(e){var o=m.get.elementCalculations(),n=e||i.onTopVisibleReverse,t="topVisibleReverse";if(e&&(m.debug("Adding callback for top visible reverse",e),i.onTopVisibleReverse=e),o.topVisible?i.once||m.remove.occurred(t):m.get.occurred("topVisible")&&m.execute(n,t),void 0===e)return!o.topVisible},bottomVisibleReverse:function(e){var o=m.get.elementCalculations(),n=e||i.onBottomVisibleReverse,t="bottomVisibleReverse";if(e&&(m.debug("Adding callback for bottom visible reverse",e),i.onBottomVisibleReverse=e),o.bottomVisible?i.once||m.remove.occurred(t):m.get.occurred("bottomVisible")&&m.execute(n,t),void 0===e)return!o.bottomVisible},topPassedReverse:function(e){var o=m.get.elementCalculations(),n=e||i.onTopPassedReverse,t="topPassedReverse";if(e&&(m.debug("Adding callback for top passed reverse",e),i.onTopPassedReverse=e),o.topPassed?i.once||m.remove.occurred(t):m.get.occurred("topPassed")&&m.execute(n,t),void 0===e)return!o.onTopPassed},bottomPassedReverse:function(e){var o=m.get.elementCalculations(),n=e||i.onBottomPassedReverse,t="bottomPassedReverse";if(e&&(m.debug("Adding callback for bottom passed reverse",e),i.onBottomPassedReverse=e),o.bottomPassed?i.once||m.remove.occurred(t):m.get.occurred("bottomPassed")&&m.execute(n,t),void 0===e)return!o.bottomPassed},execute:function(e=!1,o=""){var n=m.get.elementCalculations(),t=m.get.screenCalculations();A(e)&&(i.continuous?(m.debug("Callback being called continuously",o,n),e.call(f,n,t)):m.get.occurred(o)||(m.debug("Conditions met",o,n),e.call(f,n,t))),m.save.occurred(o)},remove:{fixed:function(){m.debug("Removing fixed position"),a.removeClass(n.fixed).css({position:"",top:"",left:"",zIndex:""}),i.onUnfixed.call(f)},placeholder:function(){m.debug("Removing placeholder content"),d&&d.remove()},occurred:function(e){var o;e?void 0!==(o=m.cache.occurred)[e]&&!0===o[e]&&(m.debug("Callback can now be called again",e),m.cache.occurred[e]=!1):m.cache.occurred={}}},save:{calculations:function(){m.verbose("Saving all calculations necessary to determine positioning"),m.save.direction(),m.save.screenCalculations(),m.save.elementCalculations()},occurred:function(e){!e||void 0!==m.cache.occurred[e]&&!0===m.cache.occurred[e]||(m.verbose("Saving callback occurred",e),m.cache.occurred[e]=!0)},scroll:function(e){e=e+i.offset||l.scrollTop()+i.offset,m.cache.scroll=e},direction:function(){var e=m.get.scroll(),o=m.get.lastScroll();let n;return n=o<e&&o?"down":e<o&&o?"up":"static",m.cache.direction=n,m.cache.direction},elementPosition:function(){const e=m.cache.element;var o=m.get.screenSize();return m.verbose("Saving element position"),e.fits=e.height<o.height,e.offset=a.offset(),e.width=a.outerWidth(),e.height=a.outerHeight(),m.is.verticallyScrollableContext()&&(e.offset.top+=l.scrollTop()-l.offset().top),m.is.horizontallyScrollableContext()&&(e.offset.left+=l.scrollLeft()-l.offset().left),m.cache.element=e},elementCalculations:function(){var e=m.get.screenCalculations();const o=m.get.elementPosition();return i.includeMargin?(o.margin={},o.margin.top=Number.parseInt(a.css("margin-top"),10),o.margin.bottom=Number.parseInt(a.css("margin-bottom"),10),o.top=o.offset.top-o.margin.top,o.bottom=o.offset.top+o.height+o.margin.bottom):(o.top=o.offset.top,o.bottom=o.offset.top+o.height),o.topPassed=e.top>=o.top,o.bottomPassed=e.top>=o.bottom,o.topVisible=e.bottom>=o.top&&!o.topPassed,o.bottomVisible=e.bottom>=o.bottom&&!o.bottomPassed,o.pixelsPassed=0,o.percentagePassed=0,o.onScreen=(o.topVisible||o.passing)&&!o.bottomPassed,o.passing=o.topPassed&&!o.bottomPassed,o.offScreen=!o.onScreen,o.passing&&(o.pixelsPassed=e.top-o.top,o.percentagePassed=(e.top-o.top)/o.height),m.cache.element=o,m.verbose("Updated element calculations",o),o},screenCalculations:function(){var e=m.get.scroll();return m.save.direction(),m.cache.screen.top=e,m.cache.screen.bottom=e+m.cache.screen.height,m.cache.screen},screenSize:function(){m.verbose("Saving window position"),m.cache.screen={height:l.height()}},position:function(){m.save.screenSize(),m.save.elementPosition()}},get:{pixelsPassed:function(e){var o=m.get.elementCalculations();return-1<e.search("%")?o.height*(Number.parseInt(e,10)/100):Number.parseInt(e,10)},occurred:function(e){return void 0!==m.cache.occurred&&m.cache.occurred[e]||!1},direction:function(){return void 0===m.cache.direction&&m.save.direction(),m.cache.direction},elementPosition:function(){return void 0===m.cache.element&&m.save.elementPosition(),m.cache.element},elementCalculations:function(){return void 0===m.cache.element&&m.save.elementCalculations(),m.cache.element},screenCalculations:function(){return void 0===m.cache.screen&&m.save.screenCalculations(),m.cache.screen},screenSize:function(){return void 0===m.cache.screen&&m.save.screenSize(),m.cache.screen},scroll:function(){return void 0===m.cache.scroll&&m.save.scroll(),m.cache.scroll},lastScroll:function(){return void 0===m.cache.screen?(m.debug("First scroll event, no last scroll could be found"),!1):m.cache.screen.top}},setting:function(e,o){if(k.isPlainObject(e))k.extend(!0,i,e);else{if(void 0===o)return i[e];i[e]=o}},internal:function(e,o){if(k.isPlainObject(e))k.extend(!0,m,e);else{if(void 0===o)return m[e];m[e]=o}},debug:function(...e){!i.silent&&i.debug&&(i.performance?m.performance.log(e):(m.debug=Function.prototype.bind.call(console.info,console,i.name+":"),m.debug.apply(console,e)))},verbose:function(...e){!i.silent&&i.verbose&&i.debug&&(i.performance?m.performance.log(e):(m.verbose=Function.prototype.bind.call(console.info,console,i.name+":"),m.verbose.apply(console,e)))},error:function(...e){i.silent||(m.error=Function.prototype.bind.call(console.error,console,i.name+":"),m.error.apply(console,e))},performance:{log:function(e){var o,n;i.performance&&(n=(o=Date.now())-(p||o),p=o,h.push({Name:e[0],Arguments:e.slice(1),Element:f,"Execution Time":n})),clearTimeout(m.performance.timer),m.performance.timer=setTimeout(function(){m.performance.display()},500)},display:function(){var e=i.name+":";let n=0;p=!1,clearTimeout(m.performance.timer),k.each(h,function(e,o){n+=o["Execution Time"]}),e+=" "+n+"ms",0<h.length&&(console.groupCollapsed(e),console.table(h),console.groupEnd()),h=[]}},invoke:function(t,e=y,o=f){let i=u,s,c,n;return"string"==typeof t&&void 0!==i&&(t=t.split(/[ .]/),s=t.length-1,k.each(t,function(e,o){var n=e!==s?o+t[e+1].charAt(0).toUpperCase()+t[e+1].slice(1):t;if(k.isPlainObject(i[n])&&e!==s)i=i[n];else{if(void 0!==i[n])return c=i[n],!1;{if(!k.isPlainObject(i[o])||e===s)return void 0!==i[o]?c=i[o]:m.error(r.method,t),!1;i=i[o]}}})),A(c)?n=c.apply(o,e):void 0!==c&&(n=c),Array.isArray(S)?S.push(n):void 0!==S?S=[S,n]:void 0!==n&&(S=n),c}};x?(void 0===u&&m.initialize(),u.save.scroll(),u.save.calculations(),m.invoke(P)):(void 0!==u&&u.invoke("destroy"),m.initialize())}),void 0!==S?S:this},k.fn.visibility.settings={name:"Visibility",namespace:"visibility",debug:!1,verbose:!1,performance:!0,observeChanges:!0,initialCheck:!0,refreshOnLoad:!0,refreshOnResize:!0,checkOnRefresh:!0,once:!0,continuous:!1,offset:0,includeMargin:!1,context:T,throttle:!1,type:!1,zIndex:"10",transition:"fade in",duration:1e3,onPassed:{},onOnScreen:!1,onOffScreen:!1,onPassing:!1,onTopVisible:!1,onBottomVisible:!1,onTopPassed:!1,onBottomPassed:!1,onPassingReverse:!1,onTopVisibleReverse:!1,onBottomVisibleReverse:!1,onTopPassedReverse:!1,onBottomPassedReverse:!1,onLoad:function(){},onAllLoaded:function(){},onFixed:function(){},onUnfixed:function(){},onUpdate:!1,onRefresh:function(){},metadata:{src:"src"},className:{fixed:"fixed",placeholder:"constraint",visible:"visible"},error:{method:"The method you called is not defined.",visible:"Element is hidden, you must call refresh after element becomes visible"}}}(jQuery,window,document);
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The Ancestral Component
4
+ #
5
+ # All components descend from this class. It provides:
6
+ # - ActiveModel::Attributes for declarative attribute definitions
7
+ # - Named slots via the `slot` class macro
8
+ # - The `render_in` contract: block capture, HTML safety, dev annotations
9
+ #
10
+ # See: specs/the-holy-view-spec.md, specs/the-holy-slot-spec.md
11
+
12
+ class Component
13
+ include ActiveModel::Model
14
+ include ActiveModel::Attributes
15
+
16
+ class_attribute :slot_names, default: []
17
+
18
+ def self.default(**overrides)
19
+ overrides.each do |name, value|
20
+ type = attribute_types.fetch(name.to_s).type
21
+ attribute name, type, default: value
22
+ end
23
+ end
24
+
25
+ def self.slot(name)
26
+ self.slot_names = slot_names + [ name ]
27
+
28
+ define_method(name) { |&block|
29
+ @slots[name] = @view_context.capture(&block)
30
+ }
31
+ end
32
+
33
+ def render_in(context, &block)
34
+ @view_context = context
35
+ @slots = {}
36
+ @content = context.capture(self, &block) if block
37
+ @content = ERB::Util.html_escape(@content) unless @content.nil? || @content.html_safe?
38
+
39
+ if Rails.env.development?
40
+ "<!-- BEGIN #{self.class.name} -->#{self}<!-- END #{self.class.name} -->".html_safe
41
+ else
42
+ to_s
43
+ end
44
+ end
45
+
46
+ def to_s
47
+ raise NotImplementedError
48
+ end
49
+
50
+ private
51
+
52
+ def tag
53
+ @view_context.tag
54
+ end
55
+
56
+ def safe_join(parts, sep = nil)
57
+ @view_context.safe_join(parts.compact, sep)
58
+ end
59
+
60
+ def class_names(*args)
61
+ @view_context.class_names(*args)
62
+ end
63
+ end
@@ -0,0 +1,27 @@
1
+ pin "ui", to: "ui/index.js"
2
+
3
+ pin "ui/controllers/fui_site_controller", to: "ui/controllers/fui_site_controller.js"
4
+ pin "ui/controllers/fui_form_controller", to: "ui/controllers/fui_form_controller.js"
5
+ pin "ui/controllers/fui_accordion_controller", to: "ui/controllers/fui_accordion_controller.js"
6
+ pin "ui/controllers/fui_api_controller", to: "ui/controllers/fui_api_controller.js"
7
+ pin "ui/controllers/fui_calendar_controller", to: "ui/controllers/fui_calendar_controller.js"
8
+ pin "ui/controllers/fui_checkbox_controller", to: "ui/controllers/fui_checkbox_controller.js"
9
+ pin "ui/controllers/fui_dimmer_controller", to: "ui/controllers/fui_dimmer_controller.js"
10
+ pin "ui/controllers/fui_dropdown_controller", to: "ui/controllers/fui_dropdown_controller.js"
11
+ pin "ui/controllers/fui_embed_controller", to: "ui/controllers/fui_embed_controller.js"
12
+ pin "ui/controllers/fui_flyout_controller", to: "ui/controllers/fui_flyout_controller.js"
13
+ pin "ui/controllers/fui_modal_controller", to: "ui/controllers/fui_modal_controller.js"
14
+ pin "ui/controllers/fui_nag_controller", to: "ui/controllers/fui_nag_controller.js"
15
+ pin "ui/controllers/fui_popup_controller", to: "ui/controllers/fui_popup_controller.js"
16
+ pin "ui/controllers/fui_progress_controller", to: "ui/controllers/fui_progress_controller.js"
17
+ pin "ui/controllers/fui_rating_controller", to: "ui/controllers/fui_rating_controller.js"
18
+ pin "ui/controllers/fui_search_controller", to: "ui/controllers/fui_search_controller.js"
19
+ pin "ui/controllers/fui_shape_controller", to: "ui/controllers/fui_shape_controller.js"
20
+ pin "ui/controllers/fui_sidebar_controller", to: "ui/controllers/fui_sidebar_controller.js"
21
+ pin "ui/controllers/fui_slider_controller", to: "ui/controllers/fui_slider_controller.js"
22
+ pin "ui/controllers/fui_state_controller", to: "ui/controllers/fui_state_controller.js"
23
+ pin "ui/controllers/fui_sticky_controller", to: "ui/controllers/fui_sticky_controller.js"
24
+ pin "ui/controllers/fui_tab_controller", to: "ui/controllers/fui_tab_controller.js"
25
+ pin "ui/controllers/fui_toast_controller", to: "ui/controllers/fui_toast_controller.js"
26
+ pin "ui/controllers/fui_transition_controller", to: "ui/controllers/fui_transition_controller.js"
27
+ pin "ui/controllers/fui_visibility_controller", to: "ui/controllers/fui_visibility_controller.js"
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The Sacred Template Handler
4
+ #
5
+ # Registers .html.ruby as a template format. View files are pure Ruby —
6
+ # no angle brackets, no ERB sigils. All output flows through components
7
+ # and the `text` helper method into the output buffer.
8
+ #
9
+ # In development, templates are annotated with HTML comments and metadata
10
+ # so that browser dev tools can identify template boundaries.
11
+
12
+ ActionView::Template.register_template_handler :ruby, ->(template, source) {
13
+ if Rails.env.development?
14
+ meta = {
15
+ path: template.short_identifier,
16
+ virtual_path: template.virtual_path,
17
+ format: template.format,
18
+ variant: template.variant
19
+ }.to_json.gsub('"', '\\"')
20
+
21
+ <<~RUBY
22
+ output_buffer << "<template data-view-meta='#{meta}'></template>\\n".html_safe
23
+ output_buffer << "<!-- BEGIN #{template.short_identifier} -->\\n".html_safe
24
+ #{source}
25
+ output_buffer << "<!-- END #{template.short_identifier} -->\\n".html_safe
26
+ output_buffer
27
+ RUBY
28
+ else
29
+ "#{source}\noutput_buffer"
30
+ end
31
+ }
data/config/routes.rb ADDED
@@ -0,0 +1,2 @@
1
+ Rails.application.routes.draw do
2
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :ui do
3
+ # # Task goes here
4
+ # end
data/lib/ui/engine.rb ADDED
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Ui
4
+ class Engine < ::Rails::Engine
5
+ initializer "ui.autoload_paths" do |app|
6
+ app.config.autoload_paths += [ root.join("app", "lib").to_s ]
7
+ end
8
+
9
+ initializer "ui.assets" do |app|
10
+ app.config.assets.paths << root.join("formantic-ui")
11
+ app.config.assets.paths << root.join("app/javascript")
12
+ end
13
+
14
+ initializer "ui.importmap", before: "importmap" do |app|
15
+ if app.config.respond_to?(:importmap)
16
+ app.config.importmap.paths << root.join("config/importmap.rb")
17
+ end
18
+ end
19
+
20
+ initializer "ui.helpers" do
21
+ ActiveSupport.on_load(:action_view) do
22
+ include ComponentHelper
23
+ include FuiHelper
24
+ end
25
+ end
26
+ end
27
+ end
data/lib/ui/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Ui
2
+ VERSION = "0.1.0"
3
+ end
data/lib/ui.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "ui/version"
2
+ require "ui/engine"
3
+
4
+ module Ui
5
+ # Your code goes here...
6
+ end
metadata ADDED
@@ -0,0 +1,220 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rails-active-ui
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - nathan
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-01 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 8.1.0
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 8.1.0
26
+ description: ActiveModel::Attributes-based view components
27
+ email:
28
+ - nathankidd@hey.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - Rakefile
34
+ - app/assets/stylesheets.css
35
+ - app/components/accordion_component.rb
36
+ - app/components/ad_component.rb
37
+ - app/components/api_component.rb
38
+ - app/components/breadcrumb_component.rb
39
+ - app/components/button_component.rb
40
+ - app/components/calendar_component.rb
41
+ - app/components/card_component.rb
42
+ - app/components/checkbox_component.rb
43
+ - app/components/column_component.rb
44
+ - app/components/comment_component.rb
45
+ - app/components/concerns/alignable.rb
46
+ - app/components/concerns/attachable.rb
47
+ - app/components/concerns/orientable.rb
48
+ - app/components/concerns/positionable.rb
49
+ - app/components/concerns/sizeable.rb
50
+ - app/components/container_component.rb
51
+ - app/components/dimmer_component.rb
52
+ - app/components/divider_component.rb
53
+ - app/components/dropdown_component.rb
54
+ - app/components/embed_component.rb
55
+ - app/components/emoji_component.rb
56
+ - app/components/feed_component.rb
57
+ - app/components/flag_component.rb
58
+ - app/components/flyout_component.rb
59
+ - app/components/form_component.rb
60
+ - app/components/grid_component.rb
61
+ - app/components/h_stack_component.rb
62
+ - app/components/header_component.rb
63
+ - app/components/icon_component.rb
64
+ - app/components/image_component.rb
65
+ - app/components/input_component.rb
66
+ - app/components/item_component.rb
67
+ - app/components/item_group_component.rb
68
+ - app/components/label_component.rb
69
+ - app/components/link_component.rb
70
+ - app/components/list_component.rb
71
+ - app/components/loader_component.rb
72
+ - app/components/menu_component.rb
73
+ - app/components/menu_item_component.rb
74
+ - app/components/message_component.rb
75
+ - app/components/modal_component.rb
76
+ - app/components/nag_component.rb
77
+ - app/components/overlay_component.rb
78
+ - app/components/placeholder_component.rb
79
+ - app/components/popup_component.rb
80
+ - app/components/progress_component.rb
81
+ - app/components/pusher_component.rb
82
+ - app/components/rail_component.rb
83
+ - app/components/rating_component.rb
84
+ - app/components/reset_component.rb
85
+ - app/components/reveal_component.rb
86
+ - app/components/row_component.rb
87
+ - app/components/search_component.rb
88
+ - app/components/segment_component.rb
89
+ - app/components/segment_group_component.rb
90
+ - app/components/shape_component.rb
91
+ - app/components/sidebar_component.rb
92
+ - app/components/site_component.rb
93
+ - app/components/slider_component.rb
94
+ - app/components/state_component.rb
95
+ - app/components/statistic_component.rb
96
+ - app/components/step_component.rb
97
+ - app/components/step_group_component.rb
98
+ - app/components/sticky_component.rb
99
+ - app/components/sub_header_component.rb
100
+ - app/components/sub_menu_component.rb
101
+ - app/components/tab_component.rb
102
+ - app/components/table_cell_component.rb
103
+ - app/components/table_component.rb
104
+ - app/components/table_row_component.rb
105
+ - app/components/text_component.rb
106
+ - app/components/toast_component.rb
107
+ - app/components/transition_component.rb
108
+ - app/components/v_stack_component.rb
109
+ - app/components/visibility_component.rb
110
+ - app/helpers/component_helper.rb
111
+ - app/helpers/fui_helper.rb
112
+ - app/javascript/accordion.js
113
+ - app/javascript/accordion.min.js
114
+ - app/javascript/api.js
115
+ - app/javascript/api.min.js
116
+ - app/javascript/calendar.js
117
+ - app/javascript/calendar.min.js
118
+ - app/javascript/checkbox.js
119
+ - app/javascript/checkbox.min.js
120
+ - app/javascript/dimmer.js
121
+ - app/javascript/dimmer.min.js
122
+ - app/javascript/dropdown.js
123
+ - app/javascript/dropdown.min.js
124
+ - app/javascript/embed.js
125
+ - app/javascript/embed.min.js
126
+ - app/javascript/flyout.js
127
+ - app/javascript/flyout.min.js
128
+ - app/javascript/form.js
129
+ - app/javascript/form.min.js
130
+ - app/javascript/jquery.js
131
+ - app/javascript/jquery.min.js
132
+ - app/javascript/modal.js
133
+ - app/javascript/modal.min.js
134
+ - app/javascript/nag.js
135
+ - app/javascript/nag.min.js
136
+ - app/javascript/popup.js
137
+ - app/javascript/popup.min.js
138
+ - app/javascript/progress.js
139
+ - app/javascript/progress.min.js
140
+ - app/javascript/rating.js
141
+ - app/javascript/rating.min.js
142
+ - app/javascript/search.js
143
+ - app/javascript/search.min.js
144
+ - app/javascript/shape.js
145
+ - app/javascript/shape.min.js
146
+ - app/javascript/sidebar.js
147
+ - app/javascript/sidebar.min.js
148
+ - app/javascript/site.js
149
+ - app/javascript/site.min.js
150
+ - app/javascript/slider.js
151
+ - app/javascript/slider.min.js
152
+ - app/javascript/state.js
153
+ - app/javascript/state.min.js
154
+ - app/javascript/sticky.js
155
+ - app/javascript/sticky.min.js
156
+ - app/javascript/tab.js
157
+ - app/javascript/tab.min.js
158
+ - app/javascript/toast.js
159
+ - app/javascript/toast.min.js
160
+ - app/javascript/transition.js
161
+ - app/javascript/transition.min.js
162
+ - app/javascript/ui/controllers/fui_accordion_controller.js
163
+ - app/javascript/ui/controllers/fui_api_controller.js
164
+ - app/javascript/ui/controllers/fui_calendar_controller.js
165
+ - app/javascript/ui/controllers/fui_checkbox_controller.js
166
+ - app/javascript/ui/controllers/fui_dimmer_controller.js
167
+ - app/javascript/ui/controllers/fui_dropdown_controller.js
168
+ - app/javascript/ui/controllers/fui_embed_controller.js
169
+ - app/javascript/ui/controllers/fui_flyout_controller.js
170
+ - app/javascript/ui/controllers/fui_form_controller.js
171
+ - app/javascript/ui/controllers/fui_modal_controller.js
172
+ - app/javascript/ui/controllers/fui_nag_controller.js
173
+ - app/javascript/ui/controllers/fui_popup_controller.js
174
+ - app/javascript/ui/controllers/fui_progress_controller.js
175
+ - app/javascript/ui/controllers/fui_rating_controller.js
176
+ - app/javascript/ui/controllers/fui_search_controller.js
177
+ - app/javascript/ui/controllers/fui_shape_controller.js
178
+ - app/javascript/ui/controllers/fui_sidebar_controller.js
179
+ - app/javascript/ui/controllers/fui_site_controller.js
180
+ - app/javascript/ui/controllers/fui_slider_controller.js
181
+ - app/javascript/ui/controllers/fui_state_controller.js
182
+ - app/javascript/ui/controllers/fui_sticky_controller.js
183
+ - app/javascript/ui/controllers/fui_tab_controller.js
184
+ - app/javascript/ui/controllers/fui_toast_controller.js
185
+ - app/javascript/ui/controllers/fui_transition_controller.js
186
+ - app/javascript/ui/controllers/fui_visibility_controller.js
187
+ - app/javascript/ui/index.js
188
+ - app/javascript/visibility.js
189
+ - app/javascript/visibility.min.js
190
+ - app/lib/component.rb
191
+ - config/importmap.rb
192
+ - config/initializers/ruby_template_handler.rb
193
+ - config/routes.rb
194
+ - lib/tasks/ui_tasks.rake
195
+ - lib/ui.rb
196
+ - lib/ui/engine.rb
197
+ - lib/ui/version.rb
198
+ homepage: https://github.com/n-at-han-k/rails-active-ui
199
+ licenses: []
200
+ metadata:
201
+ homepage_uri: https://github.com/n-at-han-k/rails-active-ui
202
+ source_code_uri: https://github.com/n-at-han-k/rails-active-ui
203
+ rdoc_options: []
204
+ require_paths:
205
+ - lib
206
+ required_ruby_version: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ">="
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ required_rubygems_version: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ requirements: []
217
+ rubygems_version: 3.7.2
218
+ specification_version: 4
219
+ summary: ActiveModel::Attributes-based view components
220
+ test_files: []