turbo_overlay 0.3.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 (57) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +436 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +330 -0
  5. data/Rakefile +35 -0
  6. data/app/assets/stylesheets/turbo_overlay.css +234 -0
  7. data/app/javascript/turbo_overlay/dialog_utils.js +46 -0
  8. data/app/javascript/turbo_overlay/hint.js +670 -0
  9. data/app/javascript/turbo_overlay/history.js +184 -0
  10. data/app/javascript/turbo_overlay/index.js +53 -0
  11. data/app/javascript/turbo_overlay/options.js +152 -0
  12. data/app/javascript/turbo_overlay/overlay_controller.js +882 -0
  13. data/app/javascript/turbo_overlay/popover_position.js +64 -0
  14. data/app/javascript/turbo_overlay/setup.js +885 -0
  15. data/app/javascript/turbo_overlay/stack_controller.js +131 -0
  16. data/app/javascript/turbo_overlay/submit_close.js +49 -0
  17. data/app/javascript/turbo_overlay/visit.js +52 -0
  18. data/app/views/layouts/turbo_overlay/drawer.html.erb +5 -0
  19. data/app/views/layouts/turbo_overlay/hint.html.erb +10 -0
  20. data/app/views/layouts/turbo_overlay/modal.html.erb +5 -0
  21. data/app/views/layouts/turbo_overlay/popover.html.erb +5 -0
  22. data/app/views/turbo_overlay/_drawer.html.erb +49 -0
  23. data/app/views/turbo_overlay/_hint.html.erb +6 -0
  24. data/app/views/turbo_overlay/_loading.html.erb +12 -0
  25. data/app/views/turbo_overlay/_modal.html.erb +46 -0
  26. data/app/views/turbo_overlay/_popover.html.erb +54 -0
  27. data/config/importmap.rb +11 -0
  28. data/lib/generators/turbo_overlay/eject_generator.rb +115 -0
  29. data/lib/generators/turbo_overlay/install_generator.rb +443 -0
  30. data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_confirm.html.erb +13 -0
  31. data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_drawer.html.erb +50 -0
  32. data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_hint.html.erb +9 -0
  33. data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_loading.html.erb +9 -0
  34. data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_modal.html.erb +49 -0
  35. data/lib/generators/turbo_overlay/templates/chrome/bootstrap3/_popover.html.erb +54 -0
  36. data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_confirm.html.erb +13 -0
  37. data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_drawer.html.erb +55 -0
  38. data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_hint.html.erb +9 -0
  39. data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_loading.html.erb +9 -0
  40. data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_modal.html.erb +58 -0
  41. data/lib/generators/turbo_overlay/templates/chrome/bootstrap5/_popover.html.erb +53 -0
  42. data/lib/generators/turbo_overlay/templates/chrome/plain/_confirm.html.erb +14 -0
  43. data/lib/generators/turbo_overlay/templates/chrome/tailwind/_confirm.html.erb +17 -0
  44. data/lib/generators/turbo_overlay/templates/chrome/tailwind/_drawer.html.erb +55 -0
  45. data/lib/generators/turbo_overlay/templates/chrome/tailwind/_hint.html.erb +6 -0
  46. data/lib/generators/turbo_overlay/templates/chrome/tailwind/_loading.html.erb +9 -0
  47. data/lib/generators/turbo_overlay/templates/chrome/tailwind/_modal.html.erb +46 -0
  48. data/lib/generators/turbo_overlay/templates/chrome/tailwind/_popover.html.erb +54 -0
  49. data/lib/generators/turbo_overlay/templates/initializer.rb.tt +67 -0
  50. data/lib/turbo_overlay/configuration.rb +226 -0
  51. data/lib/turbo_overlay/controller.rb +405 -0
  52. data/lib/turbo_overlay/engine.rb +52 -0
  53. data/lib/turbo_overlay/helpers/stream_helper.rb +77 -0
  54. data/lib/turbo_overlay/helpers/view_helper.rb +651 -0
  55. data/lib/turbo_overlay/version.rb +3 -0
  56. data/lib/turbo_overlay.rb +20 -0
  57. metadata +161 -0
