unmagic-components 0.3.0 → 0.4.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 (292) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +98 -1
  3. data/README.md +506 -1
  4. data/app/assets/icons/lucide/LICENSE +43 -0
  5. data/app/assets/icons/lucide/arrow-down.svg +1 -0
  6. data/app/assets/icons/lucide/arrow-left.svg +1 -0
  7. data/app/assets/icons/lucide/arrow-up.svg +1 -0
  8. data/app/assets/icons/lucide/ban.svg +1 -0
  9. data/app/assets/icons/lucide/brain.svg +1 -0
  10. data/app/assets/icons/lucide/check.svg +1 -0
  11. data/app/assets/icons/lucide/chevron-down.svg +1 -0
  12. data/app/assets/icons/lucide/chevron-left.svg +1 -0
  13. data/app/assets/icons/lucide/chevron-right.svg +1 -0
  14. data/app/assets/icons/lucide/circle-check.svg +1 -0
  15. data/app/assets/icons/lucide/circle-dashed.svg +1 -0
  16. data/app/assets/icons/lucide/circle-question-mark.svg +1 -0
  17. data/app/assets/icons/lucide/circle-stop.svg +1 -0
  18. data/app/assets/icons/lucide/circle-x.svg +1 -0
  19. data/app/assets/icons/lucide/clock.svg +1 -0
  20. data/app/assets/icons/lucide/copy.svg +1 -0
  21. data/app/assets/icons/lucide/ellipsis-vertical.svg +1 -0
  22. data/app/assets/icons/lucide/file.svg +1 -0
  23. data/app/assets/icons/lucide/folder.svg +1 -0
  24. data/app/assets/icons/lucide/grip-vertical.svg +1 -0
  25. data/app/assets/icons/lucide/info.svg +1 -0
  26. data/app/assets/icons/lucide/lightbulb.svg +1 -0
  27. data/app/assets/icons/lucide/list-checks.svg +1 -0
  28. data/app/assets/icons/lucide/loader-circle.svg +1 -0
  29. data/app/assets/icons/lucide/messages-square.svg +1 -0
  30. data/app/assets/icons/lucide/paperclip.svg +1 -0
  31. data/app/assets/icons/lucide/pencil.svg +1 -0
  32. data/app/assets/icons/lucide/plus.svg +1 -0
  33. data/app/assets/icons/lucide/rotate-cw.svg +1 -0
  34. data/app/assets/icons/lucide/shield-alert.svg +1 -0
  35. data/app/assets/icons/lucide/timer.svg +1 -0
  36. data/app/assets/icons/lucide/triangle-alert.svg +1 -0
  37. data/app/assets/icons/lucide/wrench.svg +1 -0
  38. data/app/assets/icons/lucide/x.svg +1 -0
  39. data/app/assets/javascripts/unmagic/components/ai_chat.js +142 -0
  40. data/app/assets/javascripts/unmagic/components/autoscroll.js +103 -0
  41. data/app/assets/javascripts/unmagic/components/board.js +65 -0
  42. data/app/assets/javascripts/unmagic/components/dropzone.js +206 -0
  43. data/app/assets/javascripts/unmagic/components/elapsed.js +64 -0
  44. data/app/assets/javascripts/unmagic/components/optimistic.js +71 -0
  45. data/app/assets/javascripts/unmagic/components/placement.js +30 -0
  46. data/app/assets/javascripts/unmagic/components/slash_menu.js +186 -0
  47. data/app/assets/javascripts/unmagic/components/sortable.js +6 -0
  48. data/app/assets/javascripts/unmagic/components/sortable_item.js +122 -0
  49. data/app/assets/javascripts/unmagic/components/sortable_list.js +135 -0
  50. data/app/assets/javascripts/unmagic/components/sortable_param.js +14 -0
  51. data/app/assets/javascripts/unmagic/components/sortable_session.js +502 -0
  52. data/app/assets/javascripts/unmagic/components/streaming_markdown.js +269 -0
  53. data/app/assets/javascripts/unmagic/components/toasts.js +14 -4
  54. data/app/assets/javascripts/unmagic/components/toolbar.js +76 -0
  55. data/app/assets/javascripts/unmagic/components/upsert.js +4 -20
  56. data/app/assets/javascripts/unmagic/components.js +10 -0
  57. data/app/assets/tailwind/unmagic_components/engine.css +1515 -0
  58. data/lib/unmagic/components/action_view_helpers.rb +558 -3
  59. data/lib/unmagic/components/ai_chat/action_bar.rb +70 -0
  60. data/lib/unmagic/components/ai_chat/attachments.rb +119 -0
  61. data/lib/unmagic/components/ai_chat/branch_picker.rb +65 -0
  62. data/lib/unmagic/components/ai_chat/citation.rb +89 -0
  63. data/lib/unmagic/components/ai_chat/composer.rb +160 -0
  64. data/lib/unmagic/components/ai_chat/failure.rb +80 -0
  65. data/lib/unmagic/components/ai_chat/message.rb +142 -0
  66. data/lib/unmagic/components/ai_chat/payload.rb +93 -0
  67. data/lib/unmagic/components/ai_chat/permission.rb +143 -0
  68. data/lib/unmagic/components/ai_chat/plan.rb +91 -0
  69. data/lib/unmagic/components/ai_chat/proposal.rb +102 -0
  70. data/lib/unmagic/components/ai_chat/reasoning.rb +75 -0
  71. data/lib/unmagic/components/ai_chat/request.rb +206 -0
  72. data/lib/unmagic/components/ai_chat/section.rb +53 -0
  73. data/lib/unmagic/components/ai_chat/slash_menu.rb +68 -0
  74. data/lib/unmagic/components/ai_chat/tool_call.rb +181 -0
  75. data/lib/unmagic/components/ai_chat/transcript.rb +68 -0
  76. data/lib/unmagic/components/ai_chat/welcome.rb +73 -0
  77. data/lib/unmagic/components/ai_chat/workspace.rb +74 -0
  78. data/lib/unmagic/components/ai_chat.rb +31 -0
  79. data/lib/unmagic/components/avatar.rb +134 -0
  80. data/lib/unmagic/components/board.rb +182 -0
  81. data/lib/unmagic/components/browser/app/controllers/unmagic/components/browser/application_controller.rb +80 -0
  82. data/lib/unmagic/components/browser/app/controllers/unmagic/components/browser/demos_controller.rb +137 -0
  83. data/lib/unmagic/components/browser/app/controllers/unmagic/components/browser/pages_controller.rb +40 -0
  84. data/lib/unmagic/components/browser/app/helpers/unmagic/components/browser/application_helper.rb +52 -0
  85. data/lib/unmagic/components/browser/app/models/unmagic/components/browser/board_store.rb +88 -0
  86. data/lib/unmagic/components/browser/app/models/unmagic/components/browser/catalog.rb +65 -0
  87. data/lib/unmagic/components/browser/app/models/unmagic/components/browser/pager.rb +11 -0
  88. data/lib/unmagic/components/browser/app/models/unmagic/components/browser/profile.rb +25 -0
  89. data/lib/unmagic/components/browser/app/models/unmagic/components/browser/reply.rb +72 -0
  90. data/lib/unmagic/components/browser/app/models/unmagic/components/browser/thing.rb +31 -0
  91. data/lib/unmagic/components/browser/app/views/layouts/unmagic/components/browser/application.html.erb +65 -0
  92. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/application/_code.html.erb +7 -0
  93. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/application/_crumb.html.erb +7 -0
  94. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/application/_example.html.erb +37 -0
  95. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/application/_nav.html.erb +17 -0
  96. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/demos/edit_profile.html.erb +9 -0
  97. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat/_conversation.html.erb +101 -0
  98. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat/_live.html.erb +53 -0
  99. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat/_thumbnail.html.erb +7 -0
  100. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat/_welcome.html.erb +12 -0
  101. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_action_bar/_always.html.erb +6 -0
  102. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_action_bar/_hover.html.erb +12 -0
  103. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_action_bar/_thumbnail.html.erb +5 -0
  104. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_attachments/_dropzone.html.erb +17 -0
  105. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_attachments/_sent.html.erb +11 -0
  106. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_attachments/_thumbnail.html.erb +6 -0
  107. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_branch_picker/_positions.html.erb +5 -0
  108. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_branch_picker/_thumbnail.html.erb +3 -0
  109. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_citation/_compact.html.erb +10 -0
  110. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_citation/_quote.html.erb +11 -0
  111. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_citation/_thumbnail.html.erb +7 -0
  112. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_composer/_parts.html.erb +14 -0
  113. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_composer/_states.html.erb +8 -0
  114. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_composer/_thumbnail.html.erb +5 -0
  115. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_failure/_full.html.erb +11 -0
  116. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_failure/_plain.html.erb +3 -0
  117. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_failure/_thumbnail.html.erb +5 -0
  118. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_message/_parts.html.erb +23 -0
  119. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_message/_states.html.erb +9 -0
  120. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_message/_thumbnail.html.erb +4 -0
  121. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_message/_turns.html.erb +16 -0
  122. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_payload/_json.html.erb +4 -0
  123. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_payload/_text.html.erb +4 -0
  124. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_payload/_thumbnail.html.erb +3 -0
  125. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_permission/_answered.html.erb +12 -0
  126. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_permission/_thumbnail.html.erb +7 -0
  127. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_permission/_waiting.html.erb +12 -0
  128. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_plan/_empty.html.erb +3 -0
  129. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_plan/_states.html.erb +9 -0
  130. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_plan/_thumbnail.html.erb +7 -0
  131. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_proposal/_decided.html.erb +11 -0
  132. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_proposal/_inline.html.erb +18 -0
  133. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_proposal/_thumbnail.html.erb +6 -0
  134. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_reasoning/_settled.html.erb +6 -0
  135. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_reasoning/_thinking.html.erb +5 -0
  136. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_reasoning/_thumbnail.html.erb +3 -0
  137. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_request/_answered.html.erb +10 -0
  138. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_request/_choices.html.erb +13 -0
  139. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_request/_form.html.erb +9 -0
  140. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_request/_thumbnail.html.erb +8 -0
  141. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_slash_menu/_composer.html.erb +15 -0
  142. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_slash_menu/_thumbnail.html.erb +9 -0
  143. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_tool_call/_made.html.erb +12 -0
  144. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_tool_call/_run.html.erb +25 -0
  145. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_tool_call/_states.html.erb +22 -0
  146. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_tool_call/_thumbnail.html.erb +7 -0
  147. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_welcome/_suggestions.html.erb +11 -0
  148. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_welcome/_thumbnail.html.erb +6 -0
  149. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_workspace/_files.html.erb +12 -0
  150. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_workspace/_thumbnail.html.erb +7 -0
  151. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/avatar/_group.html.erb +5 -0
  152. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/avatar/_sizes.html.erb +8 -0
  153. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/avatar/_thumbnail.html.erb +5 -0
  154. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/avatar/_tints.html.erb +7 -0
  155. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/badge/_in_context.html.erb +14 -0
  156. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/badge/_thumbnail.html.erb +5 -0
  157. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/badge/_tones.html.erb +8 -0
  158. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/board/_handles.html.erb +13 -0
  159. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/board/_live.html.erb +34 -0
  160. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/board/_thumbnail.html.erb +10 -0
  161. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/button/_sizes.html.erb +12 -0
  162. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/button/_thumbnail.html.erb +4 -0
  163. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/button/_variants.html.erb +6 -0
  164. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/callout/_neutral.html.erb +3 -0
  165. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/callout/_thumbnail.html.erb +5 -0
  166. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/callout/_tones.html.erb +14 -0
  167. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/card/_actions_and_footer.html.erb +7 -0
  168. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/card/_flush_table.html.erb +6 -0
  169. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/card/_link.html.erb +6 -0
  170. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/card/_thumbnail.html.erb +6 -0
  171. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/confirm/_danger.html.erb +3 -0
  172. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/confirm/_plain.html.erb +2 -0
  173. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/confirm/_thumbnail.html.erb +7 -0
  174. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/copy_button/_from_element.html.erb +4 -0
  175. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/copy_button/_thumbnail.html.erb +4 -0
  176. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/copy_button/_with_label.html.erb +3 -0
  177. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/detail_list/_inline.html.erb +5 -0
  178. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/detail_list/_stacked.html.erb +7 -0
  179. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/detail_list/_thumbnail.html.erb +5 -0
  180. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/dialog/_dialog_tag.html.erb +8 -0
  181. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/dialog/_modal.html.erb +10 -0
  182. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/dialog/_thumbnail.html.erb +4 -0
  183. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/elapsed/_countdown.html.erb +3 -0
  184. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/elapsed/_running.html.erb +8 -0
  185. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/elapsed/_thumbnail.html.erb +4 -0
  186. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/empty_state/_default.html.erb +1 -0
  187. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/empty_state/_thumbnail.html.erb +3 -0
  188. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_autogrow.html.erb +4 -0
  189. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_control_classes.html.erb +54 -0
  190. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_fields.html.erb +28 -0
  191. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_states.html.erb +11 -0
  192. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_thumbnail.html.erb +8 -0
  193. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_uuid_field.html.erb +9 -0
  194. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/local_time/_absolute.html.erb +5 -0
  195. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/local_time/_relative.html.erb +14 -0
  196. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/local_time/_thumbnail.html.erb +14 -0
  197. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/menu/_actions.html.erb +10 -0
  198. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/menu/_labelled.html.erb +6 -0
  199. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/menu/_thumbnail.html.erb +14 -0
  200. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/page_header/_default.html.erb +7 -0
  201. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/page_header/_thumbnail.html.erb +5 -0
  202. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/page_header/_with_leading.html.erb +14 -0
  203. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_blocking_out.html.erb +25 -0
  204. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_card.html.erb +7 -0
  205. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_detail_list.html.erb +15 -0
  206. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_page_header.html.erb +7 -0
  207. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_text_and_button.html.erb +17 -0
  208. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_thumbnail.html.erb +10 -0
  209. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/sortable_list/_connected.html.erb +17 -0
  210. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/sortable_list/_grid.html.erb +20 -0
  211. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/sortable_list/_handles.html.erb +22 -0
  212. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/sortable_list/_thumbnail.html.erb +7 -0
  213. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/streaming_markdown/_reveal.html.erb +19 -0
  214. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/streaming_markdown/_stopped.html.erb +31 -0
  215. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/streaming_markdown/_thumbnail.html.erb +5 -0
  216. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/table/_deferred.html.erb +6 -0
  217. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/table/_empty.html.erb +5 -0
  218. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/table/_sortable.html.erb +8 -0
  219. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/table/_table_tag.html.erb +4 -0
  220. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/table/_thumbnail.html.erb +4 -0
  221. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tabs/_links.html.erb +5 -0
  222. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tabs/_panels.html.erb +18 -0
  223. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tabs/_thumbnail.html.erb +5 -0
  224. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/toast/_above_dialog.html.erb +10 -0
  225. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/toast/_flash.html.erb +13 -0
  226. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/toast/_stream.html.erb +6 -0
  227. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/toast/_thumbnail.html.erb +10 -0
  228. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tooltip/_placement.html.erb +8 -0
  229. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tooltip/_term.html.erb +5 -0
  230. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tooltip/_thumbnail.html.erb +5 -0
  231. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/pages/component.html.erb +58 -0
  232. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/pages/installation.html.erb +47 -0
  233. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/pages/overview.html.erb +49 -0
  234. data/lib/unmagic/components/browser/app/views/unmagic/components/browser/pages/theming.html.erb +52 -0
  235. data/lib/unmagic/components/browser/assets/browser.css +2 -0
  236. data/lib/unmagic/components/browser/catalog/ai_chat.rb +21 -0
  237. data/lib/unmagic/components/browser/catalog/ai_chat_action_bar.rb +15 -0
  238. data/lib/unmagic/components/browser/catalog/ai_chat_attachments.rb +15 -0
  239. data/lib/unmagic/components/browser/catalog/ai_chat_branch_picker.rb +12 -0
  240. data/lib/unmagic/components/browser/catalog/ai_chat_citation.rb +15 -0
  241. data/lib/unmagic/components/browser/catalog/ai_chat_composer.rb +16 -0
  242. data/lib/unmagic/components/browser/catalog/ai_chat_failure.rb +15 -0
  243. data/lib/unmagic/components/browser/catalog/ai_chat_message.rb +17 -0
  244. data/lib/unmagic/components/browser/catalog/ai_chat_payload.rb +16 -0
  245. data/lib/unmagic/components/browser/catalog/ai_chat_permission.rb +15 -0
  246. data/lib/unmagic/components/browser/catalog/ai_chat_plan.rb +14 -0
  247. data/lib/unmagic/components/browser/catalog/ai_chat_proposal.rb +15 -0
  248. data/lib/unmagic/components/browser/catalog/ai_chat_reasoning.rb +14 -0
  249. data/lib/unmagic/components/browser/catalog/ai_chat_request.rb +17 -0
  250. data/lib/unmagic/components/browser/catalog/ai_chat_slash_menu.rb +14 -0
  251. data/lib/unmagic/components/browser/catalog/ai_chat_tool_call.rb +17 -0
  252. data/lib/unmagic/components/browser/catalog/ai_chat_welcome.rb +13 -0
  253. data/lib/unmagic/components/browser/catalog/ai_chat_workspace.rb +12 -0
  254. data/lib/unmagic/components/browser/catalog/avatar.rb +15 -0
  255. data/lib/unmagic/components/browser/catalog/badge.rb +11 -0
  256. data/lib/unmagic/components/browser/catalog/board.rb +18 -0
  257. data/lib/unmagic/components/browser/catalog/button.rb +14 -0
  258. data/lib/unmagic/components/browser/catalog/callout.rb +13 -0
  259. data/lib/unmagic/components/browser/catalog/card.rb +16 -0
  260. data/lib/unmagic/components/browser/catalog/confirm.rb +14 -0
  261. data/lib/unmagic/components/browser/catalog/copy_button.rb +15 -0
  262. data/lib/unmagic/components/browser/catalog/detail_list.rb +14 -0
  263. data/lib/unmagic/components/browser/catalog/dialog.rb +15 -0
  264. data/lib/unmagic/components/browser/catalog/elapsed.rb +14 -0
  265. data/lib/unmagic/components/browser/catalog/empty_state.rb +11 -0
  266. data/lib/unmagic/components/browser/catalog/forms.rb +21 -0
  267. data/lib/unmagic/components/browser/catalog/local_time.rb +13 -0
  268. data/lib/unmagic/components/browser/catalog/menu.rb +15 -0
  269. data/lib/unmagic/components/browser/catalog/page_header.rb +13 -0
  270. data/lib/unmagic/components/browser/catalog/skeleton.rb +18 -0
  271. data/lib/unmagic/components/browser/catalog/sortable_list.rb +17 -0
  272. data/lib/unmagic/components/browser/catalog/streaming_markdown.rb +17 -0
  273. data/lib/unmagic/components/browser/catalog/table.rb +17 -0
  274. data/lib/unmagic/components/browser/catalog/tabs.rb +15 -0
  275. data/lib/unmagic/components/browser/catalog/toast.rb +17 -0
  276. data/lib/unmagic/components/browser/catalog/tooltip.rb +14 -0
  277. data/lib/unmagic/components/browser/config/routes.rb +41 -0
  278. data/lib/unmagic/components/browser/tailwind/browser.css +33 -0
  279. data/lib/unmagic/components/browser.rb +39 -0
  280. data/lib/unmagic/components/configuration.rb +31 -1
  281. data/lib/unmagic/components/duration.rb +35 -0
  282. data/lib/unmagic/components/elapsed.rb +46 -0
  283. data/lib/unmagic/components/engine.rb +9 -0
  284. data/lib/unmagic/components/icons.rb +34 -26
  285. data/lib/unmagic/components/modal.rb +1 -1
  286. data/lib/unmagic/components/page_header.rb +8 -0
  287. data/lib/unmagic/components/sortable.rb +104 -0
  288. data/lib/unmagic/components/streaming_markdown.rb +34 -0
  289. data/lib/unmagic/components/turbo_stream_actions.rb +16 -0
  290. data/lib/unmagic/components/version.rb +1 -1
  291. data/lib/unmagic/components.rb +30 -1
  292. metadata +308 -4
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unmagic-components
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keith Pitt
@@ -51,6 +51,34 @@ dependencies:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  version: '7.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: unmagic-icon
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.3'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.3'
68
+ - !ruby/object:Gem::Dependency
69
+ name: unmagic-color
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.3'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.3'
54
82
  - !ruby/object:Gem::Dependency
