fron-ui 1.0.0rc2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (140) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +3 -0
  3. data/.rubocop.yml +38 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +7 -0
  7. data/.yardopts +8 -0
  8. data/Gemfile +8 -0
  9. data/Gemfile.lock +105 -0
  10. data/Rakefile +37 -0
  11. data/Readme.md +4 -0
  12. data/db.json +192 -0
  13. data/fron-ui.gemspec +21 -0
  14. data/lib/fron-ui.rb +1 -0
  15. data/lib/fron_ui.rb +5 -0
  16. data/lib/fron_ui/version.rb +7 -0
  17. data/opal/fron-ui/base.rb +49 -0
  18. data/opal/fron-ui/behaviors/action.rb +40 -0
  19. data/opal/fron-ui/behaviors/actions.rb +40 -0
  20. data/opal/fron-ui/behaviors/confirmation.rb +23 -0
  21. data/opal/fron-ui/behaviors/dropdown.rb +27 -0
  22. data/opal/fron-ui/behaviors/file.rb +48 -0
  23. data/opal/fron-ui/behaviors/intendable_children.rb +76 -0
  24. data/opal/fron-ui/behaviors/keydown.rb +31 -0
  25. data/opal/fron-ui/behaviors/loop.rb +41 -0
  26. data/opal/fron-ui/behaviors/render.rb +30 -0
  27. data/opal/fron-ui/behaviors/rest.rb +121 -0
  28. data/opal/fron-ui/behaviors/selectable_children.rb +67 -0
  29. data/opal/fron-ui/behaviors/serialize.rb +32 -0
  30. data/opal/fron-ui/behaviors/shortcuts.rb +35 -0
  31. data/opal/fron-ui/behaviors/state.rb +56 -0
  32. data/opal/fron-ui/behaviors/transition.rb +63 -0
  33. data/opal/fron-ui/components/action.rb +18 -0
  34. data/opal/fron-ui/components/box.rb +17 -0
  35. data/opal/fron-ui/components/button.rb +61 -0
  36. data/opal/fron-ui/components/calendar.rb +129 -0
  37. data/opal/fron-ui/components/checkbox.rb +57 -0
  38. data/opal/fron-ui/components/chooser.rb +246 -0
  39. data/opal/fron-ui/components/color_panel.rb +235 -0
  40. data/opal/fron-ui/components/color_picker.rb +111 -0
  41. data/opal/fron-ui/components/container.rb +61 -0
  42. data/opal/fron-ui/components/date_picker.rb +141 -0
  43. data/opal/fron-ui/components/drag.rb +76 -0
  44. data/opal/fron-ui/components/dropdown.rb +72 -0
  45. data/opal/fron-ui/components/icon.rb +29 -0
  46. data/opal/fron-ui/components/image.rb +77 -0
  47. data/opal/fron-ui/components/input.rb +30 -0
  48. data/opal/fron-ui/components/label.rb +9 -0
  49. data/opal/fron-ui/components/list.rb +34 -0
  50. data/opal/fron-ui/components/loader.rb +63 -0
  51. data/opal/fron-ui/components/modal.rb +0 -0
  52. data/opal/fron-ui/components/notifications.rb +73 -0
  53. data/opal/fron-ui/components/number.rb +202 -0
  54. data/opal/fron-ui/components/progress.rb +52 -0
  55. data/opal/fron-ui/components/slider.rb +47 -0
  56. data/opal/fron-ui/components/tabs.rb +149 -0
  57. data/opal/fron-ui/components/textarea.rb +13 -0
  58. data/opal/fron-ui/components/time.rb +65 -0
  59. data/opal/fron-ui/components/title.rb +34 -0
  60. data/opal/fron-ui/examples/blog/index.rb +289 -0
  61. data/opal/fron-ui/examples/comments/components/comment.rb +75 -0
  62. data/opal/fron-ui/examples/comments/components/comments.rb +93 -0
  63. data/opal/fron-ui/examples/comments/components/footer.rb +36 -0
  64. data/opal/fron-ui/examples/comments/components/header.rb +35 -0
  65. data/opal/fron-ui/examples/comments/components/list.rb +12 -0
  66. data/opal/fron-ui/examples/comments/index.rb +6 -0
  67. data/opal/fron-ui/examples/contacts/components/contacts.rb +100 -0
  68. data/opal/fron-ui/examples/contacts/components/details.rb +92 -0
  69. data/opal/fron-ui/examples/contacts/components/item.rb +46 -0
  70. data/opal/fron-ui/examples/contacts/components/list.rb +10 -0
  71. data/opal/fron-ui/examples/contacts/components/sidebar.rb +30 -0
  72. data/opal/fron-ui/examples/contacts/index.rb +6 -0
  73. data/opal/fron-ui/examples/editor/index.rb +164 -0
  74. data/opal/fron-ui/examples/kitchensink/index.rb +193 -0
  75. data/opal/fron-ui/examples/todos/components/item.rb +84 -0
  76. data/opal/fron-ui/examples/todos/components/options.rb +26 -0
  77. data/opal/fron-ui/examples/todos/components/todos.rb +145 -0
  78. data/opal/fron-ui/examples/todos/index.rb +6 -0
  79. data/opal/fron-ui/examples/webshop/index.rb +0 -0
  80. data/opal/fron-ui/fonts/ionicons.rb +2954 -0
  81. data/opal/fron-ui/fonts/open_sans.rb +19 -0
  82. data/opal/fron-ui/lib/collection.rb +138 -0
  83. data/opal/fron-ui/lib/date.rb +23 -0
  84. data/opal/fron-ui/lib/debounce.rb +14 -0
  85. data/opal/fron-ui/lib/image_loader.rb +13 -0
  86. data/opal/fron-ui/lib/lorem.rb +93 -0
  87. data/opal/fron-ui/lib/nil.rb +29 -0
  88. data/opal/fron-ui/lib/record.rb +23 -0
  89. data/opal/fron-ui/lib/state_serializer.rb +129 -0
  90. data/opal/fron-ui/lib/storage.rb +57 -0
  91. data/opal/fron-ui/spec/setup.rb +40 -0
  92. data/opal/fron-ui/ui.rb +40 -0
  93. data/opal/fron-ui/utils/theme_roller.rb +63 -0
  94. data/opal/fron-ui/vendor/autoprefixer.js +21114 -0
  95. data/opal/fron-ui/vendor/marked.js +1291 -0
  96. data/opal/fron-ui/vendor/md5.js +274 -0
  97. data/opal/fron-ui/vendor/moment.js +3083 -0
  98. data/opal/fron-ui/vendor/uuid.js +92 -0
  99. data/opal/fron_ui.rb +13 -0
  100. data/spec/behaviors/action_spec.rb +34 -0
  101. data/spec/behaviors/actions_spec.rb +38 -0
  102. data/spec/behaviors/confirmation_spec.rb +23 -0
  103. data/spec/behaviors/dropdown_spec.rb +32 -0
  104. data/spec/behaviors/render_spec.rb +20 -0
  105. data/spec/behaviors/rest_spec.rb +70 -0
  106. data/spec/behaviors/selectable_children_spec.rb +40 -0
  107. data/spec/behaviors/serialize_spec.rb +34 -0
  108. data/spec/components/action_spec.rb +7 -0
  109. data/spec/components/base_spec.rb +19 -0
  110. data/spec/components/box_spec.rb +7 -0
  111. data/spec/components/button_spec.rb +9 -0
  112. data/spec/components/calendar_spec.rb +58 -0
  113. data/spec/components/checkbox_spec.rb +20 -0
  114. data/spec/components/chooser_spec.rb +75 -0
  115. data/spec/components/color_panel_spec.rb +49 -0
  116. data/spec/components/color_picker_spec.rb +41 -0
  117. data/spec/components/container_spec.rb +23 -0
  118. data/spec/components/date_picker_spec.rb +71 -0
  119. data/spec/components/drag_spec.rb +20 -0
  120. data/spec/components/dropdown_spec.rb +33 -0
  121. data/spec/components/image_spec.rb +33 -0
  122. data/spec/components/input_spec.rb +8 -0
  123. data/spec/components/list_spec.rb +10 -0
  124. data/spec/components/loader_spec.rb +9 -0
  125. data/spec/components/notifications_spec.rb +17 -0
  126. data/spec/components/number_spec.rb +64 -0
  127. data/spec/components/progress_spec.rb +23 -0
  128. data/spec/components/slider_spec.rb +25 -0
  129. data/spec/components/tabs_spec.rb +50 -0
  130. data/spec/components/textarea_spec.rb +7 -0
  131. data/spec/components/time_spec.rb +37 -0
  132. data/spec/components/title_spec.rb +11 -0
  133. data/spec/examples/comments_spec.rb +72 -0
  134. data/spec/examples/todos_spec.rb +39 -0
  135. data/spec/lib/collection_spec.rb +38 -0
  136. data/spec/lib/lorem_spec.rb +55 -0
  137. data/spec/lib/state_serializer_spec.rb +58 -0
  138. data/spec/lib/storage_spec.rb +39 -0
  139. data/spec/spec_helper.rb +1 -0
  140. metadata +223 -0
