proscenium 0.19.0.beta4-x86_64-linux → 0.19.0.beta6-x86_64-linux

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/proscenium/builder.rb +9 -13
  4. data/lib/proscenium/ext/proscenium +0 -0
  5. data/lib/proscenium/importer.rb +13 -13
  6. data/lib/proscenium/middleware/base.rb +5 -2
  7. data/lib/proscenium/middleware/engines.rb +5 -9
  8. data/lib/proscenium/middleware/esbuild.rb +13 -8
  9. data/lib/proscenium/middleware.rb +2 -4
  10. data/lib/proscenium/railtie.rb +15 -5
  11. data/lib/proscenium/react_componentable.rb +1 -1
  12. data/lib/proscenium/resolver.rb +3 -8
  13. data/lib/proscenium/side_load.rb +1 -1
  14. data/lib/proscenium/ui/flash/index.css +1 -0
  15. data/lib/proscenium/ui/flash/index.js +73 -0
  16. data/lib/proscenium/ui/flash.rb +15 -0
  17. data/lib/proscenium/ui/form/field_methods.rb +88 -0
  18. data/lib/proscenium/ui/form/fields/base.rb +188 -0
  19. data/lib/proscenium/ui/form/fields/checkbox/index.jsx +48 -0
  20. data/lib/proscenium/ui/form/fields/checkbox/index.module.css +9 -0
  21. data/lib/proscenium/ui/form/fields/checkbox/previews/basic.jsx +8 -0
  22. data/lib/proscenium/ui/form/fields/checkbox.rb +32 -0
  23. data/lib/proscenium/ui/form/fields/date.module.css +27 -0
  24. data/lib/proscenium/ui/form/fields/datetime.rb +15 -0
  25. data/lib/proscenium/ui/form/fields/hidden.rb +9 -0
  26. data/lib/proscenium/ui/form/fields/input/index.jsx +71 -0
  27. data/lib/proscenium/ui/form/fields/input/index.module.css +13 -0
  28. data/lib/proscenium/ui/form/fields/input/previews/basic.jsx +8 -0
  29. data/lib/proscenium/ui/form/fields/input.rb +14 -0
  30. data/lib/proscenium/ui/form/fields/radio_group.rb +173 -0
  31. data/lib/proscenium/ui/form/fields/radio_input/index.jsx +44 -0
  32. data/lib/proscenium/ui/form/fields/radio_input/index.module.css +13 -0
  33. data/lib/proscenium/ui/form/fields/radio_input/previews/basic.jsx +8 -0
  34. data/lib/proscenium/ui/form/fields/radio_input.rb +17 -0
  35. data/lib/proscenium/ui/form/fields/rich_textarea.css +23 -0
  36. data/lib/proscenium/ui/form/fields/rich_textarea.js +6 -0
  37. data/lib/proscenium/ui/form/fields/rich_textarea.rb +18 -0
  38. data/lib/proscenium/ui/form/fields/select.jsx +47 -0
  39. data/lib/proscenium/ui/form/fields/select.module.css +46 -0
  40. data/lib/proscenium/ui/form/fields/select.rb +300 -0
  41. data/lib/proscenium/ui/form/fields/tel.css +297 -0
  42. data/lib/proscenium/ui/form/fields/tel.js +83 -0
  43. data/lib/proscenium/ui/form/fields/tel.rb +54 -0
  44. data/lib/proscenium/ui/form/fields/textarea/index.jsx +50 -0
  45. data/lib/proscenium/ui/form/fields/textarea/index.module.css +13 -0
  46. data/lib/proscenium/ui/form/fields/textarea/previews/basic.jsx +8 -0
  47. data/lib/proscenium/ui/form/fields/textarea.rb +18 -0
  48. data/lib/proscenium/ui/form/translation.rb +71 -0
  49. data/lib/proscenium/ui/form.css +52 -0
  50. data/lib/proscenium/ui/form.rb +213 -0
  51. data/lib/proscenium/ui/props.css +7 -0
  52. data/lib/proscenium/ui/react-manager/index.jsx +1 -1
  53. data/lib/proscenium/ui/test.js +1 -1
  54. data/lib/proscenium/ui/ujs/index.js +1 -1
  55. data/lib/proscenium/ui.rb +3 -0
  56. data/lib/proscenium/utils.rb +33 -0
  57. data/lib/proscenium/version.rb +1 -1
  58. data/lib/proscenium/view_component.rb +0 -2
  59. data/lib/proscenium.rb +12 -2
  60. metadata +61 -10
  61. data/lib/proscenium/middleware/runtime.rb +0 -18