@@ -0,0 +1,77 @@
1
+ module TurboOverlay
2
+ module Helpers
3
+ # Adds `turbo_stream.overlay(:close, …)` (alias `:hide`,
4
+ # `:dismiss`) so server responses can dismiss open overlays.
5
+ #
6
+ # turbo_stream.overlay(:close) # close top
7
+ # turbo_stream.overlay(:close, scope: :all) # close everything
8
+ # turbo_stream.overlay(:close, scope: :all, type: :modal) # close all modals
9
+ # turbo_stream.overlay(:close, id: "edit_user_42") # close one by id
10
+ #
11
+ # Pair the close with a host-page navigation via `visit:` —
12
+ # closes the overlay, awaits the close animation, then runs
13
+ # `Turbo.visit` on the host page. Useful for stream-driven
14
+ # flows where there's no form submission to ride a redirect on
15
+ # (ActionCable broadcasts, async job completion):
16
+ #
17
+ # turbo_stream.overlay(:close, visit: widgets_path)
18
+ # turbo_stream.overlay(:close, visit: widgets_path, visit_action: :replace)
19
+ #
20
+ # The custom turbo-stream action dispatches a `turbo-overlay:close`
21
+ # window event with `scope`, `type`, `id`, `visit`, and
22
+ # `visitAction` details; the stack Stimulus controller routes the
23
+ # close and performs the visit after the close animation resolves.
24
+ module StreamHelper
25
+ ALLOWED_MESSAGES = %i[close hide dismiss].freeze
26
+ ALLOWED_SCOPES = %i[top all].freeze
27
+ # :hint is intentionally absent — hints dismiss client-side on
28
+ # mouseout and don't participate in the server-driven close path.
29
+ ALLOWED_TYPES = %i[modal drawer popover].freeze
30
+ ALLOWED_VISIT_ACTIONS = %i[advance replace].freeze
31
+
32
+ def overlay(message = :close, scope: :top, type: nil, id: nil,
33
+ visit: nil, visit_action: nil)
34
+ normalized_message = message.to_s.downcase.to_sym
35
+ unless ALLOWED_MESSAGES.include?(normalized_message)
36
+ raise ArgumentError,
37
+ "Unknown overlay message: #{message.inspect} (expected :close, :hide, or :dismiss)"
38
+ end
39
+
40
+ normalized_scope = scope.to_s.downcase.to_sym
41
+ unless ALLOWED_SCOPES.include?(normalized_scope)
42
+ raise ArgumentError,
43
+ "Unknown overlay scope: #{scope.inspect} (expected :top or :all)"
44
+ end
45
+
46
+ if type
47
+ normalized_type = type.to_s.downcase.to_sym
48
+ unless ALLOWED_TYPES.include?(normalized_type)
49
+ raise ArgumentError,
50
+ "Unknown overlay type: #{type.inspect} (expected :modal, :drawer, or :popover)"
51
+ end
52
+ end
53
+
54
+ if visit_action
55
+ normalized_visit_action = visit_action.to_s.downcase.to_sym
56
+ unless ALLOWED_VISIT_ACTIONS.include?(normalized_visit_action)
57
+ raise ArgumentError,
58
+ "Unknown visit_action: #{visit_action.inspect} (expected :advance or :replace)"
59
+ end
60
+ end
61
+
62
+ if visit_action && !visit
63
+ raise ArgumentError, "visit_action: requires a visit: URL"
64
+ end
65
+
66
+ attrs = { message: "close" }
67
+ attrs[:scope] = normalized_scope.to_s
68
+ attrs[:type] = normalized_type.to_s if type
69
+ attrs[:"overlay-id"] = id.to_s if id
70
+ attrs[:visit] = visit.to_s if visit
71
+ attrs[:"visit-action"] = normalized_visit_action.to_s if visit_action
72
+
73
+ turbo_stream_action_tag("overlay", **attrs)
74
+ end
75
+ end
76
+ end
77
+ end