bsvc 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2856d5ea8ea38c3ca3a4a0d550bc8dbe67d078998e6a07d614ea677dea89b49a
4
- data.tar.gz: 7d0173c3461403d830628ce47a85d8f609a91485d64b2e55dd97169a49a09249
3
+ metadata.gz: a73813d0faff1ece3a11dbb99ab92fc0ae1b6a21b569f4e7b8098360414bd23f
4
+ data.tar.gz: aed5a21edf2dea1a80191fd25d091be82125bc2180f800ec87d0e513ae4c2ee0
5
5
  SHA512:
6
- metadata.gz: d361e0170595f59b984bd654e1ef07e333d3e8730236fa4a984580b9523a1dce172b4cd4e6c6d8bae8faa66d8fc9f96804ff4e19c5d4175bb7526b3b9c316fa2
7
- data.tar.gz: ab225fd11a3841c4818fff35a61c24512634c765b083888e7f93585ad6dca8c1c68561920b2adaee22afa8e087cb95c13c754d800e8580b1feeb75d09e72592a
6
+ metadata.gz: a169f4e0a2632317c578e39374375dd39572d0d7c8764d51d55b81851cd2bbdb8916ee2013e28b9ba5fb7455403a14a2c623fdcbb95807d18920704fe5df5b80
7
+ data.tar.gz: c9b5faa907d9ee920a650e04de3cc22e3e8c560ece596a4b9b67dd9f07711bf33b5d95c5b60f3eed0dfa287bc33f300785c050d82c6629d3c435c370649b2b27
data/.gitignore CHANGED
@@ -1,3 +1,5 @@
1
+ *.gem
2
+ Gemfile.lock
1
3
  /.bundle/
2
4
  /.yardoc
3
5
  /_yardoc/
data/README.md CHANGED
@@ -20,9 +20,53 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install bsvc
22
22
 
23
+
24
+ **NOTE:** BSVC does _not_ include Bootstrap for you, this is by design. BSVC will work however you include Bootstrap in your application, whether through sprockets, esbuild, import map or any other way.
25
+
23
26
  ## Usage
24
27
 
25
- TODO: Examples for using components coming soon.
28
+ Basic four column grid that shrinks to two, double stacked columns at the 768px (md) breakpont. Each column contains a heading component.
29
+
30
+ **NOTE:** The last column shows a heading component (`h`) passing content in through a block rather than the `text:` option.
31
+
32
+ ```ruby
33
+ <%= container do %>
34
+ <%= row do |c| %>
35
+ <%= column(c, col: { md: 6, lg: 3 }) do %>
36
+ <%= h(tag: 'h2', text: 'Column 1') %>
37
+ <% end %>
38
+ <%= column(c, col: { md: 6, lg: 3 }) do %>
39
+ <%= h(tag: 'h2', text: 'Column 2') %>
40
+ <% end %>
41
+ <%= column(c, col: { md: 6, lg: 3 }) do %>
42
+ <%= h(tag: 'h2', text: 'Column 3') %>
43
+ <% end %>
44
+ <%= column(c, col: { md: 6, lg: 3 }) do %>
45
+ <%= h(tag: 'h2') do %>
46
+ <i class="bi bi-4-circle-fill"></i> Column 4
47
+ <% end %>
48
+ <% end %>
49
+ <% end %>
50
+ <% end %>
51
+ ```
52
+
53
+ ### Compoments used:
54
+ - Container
55
+ - Accepts two options, type of container (`sm, md, lg...fluid`) and any additional classes
56
+ - Row
57
+ - Accepts additional classes (`row` is default) and styles.
58
+ - Column
59
+ - Accepts:
60
+ - col (`md: 6`)
61
+ - offset (`md: 6`)
62
+ - classes
63
+ - styles
64
+ - Heading (h)
65
+ - Accepts:
66
+ - text (only if no block is provided)
67
+ - tag (h1, h2, h3 etc)
68
+ - classes
69
+ - styles
26
70
 
27
71
  ## Customizing Components
28
72
 
@@ -36,14 +80,26 @@ To copy all compoents into your app run:
36
80
  rails g bsvc:components
37
81
  ```
38
82
 
39
- This will copy over all of BSVC components and helpers. It will create a `components/` directory inside of `app/`. All helpers will be placed inside `app/helpers/`.
83
+ This will copy over all of BSVC components and helpers. It will create an `app/components/` directory in the root of app. All helpers will be placed inside `app/helpers/`.
40
84
 
41
85
  ### A Single Component
42
86
 
43
87
  ```ruby
44
88
  rails g bsvc:component --name COMPONENT_NAME