55
83
  name: rspec
56
84
  requirement: !ruby/object:Gem::Requirement
@@ -83,9 +111,10 @@ description: UI components for Rails views in the spirit of form_for. Builders f
83
111
  index tables (sortable, deferred, kept live by Turbo Streams), detail lists, forms,
84
112
  cards, page headers and loading skeletons; a Turbo Frame modal, a confirm dialog
85
113
  and flash toasts; menus, tabs, tooltips, local times, copy buttons, autogrowing
86
- textareas and UUID inputs as self-registering custom elements. Plain helpers styled
87
- with Tailwind CSS v4 (required; the host's build compiles the gem's component CSS),
88
- with no Stimulus.
114
+ textareas and UUID inputs as self-registering custom elements; and AI chat components
115
+ transcripts, streamed replies, tool-call timelines, plans, permission requests
116
+ and a composer — kept live by Turbo Streams. Plain helpers styled with Tailwind
117
+ CSS v4 (required; the host's build compiles the gem's component CSS), with no Stimulus.
89
118
  email:
90
119
  - keith@unreasonable-magic.com
91
120
  executables: []
@@ -95,16 +124,66 @@ files:
95
124
  - CHANGELOG.md
96
125
  - LICENSE
97
126
  - README.md
127
+ - app/assets/icons/lucide/LICENSE
128
+ - app/assets/icons/lucide/arrow-down.svg
129
+ - app/assets/icons/lucide/arrow-left.svg
130
+ - app/assets/icons/lucide/arrow-up.svg
131
+ - app/assets/icons/lucide/ban.svg
132
+ - app/assets/icons/lucide/brain.svg
133
+ - app/assets/icons/lucide/check.svg
134
+ - app/assets/icons/lucide/chevron-down.svg
135
+ - app/assets/icons/lucide/chevron-left.svg
136
+ - app/assets/icons/lucide/chevron-right.svg
137
+ - app/assets/icons/lucide/circle-check.svg
138
+ - app/assets/icons/lucide/circle-dashed.svg
139
+ - app/assets/icons/lucide/circle-question-mark.svg
140
+ - app/assets/icons/lucide/circle-stop.svg
141
+ - app/assets/icons/lucide/circle-x.svg
142
+ - app/assets/icons/lucide/clock.svg
143
+ - app/assets/icons/lucide/copy.svg
144
+ - app/assets/icons/lucide/ellipsis-vertical.svg
145
+ - app/assets/icons/lucide/file.svg
146
+ - app/assets/icons/lucide/folder.svg
147
+ - app/assets/icons/lucide/grip-vertical.svg
148
+ - app/assets/icons/lucide/info.svg
149
+ - app/assets/icons/lucide/lightbulb.svg
150
+ - app/assets/icons/lucide/list-checks.svg
151
+ - app/assets/icons/lucide/loader-circle.svg
152
+ - app/assets/icons/lucide/messages-square.svg
153
+ - app/assets/icons/lucide/paperclip.svg
154
+ - app/assets/icons/lucide/pencil.svg
155
+ - app/assets/icons/lucide/plus.svg
156
+ - app/assets/icons/lucide/rotate-cw.svg
157
+ - app/assets/icons/lucide/shield-alert.svg
158
+ - app/assets/icons/lucide/timer.svg
159
+ - app/assets/icons/lucide/triangle-alert.svg
160
+ - app/assets/icons/lucide/wrench.svg
161
+ - app/assets/icons/lucide/x.svg
98
162
  - app/assets/javascripts/unmagic/components.js
