rails_den 2.0.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 (528) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +652 -0
  3. data/README.md +74 -0
  4. data/Rakefile +6 -0
  5. data/app/assets/javascript/rails_den/attachments.js +733 -0
  6. data/app/assets/javascript/rails_den/bookmarks.js +58 -0
  7. data/app/assets/javascript/rails_den/cable.js +18 -0
  8. data/app/assets/javascript/rails_den/chat.js +3008 -0
  9. data/app/assets/javascript/rails_den/chat_3d_management.js +1230 -0
  10. data/app/assets/javascript/rails_den/composer.js +1785 -0
  11. data/app/assets/javascript/rails_den/content.js +1337 -0
  12. data/app/assets/javascript/rails_den/emoji_catalog.js +136 -0
  13. data/app/assets/javascript/rails_den/licenses/react-LICENSE.txt +21 -0
  14. data/app/assets/javascript/rails_den/licenses/react-dom-LICENSE.txt +21 -0
  15. data/app/assets/javascript/rails_den/licenses/scheduler-LICENSE.txt +21 -0
  16. data/app/assets/javascript/rails_den/licenses/three-LICENSE.txt +21 -0
  17. data/app/assets/javascript/rails_den/members.js +187 -0
  18. data/app/assets/javascript/rails_den/notifications.js +211 -0
  19. data/app/assets/javascript/rails_den/presence.js +757 -0
  20. data/app/assets/javascript/rails_den/private_messages.js +92 -0
  21. data/app/assets/javascript/rails_den/react_runtime.js +43 -0
  22. data/app/assets/javascript/rails_den/reactions.js +139 -0
  23. data/app/assets/javascript/rails_den/spatial.js +4338 -0
  24. data/app/assets/stylesheets/rails_den/advertising.css +91 -0
  25. data/app/assets/stylesheets/rails_den/application.css +1724 -0
  26. data/app/assets/stylesheets/rails_den/attachments.css +255 -0
  27. data/app/assets/stylesheets/rails_den/board_presence.css +38 -0
  28. data/app/assets/stylesheets/rails_den/bookmarks.css +36 -0
  29. data/app/assets/stylesheets/rails_den/chat.css +1555 -0
  30. data/app/assets/stylesheets/rails_den/chat_3d.css +1283 -0
  31. data/app/assets/stylesheets/rails_den/chat_3d_management.css +294 -0
  32. data/app/assets/stylesheets/rails_den/chat_reactions.css +79 -0
  33. data/app/assets/stylesheets/rails_den/community_presence.css +51 -0
  34. data/app/assets/stylesheets/rails_den/composer.css +358 -0
  35. data/app/assets/stylesheets/rails_den/emoji_catalog.css +33 -0
  36. data/app/assets/stylesheets/rails_den/member_profiles.css +662 -0
  37. data/app/assets/stylesheets/rails_den/moderation.css +561 -0
  38. data/app/assets/stylesheets/rails_den/notifications.css +222 -0
  39. data/app/assets/stylesheets/rails_den/onebox.css +126 -0
  40. data/app/assets/stylesheets/rails_den/post_links.css +37 -0
  41. data/app/assets/stylesheets/rails_den/post_presence.css +47 -0
  42. data/app/assets/stylesheets/rails_den/presence.css +96 -0
  43. data/app/assets/stylesheets/rails_den/presence_directory.css +217 -0
  44. data/app/assets/stylesheets/rails_den/presence_live.css +15 -0
  45. data/app/assets/stylesheets/rails_den/private_messages.css +41 -0
  46. data/app/assets/stylesheets/rails_den/reactions.css +53 -0
  47. data/app/assets/stylesheets/rails_den/search.css +100 -0
  48. data/app/assets/stylesheets/rails_den/tags.css +136 -0
  49. data/app/channels/rails_den/chat_spatial_channel.rb +203 -0
  50. data/app/channels/rails_den/chat_spatial_occupancy_channel.rb +69 -0
  51. data/app/channels/rails_den/chat_stream_channel.rb +108 -0
  52. data/app/channels/rails_den/notifications_channel.rb +30 -0
  53. data/app/channels/rails_den/presence_channel.rb +205 -0
  54. data/app/controllers/admin/rails_den/administrators_controller.rb +26 -0
  55. data/app/controllers/admin/rails_den/advertising_management_controller.rb +337 -0
  56. data/app/controllers/admin/rails_den/application_controller.rb +116 -0
  57. data/app/controllers/admin/rails_den/badges_controller.rb +106 -0
  58. data/app/controllers/admin/rails_den/board_access_controller.rb +143 -0
  59. data/app/controllers/admin/rails_den/boards_controller.rb +89 -0
  60. data/app/controllers/admin/rails_den/categories_controller.rb +89 -0
  61. data/app/controllers/admin/rails_den/member_badge_awards_controller.rb +92 -0
  62. data/app/controllers/admin/rails_den/members_controller.rb +495 -0
  63. data/app/controllers/admin/rails_den/plugins_controller.rb +25 -0
  64. data/app/controllers/admin/rails_den/profile_fields_controller.rb +104 -0
  65. data/app/controllers/admin/rails_den/reaction_types_controller.rb +127 -0
  66. data/app/controllers/admin/rails_den/report_reasons_controller.rb +15 -0
  67. data/app/controllers/admin/rails_den/roles_controller.rb +190 -0
  68. data/app/controllers/admin/rails_den/tags_controller.rb +11 -0
  69. data/app/controllers/admin/rails_den/themes_controller.rb +60 -0
  70. data/app/controllers/admin/rails_den/trust_levels_controller.rb +97 -0
  71. data/app/controllers/rails_den/advertising_controller.rb +14 -0
  72. data/app/controllers/rails_den/application_controller.rb +218 -0
  73. data/app/controllers/rails_den/attachments_controller.rb +128 -0
  74. data/app/controllers/rails_den/board_follows_controller.rb +119 -0
  75. data/app/controllers/rails_den/board_read_states_controller.rb +36 -0
  76. data/app/controllers/rails_den/boards_controller.rb +103 -0
  77. data/app/controllers/rails_den/bookmarks_controller.rb +91 -0
  78. data/app/controllers/rails_den/chat_channel_memberships_controller.rb +193 -0
  79. data/app/controllers/rails_den/chat_channel_read_states_controller.rb +46 -0
  80. data/app/controllers/rails_den/chat_channels_controller.rb +556 -0
  81. data/app/controllers/rails_den/chat_message_pins_controller.rb +78 -0
  82. data/app/controllers/rails_den/chat_messages_controller.rb +166 -0
  83. data/app/controllers/rails_den/chat_reaction_types_controller.rb +24 -0
  84. data/app/controllers/rails_den/community_read_states_controller.rb +12 -0
  85. data/app/controllers/rails_den/home_controller.rb +35 -0
  86. data/app/controllers/rails_den/member_profiles_controller.rb +286 -0
  87. data/app/controllers/rails_den/member_reports_controller.rb +22 -0
  88. data/app/controllers/rails_den/members_controller.rb +42 -0
  89. data/app/controllers/rails_den/mention_candidates_controller.rb +14 -0
  90. data/app/controllers/rails_den/moderation/audit_events_controller.rb +14 -0
  91. data/app/controllers/rails_den/moderation/member_histories_controller.rb +37 -0
  92. data/app/controllers/rails_den/moderation/member_notes_controller.rb +26 -0
  93. data/app/controllers/rails_den/moderation/report_notes_controller.rb +27 -0
  94. data/app/controllers/rails_den/moderation/reports_controller.rb +97 -0
  95. data/app/controllers/rails_den/moderation/restrictions_controller.rb +71 -0
  96. data/app/controllers/rails_den/moderation/topics_controller.rb +61 -0
  97. data/app/controllers/rails_den/moderation/warnings_controller.rb +50 -0
  98. data/app/controllers/rails_den/notification_preferences_controller.rb +116 -0
  99. data/app/controllers/rails_den/notifications_controller.rb +67 -0
  100. data/app/controllers/rails_den/post_bookmarks_controller.rb +29 -0
  101. data/app/controllers/rails_den/post_drafts_controller.rb +125 -0
  102. data/app/controllers/rails_den/post_reports_controller.rb +31 -0
  103. data/app/controllers/rails_den/posts_controller.rb +318 -0
  104. data/app/controllers/rails_den/presence_controller.rb +12 -0
  105. data/app/controllers/rails_den/presence_snapshots_controller.rb +83 -0
  106. data/app/controllers/rails_den/previews_controller.rb +10 -0
  107. data/app/controllers/rails_den/private_conversations_controller.rb +120 -0
  108. data/app/controllers/rails_den/private_messages_controller.rb +45 -0
  109. data/app/controllers/rails_den/reactions_controller.rb +124 -0
  110. data/app/controllers/rails_den/reports_controller.rb +63 -0
  111. data/app/controllers/rails_den/search_controller.rb +64 -0
  112. data/app/controllers/rails_den/tags_controller.rb +70 -0
  113. data/app/controllers/rails_den/topic_bookmarks_controller.rb +35 -0
  114. data/app/controllers/rails_den/topic_follows_controller.rb +117 -0
  115. data/app/controllers/rails_den/topic_read_positions_controller.rb +40 -0
  116. data/app/controllers/rails_den/topic_reports_controller.rb +18 -0
  117. data/app/controllers/rails_den/topics_controller.rb +583 -0
  118. data/app/dashboards/rails_den/administrator_dashboard.rb +51 -0
  119. data/app/dashboards/rails_den/board_dashboard.rb +57 -0
  120. data/app/dashboards/rails_den/category_dashboard.rb +50 -0
  121. data/app/dashboards/rails_den/profile_field_dashboard.rb +53 -0
  122. data/app/dashboards/rails_den/reaction_type_dashboard.rb +26 -0
  123. data/app/dashboards/rails_den/report_reason_dashboard.rb +57 -0
  124. data/app/dashboards/rails_den/tag_dashboard.rb +59 -0
  125. data/app/helpers/rails_den/application_helper.rb +39 -0
  126. data/app/helpers/rails_den/boards_helper.rb +4 -0
  127. data/app/helpers/rails_den/moderation/reports_helper.rb +42 -0
  128. data/app/helpers/rails_den/notifications_helper.rb +4 -0
  129. data/app/helpers/rails_den/posts_helper.rb +4 -0
  130. data/app/helpers/rails_den/topics_helper.rb +4 -0
  131. data/app/jobs/rails_den/application_job.rb +4 -0
  132. data/app/jobs/rails_den/expire_user_restriction_job.rb +9 -0
  133. data/app/jobs/rails_den/member_profile_stats_refresh_job.rb +48 -0
  134. data/app/jobs/rails_den/reconcile_user_restrictions_job.rb +9 -0
  135. data/app/jobs/rails_den/resolve_onebox_entry_job.rb +74 -0
  136. data/app/mailers/rails_den/application_mailer.rb +6 -0
  137. data/app/models/rails_den/administrator.rb +18 -0
  138. data/app/models/rails_den/advertising_configuration.rb +14 -0
  139. data/app/models/rails_den/application_record.rb +5 -0
  140. data/app/models/rails_den/badge.rb +142 -0
  141. data/app/models/rails_den/badge_award.rb +87 -0
  142. data/app/models/rails_den/board.rb +129 -0
  143. data/app/models/rails_den/board_follow.rb +18 -0
  144. data/app/models/rails_den/board_read_state.rb +60 -0
  145. data/app/models/rails_den/board_role_assignment.rb +45 -0
  146. data/app/models/rails_den/board_role_permission.rb +31 -0
  147. data/app/models/rails_den/board_role_requirement.rb +16 -0
  148. data/app/models/rails_den/board_sponsorship.rb +21 -0
  149. data/app/models/rails_den/bookmark.rb +31 -0
  150. data/app/models/rails_den/category.rb +81 -0
  151. data/app/models/rails_den/category_role_requirement.rb +16 -0
  152. data/app/models/rails_den/category_sponsorship.rb +21 -0
  153. data/app/models/rails_den/chat_channel.rb +44 -0
  154. data/app/models/rails_den/chat_channel_membership.rb +21 -0
  155. data/app/models/rails_den/chat_channel_read_state.rb +100 -0
  156. data/app/models/rails_den/chat_message.rb +37 -0
  157. data/app/models/rails_den/community_read_state.rb +52 -0
  158. data/app/models/rails_den/community_sponsorship.rb +15 -0
  159. data/app/models/rails_den/member_profile.rb +113 -0
  160. data/app/models/rails_den/mention.rb +20 -0
  161. data/app/models/rails_den/moderation_event.rb +16 -0
  162. data/app/models/rails_den/moderation_note.rb +11 -0
  163. data/app/models/rails_den/notification.rb +33 -0
  164. data/app/models/rails_den/notification_event.rb +40 -0
  165. data/app/models/rails_den/notification_mute.rb +9 -0
  166. data/app/models/rails_den/onebox_entry.rb +214 -0
  167. data/app/models/rails_den/post.rb +396 -0
  168. data/app/models/rails_den/post_draft.rb +63 -0
  169. data/app/models/rails_den/post_revision.rb +10 -0
  170. data/app/models/rails_den/private_conversation.rb +25 -0
  171. data/app/models/rails_den/private_conversation_participant.rb +16 -0
  172. data/app/models/rails_den/private_message.rb +35 -0
  173. data/app/models/rails_den/private_message_recipient.rb +44 -0
  174. data/app/models/rails_den/profile_field.rb +150 -0
  175. data/app/models/rails_den/profile_field_value.rb +136 -0
  176. data/app/models/rails_den/reaction.rb +56 -0
  177. data/app/models/rails_den/reaction_type.rb +23 -0
  178. data/app/models/rails_den/reader_visit.rb +61 -0
  179. data/app/models/rails_den/report.rb +127 -0
  180. data/app/models/rails_den/report_reason.rb +52 -0
  181. data/app/models/rails_den/reputation_event.rb +92 -0
  182. data/app/models/rails_den/role.rb +87 -0
  183. data/app/models/rails_den/role_assignment.rb +18 -0
  184. data/app/models/rails_den/role_permission.rb +41 -0
  185. data/app/models/rails_den/sluggable.rb +102 -0
  186. data/app/models/rails_den/sponsor.rb +20 -0
  187. data/app/models/rails_den/sponsorship.rb +87 -0
  188. data/app/models/rails_den/tag.rb +61 -0
  189. data/app/models/rails_den/theme_selection.rb +4 -0
  190. data/app/models/rails_den/topic.rb +307 -0
  191. data/app/models/rails_den/topic_follow.rb +18 -0
  192. data/app/models/rails_den/topic_read_state.rb +76 -0
  193. data/app/models/rails_den/topic_role_requirement.rb +16 -0
  194. data/app/models/rails_den/topic_tag.rb +16 -0
  195. data/app/models/rails_den/trust_level.rb +62 -0
  196. data/app/models/rails_den/trust_level_achievement.rb +21 -0
  197. data/app/models/rails_den/user_restriction.rb +54 -0
  198. data/app/models/rails_den/user_warning.rb +10 -0
  199. data/app/presenters/rails_den/member_profile_presenter.rb +285 -0
  200. data/app/queries/rails_den/topic_new_post_counts.rb +153 -0
  201. data/app/queries/rails_den/topic_unread_counts.rb +137 -0
  202. data/app/services/rails_den/board_following.rb +91 -0
  203. data/app/services/rails_den/bookmark_list.rb +109 -0
  204. data/app/services/rails_den/bookmark_state.rb +17 -0
  205. data/app/services/rails_den/built_in_role_provisioner.rb +98 -0
  206. data/app/services/rails_den/chat/broadcaster.rb +81 -0
  207. data/app/services/rails_den/chat/message_payload.rb +26 -0
  208. data/app/services/rails_den/chat/presence_snapshot.rb +269 -0
  209. data/app/services/rails_den/chat/spatial_broadcaster.rb +135 -0
  210. data/app/services/rails_den/chat/spatial_occupancy_snapshot.rb +35 -0
  211. data/app/services/rails_den/chat/spatial_registry.rb +682 -0
  212. data/app/services/rails_den/chat/spatial_room.rb +81 -0
  213. data/app/services/rails_den/chat/spatial_snapshot.rb +261 -0
  214. data/app/services/rails_den/chat/spatial_update.rb +243 -0
  215. data/app/services/rails_den/chat/subscription_token.rb +28 -0
  216. data/app/services/rails_den/chat/unread_counts.rb +79 -0
  217. data/app/services/rails_den/chat/whisper_delivery.rb +287 -0
  218. data/app/services/rails_den/chat_channel_access.rb +97 -0
  219. data/app/services/rails_den/default_report_reason_provisioner.rb +30 -0
  220. data/app/services/rails_den/emoji_catalog.rb +101 -0
  221. data/app/services/rails_den/gamification/activity_recorder.rb +69 -0
  222. data/app/services/rails_den/gamification/badge_evaluator.rb +55 -0
  223. data/app/services/rails_den/gamification/current_trust_level.rb +21 -0
  224. data/app/services/rails_den/gamification/metrics.rb +93 -0
  225. data/app/services/rails_den/gamification/reputation_ledger.rb +261 -0
  226. data/app/services/rails_den/gamification/trust_level_evaluator.rb +78 -0
  227. data/app/services/rails_den/global_moderation_policy.rb +32 -0
  228. data/app/services/rails_den/member_profile_bio_renderer.rb +28 -0
  229. data/app/services/rails_den/mentions/autocomplete.rb +69 -0
  230. data/app/services/rails_den/mentions/candidate.rb +19 -0
  231. data/app/services/rails_den/mentions/parser.rb +185 -0
  232. data/app/services/rails_den/mentions/reconciler.rb +46 -0
  233. data/app/services/rails_den/mentions/renderer.rb +165 -0
  234. data/app/services/rails_den/moderation_access.rb +42 -0
  235. data/app/services/rails_den/moderation_audit.rb +38 -0
  236. data/app/services/rails_den/moderation_event_scope.rb +12 -0
  237. data/app/services/rails_den/moderation_notification_delivery.rb +23 -0
  238. data/app/services/rails_den/notification_events/emitter.rb +226 -0
  239. data/app/services/rails_den/notification_preferences.rb +169 -0
  240. data/app/services/rails_den/notifications/broadcaster.rb +72 -0
  241. data/app/services/rails_den/notifications/materializer.rb +284 -0
  242. data/app/services/rails_den/notifications/subscription_token.rb +28 -0
  243. data/app/services/rails_den/permission_resolver.rb +252 -0
  244. data/app/services/rails_den/presence/board_summary.rb +131 -0
  245. data/app/services/rails_den/presence/broadcaster.rb +193 -0
  246. data/app/services/rails_den/presence/chat_room_registry.rb +263 -0
  247. data/app/services/rails_den/presence/community_summary.rb +166 -0
  248. data/app/services/rails_den/presence/directory.rb +499 -0
  249. data/app/services/rails_den/presence/last_seen.rb +23 -0
  250. data/app/services/rails_den/presence/page_map.rb +202 -0
  251. data/app/services/rails_den/presence/registry.rb +805 -0
  252. data/app/services/rails_den/presence/subscription_token.rb +28 -0
  253. data/app/services/rails_den/presence/visibility.rb +95 -0
  254. data/app/services/rails_den/private_messages/mailbox.rb +108 -0
  255. data/app/services/rails_den/private_messages/read_marker.rb +25 -0
  256. data/app/services/rails_den/private_messages/sender.rb +113 -0
  257. data/app/services/rails_den/private_messages/unread_count.rb +22 -0
  258. data/app/services/rails_den/reaction_summary.rb +54 -0
  259. data/app/services/rails_den/reaction_type_importer.rb +91 -0
  260. data/app/services/rails_den/reaction_type_search.rb +34 -0
  261. data/app/services/rails_den/readable_community_content.rb +156 -0
  262. data/app/services/rails_den/report_assignment.rb +31 -0
  263. data/app/services/rails_den/report_creator.rb +96 -0
  264. data/app/services/rails_den/report_delivery.rb +39 -0
  265. data/app/services/rails_den/report_disposition.rb +25 -0
  266. data/app/services/rails_den/report_recipients.rb +89 -0
  267. data/app/services/rails_den/report_review_policy.rb +66 -0
  268. data/app/services/rails_den/report_review_scope.rb +49 -0
  269. data/app/services/rails_den/restriction_resolver.rb +28 -0
  270. data/app/services/rails_den/role_resolver.rb +66 -0
  271. data/app/services/rails_den/search/adapters/basic.rb +35 -0
  272. data/app/services/rails_den/search/adapters/postgresql.rb +73 -0
  273. data/app/services/rails_den/search/adapters.rb +21 -0
  274. data/app/services/rails_den/search/query.rb +358 -0
  275. data/app/services/rails_den/topic_following.rb +91 -0
  276. data/app/services/rails_den/topic_merger.rb +27 -0
  277. data/app/services/rails_den/topic_moderation.rb +57 -0
  278. data/app/services/rails_den/topic_splitter.rb +36 -0
  279. data/app/services/rails_den/user_restriction_manager.rb +84 -0
  280. data/app/services/rails_den/user_warning_issuer.rb +19 -0
  281. data/app/views/admin/rails_den/advertising_management/_assignment_form.html.erb +340 -0
  282. data/app/views/admin/rails_den/advertising_management/_errors.html.erb +10 -0
  283. data/app/views/admin/rails_den/advertising_management/show.html.erb +324 -0
  284. data/app/views/admin/rails_den/badges/_form.html.erb +191 -0
  285. data/app/views/admin/rails_den/badges/edit.html.erb +14 -0
  286. data/app/views/admin/rails_den/badges/index.html.erb +98 -0
  287. data/app/views/admin/rails_den/badges/new.html.erb +14 -0
  288. data/app/views/admin/rails_den/board_access/show.html.erb +51 -0
  289. data/app/views/admin/rails_den/boards/_form.html.erb +5 -0
  290. data/app/views/admin/rails_den/categories/_form.html.erb +4 -0
  291. data/app/views/admin/rails_den/members/index.html.erb +121 -0
  292. data/app/views/admin/rails_den/members/show.html.erb +398 -0
  293. data/app/views/admin/rails_den/plugins/index.html.erb +49 -0
  294. data/app/views/admin/rails_den/profile_fields/_form.html.erb +169 -0
  295. data/app/views/admin/rails_den/reaction_types/_catalog_search.html.erb +22 -0
  296. data/app/views/admin/rails_den/reaction_types/_errors.html.erb +3 -0
  297. data/app/views/admin/rails_den/reaction_types/index.html.erb +66 -0
  298. data/app/views/admin/rails_den/reaction_types/new.html.erb +23 -0
  299. data/app/views/admin/rails_den/reaction_types/selected.html.erb +15 -0
  300. data/app/views/admin/rails_den/roles/_form.html.erb +64 -0
  301. data/app/views/admin/rails_den/roles/edit.html.erb +18 -0
  302. data/app/views/admin/rails_den/roles/index.html.erb +49 -0
  303. data/app/views/admin/rails_den/roles/new.html.erb +6 -0
  304. data/app/views/admin/rails_den/shared/_access_form.html.erb +59 -0
  305. data/app/views/admin/rails_den/themes/index.html.erb +129 -0
  306. data/app/views/admin/rails_den/trust_levels/_form.html.erb +80 -0
  307. data/app/views/admin/rails_den/trust_levels/edit.html.erb +14 -0
  308. data/app/views/admin/rails_den/trust_levels/index.html.erb +86 -0
  309. data/app/views/admin/rails_den/trust_levels/new.html.erb +14 -0
  310. data/app/views/administrate/application/_index_header.html.erb +68 -0
  311. data/app/views/administrate/application/new.html.erb +42 -0
  312. data/app/views/administrate/application/show.html.erb +89 -0
  313. data/app/views/layouts/administrate/application/_navigation.html.erb +61 -0
  314. data/app/views/layouts/administrate/application.html.erb +40 -0
  315. data/app/views/layouts/rails_den/_navbar.html.erb +293 -0
  316. data/app/views/layouts/rails_den/application.html.erb +198 -0
  317. data/app/views/rails_den/advertising/show.html.erb +13 -0
  318. data/app/views/rails_den/boards/_follow_button.html.erb +45 -0
  319. data/app/views/rails_den/boards/show.html.erb +150 -0
  320. data/app/views/rails_den/bookmarks/_post_control.html.erb +12 -0
  321. data/app/views/rails_den/bookmarks/_topic_control.html.erb +12 -0
  322. data/app/views/rails_den/bookmarks/index.html.erb +78 -0
  323. data/app/views/rails_den/chat_channels/_form.html.erb +174 -0
  324. data/app/views/rails_den/chat_channels/edit.html.erb +51 -0
  325. data/app/views/rails_den/chat_channels/index.html.erb +402 -0
  326. data/app/views/rails_den/chat_channels/new.html.erb +31 -0
  327. data/app/views/rails_den/chat_channels/show.html.erb +476 -0
  328. data/app/views/rails_den/home/index.html.erb +142 -0
  329. data/app/views/rails_den/member_profiles/_avatar.html.erb +18 -0
  330. data/app/views/rails_den/member_profiles/_custom_fields.html.erb +39 -0
  331. data/app/views/rails_den/member_profiles/_followed_boards.html.erb +15 -0
  332. data/app/views/rails_den/member_profiles/_followed_topics.html.erb +15 -0
  333. data/app/views/rails_den/member_profiles/_header.html.erb +103 -0
  334. data/app/views/rails_den/member_profiles/_recent_posts.html.erb +19 -0
  335. data/app/views/rails_den/member_profiles/_recent_topics.html.erb +15 -0
  336. data/app/views/rails_den/member_profiles/_stats.html.erb +11 -0
  337. data/app/views/rails_den/member_profiles/edit.html.erb +265 -0
  338. data/app/views/rails_den/member_profiles/show.html.erb +97 -0
  339. data/app/views/rails_den/member_reports/new.html.erb +1 -0
  340. data/app/views/rails_den/moderation/audit_events/index.html.erb +11 -0
  341. data/app/views/rails_den/moderation/member_histories/show.html.erb +314 -0
  342. data/app/views/rails_den/moderation/reports/index.html.erb +47 -0
  343. data/app/views/rails_den/moderation/reports/show.html.erb +344 -0
  344. data/app/views/rails_den/moderation/restrictions/new.html.erb +14 -0
  345. data/app/views/rails_den/moderation/topics/show.html.erb +14 -0
  346. data/app/views/rails_den/moderation/warnings/new.html.erb +10 -0
  347. data/app/views/rails_den/notifications/_empty_state.html.erb +13 -0
  348. data/app/views/rails_den/notifications/index.html.erb +308 -0
  349. data/app/views/rails_den/passwords/edit.html.erb +55 -0
  350. data/app/views/rails_den/passwords/new.html.erb +49 -0
  351. data/app/views/rails_den/passwords_mailer/reset.html.erb +22 -0
  352. data/app/views/rails_den/passwords_mailer/reset.text.erb +14 -0
  353. data/app/views/rails_den/post_reports/new.html.erb +1 -0
  354. data/app/views/rails_den/posts/_attachments.html.erb +94 -0
  355. data/app/views/rails_den/posts/edit.html.erb +95 -0
  356. data/app/views/rails_den/posts/history.html.erb +123 -0
  357. data/app/views/rails_den/presence/_directory_body.html.erb +155 -0
  358. data/app/views/rails_den/presence/_summary.html.erb +26 -0
  359. data/app/views/rails_den/presence/index.html.erb +29 -0
  360. data/app/views/rails_den/private_conversations/_composer.html.erb +28 -0
  361. data/app/views/rails_den/private_conversations/_conversation_row.html.erb +19 -0
  362. data/app/views/rails_den/private_conversations/_mailbox_nav.html.erb +7 -0
  363. data/app/views/rails_den/private_conversations/_message.html.erb +4 -0
  364. data/app/views/rails_den/private_conversations/_pagination.html.erb +6 -0
  365. data/app/views/rails_den/private_conversations/index.html.erb +11 -0
  366. data/app/views/rails_den/private_conversations/new.html.erb +5 -0
  367. data/app/views/rails_den/private_conversations/sent.html.erb +11 -0
  368. data/app/views/rails_den/private_conversations/show.html.erb +23 -0
  369. data/app/views/rails_den/reactions/_picker_options.html.erb +14 -0
  370. data/app/views/rails_den/reactions/_post_reactions.html.erb +87 -0
  371. data/app/views/rails_den/reactions/_reactor_list.html.erb +16 -0
  372. data/app/views/rails_den/reactions/index.html.erb +34 -0
  373. data/app/views/rails_den/reactions/picker.html.erb +14 -0
  374. data/app/views/rails_den/registrations/edit.html.erb +95 -0
  375. data/app/views/rails_den/registrations/new.html.erb +77 -0
  376. data/app/views/rails_den/reports/_form.html.erb +54 -0
  377. data/app/views/rails_den/search/index.html.erb +235 -0
  378. data/app/views/rails_den/sessions/new.html.erb +64 -0
  379. data/app/views/rails_den/shared/_ad_network_placement.html.erb +5 -0
  380. data/app/views/rails_den/shared/_composer.html.erb +266 -0
  381. data/app/views/rails_den/shared/_sponsor_placement.html.erb +44 -0
  382. data/app/views/rails_den/tags/show.html.erb +91 -0
  383. data/app/views/rails_den/topic_reports/new.html.erb +1 -0
  384. data/app/views/rails_den/topics/_author_badges.html.erb +15 -0
  385. data/app/views/rails_den/topics/_follow_button.html.erb +45 -0
  386. data/app/views/rails_den/topics/_summary.html.erb +121 -0
  387. data/app/views/rails_den/topics/_tags.html.erb +47 -0
  388. data/app/views/rails_den/topics/new.html.erb +181 -0
  389. data/app/views/rails_den/topics/show.html.erb +430 -0
  390. data/config/locales/rails_den.en.yml +65 -0
  391. data/config/routes.rb +442 -0
  392. data/db/migrate/20260820181527_create_rails_den_administrators.rb +12 -0
  393. data/db/migrate/20260820205806_create_rails_den_categories.rb +16 -0
  394. data/db/migrate/20260820212200_create_rails_den_boards.rb +23 -0
  395. data/db/migrate/20260820234758_create_rails_den_topics.rb +24 -0
  396. data/db/migrate/20260821001937_create_rails_den_posts.rb +11 -0
  397. data/db/migrate/20260822004306_add_soft_deletion_to_rails_den_posts.rb +9 -0
  398. data/db/migrate/20260823183944_create_rails_den_onebox_entries.rb +65 -0
  399. data/db/migrate/20260824025007_add_reply_to_to_rails_den_posts.rb +8 -0
  400. data/db/migrate/20260824092300_create_rails_den_post_revisions.rb +22 -0
  401. data/db/migrate/20260824103358_create_rails_den_post_drafts.rb +36 -0
  402. data/db/migrate/20260824142522_create_rails_den_topic_read_states.rb +32 -0
  403. data/db/migrate/20260824214941_create_rails_den_reader_visits.rb +16 -0
  404. data/db/migrate/20260824225733_create_rails_den_board_read_states.rb +34 -0
  405. data/db/migrate/20260824232113_create_rails_den_community_read_states.rb +26 -0
  406. data/db/migrate/20260825121109_create_rails_den_topic_follows.rb +36 -0
  407. data/db/migrate/20260825232623_create_rails_den_board_follows.rb +36 -0
  408. data/db/migrate/20260826003155_create_rails_den_mentions.rb +27 -0
  409. data/db/migrate/20260826080109_create_rails_den_member_profiles.rb +32 -0
  410. data/db/migrate/20260826092936_add_quoted_post_to_rails_den_posts_and_post_drafts.rb +17 -0
  411. data/db/migrate/20260826101755_create_rails_den_notification_events.rb +19 -0
  412. data/db/migrate/20260826121710_create_rails_den_notifications.rb +28 -0
  413. data/db/migrate/20260826140846_create_rails_den_notification_mutes.rb +25 -0
  414. data/db/migrate/20260826175426_create_rails_den_tags.rb +31 -0
  415. data/db/migrate/20260826175428_create_rails_den_topic_tags.rb +26 -0
  416. data/db/migrate/20260827021133_create_rails_den_roles.rb +16 -0
  417. data/db/migrate/20260827021135_create_rails_den_role_assignments.rb +22 -0
  418. data/db/migrate/20260827031134_create_rails_den_role_permissions.rb +28 -0
  419. data/db/migrate/20260827031136_create_rails_den_board_role_permissions.rb +35 -0
  420. data/db/migrate/20260827033116_provision_rails_den_built_in_roles_and_permissions.rb +108 -0
  421. data/db/migrate/20260827040515_create_rails_den_board_role_assignments.rb +33 -0
  422. data/db/migrate/20260827041710_create_rails_den_board_role_requirements.rb +27 -0
  423. data/db/migrate/20260827063901_create_rails_den_category_role_requirements.rb +23 -0
  424. data/db/migrate/20260827063909_create_rails_den_topic_role_requirements.rb +23 -0
  425. data/db/migrate/20260827203747_create_rails_den_report_reasons.rb +19 -0
  426. data/db/migrate/20260827203752_create_rails_den_reports.rb +24 -0
  427. data/db/migrate/20260827203807_provision_rails_den_default_report_reasons.rb +32 -0
  428. data/db/migrate/20260828030352_create_rails_den_moderation_events.rb +26 -0
  429. data/db/migrate/20260828030354_create_rails_den_moderation_notes.rb +13 -0
  430. data/db/migrate/20260828030357_create_rails_den_user_warnings.rb +17 -0
  431. data/db/migrate/20260828030359_create_rails_den_user_restrictions.rb +30 -0
  432. data/db/migrate/20260828030404_add_moderation_fields_to_rails_den_reports.rb +55 -0
  433. data/db/migrate/20260828030407_add_moderation_fields_to_rails_den_topics.rb +14 -0
  434. data/db/migrate/20260828031955_add_opening_post_to_rails_den_topics.rb +25 -0
  435. data/db/migrate/20260828083552_create_rails_den_reaction_types.rb +15 -0
  436. data/db/migrate/20260828083554_create_rails_den_reactions.rb +20 -0
  437. data/db/migrate/20260828083556_provision_rails_den_default_reaction_type.rb +18 -0
  438. data/db/migrate/20260828151420_create_rails_den_bookmarks.rb +20 -0
  439. data/db/migrate/20260828165545_create_rails_den_profile_fields.rb +37 -0
  440. data/db/migrate/20260828165547_create_rails_den_profile_field_values.rb +31 -0
  441. data/db/migrate/20260828191644_add_presence_fields_to_rails_den_member_profiles.rb +22 -0
  442. data/db/migrate/20260829003137_create_rails_den_private_conversations.rb +13 -0
  443. data/db/migrate/20260829003139_create_rails_den_private_conversation_participants.rb +35 -0
  444. data/db/migrate/20260829003141_create_rails_den_private_messages.rb +19 -0
  445. data/db/migrate/20260829003143_create_rails_den_private_message_recipients.rb +26 -0
  446. data/db/migrate/20260829003435_provision_rails_den_message_capability_defaults.rb +39 -0
  447. data/db/migrate/20260829013557_create_rails_den_chat_channels.rb +17 -0
  448. data/db/migrate/20260829014413_create_rails_den_chat_channel_memberships.rb +26 -0
  449. data/db/migrate/20260829014523_create_rails_den_chat_messages.rb +27 -0
  450. data/db/migrate/20260830155021_create_rails_den_chat_channel_read_states.rb +37 -0
  451. data/db/migrate/20260830155023_add_pinned_to_rails_den_chat_messages.rb +16 -0
  452. data/db/migrate/20260830185149_create_rails_den_badges.rb +44 -0
  453. data/db/migrate/20260830185151_create_rails_den_badge_awards.rb +43 -0
  454. data/db/migrate/20260830190053_create_rails_den_reputation_events.rb +52 -0
  455. data/db/migrate/20260830190055_create_rails_den_trust_levels.rb +52 -0
  456. data/db/migrate/20260830190057_create_rails_den_trust_level_achievements.rb +39 -0
  457. data/db/migrate/20260830190059_add_reputation_points_to_rails_den_member_profiles.rb +17 -0
  458. data/db/migrate/20260831120000_create_rails_den_advertising_and_sponsorships.rb +55 -0
  459. data/db/migrate/20260831120001_add_description_to_rails_den_sponsors.rb +5 -0
  460. data/db/migrate/20260831120002_add_advertising_page_to_rails_den_advertising_configurations.rb +7 -0
  461. data/db/migrate/20260831120003_add_destination_url_to_rails_den_sponsors.rb +5 -0
  462. data/db/migrate/20260831120004_move_destination_url_to_rails_den_sponsorships.rb +138 -0
  463. data/db/migrate/20260831204539_create_rails_den_theme_selections.rb +9 -0
  464. data/exe/rails_den +5 -0
  465. data/lib/generators/rails_den/install/install_generator.rb +42 -0
  466. data/lib/generators/rails_den/install/templates/rails_den.rb +75 -0
  467. data/lib/generators/rails_den/install/views/views_generator.rb +56 -0
  468. data/lib/rails/commands/rails_den/import/discourse/discourse_command.rb +48 -0
  469. data/lib/rails_den/cli.rb +174 -0
  470. data/lib/rails_den/configuration.rb +173 -0
  471. data/lib/rails_den/engine.rb +10 -0
  472. data/lib/rails_den/extensions/descriptor.rb +138 -0
  473. data/lib/rails_den/extensions/registry.rb +65 -0
  474. data/lib/rails_den/extensions.rb +49 -0
  475. data/lib/rails_den/formatters/markdown.rb +30 -0
  476. data/lib/rails_den/formatters/plain_text.rb +18 -0
  477. data/lib/rails_den/formatting.rb +130 -0
  478. data/lib/rails_den/gamification.rb +77 -0
  479. data/lib/rails_den/import/discourse/backup.rb +169 -0
  480. data/lib/rails_den/import/discourse/finalizer.rb +617 -0
  481. data/lib/rails_den/import/discourse/importer.rb +266 -0
  482. data/lib/rails_den/import/discourse/source_database.rb +320 -0
  483. data/lib/rails_den/import/discourse/staff_roles.rb +173 -0
  484. data/lib/rails_den/import/discourse/transformer.rb +940 -0
  485. data/lib/rails_den/import/discourse.rb +9 -0
  486. data/lib/rails_den/licensing/client.rb +128 -0
  487. data/lib/rails_den/licensing/result.rb +57 -0
  488. data/lib/rails_den/licensing.rb +28 -0
  489. data/lib/rails_den/metadata.rb +343 -0
  490. data/lib/rails_den/onebox/address_guard.rb +108 -0
  491. data/lib/rails_den/onebox/body_renderer.rb +135 -0
  492. data/lib/rails_den/onebox/embed_policy.rb +179 -0
  493. data/lib/rails_den/onebox/errors.rb +24 -0
  494. data/lib/rails_den/onebox/extractor.rb +130 -0
  495. data/lib/rails_den/onebox/fetcher.rb +199 -0
  496. data/lib/rails_den/onebox/http_transport.rb +164 -0
  497. data/lib/rails_den/onebox/metadata.rb +343 -0
  498. data/lib/rails_den/onebox/oembed/client.rb +46 -0
  499. data/lib/rails_den/onebox/oembed/discovery.rb +296 -0
  500. data/lib/rails_den/onebox/oembed/response.rb +375 -0
  501. data/lib/rails_den/onebox/oembed.rb +18 -0
  502. data/lib/rails_den/onebox/providers/base.rb +23 -0
  503. data/lib/rails_den/onebox/providers/bluesky.rb +402 -0
  504. data/lib/rails_den/onebox/providers/generic.rb +310 -0
  505. data/lib/rails_den/onebox/providers/giphy.rb +281 -0
  506. data/lib/rails_den/onebox/providers/github.rb +300 -0
  507. data/lib/rails_den/onebox/providers/mastodon.rb +505 -0
  508. data/lib/rails_den/onebox/providers/soundcloud.rb +199 -0
  509. data/lib/rails_den/onebox/providers/spotify.rb +196 -0
  510. data/lib/rails_den/onebox/providers/tenor.rb +296 -0
  511. data/lib/rails_den/onebox/providers/tiktok.rb +292 -0
  512. data/lib/rails_den/onebox/providers/twitch.rb +414 -0
  513. data/lib/rails_den/onebox/providers/vimeo.rb +295 -0
  514. data/lib/rails_den/onebox/providers/youtube.rb +201 -0
  515. data/lib/rails_den/onebox/registry.rb +41 -0
  516. data/lib/rails_den/onebox/renderer.rb +403 -0
  517. data/lib/rails_den/onebox/result.rb +86 -0
  518. data/lib/rails_den/onebox/synchronizer.rb +161 -0
  519. data/lib/rails_den/onebox/url.rb +35 -0
  520. data/lib/rails_den/onebox.rb +176 -0
  521. data/lib/rails_den/presence.rb +162 -0
  522. data/lib/rails_den/standalone_template.rb +700 -0
  523. data/lib/rails_den/themes.rb +80 -0
  524. data/lib/rails_den/version.rb +3 -0
  525. data/lib/rails_den/view_installer.rb +129 -0
  526. data/lib/rails_den.rb +113 -0
  527. data/lib/tasks/rails_den_tasks.rake +4 -0
  528. metadata +735 -0
