primer_view_components 0.0.85 → 0.0.86

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/app/assets/javascripts/primer_view_components.js +1 -1
  4. data/app/assets/javascripts/primer_view_components.js.map +1 -1
  5. data/app/components/primer/alpha/auto_complete/item.rb +1 -1
  6. data/app/components/primer/alpha/auto_complete.rb +1 -1
  7. data/app/components/primer/alpha/button_marketing.rb +1 -1
  8. data/app/components/primer/alpha/text_field.rb +105 -0
  9. data/app/components/primer/alpha/tool-tip-element.d.ts +3 -1
  10. data/app/components/primer/alpha/tool-tip-element.js +20 -13
  11. data/app/components/primer/alpha/tool-tip-element.ts +23 -14
  12. data/app/components/primer/alpha/tooltip.rb +1 -1
  13. data/app/components/primer/beta/base_button.rb +47 -0
  14. data/app/components/primer/{alpha → beta}/border_box/header.html.erb +0 -0
  15. data/app/components/primer/{alpha → beta}/border_box/header.rb +6 -6
  16. data/app/components/primer/{border_box_component.html.erb → beta/border_box.html.erb} +0 -0
  17. data/app/components/primer/beta/border_box.rb +147 -0
  18. data/app/components/primer/blankslate_component.rb +2 -150
  19. data/app/components/primer/border_box_component.rb +2 -140
  20. data/app/components/primer/button_component.html.erb +12 -4
  21. data/app/components/primer/button_component.rb +2 -2
  22. data/app/components/primer/clipboard_copy.rb +6 -2
  23. data/app/components/primer/close_button.rb +1 -1
  24. data/app/components/primer/hellip_button.rb +1 -1
  25. data/app/components/primer/icon_button.html.erb +6 -0
  26. data/app/components/primer/icon_button.rb +46 -10
  27. data/app/components/primer/link_component.html.erb +12 -0
  28. data/app/components/primer/link_component.rb +2 -9
  29. data/app/lib/primer/join_style_arguments_helper.rb +1 -1
  30. data/lib/primer/classify/utilities.rb +3 -6
  31. data/lib/primer/form_components.rb +36 -0
  32. data/lib/primer/forms/acts_as_component.rb +118 -0
  33. data/lib/primer/forms/base.html.erb +8 -0
  34. data/lib/primer/forms/base.rb +137 -0
  35. data/lib/primer/forms/base_component.rb +58 -0
  36. data/lib/primer/forms/buffer_rewriter.rb +50 -0
  37. data/lib/primer/forms/caption.html.erb +10 -0
  38. data/lib/primer/forms/caption.rb +29 -0
  39. data/lib/primer/forms/check_box.html.erb +9 -0
  40. data/lib/primer/forms/check_box.rb +16 -0
  41. data/lib/primer/forms/check_box_group.html.erb +12 -0
  42. data/lib/primer/forms/check_box_group.rb +14 -0
  43. data/lib/primer/forms/dsl/check_box_group_input.rb +41 -0
  44. data/lib/primer/forms/dsl/check_box_input.rb +27 -0
  45. data/lib/primer/forms/dsl/form_object.rb +25 -0
  46. data/lib/primer/forms/dsl/form_reference_input.rb +36 -0
  47. data/lib/primer/forms/dsl/hidden_input.rb +29 -0
  48. data/lib/primer/forms/dsl/input.rb +259 -0
  49. data/lib/primer/forms/dsl/input_group.rb +41 -0
  50. data/lib/primer/forms/dsl/input_methods.rb +86 -0
  51. data/lib/primer/forms/dsl/multi_input.rb +58 -0
  52. data/lib/primer/forms/dsl/radio_button_group_input.rb +38 -0
  53. data/lib/primer/forms/dsl/radio_button_input.rb +37 -0
  54. data/lib/primer/forms/dsl/select_list_input.rb +53 -0
  55. data/lib/primer/forms/dsl/submit_button_input.rb +28 -0
  56. data/lib/primer/forms/dsl/text_area_input.rb +33 -0
  57. data/lib/primer/forms/dsl/text_field_input.rb +65 -0
  58. data/lib/primer/forms/form_control.html.erb +18 -0
  59. data/lib/primer/forms/form_control.rb +23 -0
  60. data/lib/primer/forms/form_list.html.erb +5 -0
  61. data/lib/primer/forms/form_list.rb +21 -0
  62. data/lib/primer/forms/form_reference.html.erb +3 -0
  63. data/lib/primer/forms/form_reference.rb +14 -0
  64. data/lib/primer/forms/group.html.erb +5 -0
  65. data/lib/primer/forms/group.rb +27 -0
  66. data/lib/primer/forms/hidden_field.html.erb +1 -0
  67. data/lib/primer/forms/hidden_field.rb +15 -0
  68. data/lib/primer/forms/multi.html.erb +3 -0
  69. data/lib/primer/forms/multi.rb +14 -0
  70. data/lib/primer/forms/radio_button.html.erb +14 -0
  71. data/lib/primer/forms/radio_button.rb +29 -0
  72. data/lib/primer/forms/radio_button_group.html.erb +12 -0
  73. data/lib/primer/forms/radio_button_group.rb +14 -0
  74. data/lib/primer/forms/select_list.html.erb +5 -0
  75. data/lib/primer/forms/select_list.rb +26 -0
  76. data/lib/primer/forms/separator.html.erb +1 -0
  77. data/lib/primer/forms/separator.rb +8 -0
  78. data/lib/primer/forms/spacing_wrapper.html.erb +3 -0
  79. data/lib/primer/forms/spacing_wrapper.rb +8 -0
  80. data/lib/primer/forms/submit_button.html.erb +4 -0
  81. data/lib/primer/forms/submit_button.rb +50 -0
  82. data/lib/primer/forms/text_area.html.erb +5 -0
  83. data/lib/primer/forms/text_area.rb +16 -0
  84. data/lib/primer/forms/text_field.html.erb +19 -0
  85. data/lib/primer/forms/text_field.rb +14 -0
  86. data/lib/primer/view_components/engine.rb +23 -0
  87. data/lib/primer/view_components/linters/argument_mappers/button.rb +2 -2
  88. data/lib/primer/view_components/linters/button_component_migration_counter.rb +1 -1
  89. data/lib/primer/view_components/linters/helpers/deprecated_components_helpers.rb +2 -8
  90. data/lib/primer/view_components/version.rb +1 -1
  91. data/lib/rubocop/cop/primer/component_name_migration.rb +3 -0
  92. data/lib/tasks/deprecated.rake +22 -0
  93. data/lib/tasks/docs.rake +5 -3
  94. data/static/arguments.yml +148 -39
  95. data/static/audited_at.json +4 -2
  96. data/static/classes.yml +2 -1
  97. data/static/constants.json +44 -39
  98. data/static/statuses.json +7 -5
  99. metadata +66 -7
  100. data/app/components/primer/base_button.rb +0 -43
  101. data/app/components/primer/blankslate_component.html.erb +0 -30
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "pathname"
4
+
5
+ module Primer
6
+ module Forms
7
+ # :nodoc:
8
+ module ActsAsComponent
9
+ # :nodoc:
10
+ module InstanceMethods
11
+ delegate :render, :content_tag, :output_buffer, :capture, to: :@view_context
12
+
13
+ def render_in(view_context, &block)
14
+ @view_context = view_context
15
+ before_render
16
+ perform_render(&block)
17
+ end
18
+
19
+ # :nocov:
20
+ def perform_render(&_block)
21
+ raise NotImplementedError, "subclasses must implement ##{__method__}."
22
+ end
23
+ # :nocov:
24
+
25
+ def before_render; end
26
+
27
+ # :nocov:
28
+ # rubocop:disable Naming/AccessorMethodName
29
+ def set_original_view_context(view_context)
30
+ @view_context = view_context
31
+ end
32
+ # rubocop:enable Naming/AccessorMethodName
33
+ # :nocov:
34
+ end
35
+
36
+ def self.extended(base)
37
+ base.include(InstanceMethods)
38
+ end
39
+
40
+ TemplateGlob = Struct.new(:glob_pattern, :method_name, :on_compile_callback)
41
+ TemplateParams = Struct.new(:source, :identifier, :type, :format)
42
+
43
+ attr_accessor :template_root_path
44
+
45
+ def renders_templates(glob_pattern, method_name = nil, &block)
46
+ template_globs << TemplateGlob.new(glob_pattern, method_name, block)
47
+ end
48
+ alias renders_template renders_templates
49
+
50
+ def compile!
51
+ # always recompile in dev
52
+ return if defined?(@compiled) && @compiled && !Rails.env.development?
53
+
54
+ template_globs.each do |template_glob|
55
+ compile_templates_in(template_glob)
56
+ end
57
+
58
+ @compiled = true
59
+ end
60
+
61
+ private
62
+
63
+ def template_globs
64
+ @template_globs ||= []
65
+ end
66
+
67
+ def compile_templates_in(template_glob)
68
+ pattern = if Pathname(template_glob.glob_pattern).absolute?
69
+ template_glob.glob_pattern
70
+ else
71
+ # skip compilation for anonymous form classes, as in tests
72
+ return unless template_root_path
73
+
74
+ File.join(template_root_path, template_glob.glob_pattern)
75
+ end
76
+
77
+ template_paths = Dir.glob(pattern)
78
+
79
+ raise "Cannot compile multiple templates with the same method name." if template_paths.size > 1 && template_glob.method_name
80
+
81
+ template_paths.each do |template_path|
82
+ method_name = template_glob.method_name
83
+ method_name ||= "render_#{File.basename(template_path).chomp('.html.erb')}"
84
+ define_template_method(template_path, method_name)
85
+ template_glob&.on_compile_callback&.call(template_path)
86
+ end
87
+ end
88
+
89
+ def define_template_method(template_path, method_name)
90
+ # rubocop:disable Style/DocumentDynamicEvalDefinition
91
+ # rubocop:disable Style/EvalWithLocation
92
+ class_eval <<-RUBY, template_path, 0
93
+ private def #{method_name}
94
+ capture { #{compile_template(template_path)} }
95
+ end
96
+ RUBY
97
+ # rubocop:enable Style/EvalWithLocation
98
+ # rubocop:enable Style/DocumentDynamicEvalDefinition
99
+ end
100
+
101
+ def compile_template(path)
102
+ handler = ActionView::Template.handler_for_extension("erb")
103
+ template = File.read(path)
104
+ template_params = TemplateParams.new({
105
+ source: template,
106
+ identifier: __FILE__,
107
+ type: "text/html",
108
+ format: "text/html"
109
+ })
110
+
111
+ # change @output_buffer ivar to output_buffer method call
112
+ BufferRewriter.rewrite(
113
+ handler.call(template_params, template)
114
+ )
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,8 @@
1
+ <%= render(SpacingWrapper.new) do %>
2
+ <% inputs.each do |input| %>
3
+ <%= render(input) %>
4
+ <% end %>
5
+ <% end %>
6
+ <% if after_content? %>
7
+ <%= render_after_content %>
8
+ <% end %>
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Forms
5
+ # :nodoc:
6
+ class Base
7
+ extend ActsAsComponent
8
+
9
+ renders_template File.join(__dir__, "base.html.erb"), :render_base_form
10
+
11
+ class << self
12
+ attr_reader :has_after_content, :__vcf_form_block, :__vcf_builder
13
+ alias after_content? has_after_content
14
+
15
+ def form(&block)
16
+ @__vcf_form_block = block
17
+ end
18
+
19
+ def new(builder, **options)
20
+ allocate.tap do |form|
21
+ form.instance_variable_set(:@builder, builder)
22
+ form.send(:initialize, **options)
23
+ end
24
+ end
25
+
26
+ def inherited(base)
27
+ form_path = const_source_location(base.name)
28
+ return unless form_path
29
+
30
+ base.template_root_path = File.join(File.dirname(form_path), base.name.demodulize.underscore)
31
+
32
+ base.renders_template "after_content.html.erb" do
33
+ base.instance_variable_set(:@has_after_content, true)
34
+ end
35
+
36
+ base.renders_templates "*_caption.html.erb" do |path|
37
+ base.fields_with_caption_templates << File.basename(path).chomp("_caption.html.erb").to_sym
38
+ end
39
+ end
40
+
41
+ def caption_template?(field_name)
42
+ fields_with_caption_templates.include?(field_name)
43
+ end
44
+
45
+ def fields_with_caption_templates
46
+ @fields_with_caption_templates ||= []
47
+ end
48
+
49
+ private
50
+
51
+ # Unfortunately this bug (https://github.com/ruby/ruby/pull/5646) prevents us from using
52
+ # Ruby's native Module.const_source_location. Instead we have to fudge it by searching
53
+ # for the file in the configured autoload paths. Doing so relies on Rails' autoloading
54
+ # conventions, so it should work ok. Zeitwerk also has this information but lacks a
55
+ # public API to map constants to source files.
56
+ def const_source_location(class_name)
57
+ # NOTE: underscore respects namespacing, i.e. will convert Foo::Bar to foo/bar.
58
+ class_path = "#{class_name.underscore}.rb"
59
+
60
+ ActiveSupport::Dependencies.autoload_paths.each do |autoload_path|
61
+ absolute_path = File.join(autoload_path, class_path)
62
+ return absolute_path if File.exist?(absolute_path)
63
+ end
64
+
65
+ nil
66
+ end
67
+ end
68
+
69
+ def inputs
70
+ @inputs ||= form_object.inputs.map do |input|
71
+ next input unless input.input?
72
+
73
+ # wrap inputs in a group (unless they are already groups)
74
+ if input.type == :group
75
+ input
76
+ else
77
+ Primer::Forms::Dsl::InputGroup.new(builder: @builder, form: self) do |group|
78
+ group.send(:add_input, input)
79
+ end
80
+ end
81
+ end
82
+ end
83
+
84
+ def each_input_in(root_input, &block)
85
+ return enum_for(__method__, root_input) unless block
86
+
87
+ root_input.inputs.each do |input|
88
+ if input.respond_to?(:inputs)
89
+ each_input_in(input, &block)
90
+ else
91
+ yield input
92
+ end
93
+ end
94
+ end
95
+
96
+ def before_render
97
+ each_input_in(self) do |input|
98
+ if input.input? && input.invalid? && input.focusable?
99
+ input.autofocus!
100
+ break
101
+ end
102
+ end
103
+ end
104
+
105
+ def caption_template?(*args)
106
+ self.class.caption_template?(*args)
107
+ end
108
+
109
+ def after_content?(*args)
110
+ self.class.after_content?(*args)
111
+ end
112
+
113
+ def render_caption_template(name)
114
+ send(:"render_#{name}_caption")
115
+ end
116
+
117
+ def perform_render(&_block)
118
+ Base.compile!
119
+ self.class.compile!
120
+
121
+ render_base_form
122
+ end
123
+
124
+ private
125
+
126
+ def form_object
127
+ # rubocop:disable Naming/MemoizedInstanceVariableName
128
+ @__pf_form_object ||= Primer::Forms::Dsl::FormObject.new(builder: @builder, form: self).tap do |obj|
129
+ # compile before adding inputs so caption templates are identified
130
+ self.class.compile!
131
+ instance_exec(obj, &self.class.__vcf_form_block)
132
+ end
133
+ # rubocop:enable Naming/MemoizedInstanceVariableName
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "primer/class_name_helper"
4
+
5
+ module Primer
6
+ module Forms
7
+ # :nodoc:
8
+ class BaseComponent
9
+ include Primer::ClassNameHelper
10
+ extend ActsAsComponent
11
+
12
+ def self.inherited(base)
13
+ base.renders_template File.join(__dir__, "#{base.name.demodulize.underscore}.html.erb"), :render_template
14
+ end
15
+
16
+ delegate :required?, :disabled?, :hidden?, to: :@input
17
+
18
+ def perform_render(&block)
19
+ @__prf_content_block = block
20
+ compile_and_render_template
21
+ end
22
+
23
+ def content
24
+ return @__prf_content if defined?(@__prf_content_evaluated) && @__prf_content_evaluated
25
+
26
+ @__prf_content_evaluated = true
27
+ @__prf_content = capture do
28
+ @__prf_content_block.call
29
+ end
30
+ end
31
+
32
+ # :nocov:
33
+ def type
34
+ :component
35
+ end
36
+ # :nocov:
37
+
38
+ def input?
39
+ false
40
+ end
41
+
42
+ private
43
+
44
+ def compile_and_render_template
45
+ self.class.compile! unless self.class.instance_methods(false).include?(:render_template)
46
+ render_template
47
+ end
48
+
49
+ def content_tag_if(condition, tag, **kwargs, &block)
50
+ if condition
51
+ content_tag(tag, **kwargs, &block)
52
+ else
53
+ capture(&block)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ripper"
4
+
5
+ module Primer
6
+ module Forms
7
+ # :nodoc:
8
+ class BufferRewriter < Ripper
9
+ class << self
10
+ def rewrite(code)
11
+ parser = new(code, "(code)", 0)
12
+ parser.parse
13
+
14
+ line_offsets = calc_line_offsets(code)
15
+
16
+ code.dup.tap do |result|
17
+ parser.var_refs.reverse_each do |lineno, stop|
18
+ line_offset = line_offsets[lineno]
19
+ start = (stop - "@output_buffer".length) + line_offset
20
+ stop += line_offset
21
+ result[start...stop] = "output_buffer"
22
+ end
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def calc_line_offsets(code)
29
+ idx = -1
30
+
31
+ [0].tap do |offsets|
32
+ while (idx = code.index(/\r?\n/, idx + 1))
33
+ offsets << Regexp.last_match.end(0)
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ def on_var_ref(var)
40
+ return unless var == "@output_buffer"
41
+
42
+ var_refs << [lineno, column - 1]
43
+ end
44
+
45
+ def var_refs
46
+ @var_refs ||= []
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,10 @@
1
+ <% if @input.caption? && !@input.caption.blank? %>
2
+ <span class="FormControl-caption" id="<%= @input.caption_id %>"><%= @input.caption %></span>
3
+ <% elsif caption_template? %>
4
+ <% caption_template = render_caption_template %>
5
+ <% unless caption_template.blank? %>
6
+ <span class="FormControl-caption" id="<%= @input.caption_id %>">
7
+ <%= caption_template %>
8
+ </span>
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Forms
5
+ # :nodoc:
6
+ class Caption < BaseComponent
7
+ def initialize(input:)
8
+ @input = input
9
+ end
10
+
11
+ def caption_template?
12
+ @input.caption_template?
13
+ end
14
+
15
+ def render_caption_template
16
+ @input.render_caption_template
17
+ end
18
+
19
+ def before_render
20
+ return unless @input.caption? && caption_template?
21
+
22
+ raise <<~MESSAGE
23
+ Please provide either a caption: argument or caption template for the
24
+ '#{@input.name}' input; both were found.
25
+ MESSAGE
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,9 @@
1
+ <div class="FormControl-checkbox-wrap">
2
+ <%= builder.check_box(@input.name, **@input.input_arguments) %>
3
+ <span class="FormControl-checkbox-labelWrap">
4
+ <%= builder.label(@input.name, **@input.label_arguments) do %>
5
+ <%= @input.label %>
6
+ <% end %>
7
+ <%= render(Caption.new(input: @input)) %>
8
+ </span>
9
+ </div>
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Forms
5
+ # :nodoc:
6
+ class CheckBox < BaseComponent
7
+ delegate :builder, :form, to: :@input
8
+
9
+ def initialize(input:)
10
+ @input = input
11
+ @input.add_label_classes("FormControl-label")
12
+ @input.add_input_classes("FormControl-checkbox")
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,12 @@
1
+ <fieldset>
2
+ <% if @input.label %>
3
+ <%= content_tag(:legend, **@input.label_arguments) do %>
4
+ <%= @input.label %>
5
+ <% end %>
6
+ <% end %>
7
+ <%= render(SpacingWrapper.new) do %>
8
+ <% @input.check_boxes.each do |check_box| %>
9
+ <%= render(check_box) %>
10
+ <% end %>
11
+ <% end %>
12
+ </fieldset>
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Forms
5
+ # :nodoc:
6
+ class CheckBoxGroup < BaseComponent
7
+ delegate :builder, :form, to: :@input
8
+
9
+ def initialize(input:)
10
+ @input = input
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Forms
5
+ module Dsl
6
+ # :nodoc:
7
+ class CheckBoxGroupInput < Input
8
+ attr_reader :label, :check_boxes
9
+
10
+ def initialize(label: nil, **system_arguments)
11
+ @label = label
12
+ @check_boxes = []
13
+
14
+ super(**system_arguments)
15
+
16
+ add_label_classes("FormControl-label", "mb-2")
17
+
18
+ yield(self) if block_given?
19
+ end
20
+
21
+ def to_component
22
+ CheckBoxGroup.new(input: self)
23
+ end
24
+
25
+ def name
26
+ nil
27
+ end
28
+
29
+ def type
30
+ :check_box_group
31
+ end
32
+
33
+ def check_box(**system_arguments)
34
+ @check_boxes << CheckBoxInput.new(
35
+ builder: @builder, form: @form, **system_arguments
36
+ )
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Forms
5
+ module Dsl
6
+ # :nodoc:
7
+ class CheckBoxInput < Input
8
+ attr_reader :name, :label
9
+
10
+ def initialize(name:, label:, **system_arguments)
11
+ @name = name
12
+ @label = label
13
+
14
+ super(**system_arguments)
15
+ end
16
+
17
+ def to_component
18
+ CheckBox.new(input: self)
19
+ end
20
+
21
+ def type
22
+ :check_box
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Forms
5
+ module Dsl
6
+ # :nodoc:
7
+ class FormObject
8
+ include InputMethods
9
+
10
+ attr_reader :builder, :form
11
+
12
+ def initialize(builder:, form:)
13
+ @builder = builder
14
+ @form = form
15
+
16
+ yield(self) if block_given?
17
+ end
18
+
19
+ def group(**options, &block)
20
+ add_input InputGroup.new(builder: @builder, form: @form, **options, &block)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Forms
5
+ module Dsl
6
+ # :nodoc:
7
+ class FormReferenceInput < Input
8
+ attr_reader :ref_block, :fields_for_args, :fields_for_kwargs
9
+
10
+ def initialize(*fields_for_args, builder:, form:, **fields_for_kwargs, &block)
11
+ @fields_for_args = fields_for_args
12
+ @fields_for_kwargs = fields_for_kwargs
13
+ @ref_block = block
14
+
15
+ super(builder: builder, form: form, **fields_for_kwargs)
16
+ end
17
+
18
+ def to_component
19
+ FormReference.new(input: self)
20
+ end
21
+
22
+ def name
23
+ nil
24
+ end
25
+
26
+ def label
27
+ nil
28
+ end
29
+
30
+ def type
31
+ :form
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Primer
4
+ module Forms
5
+ module Dsl
6
+ # :nodoc:
7
+ class HiddenInput < Input
8
+ attr_reader :name
9
+
10
+ def initialize(name:, **system_arguments)
11
+ @name = name
12
+ super(**system_arguments)
13
+ end
14
+
15
+ def to_component
16
+ HiddenField.new(input: self)
17
+ end
18
+
19
+ def label
20
+ nil
21
+ end
22
+
23
+ def type
24
+ :hidden
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end