163
+ - app/assets/javascripts/unmagic/components/ai_chat.js
99
164
  - app/assets/javascripts/unmagic/components/autogrow.js
165
+ - app/assets/javascripts/unmagic/components/autoscroll.js
166
+ - app/assets/javascripts/unmagic/components/board.js
100
167
  - app/assets/javascripts/unmagic/components/clipboard.js
101
168
  - app/assets/javascripts/unmagic/components/confirm.js
102
169
  - app/assets/javascripts/unmagic/components/dialog.js
170
+ - app/assets/javascripts/unmagic/components/dropzone.js
171
+ - app/assets/javascripts/unmagic/components/elapsed.js
103
172
  - app/assets/javascripts/unmagic/components/menu.js
104
173
  - app/assets/javascripts/unmagic/components/modal.js
174
+ - app/assets/javascripts/unmagic/components/optimistic.js
175
+ - app/assets/javascripts/unmagic/components/placement.js
176
+ - app/assets/javascripts/unmagic/components/slash_menu.js
177
+ - app/assets/javascripts/unmagic/components/sortable.js
178
+ - app/assets/javascripts/unmagic/components/sortable_item.js
179
+ - app/assets/javascripts/unmagic/components/sortable_list.js
180
+ - app/assets/javascripts/unmagic/components/sortable_param.js
181
+ - app/assets/javascripts/unmagic/components/sortable_session.js
182
+ - app/assets/javascripts/unmagic/components/streaming_markdown.js
105
183
  - app/assets/javascripts/unmagic/components/tabs.js