@@ -0,0 +1,213 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'literal'
4
+
5
+ module Proscenium::UI
6
+ # Helpers to aid in building forms and associated inputs with built-in styling, and inspired by
7
+ # Rails form helpers and SimpleForm.
8
+ #
9
+ # Start by creating the form with `Proscenium::UI::Form`, which expects a model
10
+ # instance, and a block in which you define one or more fields. It automatically includes a hidden
11
+ # authenticity token field for you.
12
+ #
13
+ # Example:
14
+ #
15
+ # render Proscenium::UI::Form.new(User.new) do |f|
16
+ # f.text_field :name
17
+ # f.radio_group :role, %i[admin manager]
18
+ # f.submit 'Save'
19
+ # end
20
+ #
21
+ # The following fields (inputs) are available:
22
+ #
23
+ # - `url_field` - <input> with 'url' type.
24
+ # - `text_field` - <input> with 'text' type.
25
+ # - `textarea_field` - <textarea>.
26
+ # - `rich_textarea_field` - A rich <textarea> using ActionText and Trix.
27
+ # - `email_field` - <input> with 'email' type.
28
+ # - `number_field` - <input> with 'number' type.
29
+ # - `color_field` - <input> with 'color' type.
30
+ # - `hidden_field` - <input> with 'hidden' type.
31
+ # - `search_field` - <input> with 'search' type.
32
+ # - `password_field` - <input> with 'password' type.
33
+ # - `tel_field` - <input> with 'tel' type.
34
+ # - `range_field` - <input> with 'range' type.
35
+ # - `time_field` - <input> with 'time' type.
36
+ # - `date_field` - <input> with 'date' type.
37
+ # - `week_field` - <input> with 'week' type.
38
+ # - `month_field` - <input> with 'month' type.
39
+ # - `datetime_local_field` - <input> with 'datetime-local' type.
40
+ # - `checkbox_field` - <input> with 'checkbox' type.
41
+ # - `radio_field` - <input> with 'radio' type.
42
+ # - `radio_group` - group of <input>'s with 'radio' type.
43
+ # - `select_field` - <select> input.
44
+ #
45
+ class Form < Proscenium::UI::Component
46
+ extend ActiveSupport::Autoload
47
+ extend Literal::Properties
48
+
49
+ autoload :FieldMethods
50
+ autoload :Translation
51
+
52
+ module Fields
53
+ extend ActiveSupport::Autoload
54
+
55
+ autoload :Base
56
+ autoload :Input
57
+ autoload :Hidden
58
+ autoload :RadioInput
59
+ autoload :Checkbox
60
+ autoload :Textarea
61
+ autoload :RichTextarea
62
+ autoload :RadioGroup
63
+ autoload :Select
64
+ autoload :Tel
65
+ end
66
+
67
+ include FieldMethods
68
+ include Translation
69
+
70
+ STANDARD_METHOD_VERBS = %w[get post].freeze
71
+
72
+ def self.input_field(method_name, type:)
73
+ define_method method_name do |*args, **attributes|
74
+ merge_bang_attributes! args, attributes
75
+ render Fields::Input.new(args, @model, self, type:, **attributes)
76
+ end
77
+ end
78
+
79
+ prop :model, _Interface(:to_model), :positional, reader: :public
80
+
81
+ prop :method, _Union?(:get, :post, :put, :patch, :delete,
82
+ 'get', 'post', 'put', 'patch', 'delete') do |value|
83
+ value ||= 'patch' if @model.respond_to?(:persisted?) && @model.persisted?
84
+ value&.to_s&.downcase || 'post'
85
+ end
86
+
87
+ # The form action, which can be any value that can be passed to Rails `url_for` helper.
88
+ prop :action, _Union?(String, Symbol, Array, Hash)
89
+
90
+ prop :attributes, Hash, :**
91
+
92
+ # Use the given `field_class` to render a custom field. This allows you to create a custom
93
+ # form field on an as-needed basis. The `field_class` must be a subclass of
94
+ # `Proscenium::UI::Form::Fields::Base`.
95
+ #
96
+ # Example:
97
+ #
98
+ # render Proscenium::UI::Form.new @resource do |f|
99
+ # f.use_field Administrator::EmailField, :email, :required!
100
+ # end
101
+ #
102
+ # @param field_class [Class<Proscenium::UI::Form::Fields::Base>]
103
+ # @param args [Array<Symbol>] name or nested names of model attribute
104
+ # @param attributes [Hash] passed through to each input
105
+ def use_field(field_class, *args, **attributes)
106
+ merge_bang_attributes! args, attributes
107
+ render field_class.new(args, model, self, **attributes)
108
+ end
109
+
110
+ # Returns a button with type of 'submit', using the `value` given.
111
+ #
112
+ # @param value [String] Value of the `value` attribute.
113
+ def submit(value = 'Save', **)
114
+ input(name: 'commit', type: :submit, value:, **)
115
+ end
116
+
117
+ # Returns a <div> with the given `message` as its content. If `message` is not given, and
118
+ # `attribute` is, then first error message for the given model `attribute`.
119
+ #
120
+ # @param message [String] error message to display.
121
+ # @param attribute [Symbol] name of the model attribute.
122
+ def error(message: nil, attribute: nil, &content)
123
+ if message.nil? && attribute.nil? && !content
124
+ raise ArgumentError, 'One of `message:`, `attribute:` or a block is required'
125
+ end
126
+
127
+ if content
128
+ div class: :@error, &content
129
+ else
130
+ div class: :@error do
131
+ message || @model.errors[attribute]&.first
132
+ end
133
+ end
134
+ end
135
+
136
+ def view_template(&block)
137
+ form action:, method:, **@attributes do
138
+ method_field
139
+ authenticity_token_field
140
+ error_for_base
141
+ yield_content(&block)
142
+ end
143
+ end
144
+
145
+ def error_for_base
146
+ return unless @model.errors.key?(:base)
147
+
148
+ callout :danger do |x|
149
+ x.title { 'Unable to save...' }
150
+ div { @model.errors.full_messages_for(:base).first }
151
+ end
152
+ end
153
+
154
+ def field_name(*names, multiple: false)
155
+ # Delete the `?` suffix if present.
156
+ lname = names.pop.to_s
157
+ names.append lname.delete_suffix('?').to_sym
158
+
159
+ @_view_context.field_name(ActiveModel::Naming.param_key(@model.class), *names,
160
+ multiple:)
161
+ end
162
+
163
+ def field_id(*)
164
+ @_view_context.field_id(ActiveModel::Naming.param_key(@model.class), *)
165
+ end
166
+
167
+ def authenticity_token_field
168
+ return if method == 'get'
169
+
170
+ input(
171
+ name: 'authenticity_token',
172
+ type: 'hidden',
173
+ value: @_view_context.form_authenticity_token(form_options: { action:,
174
+ method: @method })
175
+ )
176
+ end
177
+
178
+ def action
179
+ @_view_context.url_for(@action || @model)
180
+ end
181
+
182
+ def method_field
183
+ return if STANDARD_METHOD_VERBS.include?(@method)
184
+
185
+ input type: 'hidden', name: '_method', value: @method, autocomplete: 'off'
186
+ end
187
+
188
+ def method
189
+ STANDARD_METHOD_VERBS.include?(@method) ? @method : 'post'
190
+ end
191
+
192
+ input_field :file_field, type: 'file'
193
+ input_field :url_field, type: 'url'
194
+ input_field :text_field, type: 'text'
195
+ input_field :time_field, type: 'time'
196
+ input_field :date_field, type: 'date'
197
+ input_field :number_field, type: 'number'
198
+ input_field :week_field, type: 'week'
199
+ input_field :month_field, type: 'month'
200
+ input_field :email_field, type: 'email'
201
+ input_field :color_field, type: 'color'
202
+ input_field :search_field, type: 'search'
203
+ input_field :password_field, type: 'password'
204
+ input_field :range_field, type: 'range'
205
+
206
+ private
207
+
208
+ def merge_bang_attributes!(attrs, kw_attributes, additional_bang_attrs: [])
209
+ Proscenium::Utils.merge_bang_attributes! attrs, kw_attributes,
210
+ %i[required disabled].concat(additional_bang_attrs)
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,7 @@
1
+ :where(html) {
2
+ --pui-input-border: 1px solid gray;
3
+ --pui-input-color: FieldText;
4
+ --pui-input-accent-color: lightgray;
5
+ --pui-input-border-radius: 2px;
6
+ --pui-input-background-color: Field;
7
+ }
@@ -85,7 +85,7 @@ function init(elements) {
85
85
  throw `[proscenium/react/manager] Cannot load component ${path} (not found in Proscenium.lazyScripts)`;
86
86
  }
