coupdoeil 1.0.0.pre.alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.md +6 -0
  5. data/Rakefile +8 -0
  6. data/app/assets/config/coupdoeil_manifest.js +1 -0
  7. data/app/assets/javascripts/coupdoeil.js +2289 -0
  8. data/app/assets/javascripts/coupdoeil.min.js +2 -0
  9. data/app/assets/javascripts/coupdoeil.min.js.map +1 -0
  10. data/app/assets/stylesheets/coupdoeil/application.css +15 -0
  11. data/app/assets/stylesheets/coupdoeil/hovercard-animation.css +44 -0
  12. data/app/assets/stylesheets/coupdoeil/hovercard-arrow.css +39 -0
  13. data/app/assets/stylesheets/coupdoeil/hovercard.css +84 -0
  14. data/app/controllers/coupdoeil/hovercards_controller.rb +46 -0
  15. data/app/helpers/coupdoeil/application_helper.rb +16 -0
  16. data/app/javascript/coupdoeil/elements/coupdoeil_element.js +33 -0
  17. data/app/javascript/coupdoeil/events/onclick.js +68 -0
  18. data/app/javascript/coupdoeil/events/onmouseover.js +86 -0
  19. data/app/javascript/coupdoeil/events.js +19 -0
  20. data/app/javascript/coupdoeil/hovercard/actions.js +60 -0
  21. data/app/javascript/coupdoeil/hovercard/attributes.js +33 -0
  22. data/app/javascript/coupdoeil/hovercard/cache.js +18 -0
  23. data/app/javascript/coupdoeil/hovercard/closing.js +81 -0
  24. data/app/javascript/coupdoeil/hovercard/config.js +15 -0
  25. data/app/javascript/coupdoeil/hovercard/controller.js +22 -0
  26. data/app/javascript/coupdoeil/hovercard/opening.js +139 -0
  27. data/app/javascript/coupdoeil/hovercard/optionsParser.js +117 -0
  28. data/app/javascript/coupdoeil/hovercard/positioning.js +74 -0
  29. data/app/javascript/coupdoeil/hovercard/state_check.js +11 -0
  30. data/app/javascript/coupdoeil/hovercard.js +6 -0
  31. data/app/javascript/coupdoeil/index.js +1 -0
  32. data/app/models/coupdoeil/hovercard/option/animation.rb +20 -0
  33. data/app/models/coupdoeil/hovercard/option/cache.rb +19 -0
  34. data/app/models/coupdoeil/hovercard/option/loading.rb +19 -0
  35. data/app/models/coupdoeil/hovercard/option/offset.rb +35 -0
  36. data/app/models/coupdoeil/hovercard/option/placement.rb +44 -0
  37. data/app/models/coupdoeil/hovercard/option/trigger.rb +19 -0
  38. data/app/models/coupdoeil/hovercard/option.rb +45 -0
  39. data/app/models/coupdoeil/hovercard/options_set.rb +57 -0
  40. data/app/models/coupdoeil/hovercard/registry.rb +25 -0
  41. data/app/models/coupdoeil/hovercard/setup.rb +44 -0
  42. data/app/models/coupdoeil/hovercard/view_context_delegation.rb +18 -0
  43. data/app/models/coupdoeil/hovercard.rb +115 -0
  44. data/app/models/coupdoeil/params.rb +83 -0
  45. data/app/models/coupdoeil/tag.rb +45 -0
  46. data/app/style/hovercard-animation.scss +44 -0
  47. data/app/style/hovercard-arrow.scss +40 -0
  48. data/app/style/hovercard.scss +2 -0
  49. data/app/views/layouts/coupdoeil/application.html.erb +15 -0
  50. data/config/routes.rb +3 -0
  51. data/lib/coupdoeil/engine.rb +62 -0
  52. data/lib/coupdoeil/version.rb +3 -0
  53. data/lib/coupdoeil.rb +6 -0
  54. data/lib/generators/coupdoeil/hovercard/USAGE +15 -0
  55. data/lib/generators/coupdoeil/hovercard/hovercard_generator.rb +22 -0
  56. data/lib/generators/coupdoeil/hovercard/templates/hovercard.rb.tt +8 -0
  57. data/lib/generators/coupdoeil/install/install_generator.rb +71 -0
  58. data/lib/generators/coupdoeil/install/templates/layout.html.erb.tt +14 -0
  59. data/lib/tasks/coupdoeil_tasks.rake +4 -0
  60. metadata +129 -0
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coupdoeil
4
+ module Params
5
+ extend self
6
+
7
+ GLOBAL_ID_KEY = "_cd_globalid"
8
+
9
+ RESERVED_KEYS = [GLOBAL_ID_KEY, GLOBAL_ID_KEY.to_sym].freeze
10
+
11
+ private_constant :RESERVED_KEYS, :GLOBAL_ID_KEY
12
+
13
+ SerializationError = Class.new(StandardError)
14
+
15
+ def deserialize_global_id(hash) = GlobalID::Locator.locate hash[GLOBAL_ID_KEY]
16
+ def deserialize_hash(serialized_hash) = serialized_hash.transform_values { deserialize_param(_1) }
17
+ def serialized_global_id?(hash) = hash.size == 1 && hash.include?(GLOBAL_ID_KEY)
18
+
19
+ def serialize(*params)
20
+ ActiveSupport::Notifications.instrument("serialize_hovercard_params.coupdoeil") do
21
+ params.map { |param| serialize_param(param) }
22
+ end
23
+ end
24
+
25
+ def deserialize(params)
26
+ Array.wrap(params).map { |param| deserialize_param(param) }
27
+ rescue StandardError
28
+ raise DeserializationError
29
+ end
30
+
31
+ def serialize_param(param)
32
+ case param
33
+ when GlobalID::Identification
34
+ convert_to_global_id_hash(param)
35
+ when Array
36
+ param.map { serialize_param(_1) }
37
+ when Hash
38
+ serialize_hash(param)
39
+ else
40
+ param
41
+ end
42
+ end
43
+
44
+ def serialize_hash(param)
45
+ param.each_with_object({}) do |(key, value), hash|
46
+ hash[serialize_hash_key(key)] = serialize_param(value)
47
+ end
48
+ end
49
+
50
+ def serialize_hash_key(key)
51
+ case key
52
+ when *RESERVED_KEYS
53
+ raise Coupdoeil::SerializationError, "Can't serialize a Hash with reserved key #{key.inspect}"
54
+ when String, Symbol
55
+ key.to_s
56
+ else
57
+ raise Coupdoeil::SerializationError, "Only string and symbol hash keys may be serialized as hovercard params, but #{key.inspect} is a #{key.class}"
58
+ end
59
+ end
60
+
61
+ def convert_to_global_id_hash(param)
62
+ { GLOBAL_ID_KEY => param.to_global_id.to_s }
63
+ rescue URI::GID::MissingModelIdError
64
+ raise Coupdoeil::SerializationError, "Unable to serialize #{param.class} " \
65
+ "without an id. (Maybe you forgot to call save?)"
66
+ end
67
+
68
+ def deserialize_param(param)
69
+ case param
70
+ when Array
71
+ param.map { |arg| deserialize_param(arg) }
72
+ when Hash
73
+ if serialized_global_id?(param)
74
+ deserialize_global_id param
75
+ else
76
+ deserialize_hash(param)
77
+ end
78
+ else
79
+ param
80
+ end
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Coupdoeil
4
+ class Tag
5
+ def initialize(hovercard:, hovercard_options:, attributes:)
6
+ @hovercard_setup = hovercard
7
+ @attributes = attributes
8
+ hovercard_options = Hovercard::OptionsSet.new(hovercard_options)
9
+ @hovercard_options_set = hovercard_setup.default_options.merge(hovercard_options)
10
+ @hovercard_options_set.validate!
11
+ end
12
+
13
+ def render_in(view_context, &block)
14
+ ActiveSupport::Notifications.instrument("render_tag.coupdoeil") do
15
+ content = view_context.capture(&block) if block_given?
16
+ view_context.content_tag("coup-doeil", **@attributes.merge(hovercard_attributes)) do
17
+ if hovercard_options_set.preload?
18
+ view_context.tag.template(view_context.render(hovercard_setup), class: "hovercard-content") + content
19
+ else
20
+ content
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :hovercard_options_set, :hovercard_setup
29
+
30
+ def hovercard_attributes
31
+ attributes = { hc: hovercard_options_set.to_base36 }
32
+
33
+ unless hovercard_options_set.preload?
34
+ params = Params.serialize(hovercard_setup.params).sole.presence&.to_json
35
+ attributes.merge!("hc-type" => hovercard_setup.identifier, "hc-params" => params)
36
+ end
37
+
38
+ if Rails.env.local?
39
+ attributes.merge!(hovercard_options_set.to_h.transform_keys { "hovercard-#{_1}" })
40
+ end
41
+
42
+ attributes
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,44 @@
1
+ .coupdoeil--hovercard.hidden {
2
+ display: none
3
+ }
4
+
5
+ .coupdoeil--hovercard[data-animation] {
6
+ &.hovercard-enter {
7
+ transition-timing-function: cubic-bezier(0.4, 0, 1, 1);
8
+ }
9
+ &.hovercard-leave {
10
+ transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
11
+ }
12
+ &.hovercard-enter, &.hovercard-leave {
13
+ transition-property: opacity, transform;
14
+ transition-duration: 150ms;
15
+ }
16
+
17
+ &.hovercard-enter-end, &.hovercard-leave-start {
18
+ &[data-animation="fade-in"], &[data-animation="slide-in"], &[data-animation="slide-out"] {
19
+ opacity: 1;
20
+ }
21
+ }
22
+
23
+ &.hovercard-enter-start, &.hovercard-leave-end {
24
+ &[data-animation="fade-in"], &[data-animation="slide-in"], &[data-animation="slide-out"] {
25
+ opacity: 0;
26
+ }
27
+ &[data-placement|="right"] {
28
+ &[data-animation="slide-in"] { transform: translateX(1rem); }
29
+ &[data-animation="slide-out"] { transform: translateX(-1rem); }
30
+ }
31
+ &[data-placement|="left"] {
32
+ &[data-animation="slide-in"] { transform: translateX(-1rem); }
33
+ &[data-animation="slide-out"] { transform: translateX(1rem); }
34
+ }
35
+ &[data-placement|="top"] {
36
+ &[data-animation="slide-in"] { transform: translateY(-1rem); }
37
+ &[data-animation="slide-out"] { transform: translateY(1rem); }
38
+ }
39
+ &[data-placement|="bottom"] {
40
+ &[data-animation="slide-in"] { transform: translateY(1rem); }
41
+ &[data-animation="slide-out"] { transform: translateY(-1rem); }
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,40 @@
1
+ @use 'sass:list';
2
+
3
+ .coupdoeil--hovercard {
4
+ & [data-hovercard-arrow] {
5
+ --co-hovercard--color: white;
6
+ --co-hovercard--border-color: rgb(209 213 219);
7
+ --co-hovercard-border-size: 1px;
8
+ --co-hovercard-border-style: solid;
9
+ --co-hovercard--size-ratio: 1;
10
+ --co-hovercard--height: 0.75rem;
11
+ --co-hovercard--width: calc(var(--co-hovercard--height) / var(--co-hovercard--size-ratio));
12
+
13
+ position: absolute;
14
+ height: var(--co-hovercard--height);
15
+ width: var(--co-hovercard--height);
16
+
17
+ &::after, &::before {
18
+ content: "";
19
+ width: 0;
20
+ height: 0;
21
+ position: absolute;
22
+ bottom: 0;
23
+ border: var(--co-hovercard--base-border-width) var(--co-hovercard-border-style) transparent;
24
+ }
25
+
26
+ &::after {
27
+ --co-hovercard--base-border-width: var(--co-hovercard--width);
28
+ border-bottom-color: var(--co-hovercard--color);
29
+ left: calc(50% - var(--co-hovercard--width));
30
+ }
31
+ &::before {
32
+ --co-hovercard--base-border-width: calc(var(--co-hovercard--height) + var(--co-hovercard-border-size));
33
+ border-bottom-color: var(--co-hovercard--border-color);
34
+ left: calc(50% - var(--co-hovercard--width) - var(--co-hovercard-border-size));
35
+ }
36
+ }
37
+ &[data-placement|="top"] [data-hovercard-arrow] { transform: rotate(180deg); }
38
+ &[data-placement|="right"] [data-hovercard-arrow] { transform: rotate(-90deg); }
39
+ &[data-placement|="left"] [data-hovercard-arrow] { transform: rotate(90deg); }
40
+ }
@@ -0,0 +1,2 @@
1
+ @use "hovercard-animation";
2
+ @use "hovercard-arrow";
@@ -0,0 +1,15 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Coupdoeil</title>
5
+ <%= csrf_meta_tags %>
6
+ <%= csp_meta_tag %>
7
+
8
+ <%= stylesheet_link_tag "coupdoeil/application", media: "all" %>
9
+ </head>
10
+ <body>
11
+
12
+ <%= yield %>
13
+
14
+ </body>
15
+ </html>
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Coupdoeil::Engine.routes.draw do
2
+ resource :hovercard, only: :create
3
+ end
@@ -0,0 +1,62 @@
1
+ module Coupdoeil
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace Coupdoeil
4
+ # config.eager_load_namespaces << Coupdoeil
5
+ config.coupdoeil = ActiveSupport::OrderedOptions.new
6
+
7
+ # If you don't want to precompile Coupdoeil's assets (eg. because you're using webpack),
8
+ # you can do this in an intiailzer:
9
+ #
10
+ # config.after_initialize do
11
+ # config.assets.precompile -= Coupdoeil::Engine::PRECOMPILE_ASSETS
12
+ # end
13
+ #
14
+ # If you just want to remove specific css:
15
+ #
16
+ # config.after_initialize do
17
+ # config.assets.precompile -= %w[coupdoeil/hovercard-arrow.css]
18
+ # end
19
+ PRECOMPILE_ASSETS = %w[
20
+ coupdoeil.js
21
+ coupdoeil.min.js
22
+ coupdoeil.min.js.map
23
+ coupdoeil/hovercard.css
24
+ coupdoeil/hovercard-arrow.css
25
+ coupdoeil/hovercard-animation.css
26
+ ]
27
+
28
+ initializer "coupdoeil.assets" do
29
+ if Rails.application.config.respond_to?(:assets)
30
+ Rails.application.config.assets.precompile += PRECOMPILE_ASSETS
31
+ end
32
+ end
33
+
34
+ initializer "coupdoeil.logger" do
35
+ stdout_logger = ActiveSupport::Logger.new(STDOUT)
36
+ stdout_logger.formatter = ::Logger::Formatter.new
37
+ tagged_stdout_logger = ActiveSupport::TaggedLogging.new(stdout_logger)
38
+ config.coupdoeil.logger = tagged_stdout_logger.tagged("Coupdoeil")
39
+ end
40
+
41
+ initializer "coupdoeil.helpers", before: :load_config_initializers do
42
+ ActiveSupport.on_load(:action_controller_base) do
43
+ helper Coupdoeil::Engine.helpers
44
+ end
45
+ end
46
+
47
+ initializer "coupdoeil.view_paths" do
48
+ config.to_prepare do
49
+ views = Rails.application.config.paths["app/views"].existent
50
+ views += Rails.application.config.paths.add("app/hovercards").existent
51
+ views += Rails.application.config.paths.add("app/hovercards/layouts").existent
52
+ Coupdoeil::Hovercard.prepend_view_path(views)
53
+ end
54
+ end
55
+
56
+ initializer "coupdoeil.routes" do |app|
57
+ app.routes.append do
58
+ mount Coupdoeil::Engine => "/coupdoeil"
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,3 @@
1
+ module Coupdoeil
2
+ VERSION = "1.0.0-alpha.1"
3
+ end
data/lib/coupdoeil.rb ADDED
@@ -0,0 +1,6 @@
1
+ require "coupdoeil/version"
2
+ require "coupdoeil/engine"
3
+
4
+ module Coupdoeil
5
+ # Your code goes here...
6
+ end
@@ -0,0 +1,15 @@
1
+ Description:
2
+ Create hovercard class and views files.
3
+
4
+ Example:
5
+ bin/rails generate hovercard Contact details from_project
6
+
7
+ creates the following files:
8
+ app/hovercards/contact_hovercard.rb
9
+ app/views/contact_hovercard/details.html.erb
10
+ app/views/contact_hovercard/from_project.html.erb
11
+
12
+ bin/rails generate hovercard Contact details from_project --skip-views
13
+
14
+ creates only the class file:
15
+ app/hovercards/contact_hovercard.rb
@@ -0,0 +1,22 @@
1
+ class Coupdoeil::HovercardGenerator < Rails::Generators::NamedBase
2
+ source_root File.expand_path("templates", __dir__)
3
+
4
+ check_class_collision suffix: "Hovercard"
5
+
6
+ class_option :skip_views, type: :boolean, desc: "Skip view files", default: false
7
+
8
+ argument :action_names, type: :array, default: []
9
+
10
+ def create_hovercard_file
11
+ template "hovercard.rb",
12
+ File.join("app/hovercards", class_path, "#{file_name}_hovercard.rb")
13
+ unless options.skip_views?
14
+ action_names.each do |action_name|
15
+ path = [*class_path, file_name].join('/')
16
+ create_file "app/hovercards/#{path}_hovercard/#{action_name}.html.erb", <<~ERB
17
+ <p>Hello from #{class_name}Hovercard##{action_name}</p>
18
+ ERB
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,8 @@
1
+ <% module_namespacing do -%>
2
+ class <%= class_name %>Hovercard < ApplicationHovercard
3
+ <% action_names.each do |action_name| -%>
4
+ def <%= action_name %>
5
+ end
6
+ <% end -%>
7
+ end
8
+ <% end -%>
@@ -0,0 +1,71 @@
1
+ class Coupdoeil::InstallGenerator < Rails::Generators::Base
2
+ Coupdoeil::InstallGenerator.source_root Coupdoeil::Engine.root.join("lib/generators/coupdoeil/install/templates")
3
+
4
+ desc "Create base class for hovercards and default layout."
5
+
6
+ def create_base_class
7
+ create_file "app/hovercards/application_hovercard.rb", <<~RUBY
8
+ class ApplicationHovercard < Coupdoeil::Hovercard
9
+ end
10
+ RUBY
11
+ end
12
+
13
+ def insert_default_layout
14
+ template "layout.html.erb.tt", "app/hovercards/layouts/hovercard.html.erb"
15
+ end
16
+
17
+ def install_javascripts
18
+ puts ""
19
+ if Rails.root.join("config/importmap.rb").exist?
20
+ append_to_importmap
21
+ elsif Rails.root.join("package.json").exist?
22
+ raise "package.json not supported yet!"
23
+ else
24
+ puts "You must either be running with node (package.json) or importmap-rails (config/importmap.rb) to use this gem."
25
+ end
26
+ end
27
+
28
+ def install_stylesheets
29
+ puts ""
30
+ import_stylesheet
31
+ hidden_class_requirement
32
+ end
33
+
34
+ private
35
+
36
+ def append_to_importmap
37
+ puts "Using importmap"
38
+ puts "Pin Coupdoeil"
39
+ append_to_file "config/importmap.rb", %(pin "coupdoeil", to: "coupdoeil.min.js", preload: true\n)
40
+
41
+ puts "Import Coupdoeil"
42
+ append_to_file "app/javascript/application.js", %(import "coupdoeil"\n)
43
+ end
44
+
45
+ def import_stylesheet
46
+ puts "To use Coupdoeil hovercard style, add to your layout's head:"
47
+ puts ""
48
+ puts <<-ERB
49
+ <%= stylesheet_link_tag "coupdoeil/hovercard" %>
50
+ ERB
51
+ puts ""
52
+ puts "Or one of two:"
53
+ puts ""
54
+ puts <<-ERB
55
+ <%= stylesheet_link_tag "coupdoeil/hovercard-arrow" %>
56
+ <%= stylesheet_link_tag "coupdoeil/hovercard-animation" %>
57
+ ERB
58
+ end
59
+
60
+ def hidden_class_requirement
61
+ puts ""
62
+ puts "Also make sure you have a CSS implementation of .hidden class:"
63
+ puts ""
64
+ puts <<-CSS
65
+ .hidden {
66
+ display: none;
67
+ }
68
+ CSS
69
+ puts ""
70
+ end
71
+ end
@@ -0,0 +1,14 @@
1
+ <div
2
+ style="
3
+ background: white;
4
+ padding: 1rem;
5
+ border: 1px solid rgb(209 213 219);
6
+ box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
7
+ width: max-content;
8
+ max-width: 24rem;
9
+ border-radius: 0.25rem;
10
+ "
11
+ >
12
+ <div data-hovercard-arrow></div>
13
+ <%%= yield %>
14
+ </div>
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :coupdoeil do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,129 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: coupdoeil
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0.pre.alpha.1
5
+ platform: ruby
6
+ authors:
7
+ - PageHey
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 2025-05-10 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rails
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: 7.1.0
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: 7.1.0
26
+ - !ruby/object:Gem::Dependency
27
+ name: jekyll
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ description: Easy and powerful hovercard system for Ruby On Rails.
41
+ email:
42
+ - pagehey@pm.me
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - CHANGELOG.md
48
+ - MIT-LICENSE
49
+ - README.md
50
+ - Rakefile
51
+ - app/assets/config/coupdoeil_manifest.js
52
+ - app/assets/javascripts/coupdoeil.js
53
+ - app/assets/javascripts/coupdoeil.min.js
54
+ - app/assets/javascripts/coupdoeil.min.js.map
55
+ - app/assets/stylesheets/coupdoeil/application.css
56
+ - app/assets/stylesheets/coupdoeil/hovercard-animation.css
57
+ - app/assets/stylesheets/coupdoeil/hovercard-arrow.css
58
+ - app/assets/stylesheets/coupdoeil/hovercard.css
59
+ - app/controllers/coupdoeil/hovercards_controller.rb
60
+ - app/helpers/coupdoeil/application_helper.rb
61
+ - app/javascript/coupdoeil/elements/coupdoeil_element.js
62
+ - app/javascript/coupdoeil/events.js
63
+ - app/javascript/coupdoeil/events/onclick.js
64
+ - app/javascript/coupdoeil/events/onmouseover.js
65
+ - app/javascript/coupdoeil/hovercard.js
66
+ - app/javascript/coupdoeil/hovercard/actions.js
67
+ - app/javascript/coupdoeil/hovercard/attributes.js
68
+ - app/javascript/coupdoeil/hovercard/cache.js
69
+ - app/javascript/coupdoeil/hovercard/closing.js
70
+ - app/javascript/coupdoeil/hovercard/config.js
71
+ - app/javascript/coupdoeil/hovercard/controller.js
72
+ - app/javascript/coupdoeil/hovercard/opening.js
73
+ - app/javascript/coupdoeil/hovercard/optionsParser.js
74
+ - app/javascript/coupdoeil/hovercard/positioning.js
75
+ - app/javascript/coupdoeil/hovercard/state_check.js
76
+ - app/javascript/coupdoeil/index.js
77
+ - app/models/coupdoeil/hovercard.rb
78
+ - app/models/coupdoeil/hovercard/option.rb
79
+ - app/models/coupdoeil/hovercard/option/animation.rb
80
+ - app/models/coupdoeil/hovercard/option/cache.rb
81
+ - app/models/coupdoeil/hovercard/option/loading.rb
82
+ - app/models/coupdoeil/hovercard/option/offset.rb
83
+ - app/models/coupdoeil/hovercard/option/placement.rb
84
+ - app/models/coupdoeil/hovercard/option/trigger.rb
85
+ - app/models/coupdoeil/hovercard/options_set.rb
86
+ - app/models/coupdoeil/hovercard/registry.rb
87
+ - app/models/coupdoeil/hovercard/setup.rb
88
+ - app/models/coupdoeil/hovercard/view_context_delegation.rb
89
+ - app/models/coupdoeil/params.rb
90
+ - app/models/coupdoeil/tag.rb
91
+ - app/style/hovercard-animation.scss
92
+ - app/style/hovercard-arrow.scss
93
+ - app/style/hovercard.scss
94
+ - app/views/layouts/coupdoeil/application.html.erb
95
+ - config/routes.rb
96
+ - lib/coupdoeil.rb
97
+ - lib/coupdoeil/engine.rb
98
+ - lib/coupdoeil/version.rb
99
+ - lib/generators/coupdoeil/hovercard/USAGE
100
+ - lib/generators/coupdoeil/hovercard/hovercard_generator.rb
101
+ - lib/generators/coupdoeil/hovercard/templates/hovercard.rb.tt
102
+ - lib/generators/coupdoeil/install/install_generator.rb
103
+ - lib/generators/coupdoeil/install/templates/layout.html.erb.tt
104
+ - lib/tasks/coupdoeil_tasks.rake
105
+ homepage: https://coupdoeil.org
106
+ licenses:
107
+ - MIT
108
+ metadata:
109
+ homepage_uri: https://coupdoeil.org
110
+ source_code_uri: https://gitlab.com/Pagehey/coupdoeil
111
+ changelog_uri: https://gitlab.com/Pagehey/coupdoeil/CHANGELOG.md
112
+ rdoc_options: []
113
+ require_paths:
114
+ - lib
115
+ required_ruby_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ required_rubygems_version: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ requirements: []
126
+ rubygems_version: 3.6.2
127
+ specification_version: 4
128
+ summary: A framework to easily handle hovercards.
129
+ test_files: []