106
184
  - app/assets/javascripts/unmagic/components/time.js
107
185
  - app/assets/javascripts/unmagic/components/toasts.js
186
+ - app/assets/javascripts/unmagic/components/toolbar.js
108
187
  - app/assets/javascripts/unmagic/components/tooltip.js
109
188
  - app/assets/javascripts/unmagic/components/upsert.js
110
189
  - app/assets/javascripts/unmagic/components/uuid_input.js
@@ -113,8 +192,229 @@ files:
113
192
  - lib/unmagic-components.rb
114
193
  - lib/unmagic/components.rb
115
194
  - lib/unmagic/components/action_view_helpers.rb
195
+ - lib/unmagic/components/ai_chat.rb
196
+ - lib/unmagic/components/ai_chat/action_bar.rb
197
+ - lib/unmagic/components/ai_chat/attachments.rb
198
+ - lib/unmagic/components/ai_chat/branch_picker.rb
199
+ - lib/unmagic/components/ai_chat/citation.rb
200
+ - lib/unmagic/components/ai_chat/composer.rb
201
+ - lib/unmagic/components/ai_chat/failure.rb
202
+ - lib/unmagic/components/ai_chat/message.rb
203
+ - lib/unmagic/components/ai_chat/payload.rb
204
+ - lib/unmagic/components/ai_chat/permission.rb
205
+ - lib/unmagic/components/ai_chat/plan.rb
206
+ - lib/unmagic/components/ai_chat/proposal.rb
207
+ - lib/unmagic/components/ai_chat/reasoning.rb
208
+ - lib/unmagic/components/ai_chat/request.rb
209
+ - lib/unmagic/components/ai_chat/section.rb
210
+ - lib/unmagic/components/ai_chat/slash_menu.rb
211
+ - lib/unmagic/components/ai_chat/tool_call.rb
212
+ - lib/unmagic/components/ai_chat/transcript.rb
213
+ - lib/unmagic/components/ai_chat/welcome.rb
214
+ - lib/unmagic/components/ai_chat/workspace.rb
116
215
  - lib/unmagic/components/autogrow.rb