87
87
 
88
- const react = import("@proscenium/react-manager/react");
88
+ const react = import("proscenium/react-manager/react");
89
89
  const Component = import(window.Proscenium.lazyScripts[path].outpath);
90
90
 
91
91
  const forwardChildren =
@@ -1 +1 @@
1
- console.log("@proscenium/ui/test.js");
1
+ console.log("proscenium/test.js");
@@ -2,7 +2,7 @@ export default async () => {
2
2
  window.Proscenium = window.Proscenium || {};
3
3
 
4
4
  if (!window.Proscenium.UJS) {
5
- const classPath = "/proscenium/ui/ujs/class.js";
5
+ const classPath = "/proscenium/ujs/class.js";
6
6
  const module = await import(classPath);
7
7
  window.Proscenium.UJS = new module.default();
8
8
  }
data/lib/proscenium/ui.rb CHANGED
@@ -2,7 +2,10 @@
2
2
 
3
3
  module Proscenium::UI
4
4
  extend ActiveSupport::Autoload
5
+ extend Phlex::Kit
5
6
 
6
7
  autoload :Component
7
8
  autoload :Breadcrumbs
9
+ autoload :Form
10
+ autoload :Flash
8
11
  end
@@ -9,5 +9,38 @@ module Proscenium
9
9
  def digest(value)
10
10
  Digest::SHA1.hexdigest(value.to_s)[..7]
11
11
  end
12
+
13
+ # Merges the given array of attribute `name`'s into the `kw_arguments`. A bang attribute is one
14
+ # that ends with an exclamation mark or - in Ruby parlance - a "bang", and has a boolean value.
15
+ # Modifies the given `kw_attributes`, and only attribute names in `allowed` will be merged.
16
+ #
17
+ # @param names [Array(Symbol)] of argument names
18
+ # @param kw_attributes [Hash] attributes to be merged with
19
+ # @param allowed [Array(Symbol)] attribute names allowed to be merged as bang attributes
20
+ #
21
+ # Example:
22
+ #
23
+ # def tab(name, *args, href:, **attributes)
24
+ # Hue::Utils.merge_bang_attributes!(args, attributes, [:current])
25
+ # end
26
+ #
27
+ # Allowing you to use either of the following API's:
28
+ #
29
+ # tab 'Tab 1', required: true
30
+ # tab 'Tab 1', :required!
31
+ #
32
+ def merge_bang_attributes!(names, kw_attributes, allowed)
33
+ allowed.each do |name|
34
+ sym_name = name.to_sym
35
+ bang_name = :"#{sym_name}!"
36
+
37
+ next unless names.include?(bang_name)
38
+
39
+ names.delete(bang_name)
40
+
41
+ # Keyword arguments should override the bang.
42
+ kw_attributes[sym_name] = true unless kw_attributes.key?(sym_name)
43
+ end
44
+ end
12
45
  end
13
46
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Proscenium
4
- VERSION = '0.19.0.beta4'
4
+ VERSION = '0.19.0.beta6'
5
5
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'view_component'
4
-
5
3
  class Proscenium::ViewComponent < ViewComponent::Base
6
4
  extend ActiveSupport::Autoload
7
5
 
data/lib/proscenium.rb CHANGED
@@ -1,6 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/dependencies/autoload'
3
+ # require 'zeitwerk'
4
+
5
+ # loader = Zeitwerk::Loader.for_gem
6
+ # loader.inflector.inflect 'ui' => 'UI'
7
+ # loader.ignore "#{__dir__}/proscenium/ext"
8
+ # loader.ignore "#{__dir__}/proscenium/libs"
9
+ # loader.setup
4
10
 
5
11
  module Proscenium
6
12
  extend ActiveSupport::Autoload
@@ -65,7 +71,11 @@ module Proscenium
65
71
  end
66
72
 
67
73
  def ui_path
68
- Railtie.root.join('lib', 'proscenium', 'ui')
74
+ @ui_path ||= Railtie.root.join('lib', 'proscenium', 'ui')
75
+ end
76
+
77
+ def ui_path_regex
78
+ @ui_path_regex ||= Regexp.new("^#{Proscenium.ui_path}/")
69
79
  end
70
80
 
71
81
  def root
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proscenium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.0.beta4
4
+ version: 0.19.0.beta6
5
5
  platform: x86_64-linux
6
6
  authors:
7
7
  - Joel Moss
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-03 00:00:00.000000000 Z
11
+ date: 2025-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: 7.1.0
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '8.0'
22
+ version: '9.0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,21 @@ dependencies:
29
29
  version: 7.1.0
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '8.0'
32
+ version: '9.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: countries
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 7.1.0
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: 7.1.0
33
47
  - !ruby/object:Gem::Dependency
34
48
  name: ffi
35
49
  requirement: !ruby/object:Gem::Requirement
@@ -59,19 +73,19 @@ dependencies:
59
73
  - !ruby/object:Gem::Version
60
74
  version: '1.0'
61
75
  - !ruby/object:Gem::Dependency
62
- name: oj
76
+ name: phonelib
63
77
  requirement: !ruby/object:Gem::Requirement
64
78
  requirements:
65
79
  - - "~>"
66
80
  - !ruby/object:Gem::Version
67
- version: '3.13'
81
+ version: 0.10.3
68
82
  type: :runtime
69
83
  prerelease: false
70
84
  version_requirements: !ruby/object:Gem::Requirement
71
85
  requirements:
72
86
  - - "~>"
73
87
  - !ruby/object:Gem::Version
74
- version: '3.13'
88
+ version: 0.10.3
75
89
  - !ruby/object:Gem::Dependency
76
90
  name: railties
77
91
  requirement: !ruby/object:Gem::Requirement
@@ -81,7 +95,7 @@ dependencies:
81
95
  version: 7.1.0
82
96
  - - "<"
83
97
  - !ruby/object:Gem::Version
84
- version: '8.0'
98
+ version: '9.0'
85
99
  type: :runtime
86
100
  prerelease: false
87
101
  version_requirements: !ruby/object:Gem::Requirement
@@ -91,7 +105,7 @@ dependencies:
91
105
  version: 7.1.0
92
106
  - - "<"
93
107
  - !ruby/object:Gem::Version
94
- version: '8.0'
108
+ version: '9.0'
95
109
  - !ruby/object:Gem::Dependency
96
110
  name: ruby-next
97
111
  requirement: !ruby/object:Gem::Requirement
@@ -133,7 +147,6 @@ files:
133
147
  - lib/proscenium/middleware/base.rb
134
148
  - lib/proscenium/middleware/engines.rb
135
149
  - lib/proscenium/middleware/esbuild.rb
136
- - lib/proscenium/middleware/runtime.rb
137
150
  - lib/proscenium/monkey.rb
138
151
  - lib/proscenium/phlex.rb
139
152
  - lib/proscenium/phlex/asset_inclusions.rb
@@ -154,6 +167,44 @@ files:
154
167
  - lib/proscenium/ui/breadcrumbs/mixins.css
155
168
  - lib/proscenium/ui/component.rb
156
169
  - lib/proscenium/ui/custom_element.js
170
+ - lib/proscenium/ui/flash.rb
171
+ - lib/proscenium/ui/flash/index.css
172
+ - lib/proscenium/ui/flash/index.js
173
+ - lib/proscenium/ui/form.css
174
+ - lib/proscenium/ui/form.rb
175
+ - lib/proscenium/ui/form/field_methods.rb
176
+ - lib/proscenium/ui/form/fields/base.rb
177
+ - lib/proscenium/ui/form/fields/checkbox.rb
178
+ - lib/proscenium/ui/form/fields/checkbox/index.jsx
179
+ - lib/proscenium/ui/form/fields/checkbox/index.module.css
180
+ - lib/proscenium/ui/form/fields/checkbox/previews/basic.jsx
181
+ - lib/proscenium/ui/form/fields/date.module.css
182
+ - lib/proscenium/ui/form/fields/datetime.rb
183
+ - lib/proscenium/ui/form/fields/hidden.rb
184
+ - lib/proscenium/ui/form/fields/input.rb
185
+ - lib/proscenium/ui/form/fields/input/index.jsx
186
+ - lib/proscenium/ui/form/fields/input/index.module.css
187
+ - lib/proscenium/ui/form/fields/input/previews/basic.jsx
188
+ - lib/proscenium/ui/form/fields/radio_group.rb
189
+ - lib/proscenium/ui/form/fields/radio_input.rb
190
+ - lib/proscenium/ui/form/fields/radio_input/index.jsx
191
+ - lib/proscenium/ui/form/fields/radio_input/index.module.css
192
+ - lib/proscenium/ui/form/fields/radio_input/previews/basic.jsx
193
+ - lib/proscenium/ui/form/fields/rich_textarea.css
194
+ - lib/proscenium/ui/form/fields/rich_textarea.js
195
+ - lib/proscenium/ui/form/fields/rich_textarea.rb
196
+ - lib/proscenium/ui/form/fields/select.jsx
197
+ - lib/proscenium/ui/form/fields/select.module.css
198
+ - lib/proscenium/ui/form/fields/select.rb
199
+ - lib/proscenium/ui/form/fields/tel.css
200
+ - lib/proscenium/ui/form/fields/tel.js
201
+ - lib/proscenium/ui/form/fields/tel.rb
202
+ - lib/proscenium/ui/form/fields/textarea.rb
203
+ - lib/proscenium/ui/form/fields/textarea/index.jsx
204
+ - lib/proscenium/ui/form/fields/textarea/index.module.css
205
+ - lib/proscenium/ui/form/fields/textarea/previews/basic.jsx
206
+ - lib/proscenium/ui/form/translation.rb
207
+ - lib/proscenium/ui/props.css
157
208
  - lib/proscenium/ui/react-manager/index.jsx
158
209
  - lib/proscenium/ui/react-manager/react.js
159
210
  - lib/proscenium/ui/stimulus-loading.js
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Proscenium
4
- class Middleware
5
- class Runtime < Esbuild
6
- private
7
-
8
- def real_path
9
- @real_path ||= Pathname.new(@request.path.sub(%r{^/@proscenium},
10
- '/lib/proscenium/libs')).to_s
11
- end
12
-
13
- def root_for_readable
14
- Proscenium::Railtie.root
15
- end
16
- end
17
- end
18
- end