@@ -0,0 +1 @@
1
+ require 'fron_ui'
@@ -0,0 +1,5 @@
1
+ require 'fron'
2
+ require 'fron_ui/version'
3
+
4
+ Opal.use_gem 'color'
5
+ Opal.append_path File.expand_path('../../opal', __FILE__).untaint
@@ -0,0 +1,7 @@
1
+ # Fron
2
+ module Fron
3
+ # UI
4
+ module UI
5
+ VERSION = '1.0.0rc2'
6
+ end
7
+ end
@@ -0,0 +1,49 @@
1
+ # UI Module
2
+ module UI
3
+ # Base Component
4
+ class Base < Fron::Component
5
+ tag 'ui-base'
6
+
7
+ style '&[disabled]' => { pointerEvents: :none,
8
+ userSelect: :none,
9
+ opacity: 0.4 }
10
+
11
+ attribute_accessor :tabindex
12
+
13
+ # Disabled state
14
+ #
15
+ # * Doesn't trigger events -> ???
16
+ # * Not selectable -> pointer-events: none;
17
+ # * Cannot be tabbed -> remove tabindex if there is one?
18
+ def disabled=(value)
19
+ super
20
+ if disabled
21
+ self[:_tabindex] = self[:tabindex] if self[:tabindex]
22
+ remove_attribute :tabindex
23
+ self[:disabled] = ''
24
+ else
25
+ self[:tabindex] = self[:_tabindex] if self[:_tabindex]
26
+ remove_attribute :_tabindex
27
+ remove_attribute :disabled
28
+ end
29
+ end
30
+
31
+ # Sets the readonly state
32
+ #
33
+ # @param value [Boolean] The value
34
+ def readonly=(value)
35
+ if value
36
+ self[:readonly] = ''
37
+ else
38
+ remove_attribute :readonly
39
+ end
40
+ end
41
+
42
+ # Sets the flex value
43
+ #
44
+ # @param value [Numeric] The value
45
+ def flex=(value)
46
+ @style.flex = value
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,40 @@
1
+ module UI
2
+ # Behaviors
3
+ module Behaviors
4
+ # Behavior for managing components
5
+ # that can respond to **action** - enter / space
6
+ #
7
+ # @author Gusztáv Szikszai
8
+ # @since 0.1.0
9
+ module Action
10
+ # Sets up the behavior:
11
+ #
12
+ # * Includes keydown behavior
13
+ # * Sets styles for :focus and :hover states
14
+ # * Sets up actions for enter and space
15
+ #
16
+ # @param base [Fron::Component] The includer
17
+ def self.included(base)
18
+ base.include Behaviors::Keydown
19
+ base.style cursor: :pointer,
20
+ userSelect: :none,
21
+ '> *' => { pointerEvents: :none },
22
+ '&:focus, &:hover' => {
23
+ color: -> { colors.focus },
24
+ outline: :none
25
+ }
26
+
27
+ base.keydown [:enter, :space], :action
28
+ end
29
+
30
+ # Action method, to be overriden.
31
+ #
32
+ # * Triggers click event
33
+ #
34
+ # @abstract
35
+ def action
36
+ trigger :click
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,40 @@
1
+ module UI
2
+ module Behaviors
3
+ # Behaviors to handle basic method
4
+ # delegation via **action** attributes
5
+ # of the child components
6
+ #
7
+ # @author Gusztáv Szikszai
8
+ # @since 0.1.0
9
+ module Actions
10
+ IS_TOUCH = `'ontouchstart' in window && !window._phantom`
11
+
12
+ METHOD = IS_TOUCH ? :touchstart : :click
13
+
14
+ # Sets up the behavior:
15
+ #
16
+ # * Sets up event for the action
17
+ #
18
+ # @param base [Fron::Component] The includer
19
+ def self.included(base)
20
+ base.on METHOD, '[action]', :handle_action
21
+ end
22
+
23
+ private
24
+
25
+ # Handles the action event:
26
+ #
27
+ # * calls the method named as the
28
+ # targets action attribute
29
+ # * stops the event
30
+ #
31
+ # @param event [DOM::Event] The event
32
+ def handle_action(event)
33
+ method = event.target[:action]
34
+ return unless respond_to?(method)
35
+ event.stop
36
+ send method, event
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,23 @@
1
+ module UI
2
+ module Behaviors
3
+ # Behavior for defining methods with
4
+ # a confirmation dialog, the given method
5
+ # only will be called if the user accepts.
6
+ #
7
+ # @author Gusztáv Szikszai
8
+ # @since 0.1.0
9
+ module Confirmation
10
+ # Sets up the behavior.
11
+ #
12
+ # @param base [Fron::Component] The includer
13
+ def self.included(base)
14
+ base.meta_def :confirmation do |name, message|
15
+ base.define_method "confirm_#{name}" do |*args|
16
+ break if message && !confirm(message)
17
+ send name, *args
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,27 @@
1
+ module UI
2
+ module Behaviors
3
+ # Behavior for managing opening / closing
4
+ # of a dropdown.
5
+ #
6
+ # @author Gusztáv Szikszai
7
+ # @since 0.1.0
8
+ module Dropdown
9
+ # Sets up the behavior.
10
+ #
11
+ # @param base [Fron::Component] The includer
12
+ def self.included(base)
13
+ base.register self, [:dropdown]
14
+ end
15
+
16
+ # Handles the initialization of
17
+ # the component
18
+ #
19
+ # @param item [Hash] The arguments
20
+ def self.dropdown(item)
21
+ input, dropdown = item[:args].map { |id| instance_variable_get("@#{id}") }
22
+ input.on(:focus) { dropdown.open }
23
+ input.on(:blur) { dropdown.close }
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,48 @@
1
+ module UI
2
+ module Behaviors
3
+ module File
4
+ class << self
5
+ def handle_change
6
+ return unless file
7
+ @instance.send(@instance._on_file_select, file)
8
+ file_input.value = ''
9
+ end
10
+
11
+ def file_input
12
+ @file_input ||= create_file_input
13
+ end
14
+
15
+ def file
16
+ file_input.files[0]
17
+ end
18
+
19
+ def create_file_input
20
+ input = DOM::Element.new :input
21
+ input[:type] = :file
22
+ input.on(:change) { handle_change }
23
+ input >> DOM::Document.body
24
+ input.hide
25
+ input
26
+ end
27
+
28
+ def included(base)
29
+ base.register self, [:on_file_select]
30
+ base.attr_reader :_on_file_select
31
+ end
32
+
33
+ def select(instance)
34
+ @instance = instance
35
+ file_input.click
36
+ end
37
+
38
+ def on_file_select(item)
39
+ @_on_file_select = item[:args][0]
40
+ end
41
+ end
42
+
43
+ def select_file
44
+ UI::Behaviors::File.select self
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,76 @@
1
+ module UI
2
+ module Behaviors
3
+ # Behavior for handling intent for selecting
4
+ # elements.
5
+ #
6
+ # @author Gusztáv Szikszai
7
+ # @since 0.1.0
8
+ module IntendableChildren
9
+ # Sets up the behavior:
10
+ #
11
+ # * Sets styles for children
12
+ #
13
+ # @param base [Fron::Component] The includer
14
+ def self.included(base)
15
+ base.style '> .hidden' => { display: :none },
16
+ '> *:hover' => { background: -> { dampen colors.input, 0.05 } },
17
+ '> *.intended' => { background: -> { dampen colors.input, 0.1 } }
18
+ end
19
+
20
+ # Intends selection for the
21
+ # next intendable item
22
+ def intend_next
23
+ intend_with :first, :next
24
+ end
25
+
26
+ # Intends selection for the
27
+ # previous intendable item
28
+ def intend_previous
29
+ intend_with :last, :previous
30
+ end
31
+
32
+ # Intends an item
33
+ #
34
+ # @param tail [Symbol] First or last
35
+ # @param method [Symbol] Next or previous
36
+ def intend_with(tail, method)
37
+ children = intend_children
38
+ index = children.index(intended)
39
+ next_indenteded = begin
40
+ case method
41
+ when :next
42
+ children[index + 1]
43
+ when :previous
44
+ children[index - 1]
45
+ end
46
+ rescue
47
+ nil
48
+ end
49
+ intend next_indenteded || intend_children.send(tail)
50
+ end
51
+
52
+ # Intends the given item
53
+ #
54
+ # @param item [Fron::Component] The item
55
+ def intend(item)
56
+ return unless item
57
+ intended.remove_class(:intended) if intended
58
+ item.add_class(:intended)
59
+ end
60
+
61
+ # Returns the currently intended item
62
+ #
63
+ # @return [Fron::Component] The item
64
+ def intended
65
+ find('.intended')
66
+ end
67
+
68
+ # Returns the children that can be intended
69
+ #
70
+ # @return [Array<Fron::Component>] The items
71
+ def intend_children
72
+ children.select { |child| !child.has_class :hidden }
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,31 @@
1
+ module UI
2
+ module Behaviors
3
+ # Behavior for managing key presses
4
+ #
5
+ # @author Gusztáv Szikszai
6
+ # @since 0.1.0
7
+ module Keydown
8
+ class << self
9
+ TYPES = %w(keyup keydown)
10
+
11
+ # Sets up the behavior.
12
+ #
13
+ # @param base [Fron::Component] The includer
14
+ def included(base)
15
+ base.register self, TYPES
16
+ end
17
+
18
+ TYPES.each do |type|
19
+ define_method type do |item|
20
+ on type do |event|
21
+ keys = Array(item[:args].first)
22
+ break unless keys.include?(event.key)
23
+ event.stop
24
+ send item[:args][1], event
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,41 @@
1
+ module UI
2
+ module Behaviors
3
+ module Loop
4
+ # Update / Render Loop
5
+ def self.included(base)
6
+ base.register self, [:act]
7
+ end
8
+
9
+ def data
10
+ @data ||= {}
11
+ end
12
+
13
+ def update!(type, *args)
14
+ if type.is_a?(Array)
15
+ type.each { |item| update_act(*item) }
16
+ else
17
+ update_act(type, *args)
18
+ end
19
+ raise "Could not render #{self} because it's not defined!" unless respond_to?(:render)
20
+ render
21
+ end
22
+
23
+ def replace!(data)
24
+ @data = data
25
+ render
26
+ end
27
+
28
+ def update_act(type, *args)
29
+ raise "There is no update with the name #{type}!" unless @acts[type]
30
+ updated_data = @acts[type].call(*(args + [data]))
31
+ raise "Update didn't return a hash insted I got #{udpated_data}!" unless updated_data.is_a?(Hash)
32
+ data.merge! updated_data
33
+ end
34
+
35
+ def self.act(item)
36
+ @acts ||= {}
37
+ @acts[item[:args].first] = item[:block]
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,30 @@
1
+ module UI
2
+ module Behaviors
3
+ # Behavior for rendering with requestAnimationFrame
4
+ #
5
+ # @author Gusztáv Szikszai
6
+ # @since 0.1.0
7
+ module Render
8
+ # Sets up the behavior:
9
+ #
10
+ # * Defines the render method that will call
11
+ # the render proc
12
+ #
13
+ # @param base [Fron::Component] The includer
14
+ def self.included(base)
15
+ base.register self, [:render]
16
+ base.define_method :render do |&block|
17
+ @render_proc.call
18
+ block.call if block
19
+ end
20
+ end
21
+
22
+ # Defines the render proc from the item
23
+ #
24
+ # @param item [Hash] The arguments
25
+ def self.render(item)
26
+ @render_proc = Fron::RenderProc.new method(item[:args].first)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,121 @@
1
+ require 'promise'
2
+
3
+ module UI
4
+ module Behaviors
5
+ # Behavior for giving a component REST methods.
6
+ #
7
+ # @see http://en.wikipedia.org/wiki/Representational_state_transfer
8
+ #
9
+ # @author Gusztáv Szikszai
10
+ # @since 0.1.0
11
+ module Rest
12
+ extend Fron::Eventable
13
+
14
+ # Sets up the behavior.
15
+ #
16
+ # @param base [Fron::Component] The includer
17
+ def self.included(base)
18
+ base.register self, [:rest]
19
+ end
20
+
21
+ # Sets the rest options from the registry
22
+ #
23
+ # @param item [Hash] The item
24
+ def self.rest(item)
25
+ @rest_options = OpenStruct.new item[:args].first
26
+ end
27
+
28
+ # Updates the model with the given data.
29
+ #
30
+ # @param data [Hash] The data
31
+ #
32
+ # @yield The updated data
33
+ def update(data, &block)
34
+ request :patch, @data[:id], data, &block
35
+ end
36
+
37
+ # Destroyes the model
38
+ #
39
+ # @yield if the action was successfull
40
+ def destroy(&block)
41
+ request :delete, @data[:id], &block
42
+ end
43
+
44
+ # Creates a new model with the given data.
45
+ #
46
+ # @param data [Hash] The data
47
+ #
48
+ # @yield The actual created data
49
+ def create(data, &block)
50
+ request :post, '', data, &block
51
+ end
52
+
53
+ # Returns all recrods
54
+ #
55
+ # @yieldreturn [Array<Hash>] The recrods
56
+ def all(&block)
57
+ request :get, '', &block
58
+ end
59
+
60
+ # Makes a requests to server
61
+ #
62
+ # :reek:FeatureEnvy
63
+ #
64
+ # @param method [Symbol, String] The request method
65
+ # @param path [String] The URL
66
+ # @param params [Hash] The parameters
67
+ #
68
+ # @yield [Hash] The returned data
69
+ def request(method, path, params = {})
70
+ promise = Promise.new
71
+ req = create_request path
72
+ req.request method.upcase, params do |response|
73
+ if response.status == 0
74
+ raise_error :no_connection, "Could not connect to: #{req.url}", promise
75
+ elsif (200..300).cover?(response.status)
76
+ data = response_json(response)
77
+ promise.resolve data unless promise.realized?
78
+ yield data if block_given?
79
+ else
80
+ raise_error :wrong_status, response_json(response)['error'], promise
81
+ yield nil if block_given?
82
+ end
83
+ end
84
+ promise
85
+ end
86
+
87
+ private
88
+
89
+ # Raises an error on the parent class.
90
+ #
91
+ # @param type [Symbol] The type
92
+ # @param message [String] The message
93
+ def raise_error(type, message, promise)
94
+ promise.reject(message) unless promise.realized?
95
+ UI::Behaviors::Rest.trigger type, message
96
+ UI::Behaviors::Rest.trigger :error, [type, message]
97
+ end
98
+
99
+ # Tries to parse the json response,
100
+ # raises error if it's invalid.
101
+ #
102
+ # @param response [Fron::Response] The response
103
+ #
104
+ # @return [Hash] The parsed data
105
+ def response_json(response)
106
+ response.json
107
+ rescue StandardError
108
+ raise_error :invalid_json, 'Invalid JSON data!'
109
+ end
110
+
111
+ # Creates a request object
112
+ #
113
+ # @param path [String] The URL
114
+ #
115
+ # @return [Fron::Request] The request
116
+ def create_request(path)
117
+ Fron::Request.new "#{@rest_options.url}/#{path}", 'Content-Type' => 'application/json'
118
+ end
119
+ end
120
+ end
121
+ end