@@ -0,0 +1,1283 @@
1
+ .rails-den-chat-mode-shell {
2
+ --rd-world-cyan: #55e6ff;
3
+ --rd-world-violet: #a855f7;
4
+ --rd-world-magenta: #e94cff;
5
+ --rd-world-emerald: #35f1b4;
6
+ --rd-world-blue: #4387ff;
7
+ --rd-world-ink: #051020;
8
+ --rd-world-panel: rgba(7, 20, 42, 0.82);
9
+ --rd-world-border: rgba(106, 226, 255, 0.34);
10
+ --rd-world-text: #effcff;
11
+ --rd-world-muted: #9fc9dc;
12
+
13
+ width: 100%;
14
+ }
15
+
16
+ .rails-den-chat-mode-toolbar {
17
+ display: flex;
18
+ align-items: center;
19
+ justify-content: space-between;
20
+ gap: 1rem;
21
+ margin-bottom: 0.75rem;
22
+ }
23
+
24
+ .rails-den-chat-mode-heading {
25
+ display: flex;
26
+ align-items: baseline;
27
+ gap: 0.6rem;
28
+ min-width: 0;
29
+ }
30
+
31
+ .rails-den-chat-mode-heading strong {
32
+ font-size: 0.78rem;
33
+ }
34
+
35
+ .rails-den-chat-mode-heading span {
36
+ color: var(--rd-chat-muted);
37
+ font-size: 0.68rem;
38
+ }
39
+
40
+ .rails-den-chat-mode-controls {
41
+ display: inline-flex;
42
+ align-items: center;
43
+ gap: 0.25rem;
44
+ padding: 0.2rem;
45
+ background:
46
+ color-mix(
47
+ in srgb,
48
+ currentColor 5%,
49
+ transparent
50
+ );
51
+ border: 1px solid var(--rd-chat-border);
52
+ border-radius: 999px;
53
+ }
54
+
55
+ .rails-den-chat-mode-button {
56
+ appearance: none;
57
+ min-height: 2rem;
58
+ padding: 0.35rem 0.68rem;
59
+ color: var(--rd-chat-muted);
60
+ background: transparent;
61
+ border: 1px solid transparent;
62
+ border-radius: 999px;
63
+ font: inherit;
64
+ font-size: 0.68rem;
65
+ font-weight: 700;
66
+ cursor: pointer;
67
+ }
68
+
69
+ .rails-den-chat-mode-button:hover {
70
+ color: inherit;
71
+ }
72
+
73
+ .rails-den-chat-mode-button.is-active {
74
+ color: inherit;
75
+ background:
76
+ color-mix(
77
+ in srgb,
78
+ currentColor 10%,
79
+ transparent
80
+ );
81
+ border-color: var(--rd-chat-border-strong);
82
+ }
83
+
84
+ .rails-den-chat-world {
85
+ position: relative;
86
+ box-sizing: border-box;
87
+ width: 100%;
88
+ height: min(72vh, 760px);
89
+ min-height: 560px;
90
+ overflow: hidden;
91
+ color: var(--rd-world-text);
92
+ background:
93
+ radial-gradient(
94
+ circle at 50% 38%,
95
+ #12335b 0,
96
+ #08172c 35%,
97
+ #030b18 78%
98
+ );
99
+ border: 1px solid var(--rd-world-border);
100
+ border-radius: 0.85rem;
101
+ box-shadow:
102
+ 0 1.5rem 4rem rgba(0, 0, 0, 0.24),
103
+ inset 0 0 4rem rgba(44, 211, 255, 0.06);
104
+ }
105
+
106
+ .rails-den-chat-world[hidden] {
107
+ display: none;
108
+ }
109
+
110
+ .rails-den-chat-world-canvas {
111
+ position: absolute;
112
+ inset: 0;
113
+ display: block;
114
+ width: 100%;
115
+ height: 100%;
116
+ }
117
+
118
+ .rails-den-chat-world-overlay {
119
+ position: absolute;
120
+ inset: 0;
121
+ z-index: 2;
122
+ display: flex;
123
+ flex-direction: column;
124
+ justify-content: space-between;
125
+ padding: 1rem;
126
+ pointer-events: none;
127
+ }
128
+
129
+ .rails-den-chat-world-status {
130
+ display: inline-flex;
131
+ align-items: center;
132
+ align-self: flex-start;
133
+ gap: 0.55rem;
134
+ max-width: min(34rem, 90%);
135
+ padding: 0.55rem 0.75rem;
136
+ color: var(--rd-world-text);
137
+ background: var(--rd-world-panel);
138
+ border: 1px solid var(--rd-world-border);
139
+ border-radius: 0.55rem;
140
+ box-shadow:
141
+ 0 0 1.5rem rgba(60, 220, 255, 0.08);
142
+ backdrop-filter: blur(14px);
143
+ }
144
+
145
+ .rails-den-chat-world-status-dot {
146
+ width: 0.55rem;
147
+ height: 0.55rem;
148
+ flex: 0 0 auto;
149
+ background: var(--rd-world-emerald);
150
+ border-radius: 50%;
151
+ box-shadow:
152
+ 0 0 0.8rem var(--rd-world-emerald);
153
+ }
154
+
155
+ .rails-den-chat-world-status-text {
156
+ display: grid;
157
+ gap: 0.08rem;
158
+ }
159
+
160
+ .rails-den-chat-world-status-text strong {
161
+ font-size: 0.72rem;
162
+ }
163
+
164
+ .rails-den-chat-world-status-text span {
165
+ color: var(--rd-world-muted);
166
+ font-size: 0.61rem;
167
+ }
168
+
169
+ .rails-den-chat-world-controls {
170
+ position: absolute;
171
+ left: 1rem;
172
+ bottom: 1rem;
173
+ width: min(19rem, calc(100vw - 2rem));
174
+ box-sizing: border-box;
175
+ padding: 0.82rem;
176
+ color: var(--rd-world-text);
177
+ background:
178
+ linear-gradient(
179
+ 145deg,
180
+ rgba(6, 21, 43, 0.92),
181
+ rgba(5, 13, 30, 0.82)
182
+ );
183
+ border: 1px solid var(--rd-world-border);
184
+ border-radius: 0.72rem;
185
+ box-shadow:
186
+ 0 0 2rem rgba(60, 220, 255, 0.08),
187
+ inset 0 0 1.5rem rgba(85, 230, 255, 0.025);
188
+ backdrop-filter:
189
+ blur(16px)
190
+ saturate(1.2);
191
+ }
192
+
193
+ .rails-den-chat-world-controls-heading {
194
+ display: grid;
195
+ gap: 0.12rem;
196
+ margin-bottom: 0.62rem;
197
+ padding-bottom: 0.58rem;
198
+ border-bottom:
199
+ 1px solid
200
+ rgba(106, 226, 255, 0.16);
201
+ }
202
+
203
+ .rails-den-chat-world-controls-heading strong {
204
+ font-size: 0.74rem;
205
+ }
206
+
207
+ .rails-den-chat-world-controls-heading span {
208
+ color: var(--rd-world-cyan);
209
+ font-size: 0.6rem;
210
+ font-weight: 650;
211
+ }
212
+
213
+ .rails-den-chat-world-controls-grid {
214
+ display: grid;
215
+ grid-template-columns:
216
+ repeat(2, minmax(0, 1fr));
217
+ gap: 0.42rem 0.7rem;
218
+ }
219
+
220
+ .rails-den-chat-world-control {
221
+ display: grid;
222
+ grid-template-columns:
223
+ minmax(3.4rem, auto)
224
+ 1fr;
225
+ align-items: center;
226
+ gap: 0.42rem;
227
+ min-width: 0;
228
+ color: var(--rd-world-muted);
229
+ font-size: 0.58rem;
230
+ line-height: 1.2;
231
+ }
232
+
233
+ .rails-den-chat-world-control-keys {
234
+ display: inline-flex;
235
+ align-items: center;
236
+ justify-content: center;
237
+ min-height: 1.45rem;
238
+ padding: 0.14rem 0.34rem;
239
+ color: var(--rd-world-text);
240
+ background:
241
+ rgba(85, 230, 255, 0.08);
242
+ border:
243
+ 1px solid
244
+ rgba(106, 226, 255, 0.24);
245
+ border-radius: 0.35rem;
246
+ font-size: 0.55rem;
247
+ font-weight: 800;
248
+ white-space: nowrap;
249
+ }
250
+
251
+ .rails-den-chat-world-control-keys kbd {
252
+ padding: 0;
253
+ color: inherit;
254
+ background: transparent;
255
+ border: 0;
256
+ box-shadow: none;
257
+ font: inherit;
258
+ }
259
+
260
+ .rails-den-chat-world-title {
261
+ align-self: center;
262
+ margin-bottom: 1rem;
263
+ text-align: center;
264
+ text-shadow:
265
+ 0 0 1rem rgba(84, 226, 255, 0.36);
266
+ }
267
+
268
+ .rails-den-chat-world-title span {
269
+ display: block;
270
+ margin-bottom: 0.2rem;
271
+ color: var(--rd-world-cyan);
272
+ font-size: 0.6rem;
273
+ font-weight: 800;
274
+ letter-spacing: 0.18em;
275
+ text-transform: uppercase;
276
+ }
277
+
278
+ .rails-den-chat-world-title strong {
279
+ display: block;
280
+ font-size:
281
+ clamp(
282
+ 1.35rem,
283
+ 4vw,
284
+ 2.2rem
285
+ );
286
+ letter-spacing: -0.025em;
287
+ }
288
+
289
+ .rails-den-chat-world-title small {
290
+ display: block;
291
+ margin-top: 0.35rem;
292
+ color: var(--rd-world-muted);
293
+ font-size: 0.68rem;
294
+ font-weight: 500;
295
+ }
296
+
297
+ .rails-den-chat-classic-shell[hidden] {
298
+ display: none;
299
+ }
300
+
301
+ .rails-den-chat-spatial-deck-shell {
302
+ display: none;
303
+ }
304
+
305
+ /* =========================================================
306
+ IMMERSIVE 3-D MODE
307
+ ========================================================= */
308
+
309
+ html:has(
310
+ .rails-den-chat-mode-shell[
311
+ data-rails-den-chat-active-mode="3d"
312
+ ]
313
+ ),
314
+ body:has(
315
+ .rails-den-chat-mode-shell[
316
+ data-rails-den-chat-active-mode="3d"
317
+ ]
318
+ ) {
319
+ overflow: hidden;
320
+ }
321
+
322
+ .rails-den-chat-mode-shell[
323
+ data-rails-den-chat-active-mode="3d"
324
+ ] {
325
+ position: fixed;
326
+ inset: 0;
327
+ z-index: 10000;
328
+ width: 100vw;
329
+ height: 100vh;
330
+ height: 100dvh;
331
+ margin: 0;
332
+ padding: 0;
333
+ overflow: hidden;
334
+ background: var(--rd-world-ink);
335
+ }
336
+
337
+ .rails-den-chat-mode-shell[
338
+ data-rails-den-chat-active-mode="3d"
339
+ ]
340
+ .rails-den-chat-mode-toolbar {
341
+ position: absolute;
342
+ top:
343
+ max(
344
+ 1rem,
345
+ env(safe-area-inset-top)
346
+ );
347
+ right:
348
+ max(
349
+ 1rem,
350
+ env(safe-area-inset-right)
351
+ );
352
+ z-index: 20;
353
+ margin: 0;
354
+ pointer-events: auto;
355
+ }
356
+
357
+ .rails-den-chat-mode-shell[
358
+ data-rails-den-chat-active-mode="3d"
359
+ ]
360
+ .rails-den-chat-mode-heading {
361
+ display: none;
362
+ }
363
+
364
+ .rails-den-chat-mode-shell[
365
+ data-rails-den-chat-active-mode="3d"
366
+ ]
367
+ .rails-den-chat-mode-controls {
368
+ padding: 0.25rem;
369
+ background: rgba(5, 16, 32, 0.76);
370
+ border-color: rgba(106, 226, 255, 0.34);
371
+ box-shadow:
372
+ 0 0 1.5rem rgba(44, 211, 255, 0.1);
373
+ backdrop-filter: blur(16px);
374
+ }
375
+
376
+ .rails-den-chat-mode-shell[
377
+ data-rails-den-chat-active-mode="3d"
378
+ ]
379
+ .rails-den-chat-mode-button {
380
+ min-height: 2.25rem;
381
+ padding: 0.42rem 0.8rem;
382
+ color: var(--rd-world-muted);
383
+ }
384
+
385
+ .rails-den-chat-mode-shell[
386
+ data-rails-den-chat-active-mode="3d"
387
+ ]
388
+ .rails-den-chat-mode-button:hover {
389
+ color: var(--rd-world-text);
390
+ }
391
+
392
+ .rails-den-chat-mode-shell[
393
+ data-rails-den-chat-active-mode="3d"
394
+ ]
395
+ .rails-den-chat-mode-button[
396
+ data-rails-den-chat-mode="3d"
397
+ ] {
398
+ display: none;
399
+ }
400
+
401
+ .rails-den-chat-mode-shell[
402
+ data-rails-den-chat-active-mode="3d"
403
+ ]
404
+ .rails-den-chat-mode-button[
405
+ data-rails-den-chat-mode="classic"
406
+ ] {
407
+ color: var(--rd-world-text);
408
+ background: rgba(85, 230, 255, 0.08);
409
+ border-color: rgba(106, 226, 255, 0.24);
410
+ }
411
+
412
+ .rails-den-chat-mode-shell[
413
+ data-rails-den-chat-active-mode="3d"
414
+ ]
415
+ .rails-den-chat-world {
416
+ position: absolute;
417
+ inset: 0;
418
+ width: 100%;
419
+ height: 100%;
420
+ min-height: 0;
421
+ border: 0;
422
+ border-radius: 0;
423
+ box-shadow: none;
424
+ }
425
+
426
+ .rails-den-chat-mode-shell[
427
+ data-rails-den-chat-active-mode="3d"
428
+ ]
429
+ .rails-den-chat-world-overlay {
430
+ padding:
431
+ max(
432
+ 1rem,
433
+ env(safe-area-inset-top)
434
+ )
435
+ max(
436
+ 1rem,
437
+ env(safe-area-inset-right)
438
+ )
439
+ max(
440
+ 1rem,
441
+ env(safe-area-inset-bottom)
442
+ )
443
+ max(
444
+ 1rem,
445
+ env(safe-area-inset-left)
446
+ );
447
+ }
448
+
449
+ .rails-den-chat-mode-shell[
450
+ data-rails-den-chat-active-mode="3d"
451
+ ]
452
+ .rails-den-chat-world-controls {
453
+ left:
454
+ max(
455
+ 1rem,
456
+ env(safe-area-inset-left)
457
+ );
458
+ bottom:
459
+ max(
460
+ 1rem,
461
+ env(safe-area-inset-bottom)
462
+ );
463
+ }
464
+
465
+ .rails-den-chat-mode-shell[
466
+ data-rails-den-chat-active-mode="3d"
467
+ ]
468
+ .rails-den-chat-world-title {
469
+ margin-bottom:
470
+ max(
471
+ 1rem,
472
+ env(safe-area-inset-bottom)
473
+ );
474
+ }
475
+
476
+ /* The directory's Classic browser never becomes the 3-D deck. */
477
+ .rails-den-chat-mode-shell[
478
+ data-rails-den-chat-directory-shell
479
+ ][
480
+ data-rails-den-chat-active-mode="3d"
481
+ ]
482
+ .rails-den-chat-classic-shell {
483
+ display: none !important;
484
+ }
485
+
486
+ /* Atrium persistent deck + channel-page compact deck. */
487
+ .rails-den-chat-mode-shell[
488
+ data-rails-den-chat-active-mode="3d"
489
+ ]
490
+ .rails-den-chat-spatial-deck-shell,
491
+ .rails-den-chat-mode-shell:not(
492
+ [data-rails-den-chat-directory-shell]
493
+ )[
494
+ data-rails-den-chat-active-mode="3d"
495
+ ]
496
+ .rails-den-chat-classic-shell {
497
+ position: absolute;
498
+ right:
499
+ max(
500
+ 1rem,
501
+ env(safe-area-inset-right)
502
+ );
503
+ bottom:
504
+ max(
505
+ 1rem,
506
+ env(safe-area-inset-bottom)
507
+ );
508
+ z-index: 32;
509
+ display: block;
510
+ width: min(34rem, calc(100vw - 2rem));
511
+ height: min(36rem, calc(100dvh - 7rem));
512
+ min-height: 22rem;
513
+ margin: 0;
514
+ opacity: 0;
515
+ visibility: hidden;
516
+ pointer-events: none;
517
+ transform:
518
+ translateY(0.8rem)
519
+ scale(0.985);
520
+ transform-origin: right bottom;
521
+ transition:
522
+ opacity 140ms ease,
523
+ transform 140ms ease,
524
+ visibility 140ms step-end;
525
+ }
526
+
527
+ .rails-den-chat-mode-shell[
528
+ data-rails-den-chat-active-mode="3d"
529
+ ][
530
+ data-rails-den-chat-deck-open="true"
531
+ ]
532
+ .rails-den-chat-spatial-deck-shell,
533
+ .rails-den-chat-mode-shell:not(
534
+ [data-rails-den-chat-directory-shell]
535
+ )[
536
+ data-rails-den-chat-active-mode="3d"
537
+ ][
538
+ data-rails-den-chat-deck-open="true"
539
+ ]
540
+ .rails-den-chat-classic-shell {
541
+ opacity: 1;
542
+ visibility: visible;
543
+ pointer-events: auto;
544
+ transform:
545
+ translateY(0)
546
+ scale(1);
547
+ transition:
548
+ opacity 140ms ease,
549
+ transform 140ms ease,
550
+ visibility 0ms step-start;
551
+ }
552
+
553
+ .rails-den-chat-mode-shell[
554
+ data-rails-den-chat-active-mode="3d"
555
+ ]
556
+ .rails-den-chat-spatial-deck-shell::before,
557
+ .rails-den-chat-mode-shell:not(
558
+ [data-rails-den-chat-directory-shell]
559
+ )[
560
+ data-rails-den-chat-active-mode="3d"
561
+ ]
562
+ .rails-den-chat-classic-shell::before {
563
+ content: "";
564
+ position: absolute;
565
+ inset: -1px;
566
+ z-index: -1;
567
+ pointer-events: none;
568
+ border-radius: 0.92rem;
569
+ background:
570
+ linear-gradient(
571
+ 135deg,
572
+ rgba(85, 230, 255, 0.28),
573
+ rgba(168, 85, 247, 0.1) 48%,
574
+ rgba(53, 241, 180, 0.16)
575
+ );
576
+ filter: blur(14px);
577
+ opacity: 0.75;
578
+ }
579
+
580
+ .rails-den-chat-mode-shell[
581
+ data-rails-den-chat-active-mode="3d"
582
+ ]
583
+ .rails-den-chat-spatial-deck-shell >
584
+ .rails-den-chat-client,
585
+ .rails-den-chat-mode-shell:not(
586
+ [data-rails-den-chat-directory-shell]
587
+ )[
588
+ data-rails-den-chat-active-mode="3d"
589
+ ]
590
+ .rails-den-chat-classic-shell >
591
+ .rails-den-chat-shell {
592
+ width: 100%;
593
+ height: 100%;
594
+ min-height: 0;
595
+ }
596
+
597
+ .rails-den-chat-mode-shell[
598
+ data-rails-den-chat-active-mode="3d"
599
+ ]
600
+ .rails-den-chat-spatial-deck-shell >
601
+ .rails-den-chat-client,
602
+ .rails-den-chat-mode-shell:not(
603
+ [data-rails-den-chat-directory-shell]
604
+ )[
605
+ data-rails-den-chat-active-mode="3d"
606
+ ]
607
+ .rails-den-chat-shell {
608
+ box-sizing: border-box;
609
+ overflow: hidden;
610
+ color: var(--rd-world-text);
611
+ background:
612
+ linear-gradient(
613
+ 145deg,
614
+ rgba(4, 18, 36, 0.94),
615
+ rgba(5, 12, 29, 0.9)
616
+ );
617
+ border:
618
+ 1px solid
619
+ rgba(106, 226, 255, 0.42);
620
+ border-radius: 0.86rem;
621
+ box-shadow:
622
+ 0 1.6rem 4.5rem rgba(0, 0, 0, 0.42),
623
+ 0 0 2.5rem rgba(85, 230, 255, 0.1),
624
+ inset 0 0 2rem rgba(85, 230, 255, 0.025);
625
+ backdrop-filter:
626
+ blur(20px)
627
+ saturate(1.25);
628
+ }
629
+
630
+ .rails-den-chat-mode-shell[
631
+ data-rails-den-chat-active-mode="3d"
632
+ ]
633
+ .rails-den-chat-client {
634
+ min-width: 0;
635
+ min-height: 0;
636
+ }
637
+
638
+ .rails-den-chat-mode-shell[
639
+ data-rails-den-chat-active-mode="3d"
640
+ ]
641
+ .rails-den-chat-workspace {
642
+ display: grid;
643
+ grid-template-columns: minmax(0, 1fr);
644
+ width: 100%;
645
+ height: 100%;
646
+ min-height: 0;
647
+ overflow: hidden;
648
+ background: transparent;
649
+ }
650
+
651
+ .rails-den-chat-mode-shell[
652
+ data-rails-den-chat-active-mode="3d"
653
+ ]
654
+ .rails-den-chat-sidebar,
655
+ .rails-den-chat-mode-shell[
656
+ data-rails-den-chat-active-mode="3d"
657
+ ]
658
+ .rails-den-chat-members {
659
+ display: none;
660
+ }
661
+
662
+ .rails-den-chat-mode-shell[
663
+ data-rails-den-chat-active-mode="3d"
664
+ ]
665
+ .rails-den-chat-main {
666
+ display: grid;
667
+ grid-template-rows:
668
+ auto
669
+ auto
670
+ auto
671
+ minmax(0, 1fr)
672
+ auto
673
+ auto;
674
+ width: 100%;
675
+ height: 100%;
676
+ min-width: 0;
677
+ min-height: 0;
678
+ color: var(--rd-world-text);
679
+ background: transparent;
680
+ }
681
+
682
+ .rails-den-chat-mode-shell[
683
+ data-rails-den-chat-active-mode="3d"
684
+ ]
685
+ .rails-den-chat-header {
686
+ display: flex;
687
+ align-items: center;
688
+ justify-content: space-between;
689
+ gap: 0.7rem;
690
+ min-height: 3.2rem;
691
+ padding: 0.56rem 0.68rem;
692
+ background: rgba(85, 230, 255, 0.025);
693
+ border-bottom:
694
+ 1px solid
695
+ rgba(106, 226, 255, 0.18);
696
+ }
697
+
698
+ .rails-den-chat-header-copy {
699
+ min-width: 0;
700
+ }
701
+
702
+ .rails-den-chat-mode-shell[
703
+ data-rails-den-chat-active-mode="3d"
704
+ ]
705
+ .rails-den-chat-header h1 {
706
+ margin: 0;
707
+ overflow: hidden;
708
+ color: var(--rd-world-text);
709
+ font-size: 0.9rem;
710
+ text-overflow: ellipsis;
711
+ white-space: nowrap;
712
+ }
713
+
714
+ .rails-den-chat-mode-shell[
715
+ data-rails-den-chat-active-mode="3d"
716
+ ]
717
+ .rails-den-chat-header p {
718
+ margin: 0.1rem 0 0;
719
+ max-width: 21rem;
720
+ overflow: hidden;
721
+ color: var(--rd-world-muted);
722
+ font-size: 0.6rem;
723
+ text-overflow: ellipsis;
724
+ white-space: nowrap;
725
+ }
726
+
727
+ .rails-den-chat-hud-kicker {
728
+ display: none;
729
+ }
730
+
731
+ .rails-den-chat-mode-shell[
732
+ data-rails-den-chat-active-mode="3d"
733
+ ]
734
+ .rails-den-chat-hud-kicker {
735
+ display: block;
736
+ margin-bottom: 0.08rem;
737
+ color: var(--rd-world-cyan);
738
+ font-size: 0.52rem;
739
+ font-weight: 800;
740
+ letter-spacing: 0.1em;
741
+ text-transform: uppercase;
742
+ }
743
+
744
+ .rails-den-chat-header-actions {
745
+ display: flex;
746
+ align-items: center;
747
+ justify-content: flex-end;
748
+ gap: 0.35rem;
749
+ flex: 0 0 auto;
750
+ }
751
+
752
+ .rails-den-chat-spatial-count {
753
+ display: none;
754
+ }
755
+
756
+ .rails-den-chat-mode-shell[
757
+ data-rails-den-chat-active-mode="3d"
758
+ ]
759
+ .rails-den-chat-spatial-count {
760
+ display: inline-flex;
761
+ align-items: center;
762
+ min-height: 1.7rem;
763
+ padding: 0.18rem 0.42rem;
764
+ color: var(--rd-world-cyan);
765
+ background: rgba(85, 230, 255, 0.06);
766
+ border:
767
+ 1px solid
768
+ rgba(85, 230, 255, 0.18);
769
+ border-radius: 999px;
770
+ font-size: 0.56rem;
771
+ font-weight: 800;
772
+ white-space: nowrap;
773
+ }
774
+
775
+ .rails-den-chat-mode-shell[
776
+ data-rails-den-chat-active-mode="3d"
777
+ ]
778
+ .rails-den-chat-connection {
779
+ min-height: 1.7rem;
780
+ box-sizing: border-box;
781
+ display: inline-flex;
782
+ align-items: center;
783
+ color: var(--rd-world-muted);
784
+ font-size: 0.55rem;
785
+ }
786
+
787
+ .rails-den-chat-mode-shell[
788
+ data-rails-den-chat-active-mode="3d"
789
+ ]
790
+ .rails-den-chat-connection.is-live {
791
+ color: var(--rd-world-emerald);
792
+ }
793
+
794
+ .rails-den-chat-hud-close {
795
+ display: none;
796
+ }
797
+
798
+ .rails-den-chat-mode-shell[
799
+ data-rails-den-chat-active-mode="3d"
800
+ ]
801
+ .rails-den-chat-hud-close {
802
+ appearance: none;
803
+ display: inline-grid;
804
+ place-items: center;
805
+ width: 1.85rem;
806
+ height: 1.85rem;
807
+ padding: 0;
808
+ color: var(--rd-world-cyan);
809
+ background: rgba(85, 230, 255, 0.06);
810
+ border:
811
+ 1px solid
812
+ rgba(106, 226, 255, 0.2);
813
+ border-radius: 0.4rem;
814
+ font: inherit;
815
+ font-size: 1rem;
816
+ line-height: 1;
817
+ cursor: pointer;
818
+ }
819
+
820
+ .rails-den-chat-mode-shell[
821
+ data-rails-den-chat-active-mode="3d"
822
+ ]
823
+ .rails-den-chat-hud-close:hover {
824
+ color: var(--rd-world-text);
825
+ background: rgba(85, 230, 255, 0.12);
826
+ border-color:
827
+ rgba(106, 226, 255, 0.38);
828
+ }
829
+
830
+ .rails-den-chat-hud-room-picker,
831
+ .rails-den-chat-spatial-members,
832
+ .rails-den-chat-hud-atrium-empty {
833
+ display: none;
834
+ }
835
+
836
+ .rails-den-chat-mode-shell[
837
+ data-rails-den-chat-active-mode="3d"
838
+ ]
839
+ .rails-den-chat-hud-room-picker {
840
+ display: grid;
841
+ grid-template-columns:
842
+ auto
843
+ minmax(0, 1fr);
844
+ align-items: center;
845
+ gap: 0.5rem;
846
+ padding: 0.42rem 0.68rem;
847
+ border-bottom:
848
+ 1px solid
849
+ rgba(106, 226, 255, 0.13);
850
+ }
851
+
852
+ .rails-den-chat-mode-shell[
853
+ data-rails-den-chat-active-mode="3d"
854
+ ]
855
+ .rails-den-chat-hud-room-picker label {
856
+ color: var(--rd-world-muted);
857
+ font-size: 0.56rem;
858
+ font-weight: 800;
859
+ letter-spacing: 0.08em;
860
+ text-transform: uppercase;
861
+ }
862
+
863
+ .rails-den-chat-mode-shell[
864
+ data-rails-den-chat-active-mode="3d"
865
+ ]
866
+ .rails-den-chat-hud-room-picker select {
867
+ min-width: 0;
868
+ min-height: 1.9rem;
869
+ padding: 0.2rem 0.42rem;
870
+ color: var(--rd-world-text);
871
+ background:
872
+ rgba(85, 230, 255, 0.055);
873
+ border:
874
+ 1px solid
875
+ rgba(106, 226, 255, 0.2);
876
+ border-radius: 0.4rem;
877
+ font: inherit;
878
+ font-size: 0.63rem;
879
+ color-scheme: dark;
880
+ }
881
+
882
+ .rails-den-chat-mode-shell[
883
+ data-rails-den-chat-active-mode="3d"
884
+ ]
885
+ .rails-den-chat-hud-room-picker select option {
886
+ color: #effcff;
887
+ background: #07142a;
888
+ }
889
+
890
+ .rails-den-chat-mode-shell[
891
+ data-rails-den-chat-active-mode="3d"
892
+ ]
893
+ .rails-den-chat-hud-room-picker select option:checked {
894
+ color: #051020;
895
+ background: #55e6ff;
896
+ }
897
+
898
+ .rails-den-chat-mode-shell[
899
+ data-rails-den-chat-active-mode="3d"
900
+ ]
901
+ .rails-den-chat-spatial-members {
902
+ display: block;
903
+ overflow: hidden;
904
+ padding: 0.32rem 0.68rem;
905
+ color: var(--rd-world-muted);
906
+ border-bottom:
907
+ 1px solid
908
+ rgba(106, 226, 255, 0.1);
909
+ font-size: 0.56rem;
910
+ text-overflow: ellipsis;
911
+ white-space: nowrap;
912
+ }
913
+
914
+ .rails-den-chat-mode-shell[
915
+ data-rails-den-chat-active-mode="3d"
916
+ ]
917
+ .rails-den-chat-room-presence {
918
+ display: none;
919
+ }
920
+
921
+ .rails-den-chat-mode-shell[
922
+ data-rails-den-chat-active-mode="3d"
923
+ ]
924
+ .rails-den-chat-message-list {
925
+ min-height: 0;
926
+ max-height: none;
927
+ padding: 0.4rem 0 0.6rem;
928
+ overflow-y: auto;
929
+ scrollbar-color:
930
+ rgba(85, 230, 255, 0.28)
931
+ transparent;
932
+ }
933
+
934
+ .rails-den-chat-mode-shell[
935
+ data-rails-den-chat-active-mode="3d"
936
+ ]
937
+ .rails-den-chat-message {
938
+ padding: 0.34rem 0.68rem;
939
+ }
940
+
941
+ .rails-den-chat-mode-shell[
942
+ data-rails-den-chat-active-mode="3d"
943
+ ]
944
+ .rails-den-chat-message:hover {
945
+ background:
946
+ rgba(85, 230, 255, 0.045);
947
+ }
948
+
949
+ .rails-den-chat-mode-shell[
950
+ data-rails-den-chat-active-mode="3d"
951
+ ]
952
+ .rails-den-chat-message-meta strong {
953
+ color: var(--rd-world-cyan);
954
+ font-size: 0.7rem;
955
+ }
956
+
957
+ .rails-den-chat-mode-shell[
958
+ data-rails-den-chat-active-mode="3d"
959
+ ]
960
+ .rails-den-chat-message-meta time {
961
+ color: var(--rd-world-muted);
962
+ font-size: 0.54rem;
963
+ }
964
+
965
+ .rails-den-chat-mode-shell[
966
+ data-rails-den-chat-active-mode="3d"
967
+ ]
968
+ .rails-den-chat-message-body {
969
+ color: var(--rd-world-text);
970
+ font-size: 0.72rem;
971
+ line-height: 1.4;
972
+ }
973
+
974
+ .rails-den-chat-mode-shell[
975
+ data-rails-den-chat-active-mode="3d"
976
+ ]
977
+ .rails-den-chat-empty,
978
+ .rails-den-chat-mode-shell[
979
+ data-rails-den-chat-active-mode="3d"
980
+ ]
981
+ .rails-den-chat-hud-atrium-empty {
982
+ min-height: 10rem;
983
+ place-content: center;
984
+ place-items: center;
985
+ padding: 1rem;
986
+ color: var(--rd-world-muted);
987
+ text-align: center;
988
+ }
989
+
990
+ .rails-den-chat-mode-shell[
991
+ data-rails-den-chat-active-mode="3d"
992
+ ]
993
+ .rails-den-chat-hud-atrium-empty {
994
+ display: grid;
995
+ gap: 0.25rem;
996
+ }
997
+
998
+ .rails-den-chat-mode-shell[
999
+ data-rails-den-chat-active-mode="3d"
1000
+ ]
1001
+ .rails-den-chat-hud-atrium-empty strong {
1002
+ color: var(--rd-world-text);
1003
+ font-size: 0.78rem;
1004
+ }
1005
+
1006
+ .rails-den-chat-mode-shell[
1007
+ data-rails-den-chat-active-mode="3d"
1008
+ ]
1009
+ .rails-den-chat-hud-atrium-empty span {
1010
+ font-size: 0.63rem;
1011
+ }
1012
+
1013
+ .rails-den-chat-mode-shell[
1014
+ data-rails-den-chat-active-mode="3d"
1015
+ ]
1016
+ .rails-den-chat-composer {
1017
+ padding: 0.52rem 0.62rem 0.6rem;
1018
+ background: rgba(3, 12, 26, 0.72);
1019
+ border-top:
1020
+ 1px solid
1021
+ rgba(106, 226, 255, 0.18);
1022
+ }
1023
+
1024
+ .rails-den-chat-mode-shell[
1025
+ data-rails-den-chat-active-mode="3d"
1026
+ ]
1027
+ .rails-den-chat-composer textarea {
1028
+ min-height: 3.6rem;
1029
+ max-height: 8rem;
1030
+ resize: none;
1031
+ color: var(--rd-world-text);
1032
+ background:
1033
+ rgba(85, 230, 255, 0.045);
1034
+ border-color:
1035
+ rgba(106, 226, 255, 0.25);
1036
+ font-size: 0.72rem;
1037
+ }
1038
+
1039
+ .rails-den-chat-mode-shell[
1040
+ data-rails-den-chat-active-mode="3d"
1041
+ ]
1042
+ .rails-den-chat-composer textarea:focus {
1043
+ border-color: var(--rd-world-cyan);
1044
+ box-shadow:
1045
+ 0 0 0 2px rgba(85, 230, 255, 0.09),
1046
+ 0 0 1.25rem rgba(85, 230, 255, 0.08);
1047
+ }
1048
+
1049
+ .rails-den-chat-mode-shell[
1050
+ data-rails-den-chat-active-mode="3d"
1051
+ ]
1052
+ .rails-den-chat-composer-footer span {
1053
+ color: var(--rd-world-muted);
1054
+ font-size: 0.54rem;
1055
+ }
1056
+
1057
+ .rails-den-chat-mode-shell[
1058
+ data-rails-den-chat-active-mode="3d"
1059
+ ]
1060
+ .rails-den-chat-composer-footer button {
1061
+ color: var(--rd-world-text);
1062
+ background:
1063
+ rgba(85, 230, 255, 0.1);
1064
+ border-color:
1065
+ rgba(85, 230, 255, 0.3);
1066
+ }
1067
+
1068
+ .rails-den-chat-mode-shell[
1069
+ data-rails-den-chat-active-mode="3d"
1070
+ ]
1071
+ .rails-den-chat-error,
1072
+ .rails-den-chat-mode-shell[
1073
+ data-rails-den-chat-active-mode="3d"
1074
+ ]
1075
+ .rails-den-chat-cannot-post {
1076
+ margin: 0;
1077
+ padding: 0.42rem 0.68rem;
1078
+ color: var(--rd-world-text);
1079
+ background:
1080
+ rgba(233, 76, 255, 0.07);
1081
+ border-color:
1082
+ rgba(233, 76, 255, 0.22);
1083
+ font-size: 0.62rem;
1084
+ }
1085
+
1086
+ /*
1087
+ * Always-visible discoverability in movement mode.
1088
+ */
1089
+ .rails-den-chat-launcher {
1090
+ display: none;
1091
+ }
1092
+
1093
+ .rails-den-chat-mode-shell[
1094
+ data-rails-den-chat-active-mode="3d"
1095
+ ][
1096
+ data-rails-den-chat-deck-open="false"
1097
+ ]
1098
+ .rails-den-chat-launcher {
1099
+ position: absolute;
1100
+ right:
1101
+ max(
1102
+ 1rem,
1103
+ env(safe-area-inset-right)
1104
+ );
1105
+ bottom:
1106
+ max(
1107
+ 1rem,
1108
+ env(safe-area-inset-bottom)
1109
+ );
1110
+ z-index: 30;
1111
+ display: inline-flex;
1112
+ align-items: center;
1113
+ justify-content: center;
1114
+ min-height: 2.35rem;
1115
+ padding: 0.46rem 0.76rem;
1116
+ color: var(--rd-world-text);
1117
+ background:
1118
+ linear-gradient(
1119
+ 145deg,
1120
+ rgba(7, 31, 56, 0.94),
1121
+ rgba(5, 18, 38, 0.88)
1122
+ );
1123
+ border:
1124
+ 1px solid
1125
+ rgba(106, 226, 255, 0.46);
1126
+ border-radius: 0.56rem;
1127
+ box-shadow:
1128
+ 0 0 1.6rem rgba(85, 230, 255, 0.16),
1129
+ inset 0 0 1rem rgba(85, 230, 255, 0.04);
1130
+ backdrop-filter: blur(14px);
1131
+ font: inherit;
1132
+ font-size: 0.68rem;
1133
+ font-weight: 850;
1134
+ letter-spacing: 0.035em;
1135
+ cursor: pointer;
1136
+ }
1137
+
1138
+ .rails-den-chat-mode-shell[
1139
+ data-rails-den-chat-active-mode="3d"
1140
+ ][
1141
+ data-rails-den-chat-deck-open="false"
1142
+ ]
1143
+ .rails-den-chat-launcher:hover {
1144
+ background:
1145
+ linear-gradient(
1146
+ 145deg,
1147
+ rgba(12, 48, 78, 0.96),
1148
+ rgba(7, 26, 50, 0.92)
1149
+ );
1150
+ border-color:
1151
+ rgba(106, 226, 255, 0.72);
1152
+ }
1153
+
1154
+ .rails-den-chat-mode-shell[
1155
+ data-rails-den-chat-active-mode="3d"
1156
+ ][
1157
+ data-rails-den-chat-deck-open="true"
1158
+ ]
1159
+ .rails-den-chat-world-controls,
1160
+ .rails-den-chat-mode-shell[
1161
+ data-rails-den-chat-active-mode="3d"
1162
+ ][
1163
+ data-rails-den-chat-deck-open="true"
1164
+ ]
1165
+ .rails-den-chat-world-title {
1166
+ opacity: 0.18;
1167
+ }
1168
+
1169
+ .rails-den-chat-world-controls,
1170
+ .rails-den-chat-world-title {
1171
+ transition:
1172
+ opacity 140ms ease;
1173
+ }
1174
+
1175
+ @media (max-width: 760px) {
1176
+ .rails-den-chat-mode-toolbar {
1177
+ align-items: flex-start;
1178
+ flex-direction: column;
1179
+ }
1180
+
1181
+ .rails-den-chat-mode-controls {
1182
+ width: 100%;
1183
+ }
1184
+
1185
+ .rails-den-chat-mode-button {
1186
+ flex: 1 1 0;
1187
+ }
1188
+
1189
+ .rails-den-chat-world {
1190
+ height: 68vh;
1191
+ min-height: 460px;
1192
+ border-radius: 0.65rem;
1193
+ }
1194
+
1195
+ .rails-den-chat-world-overlay {
1196
+ padding: 0.7rem;
1197
+ }
1198
+
1199
+ .rails-den-chat-world-status {
1200
+ max-width: calc(100% - 1.4rem);
1201
+ }
1202
+
1203
+ .rails-den-chat-world-controls {
1204
+ display: none;
1205
+ }
1206
+
1207
+ .rails-den-chat-mode-shell[
1208
+ data-rails-den-chat-active-mode="3d"
1209
+ ]
1210
+ .rails-den-chat-mode-controls {
1211
+ width: auto;
1212
+ }
1213
+
1214
+ .rails-den-chat-mode-shell[
1215
+ data-rails-den-chat-active-mode="3d"
1216
+ ]
1217
+ .rails-den-chat-mode-button {
1218
+ flex: 0 0 auto;
1219
+ }
1220
+
1221
+ .rails-den-chat-mode-shell[
1222
+ data-rails-den-chat-active-mode="3d"
1223
+ ]
1224
+ .rails-den-chat-spatial-deck-shell,
1225
+ .rails-den-chat-mode-shell:not(
1226
+ [data-rails-den-chat-directory-shell]
1227
+ )[
1228
+ data-rails-den-chat-active-mode="3d"
1229
+ ]
1230
+ .rails-den-chat-classic-shell {
1231
+ right:
1232
+ max(
1233
+ 0.6rem,
1234
+ env(safe-area-inset-right)
1235
+ );
1236
+ bottom:
1237
+ max(
1238
+ 0.6rem,
1239
+ env(safe-area-inset-bottom)
1240
+ );
1241
+ width: calc(100vw - 1.2rem);
1242
+ height: min(66dvh, 38rem);
1243
+ min-height: 22rem;
1244
+ }
1245
+
1246
+ .rails-den-chat-mode-shell[
1247
+ data-rails-den-chat-active-mode="3d"
1248
+ ]
1249
+ .rails-den-chat-header p,
1250
+ .rails-den-chat-mode-shell[
1251
+ data-rails-den-chat-active-mode="3d"
1252
+ ]
1253
+ .rails-den-chat-connection {
1254
+ display: none;
1255
+ }
1256
+
1257
+ .rails-den-chat-mode-shell[
1258
+ data-rails-den-chat-active-mode="3d"
1259
+ ]
1260
+ .rails-den-chat-composer-footer span {
1261
+ display: none;
1262
+ }
1263
+ }
1264
+
1265
+ @media (prefers-reduced-motion: reduce) {
1266
+ .rails-den-chat-world {
1267
+ scroll-behavior: auto;
1268
+ }
1269
+
1270
+ .rails-den-chat-mode-shell[
1271
+ data-rails-den-chat-active-mode="3d"
1272
+ ]
1273
+ .rails-den-chat-spatial-deck-shell,
1274
+ .rails-den-chat-mode-shell:not(
1275
+ [data-rails-den-chat-directory-shell]
1276
+ )[
1277
+ data-rails-den-chat-active-mode="3d"
1278
+ ]
1279
+ .rails-den-chat-classic-shell {
1280
+ transition: none;
1281
+ transform: none;
1282
+ }
1283
+ }