45
89
  ```
46
- `--name` should be the top level directory of the coponent you want in `app/components/`
90
+ `COMPONENT_NAME` should be the top level directory of the coponent you want in `app/components/`
91
+
92
+ **NOTE:** Running the `component` command on a parent component with nested child components will copy over all child components in the top level directory.
93
+
94
+ ### A Single Nested Child Component
95
+ For nested child components, pass the path of the component starting with the top level directory.
96
+
97
+ ```ruby
98
+ rails g bsvc:component --name grid/container
99
+ ```
100
+
101
+ This will grab only the container component and helper and place them in `app/components/grid` and `app/helpers/grid`.
102
+
47
103
 
48
104
  ## Roadmap
49
105
  - Continue building out components
@@ -0,0 +1,9 @@
1
+ <div
2
+ <%= classes %>
3
+ <%= id %>
4
+ <%= styles %>
5
+ >
6
+ <% items.each do |item| %>
7
+ <%= item %>
8
+ <% end %>
9
+ </div>
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Accordion
4
+ def default_plus_passed_classes(defaults, classes)
5
+ "#{defaults} #{classes}".strip
6
+ end
7
+
8
+ module_function :default_plus_passed_classes
9
+
10
+ class AccordionComponent < ViewComponent::Base
11
+ renders_many :items, AccordionItemComponent
12
+
13
+ def initialize(**options)
14
+ @id = options[:id]
15
+ @classses = options[:classses]
16
+ @styles = options[:styles]
17
+
18
+ @default_classses = 'accordion'
19
+ end
20
+
21
+ private
22
+
23
+ def styles
24
+ @styles if @styles.present?
25
+ end
26
+
27
+ def id
28
+ "id=#{@id}" if @id
29
+ end
30
+
31
+ def classes
32
+ "class=#{Accordion.default_plus_passed_classes(
33
+ @default_classses,
34
+ @classes
35
+ )}"
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,24 @@
1
+ <div class="accordion-item">
2
+ <h2 class="accordion-header" <%= id %>>
3
+ <button
4
+ class="<%= "accordion-button #{active_item? ? nil : 'collapsed'}".strip %>"
5
+ type="button"
6
+ data-bs-toggle="collapse"
7
+ data-bs-target="#<%= @target %>"
8
+ aria-expanded="<%= active_item? ? 'true' : 'false' %>"
9
+ aria-controls="<%= @target %>"
10
+ >
11
+ <%= @title %>
12
+ </button>
13
+ </h2>
14
+ <div
15
+ id="<%= @target %>"
16
+ class="<%= "accordion-collapse collapse #{active_item? ? 'show' : nil}".strip %>"
17
+ aria-labelledby="<%= @id %>"
18
+ data-bs-parent="<%= "##{@parent}" %>"
19
+ >
20
+ <div class="accordion-body">
21
+ <%= content %>
22
+ </div>
23
+ </div>
24
+ </div>
@@ -0,0 +1,25 @@
1
+ # frozen_strin_literal: true
2
+
3
+ module Accordion
4
+ class AccordionItemComponent < ViewComponent::Base
5
+
6
+ def initialize(**options)
7
+ @id = options[:id]
8
+ @title = options[:title]
9
+ @index = options[:index]
10
+ @target = options[:target]
11
+ @active = options[:active]
12
+ @parent = options[:parent]
13
+ end
14
+
15
+ private
16
+
17
+ def active_item?
18
+ @active
19
+ end
20
+
21
+ def id
22
+ "id=#{@id}" if @id
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ <div
2
+ class="alert alert-<%= variant %> <%= dismissible_classes %> <%= icon_classes %>"
3
+ role="alert"
4
+ >
5
+ <%= message %>
6
+ <% if dismissible? %>
7
+ <button
8
+ type="button"
9
+ class="btn-close"
10
+ data-bs-dismiss="alert"
11
+ aria-label="Close">
12
+ </button>
13
+ <% end %>
14
+ </div>
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Alert
4
+ class AlertComponent < ViewComponent::Base
5
+ def initialize(**options)
6
+ @variant = options[:variant]
7
+ @dismiss = options[:dismiss]
8
+ @message = options[:message]
9
+ @icon = options[:icon]
10
+ end
11
+
12
+ private
13
+
14
+ def dismissible?
15
+ true unless @dismiss == false
16
+ end
17
+
18
+ def dismissible_classes
19
+ 'alert-dismissible fade show' if dismissible?
20
+ end
21
+
22
+ def icon?
23
+ @icon
24
+ end
25
+
26
+ def icon_classes
27
+ 'd-flex align-items-center' if icon?
28
+ end
29
+
30
+ def variant
31
+ @variant || 'primary'
32
+ end
33
+
34
+ def message
35
+ @message || content
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Forms
4
+ module Form
5
+ class FormComponent < ViewComponent::Base
6
+ def initialize(**options)
7
+ @url = options[:url]
8
+ @scope = options[:scope]
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ <% if @floating %>
2
+ <div class="form-floating">
3
+ <%= text_input %>
4
+ <label for="<%= floating_label_id %>"><%= @placeholder %></label>
5
+ </div>
6
+ <% else %>
7
+ <%= text_input %>
8
+ <% end %>
9
+
10
+ <h1>DO NOT USE: Active development</h1>
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Forms
4
+ module Input
5
+ class InputComponent < ViewComponent::Base
6
+ def initialize(**options)
7
+ @method = options[:method]
8
+ @object = options[:object]
9
+ @scope = options[:scope]
10
+ @type = options.dig(:html, :type)
11
+ @classes = options.dig(:html, :class)
12
+ @floating = options.dig(:html, :floating)
13
+ @placeholder = options.dig(:html, :placeholder)
14
+ @onchange = options.dig(:html, :onchange)
15
+ @html = options[:html]
16
+ classes_builder
17
+ end
18
+
19
+ private
20
+
21
+ def text_input
22
+ if scoped?
23
+ @scope.text_field(@method, @html)
24
+ else
25
+ text_field(@object, @method, @html)
26
+ end
27
+ end
28
+
29
+ def scoped?
30
+ @scope.present?
31
+ end
32
+
33
+ def floating_label_id
34
+ if scoped?
35
+ @scope.options[:html][:id]
36
+ else
37
+ "#{@object}_#{@method}"
38
+ end
39
+ end
40
+
41
+ def classes_builder
42
+ if @html[:class]
43
+ @html[:class] = "form-control #{@classes}".strip
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -19,7 +19,6 @@ module Card
19
19
  class HeaderComponent < ViewComponent::Base
20
20
 
21
21
  def initialize(**options)
22
- @tag = options[:tag] || :h2
23
22
  @classes = options[:classes]
24
23
  @styles = options[:styles]
25
24
 
@@ -27,7 +26,7 @@ module Card
27
26
  end
28
27
 
29
28
  def call
30
- content_tag(@tag,
29
+ content_tag(:div,
31
30
  content,
32
31
  class: Card.default_plus_passed_classes(
33
32
  @default_classses,
@@ -41,7 +40,6 @@ module Card
41
40
  class FooterComponent < ViewComponent::Base
42
41
 
43
42
  def initialize(**options)
44
- @tag = options[:tag] || :div
45
43
  @classes = options[:classes]
46
44
  @styles = options[:styles]
47
45
 
@@ -49,7 +47,7 @@ module Card
49
47
  end
50
48
 
51
49
  def call
52
- content_tag(@tag,
50
+ content_tag(:div,
53
51
  content,
54
52
  class: Card.default_plus_passed_classes(
55
53
  @default_classses,
@@ -23,15 +23,17 @@ module Grid
23
23
  private
24
24
 
25
25
  def column_class_builder
26
- "#{column_breakpoint} #{column_offset} #{@classes}"
26
+ "#{column_breakpoint} #{column_offset} #{@classes}".strip
27
27
  end
28
28
 
29
29
  def class_parser(option, klass)
30
- option.map do |key, value|
31
- if BREAK_POINTS.include?(key)
32
- "#{klass}-#{key}-#{value} "
33
- end
34
- end.join('').strip
30
+ unless option.nil?
31
+ option.map do |key, value|
32
+ if BREAK_POINTS.include?(key)
33
+ "#{klass}-#{key}-#{value} "
34
+ end
35
+ end.join('').strip
36
+ end
35
37
  end
36
38
 
37
39
  def column_breakpoint
@@ -0,0 +1,17 @@
1
+ # frozen_strin_literal: true
2
+
3
+ module Accordion
4
+ module AccordionHelper
5
+ def accordion(**options)
6
+ render(Accordion::AccordionComponent.new(**options)) do |c|
7
+ yield(c)
8
+ end
9
+ end
10
+
11
+ def item(c, **options)
12
+ c.with_item(**options) do
13
+ yield
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ #frozen_string_literal: true
2
+
3
+ module Alert
4
+ module AlertHelper
5
+ def alert(**options)
6
+ if block_given?
7
+ render(Alert::AlertComponent.new(**options)) do
8
+ yield
9
+ end
10
+ else
11
+ render(Alert::AlertComponent.new(**options))
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ module Alpha
2
+ module Forms
3
+ module InputHelper
4
+ def input(**options)
5
+ render(Input::InputComponent.new(**options))
6
+ end
7
+ end
8
+ end
9
+ end
@@ -7,5 +7,17 @@ module Card
7
7
  yield(c)
8
8
  end
9
9
  end
10
+
11
+ def header(c, **options)
12
+ c.with_header(**options) do
13
+ yield
14
+ end
15
+ end
16
+
17
+ def footer(c, **options)
18
+ c.with_footer(**options) do
19
+ yield
20
+ end
21
+ end
10
22
  end
11
23
  end
@@ -5,5 +5,11 @@ module Grid
5
5
  yield(c)
6
6
  end
7
7
  end
8
+
9
+ def column(c, **options)
10
+ c.with_column(**options) do
11
+ yield
12
+ end
13
+ end
8
14
  end
9
15
  end
data/bsvc.gemspec CHANGED
@@ -19,8 +19,6 @@ Gem::Specification.new do |spec|
19
19
  spec.metadata["source_code_uri"] = spec.homepage
20
20
  spec.metadata["changelog_uri"] = spec.homepage
21
21
 
22
- # Specify which files should be added to the gem when it is released.
23
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
22
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
25
23
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
24
  end
data/lib/bsvc/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Bsvc
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -8,8 +8,22 @@ module Bsvc
8
8
  class_option :name, type: :string, default: ''
9
9
 
10
10
  def copy_single_component
11
+ copy_component_to_app
12
+ copy_helper_to_app
13
+ end
14
+
15
+ private
16
+
17
+ def copy_component_to_app
11
18
  directory("app/components/#{@options[:name]}", "app/components/#{@options[:name]}")
12
- directory("app/helpers/#{@options[:name]}", "app/helpers/#{@options[:name]}")
19
+ end
20
+
21
+ def copy_helper_to_app
22
+ if @options[:name].include?('/')
23
+ copy_file("app/helpers/#{@options[:name]}_helper.rb", "app/helpers/#{@options[:name]}_helper.rb")
24
+ else
25
+ directory("app/helpers/#{@options[:name]}", "app/helpers/#{@options[:name]}")
26
+ end
13
27
  end
14
28
  end
15
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bsvc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick McNeany
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-01-09 00:00:00.000000000 Z
11
+ date: 2023-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,15 @@ files:
80
80
  - LICENSE.txt
81
81
  - README.md
82
82
  - Rakefile
83
+ - app/components/accordion/accordion_component.html.erb
84
+ - app/components/accordion/accordion_component.rb
85
+ - app/components/accordion/accordion_item_component.htm.erb
86
+ - app/components/accordion/accordion_item_component.rb
87
+ - app/components/alert/alert_component.html.erb
88
+ - app/components/alert/alert_component.rb
89
+ - app/components/alpha/forms/form/form.rb
90
+ - app/components/alpha/forms/input/input_component.html.erb
91
+ - app/components/alpha/forms/input/input_component.rb
83
92
  - app/components/card/card_component.html.erb
84
93
  - app/components/card/card_component.rb
85
94
  - app/components/grid/columns/columns_component.rb
@@ -87,6 +96,9 @@ files:
87
96
  - app/components/grid/container/container_component.rb
88
97
  - app/components/grid/row/row_component.rb
89
98
  - app/components/heading/h_component.rb
99
+ - app/helpers/accordion/accordion_helper.rb
100
+ - app/helpers/alert/alert_helper.rb
101
+ - app/helpers/alpha/forms/input_helper.rb
90
102
  - app/helpers/card/card_helper.rb
91
103
  - app/helpers/grid/container_helper.rb
92
104
  - app/helpers/grid/row_helper.rb
@@ -106,7 +118,7 @@ metadata:
106
118
  homepage_uri: https://github.com/Nickiam7/bsvc
107
119
  source_code_uri: https://github.com/Nickiam7/bsvc
108
120
  changelog_uri: https://github.com/Nickiam7/bsvc
109
- post_install_message:
121
+ post_install_message:
110
122
  rdoc_options: []
111
123
  require_paths:
112
124
  - lib
@@ -121,8 +133,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
133
  - !ruby/object:Gem::Version
122
134
  version: '0'
123
135
  requirements: []
124
- rubygems_version: 3.0.3
125
- signing_key:
136
+ rubygems_version: 3.3.25
137
+ signing_key:
126
138
  specification_version: 4
127
139
  summary: A Bootstrap and ViewComponent library for Rails views.
128
140
  test_files: []