216
+ - lib/unmagic/components/avatar.rb
117
217
  - lib/unmagic/components/badge.rb
218
+ - lib/unmagic/components/board.rb
219
+ - lib/unmagic/components/browser.rb
220
+ - lib/unmagic/components/browser/app/controllers/unmagic/components/browser/application_controller.rb
221
+ - lib/unmagic/components/browser/app/controllers/unmagic/components/browser/demos_controller.rb
222
+ - lib/unmagic/components/browser/app/controllers/unmagic/components/browser/pages_controller.rb
223
+ - lib/unmagic/components/browser/app/helpers/unmagic/components/browser/application_helper.rb
224
+ - lib/unmagic/components/browser/app/models/unmagic/components/browser/board_store.rb
225
+ - lib/unmagic/components/browser/app/models/unmagic/components/browser/catalog.rb
226
+ - lib/unmagic/components/browser/app/models/unmagic/components/browser/pager.rb
227
+ - lib/unmagic/components/browser/app/models/unmagic/components/browser/profile.rb
228
+ - lib/unmagic/components/browser/app/models/unmagic/components/browser/reply.rb
229
+ - lib/unmagic/components/browser/app/models/unmagic/components/browser/thing.rb
230
+ - lib/unmagic/components/browser/app/views/layouts/unmagic/components/browser/application.html.erb
231
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/application/_code.html.erb
232
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/application/_crumb.html.erb
233
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/application/_example.html.erb
234
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/application/_nav.html.erb
235
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/demos/edit_profile.html.erb
236
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat/_conversation.html.erb
237
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat/_live.html.erb
238
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat/_thumbnail.html.erb
239
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat/_welcome.html.erb
240
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_action_bar/_always.html.erb
241
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_action_bar/_hover.html.erb
242
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_action_bar/_thumbnail.html.erb
243
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_attachments/_dropzone.html.erb
244
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_attachments/_sent.html.erb
245
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_attachments/_thumbnail.html.erb
246
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_branch_picker/_positions.html.erb
247
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_branch_picker/_thumbnail.html.erb
248
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_citation/_compact.html.erb
249
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_citation/_quote.html.erb
250
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_citation/_thumbnail.html.erb
251
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_composer/_parts.html.erb
252
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_composer/_states.html.erb
253
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_composer/_thumbnail.html.erb
254
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_failure/_full.html.erb
255
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_failure/_plain.html.erb
256
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_failure/_thumbnail.html.erb
257
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_message/_parts.html.erb
258
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_message/_states.html.erb
259
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_message/_thumbnail.html.erb
260
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_message/_turns.html.erb
261
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_payload/_json.html.erb
262
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_payload/_text.html.erb
263
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_payload/_thumbnail.html.erb
264
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_permission/_answered.html.erb
265
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_permission/_thumbnail.html.erb
266
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_permission/_waiting.html.erb
267
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_plan/_empty.html.erb
268
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_plan/_states.html.erb
269
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_plan/_thumbnail.html.erb
270
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_proposal/_decided.html.erb
271
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_proposal/_inline.html.erb
272
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_proposal/_thumbnail.html.erb
273
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_reasoning/_settled.html.erb
274
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_reasoning/_thinking.html.erb
275
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_reasoning/_thumbnail.html.erb
276
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_request/_answered.html.erb
277
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_request/_choices.html.erb
278
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_request/_form.html.erb
279
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_request/_thumbnail.html.erb
280
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_slash_menu/_composer.html.erb
281
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_slash_menu/_thumbnail.html.erb
282
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_tool_call/_made.html.erb
283
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_tool_call/_run.html.erb
284
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_tool_call/_states.html.erb
285
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_tool_call/_thumbnail.html.erb
286
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_welcome/_suggestions.html.erb
287
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_welcome/_thumbnail.html.erb
288
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_workspace/_files.html.erb
289
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/ai_chat_workspace/_thumbnail.html.erb
290
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/avatar/_group.html.erb
291
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/avatar/_sizes.html.erb
292
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/avatar/_thumbnail.html.erb
293
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/avatar/_tints.html.erb
294
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/badge/_in_context.html.erb
295
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/badge/_thumbnail.html.erb
296
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/badge/_tones.html.erb
297
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/board/_handles.html.erb
298
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/board/_live.html.erb
299
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/board/_thumbnail.html.erb
300
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/button/_sizes.html.erb
301
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/button/_thumbnail.html.erb
302
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/button/_variants.html.erb
303
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/callout/_neutral.html.erb
304
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/callout/_thumbnail.html.erb
305
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/callout/_tones.html.erb
306
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/card/_actions_and_footer.html.erb
307
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/card/_flush_table.html.erb
308
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/card/_link.html.erb
309
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/card/_thumbnail.html.erb
310
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/confirm/_danger.html.erb
311
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/confirm/_plain.html.erb
312
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/confirm/_thumbnail.html.erb
313
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/copy_button/_from_element.html.erb
314
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/copy_button/_thumbnail.html.erb
315
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/copy_button/_with_label.html.erb
316
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/detail_list/_inline.html.erb
317
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/detail_list/_stacked.html.erb
318
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/detail_list/_thumbnail.html.erb
319
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/dialog/_dialog_tag.html.erb
320
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/dialog/_modal.html.erb
321
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/dialog/_thumbnail.html.erb
322
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/elapsed/_countdown.html.erb
323
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/elapsed/_running.html.erb
324
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/elapsed/_thumbnail.html.erb
325
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/empty_state/_default.html.erb
326
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/empty_state/_thumbnail.html.erb
327
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_autogrow.html.erb
328
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_control_classes.html.erb
329
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_fields.html.erb
330
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_states.html.erb
331
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_thumbnail.html.erb
332
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/forms/_uuid_field.html.erb
333
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/local_time/_absolute.html.erb
334
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/local_time/_relative.html.erb
335
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/local_time/_thumbnail.html.erb
336
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/menu/_actions.html.erb
337
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/menu/_labelled.html.erb
338
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/menu/_thumbnail.html.erb
339
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/page_header/_default.html.erb
340
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/page_header/_thumbnail.html.erb
341
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/page_header/_with_leading.html.erb
342
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_blocking_out.html.erb
343
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_card.html.erb
344
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_detail_list.html.erb
345
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_page_header.html.erb
346
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_text_and_button.html.erb
347
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/skeleton/_thumbnail.html.erb
348
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/sortable_list/_connected.html.erb
349
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/sortable_list/_grid.html.erb
350
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/sortable_list/_handles.html.erb
351
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/sortable_list/_thumbnail.html.erb
352
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/streaming_markdown/_reveal.html.erb
353
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/streaming_markdown/_stopped.html.erb
354
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/streaming_markdown/_thumbnail.html.erb
355
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/table/_deferred.html.erb
356
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/table/_empty.html.erb
357
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/table/_sortable.html.erb
358
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/table/_table_tag.html.erb
359
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/table/_thumbnail.html.erb
360
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tabs/_links.html.erb
361
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tabs/_panels.html.erb
362
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tabs/_thumbnail.html.erb
363
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/toast/_above_dialog.html.erb
364
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/toast/_flash.html.erb
365
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/toast/_stream.html.erb
366
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/toast/_thumbnail.html.erb
367
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tooltip/_placement.html.erb
368
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tooltip/_term.html.erb
369
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/examples/tooltip/_thumbnail.html.erb
370
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/pages/component.html.erb
371
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/pages/installation.html.erb
372
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/pages/overview.html.erb
373
+ - lib/unmagic/components/browser/app/views/unmagic/components/browser/pages/theming.html.erb
374
+ - lib/unmagic/components/browser/assets/browser.css
375
+ - lib/unmagic/components/browser/catalog/ai_chat.rb
376
+ - lib/unmagic/components/browser/catalog/ai_chat_action_bar.rb
377
+ - lib/unmagic/components/browser/catalog/ai_chat_attachments.rb
378
+ - lib/unmagic/components/browser/catalog/ai_chat_branch_picker.rb
379
+ - lib/unmagic/components/browser/catalog/ai_chat_citation.rb
380
+ - lib/unmagic/components/browser/catalog/ai_chat_composer.rb
381
+ - lib/unmagic/components/browser/catalog/ai_chat_failure.rb
382
+ - lib/unmagic/components/browser/catalog/ai_chat_message.rb
383
+ - lib/unmagic/components/browser/catalog/ai_chat_payload.rb
384
+ - lib/unmagic/components/browser/catalog/ai_chat_permission.rb
385
+ - lib/unmagic/components/browser/catalog/ai_chat_plan.rb
386
+ - lib/unmagic/components/browser/catalog/ai_chat_proposal.rb
387
+ - lib/unmagic/components/browser/catalog/ai_chat_reasoning.rb
388
+ - lib/unmagic/components/browser/catalog/ai_chat_request.rb
389
+ - lib/unmagic/components/browser/catalog/ai_chat_slash_menu.rb
390
+ - lib/unmagic/components/browser/catalog/ai_chat_tool_call.rb
391
+ - lib/unmagic/components/browser/catalog/ai_chat_welcome.rb
392
+ - lib/unmagic/components/browser/catalog/ai_chat_workspace.rb
393
+ - lib/unmagic/components/browser/catalog/avatar.rb
394
+ - lib/unmagic/components/browser/catalog/badge.rb
395
+ - lib/unmagic/components/browser/catalog/board.rb
396
+ - lib/unmagic/components/browser/catalog/button.rb
397
+ - lib/unmagic/components/browser/catalog/callout.rb
398
+ - lib/unmagic/components/browser/catalog/card.rb
399
+ - lib/unmagic/components/browser/catalog/confirm.rb
400
+ - lib/unmagic/components/browser/catalog/copy_button.rb
401
+ - lib/unmagic/components/browser/catalog/detail_list.rb
402
+ - lib/unmagic/components/browser/catalog/dialog.rb
403
+ - lib/unmagic/components/browser/catalog/elapsed.rb
404
+ - lib/unmagic/components/browser/catalog/empty_state.rb
405
+ - lib/unmagic/components/browser/catalog/forms.rb
406
+ - lib/unmagic/components/browser/catalog/local_time.rb
407
+ - lib/unmagic/components/browser/catalog/menu.rb
408
+ - lib/unmagic/components/browser/catalog/page_header.rb
409
+ - lib/unmagic/components/browser/catalog/skeleton.rb
410
+ - lib/unmagic/components/browser/catalog/sortable_list.rb
411
+ - lib/unmagic/components/browser/catalog/streaming_markdown.rb
412
+ - lib/unmagic/components/browser/catalog/table.rb
413
+ - lib/unmagic/components/browser/catalog/tabs.rb
414
+ - lib/unmagic/components/browser/catalog/toast.rb
415
+ - lib/unmagic/components/browser/catalog/tooltip.rb
416
+ - lib/unmagic/components/browser/config/routes.rb
417
+ - lib/unmagic/components/browser/tailwind/browser.css
118
418
  - lib/unmagic/components/button.rb
119
419
  - lib/unmagic/components/callout.rb
120
420
  - lib/unmagic/components/card.rb
@@ -126,6 +426,8 @@ files:
126
426
  - lib/unmagic/components/detail_list/item.rb
127
427
  - lib/unmagic/components/dialog.rb
128
428
  - lib/unmagic/components/dialog_responder.rb
429
+ - lib/unmagic/components/duration.rb
430
+ - lib/unmagic/components/elapsed.rb
129
431
  - lib/unmagic/components/engine.rb
130
432
  - lib/unmagic/components/form_builder.rb
131
433
  - lib/unmagic/components/icons.rb
@@ -136,6 +438,8 @@ files:
136
438
  - lib/unmagic/components/renderers/empty_state.rb
137
439
  - lib/unmagic/components/renderers/pagination.rb
138
440
  - lib/unmagic/components/skeleton.rb
441
+ - lib/unmagic/components/sortable.rb
442
+ - lib/unmagic/components/streaming_markdown.rb
139
443
  - lib/unmagic/components/table.rb
140
444
  - lib/unmagic/components/table/column.rb
141
445
  - lib/unmagic/components/table_tag.rb