primer_view_components 0.0.10 → 0.0.11

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: f4ccf1dd55332ea7b350841d78e04a0f56a0f036749638c30041582500cc561c
4
- data.tar.gz: f948087b2dba1cd217296a08260db95a8973cf8e58d4e1240a2c45295ef17e24
3
+ metadata.gz: befa90070fd7a8cd5a5668c8ac39697fb4baf39d11ebc50f938f72eb1805543a
4
+ data.tar.gz: c9b3abe81ae870566a2a2decf6135b8f13158842c43fd46b40346aba6fcc6e45
5
5
  SHA512:
6
- metadata.gz: 2359e308fa78d78b5cb0f4e76791bfcd6a9714b7295320d04f293f0b7e0351c4fbad90a13743c61e9401de9c69c1269ee791167638715e7fafc594a47b8a242b
7
- data.tar.gz: 2089d76d7cdef40b4bce9871d2b0ade0f492751ba057dc99e6fabc4654390656e0cdef57004931d66b1ea75f6189581dbf840bedbb7b89ee6d0fbfdb31d13136
6
+ metadata.gz: 16cbb49509d19431d5dba889847c350c5720b471452a62d5452de2ce454376826edc37628b5b65711255dbe4bd50357f7b7c0d158b2c595b15685db974e11607
7
+ data.tar.gz: aea1f3880d89157176c509eba04c7a79d9fd443e9f8ca8d5e3f40960e27ed94e100c69bfde39c86bba76471e76d6afca4f6ed7919d398e35b076a4ef5f659309
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## main
4
4
 
5
+ ## 0.0.11
6
+
7
+ * Renames DetailsComponent::OVERLAY_DEFAULT to DetailsComponent::NO_OVERLAY to more correctly describe its value.
8
+
9
+ *Justin Kenyon*
10
+
5
11
  ## 0.0.10
6
12
 
7
13
  * Add SpinnerComponent
data/README.md CHANGED
@@ -8,182 +8,7 @@
8
8
 
9
9
  _Note: This library is in pre-release development and should not be considered stable._
10
10
 
11
- ## Design philosophy
12
-
13
- Primer ViewComponents aims to mimic the API of [Primer Components](https://github.com/primer/components), while using [Primer CSS](https://github.com/primer/css) under the hood.
14
-
15
- ## Installation
16
-
17
- In `Gemfile`, add:
18
-
19
- ```ruby
20
- gem "primer_view_components"
21
- ```
22
-
23
- In `config/application.rb`, add **after the application definition**
24
-
25
- ```ruby
26
- require "primer/view_components/engine"
27
- ```
28
-
29
- ## Usage
30
-
31
- ### Built-in styling arguments
32
-
33
- Primer components should be styled using the built-in arguments when possible. Most Primer utility classes for spacing, alignment, display, and colors have equivalent component arguments.
34
-
35
- Example label built with Primer CSS:
36
-
37
- ```html
38
- <span title="Label: Suggested" class="Label Label--outline Label--outline-green ml-2 v-align-middle">Suggested</span>
39
- ```
40
-
41
- The same label using `Primer::LabelComponent`:
42
-
43
- ```erb
44
- <%= render Primer::LabelComponent.new(ml: 2, vertical_align: :middle, scheme: :green, title: "Label: Suggested") do %>
45
- Suggested
46
- <% end %>
47
- ```
48
-
49
- Some components have their own specific arguments, but they can all be styled with the following arguments.
50
-
51
- | Component argument | Primer class | Example |
52
- | --------------- | --------------- | -------- |
53
- | `m` | `m-<value>` | `m: 4` → `.m-4` |
54
- | `my` | `my-<value>` | `my: 4` → `.my-4` |
55
- | `mx` | `my-<value>` | `mx: 4` → `.mx-4` |
56
- | `mt` | `mt-<value>` | `mt: 4` → `.mt-4` |
57
- | `mb` | `mb-<value>` | `mb: 4` → `.mb-4` |
58
- | `ml` | `ml-<value>` | `ml: 4` → `.ml-4` |
59
- | `mr` | `mr-<value>` | `mr: 4` → `.mr-4` |
60
- | `p` | `p-<value>` | `p: 4` → `.p-4` |
61
- | `py` | `py-<value>` | `py: 4` → `.py-4` |
62
- | `px` | `py-<value>` | `px: 4` → `.px-4` |
63
- | `pt` | `pt-<value>` | `pt: 4` → `.pt-4` |
64
- | `pb` | `pb-<value>` | `pb: 4` → `.pb-4` |
65
- | `pl` | `pl-<value>` | `pl: 4` → `.pl-4` |
66
- | `pr` | `pr-<value>` | `pr: 4` → `.pr-4` |
67
- | `pr` | `pr-<value>` | `pr: 4` → `.pr-4` |
68
- | `f` | `f-<value>` | `f: 4` → `.f-4` |
69
- | `color` | `color-<value>` | `color: :red_500` → `.color-red-500` |
70
- | `text` | `text-<value>` | `text: :green` → `.text-green` |
71
- | `bg` | `bg-<value>` | `bg: :blue_light` → `.bg-blue-light` |
72
- | `display` | `d-<value>` | `display: :none` → `.d-none` |
73
- | `float` | `float-<value>` | `float: :right` → `.float-right` |
74
- | `vertical_align` | `v-align-<value>` | `vertical_align: :baseline` → `.v-align-baseline` |
75
- | `text_align` | `text-<value>` | `text_align: :right` → `.text-right` |
76
- | `font_size` | `f<value>` | `font_size: 4` → `.f4` |
77
- | `font_weight` | `text-<value>` | `font_weight: :bold` → `.text-bold` |
78
- | `border` | `border-<value>` | `border: :bottom` → `.border-bottom` |
79
- | `border_color` | `border-<value>` | `border: :green` → `.border-green` |
80
- | `border_top` | `border-top-<value>` | `border_top: 0` → `.border-top-0` |
81
- | `border_bottom` | `border-bottom-<value>` | `border_bottom: 0` → `.border-bottom-0` |
82
- | `border_left` | `border-left-<value>` | `border_left: 0` → `.border-left-0` |
83
- | `border_right` | `border-right-<value>` | `border_right: 0` → `.border-right-0` |
84
- | `word_break` | `wb-<value>` | `word_break: :break_all` → `.wb-break-all` |
85
- | `direction` | `flex-<value>` | `direction: :row` → `.flex-row` |
86
- | `justify_content` | `flex-justify-<value>` | `justify_content: :center` → `.flex-justify-center` |
87
- | `align_items` | `flex-items-<value>` | `align_items: :baseline` → `.flex-items-baseline` |
88
- | `box_shadow` | `box-shadow-<value>` | `box_shadow: :medium` → `.box-shadow-medium` |
89
-
90
- #### Boolean arguments
91
-
92
- | Component arguments | True | False |
93
- | -------------- | ------- | ------ |
94
- | `underline` | `underline: true` → `.text-underline` | `underline: false` → `.no-underline` |
95
- | `top` | n/a | `top: false` → `.top-0` |
96
- | `bottom` | n/a | `bottom: false` → `.bottom-0` |
97
- | `left` | n/a | `left: false` → `.left-0` |
98
- | `right` | n/a | `right: false` → `.right-0` |
99
-
100
- #### Responsive arguments
101
-
102
- Different classes can be used for different breakpoints just like in Primer CSS. Simply use an array with the four values required for `[none, small, medium, large]`. If no breakpoint is needed for a breakpoint, pass `nil`.
103
-
104
- Example heading built with Primer CSS:
105
-
106
- ```html
107
- <h1 class="mt-0 mt-lg-4">Hello world</h1>
108
- ```
109
-
110
- The same label using `Primer::HeadingComponent`:
111
-
112
- ```erb
113
- <%= render Primer::HeadingComponent.new(mt: [0, nil, nil, 4]) do %>
114
- Hello world
115
- <% end %>
116
- ```
117
-
118
- ## Contributing
119
-
120
- Bug reports and pull requests are welcome on GitHub at [https://github.com/primer/view_components](https://github.com/primer/view_components). This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
121
-
122
- ### Setting up
123
-
124
- Run
125
-
126
- ```bash
127
- script/setup
128
- ```
129
-
130
- To install all necessary dependencies.
131
-
132
- ### Running tests
133
-
134
- To run the full test suite:
135
-
136
- ```bash
137
- bundle exec rake
138
- ```
139
-
140
- ### Writing documentation
141
-
142
- Documentation is written as [YARD](https://yardoc.org/) comments directly in the source code, compiled into Markdown via `rake docs:build` and served by [Doctocat](https://github.com/primer/doctocat).
143
-
144
- ### Storybook / Documentation
145
-
146
- To run Storybook and the documentation site, run:
147
-
148
- ```bash
149
- script/dev
150
- ```
151
-
152
- _Note: Overmind is required to run script/dev._
153
-
154
- ### Developing with another app
155
-
156
- In your `Gemfile`, change:
157
-
158
- ```ruby
159
- gem "primer_view_components"
160
- ```
161
-
162
- to
163
-
164
- ```ruby
165
- gem "primer_view_components", path: "path_to_the_gem" # e.g. path: "~/primer/view_components"
166
- ```
167
-
168
- Then, `bundle install` to update references. You'll now be able to see changes from the gem without having to build it.
169
- Remember that restarting the Rails server is necessary to see changes, as the gem is loaded at boot time.
170
-
171
- To minimize the number of restarts, we recommend checking the component in Storybook first, and then when it's in a good state,
172
- you can check it in your app.
173
-
174
- ### Documentation
175
-
176
- Document components with [YARD](https://yardoc.org/). Docs are published to [RubyDoc.info](https://rubydoc.info/github/primer/view_components).
177
-
178
- ## Deploying to Heroku
179
-
180
- We have both `staging` and `production` environments. To deploy Storybook to Heroku, run the following in `#primer-view-components-ops`:
181
-
182
- ```bash
183
- .deploy primer-view-components</branch> to <environment>
184
- ```
185
-
186
- If no `branch` is passed, `main` will be deployed.
11
+ Visit [https://view-components.primer.vercel.app/](https://view-components.primer.vercel.app/) to view documentation.
187
12
 
188
13
  ## License
189
14
 
@@ -56,7 +56,7 @@ module Primer
56
56
  # @param title [String] Text that appears in a larger bold font.
57
57
  # @param title_tag [Symbol] HTML tag to use for title.
58
58
  # @param icon [String] Octicon icon to use at top of component.
59
- # @param icon_size [Symbol] One of <%= Primer::OcticonComponent::SIZE_MAPPINGS.keys.map { |k| "`:#{k}`" }.to_sentence %>
59
+ # @param icon_size [Symbol] <%= one_of(Primer::OcticonComponent::SIZE_MAPPINGS.keys) %>
60
60
  # @param image_src [String] Image to display.
61
61
  # @param image_alt [String] Alt text for image.
62
62
  # @param description [String] Text that appears below the title. Typically a whole sentence.
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # BorderBox is a Box component with a border.
4
5
  class BorderBoxComponent < Primer::Component
5
6
  include ViewComponent::Slotable
6
7
 
@@ -9,6 +10,17 @@ module Primer
9
10
  with_slot :footer, class_name: "Footer"
10
11
  with_slot :row, collection: true, class_name: "Row"
11
12
 
13
+ # @example 350|Header, body, rows, and footer
14
+ # <%= render(Primer::BorderBoxComponent.new) do |component|
15
+ # component.slot(:header) { "Header" }
16
+ # component.slot(:body) { "Body" }
17
+ # component.slot(:row) { "Row one" }
18
+ # component.slot(:row) { "Row two" }
19
+ # component.slot(:row) { "Row three" }
20
+ # component.slot(:footer) { "Footer" }
21
+ # end %>
22
+ #
23
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
12
24
  def initialize(**kwargs)
13
25
  @kwargs = kwargs
14
26
  @kwargs[:tag] = :div
@@ -23,8 +35,8 @@ module Primer
23
35
  end
24
36
 
25
37
  class Header < Primer::Slot
26
-
27
38
  attr_reader :kwargs
39
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
28
40
  def initialize(**kwargs)
29
41
  @kwargs = kwargs
30
42
  @kwargs[:tag] = :div
@@ -36,8 +48,8 @@ module Primer
36
48
  end
37
49
 
38
50
  class Body < Primer::Slot
39
-
40
51
  attr_reader :kwargs
52
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
41
53
  def initialize(**kwargs)
42
54
  @kwargs = kwargs
43
55
  @kwargs[:tag] = :div
@@ -49,8 +61,8 @@ module Primer
49
61
  end
50
62
 
51
63
  class Footer < Primer::Slot
52
-
53
64
  attr_reader :kwargs
65
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
54
66
  def initialize(**kwargs)
55
67
  @kwargs = kwargs
56
68
  @kwargs[:tag] = :div
@@ -62,8 +74,8 @@ module Primer
62
74
  end
63
75
 
64
76
  class Row < Primer::Slot
65
-
66
77
  attr_reader :kwargs
78
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
67
79
  def initialize(**kwargs)
68
80
  @kwargs = kwargs
69
81
  @kwargs[:tag] = :li
@@ -1,7 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # A basic wrapper component for most layout related needs.
4
5
  class BoxComponent < Primer::Component
6
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
5
7
  def initialize(**kwargs)
6
8
  @kwargs = kwargs
7
9
  @kwargs[:tag] = :div
@@ -1,31 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- ##
4
- # Breadcrumbs are used to display page hierarchy within a section of the site. All of the items in the breadcrumb "trail" are links except for the final item which is a plain string indicating the current page.
5
- #
6
- # ## Example
7
- #
8
- # The `Primer::BreadcrumbComponent` uses the [Slots API](https://github.com/github/view_component#slots-experimental) and at least one slot is required for the component to render. Each slot can accept the following parameters:
9
- #
10
- # 1. `href` (string). The URL to link to.
11
- # 2. `selected` (boolean, default=false). Flag indicating whether or not the item is selected and not rendered as a link.
12
- #
13
- # Note that if if both `href` and `selected: true` are passed in, `href` will be ignored and the item will not be rendered as a link.
14
- #
15
- # ```ruby
16
- # <%= render(Primer::BreadcrumbComponent.new) do |component| %>
17
- # <% component.slot(:item, href: "/") do %>Home<% end %>
18
- # <% component.slot(:item, href: "/about") do %>About<% end %>
19
- # <% component.slot(:item, selected: true) do %>Team<% end %>
20
- # <% end %>
21
- # ```
22
- ##
23
3
  module Primer
4
+ # Use breadcrumbs to display page hierarchy within a section of the site. All of the items in the breadcrumb "trail" are links except for the final item, which is a plain string indicating the current page.
24
5
  class BreadcrumbComponent < Primer::Component
25
6
  include ViewComponent::Slotable
26
7
 
27
8
  with_slot :item, collection: true, class_name: "BreadcrumbItem"
28
9
 
10
+ # @example 40|Basic
11
+ # <%= render(Primer::BreadcrumbComponent.new) do |component| %>
12
+ # <% component.slot(:item, href: "/") do %>Home<% end %>
13
+ # <% component.slot(:item, href: "/about") do %>About<% end %>
14
+ # <% component.slot(:item, selected: true) do %>Team<% end %>
15
+ # <% end %>
16
+ #
17
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
29
18
  def initialize(**kwargs)
30
19
  @kwargs = kwargs
31
20
  @kwargs[:tag] = :nav
@@ -36,9 +25,13 @@ module Primer
36
25
  items.any?
37
26
  end
38
27
 
28
+ # _Note: if both `href` and `selected: true` are passed in, `href` will be ignored and the item will not be rendered as a link._
39
29
  class BreadcrumbItem < Primer::Slot
40
30
  attr_reader :href, :kwargs
41
31
 
32
+ # @param href [String] The URL to link to.
33
+ # @param selected [Boolean] Whether or not the item is selected and not rendered as a link.
34
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
42
35
  def initialize(href: nil, selected: false, **kwargs)
43
36
  @href, @kwargs = href, kwargs
44
37
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # Use buttons for actions (e.g. in forms). Use links for destinations, or moving from one page to another.
4
5
  class ButtonComponent < Primer::Component
5
6
  DEFAULT_BUTTON_TYPE = :default
6
7
  BUTTON_TYPE_MAPPINGS = {
@@ -25,6 +26,22 @@ module Primer
25
26
  DEFAULT_TYPE = :button
26
27
  TYPE_OPTIONS = [DEFAULT_TYPE, :reset, :submit].freeze
27
28
 
29
+ # @example 50|Button types
30
+ # <%= render(Primer::ButtonComponent.new) { "Default" } %>
31
+ # <%= render(Primer::ButtonComponent.new(button_type: :primary)) { "Primary" } %>
32
+ # <%= render(Primer::ButtonComponent.new(button_type: :danger)) { "Danger" } %>
33
+ # <%= render(Primer::ButtonComponent.new(button_type: :outline)) { "Outline" } %>
34
+ #
35
+ # @example 50|Variants
36
+ # <%= render(Primer::ButtonComponent.new(variant: :small)) { "Small" } %>
37
+ # <%= render(Primer::ButtonComponent.new(variant: :medium)) { "Medium" } %>
38
+ # <%= render(Primer::ButtonComponent.new(variant: :large)) { "Large" } %>
39
+ #
40
+ # @param button_type [Symbol] <%= one_of(Primer::ButtonComponent::BUTTON_TYPE_OPTIONS) %>
41
+ # @param variant [Symbol] <%= one_of(Primer::ButtonComponent::VARIANT_OPTIONS) %>
42
+ # @param tag [Symbol] <%= one_of(Primer::ButtonComponent::TAG_OPTIONS) %>
43
+ # @param type [Symbol] <%= one_of(Primer::ButtonComponent::TYPE_OPTIONS) %>
44
+ # @param group_item [Boolean] Whether button is part of a ButtonGroup.
28
45
  def initialize(
29
46
  button_type: DEFAULT_BUTTON_TYPE,
30
47
  variant: DEFAULT_VARIANT,
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # @private
4
5
  class Component < ViewComponent::Base
5
6
  include ClassNameHelper
6
7
  include FetchOrFallbackHelper
@@ -9,9 +9,9 @@ module Primer
9
9
  class DetailsComponent < Primer::Component
10
10
  include ViewComponent::Slotable
11
11
 
12
- OVERLAY_DEFAULT = :none
12
+ NO_OVERLAY = :none
13
13
  OVERLAY_MAPPINGS = {
14
- OVERLAY_DEFAULT => "",
14
+ NO_OVERLAY => "",
15
15
  :default => "details-overlay",
16
16
  :dark => "details-overlay details-overlay-dark",
17
17
  }.freeze
@@ -19,12 +19,12 @@ module Primer
19
19
  with_slot :body, class_name: "Body"
20
20
  with_slot :summary, class_name: "Summary"
21
21
 
22
- def initialize(overlay: OVERLAY_DEFAULT, reset: false, **kwargs)
22
+ def initialize(overlay: NO_OVERLAY, reset: false, **kwargs)
23
23
  @kwargs = kwargs
24
24
  @kwargs[:tag] = :details
25
25
  @kwargs[:classes] = class_names(
26
26
  kwargs[:classes],
27
- OVERLAY_MAPPINGS[fetch_or_fallback(OVERLAY_MAPPINGS.keys, overlay, OVERLAY_DEFAULT)],
27
+ OVERLAY_MAPPINGS[fetch_or_fallback(OVERLAY_MAPPINGS.keys, overlay, NO_OVERLAY)],
28
28
  "details-reset" => reset
29
29
  )
30
30
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # Use the Flash component to inform users of successful or pending actions.
4
5
  class FlashComponent < Primer::Component
5
6
  include ViewComponent::Slotable
6
7
 
@@ -13,7 +14,35 @@ module Primer
13
14
  :danger => "flash-error",
14
15
  :success => "flash-success"
15
16
  }.freeze
16
-
17
+ # @example 280|Variants
18
+ # <%= render(Primer::FlashComponent.new) { "This is a flash message!" } %>
19
+ # <%= render(Primer::FlashComponent.new(variant: :warning)) { "This is a warning flash message!" } %>
20
+ # <%= render(Primer::FlashComponent.new(variant: :danger)) { "This is a danger flash message!" } %>
21
+ # <%= render(Primer::FlashComponent.new(variant: :success)) { "This is a success flash message!" } %>
22
+ #
23
+ # @example 80|Full width
24
+ # <%= render(Primer::FlashComponent.new(full: true)) { "This is a full width flash message!" } %>
25
+ #
26
+ # @example 80|Dismissible
27
+ # <%= render(Primer::FlashComponent.new(dismissible: true)) { "This is a dismissible flash message!" } %>
28
+ #
29
+ # @example 80|Icon
30
+ # <%= render(Primer::FlashComponent.new(icon: "people")) { "This is a flash message with an icon!" } %>
31
+ #
32
+ # @example 80|With actions
33
+ # <%= render(Primer::FlashComponent.new) do |component| %>
34
+ # This is a flash message with actions!
35
+ # <% component.slot(:actions) do %>
36
+ # <%= render(Primer::ButtonComponent.new(variant: :small)) { "Take action" } %>
37
+ # <% end %>
38
+ # <% end %>
39
+ #
40
+ # @param full [Boolean] Whether the component should take up the full width of the screen.
41
+ # @param spacious [Boolean] Whether to add margin to the bottom of the component.
42
+ # @param dismissible [Boolean] Whether the component can be dismissed with an X button.
43
+ # @param icon [String] Name of Octicon icon to use.
44
+ # @param variant [Symbol] <%= one_of(Primer::FlashComponent::VARIANT_MAPPINGS.keys) %>
45
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
17
46
  def initialize(full: false, spacious: false, dismissible: false, icon: nil, variant: DEFAULT_VARIANT, **kwargs)
18
47
  @icon = icon
19
48
  @dismissible = dismissible
@@ -33,6 +62,7 @@ module Primer
33
62
 
34
63
  attr_reader :kwargs
35
64
 
65
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
36
66
  def initialize(**kwargs)
37
67
  @kwargs = kwargs
38
68
  @kwargs[:tag] = :div
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # Use labels to add contextual metadata to a design.
4
5
  class LabelComponent < Primer::Component
5
6
  SCHEME_MAPPINGS = {
6
7
  # gray
@@ -28,6 +29,22 @@ module Primer
28
29
  }.freeze
29
30
  VARIANT_OPTIONS = VARIANT_MAPPINGS.keys << nil
30
31
 
32
+ # @example 40|Schemes
33
+ # <%= render(Primer::LabelComponent.new(title: "Label: Label")) { "default" } %>
34
+ # <%= render(Primer::LabelComponent.new(title: "Label: Label", scheme: :gray)) { "gray" } %>
35
+ # <%= render(Primer::LabelComponent.new(title: "Label: Label", scheme: :dark_gray)) { "dark_gray" } %>
36
+ # <%= render(Primer::LabelComponent.new(title: "Label: Label", scheme: :yellow)) { "yellow" } %>
37
+ # <%= render(Primer::LabelComponent.new(title: "Label: Label", scheme: :green)) { "green" } %>
38
+ # <%= render(Primer::LabelComponent.new(title: "Label: Label", scheme: :purple)) { "purple" } %>
39
+ #
40
+ # @example 40|Variants
41
+ # <%= render(Primer::LabelComponent.new(title: "Label: Label")) { "Default" } %>
42
+ # <%= render(Primer::LabelComponent.new(title: "Label: Label", variant: :large)) { "Large" } %>
43
+ #
44
+ # @param title [String] `title` attribute for the component element.
45
+ # @param scheme [Symbol] <%= one_of(Primer::LabelComponent::SCHEME_OPTIONS) %>
46
+ # @param variant [Symbol] <%= one_of(Primer::LabelComponent::VARIANT_OPTIONS) %>
47
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
31
48
  def initialize(title:, scheme: nil, variant: nil, **kwargs)
32
49
  @kwargs = kwargs
33
50
  @kwargs[:bg] = :blue if scheme.nil?
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # Use Layout to build a main/sidebar layout.
4
5
  class LayoutComponent < Primer::Component
5
6
  with_content_areas :main, :sidebar
6
7
 
@@ -11,6 +12,22 @@ module Primer
11
12
  DEFAULT_SIDEBAR_COL = 3
12
13
  ALLOWED_SIDEBAR_COLS = (1..(MAX_COL - 1)).to_a.freeze
13
14
 
15
+ # @example 40|Default
16
+ # <%= render(Primer::LayoutComponent.new) do |component| %>
17
+ # <% component.with(:sidebar) { "Sidebar" } %>
18
+ # <% component.with(:main) { "Main" } %>
19
+ # <% end %>
20
+ #
21
+ # @example 40|Left sidebar
22
+ # <%= render(Primer::LayoutComponent.new(side: :left)) do |component| %>
23
+ # <% component.with(:sidebar) { "Sidebar" } %>
24
+ # <% component.with(:main) { "Main" } %>
25
+ # <% end %>
26
+ #
27
+ # @param responsive [Boolean] Whether to collapse layout to a single column at smaller widths.
28
+ # @param side [Symbol] Which side to display the sidebar on. <%= one_of(Primer::LayoutComponent::ALLOWED_SIDES) %>
29
+ # @param sidebar_col [Integer] Sidebar column width.
30
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
14
31
  def initialize(responsive: false, side: DEFAULT_SIDE, sidebar_col: DEFAULT_SIDEBAR_COL, **kwargs)
15
32
  @kwargs = kwargs
16
33
  @side = fetch_or_fallback(ALLOWED_SIDES, side, DEFAULT_SIDE)
@@ -1,7 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # Use links for moving from one page to another. The Link component styles anchor tags with default blue styling and hover text-decoration.
4
5
  class LinkComponent < Primer::Component
6
+ # @example 40|Default
7
+ # <%= render(Primer::LinkComponent.new(href: "http://www.google.com")) { "Link" } %>
8
+ #
9
+ # @example 40|Muted
10
+ # <%= render(Primer::LinkComponent.new(href: "http://www.google.com", muted: true)) { "Link" } %>
11
+ #
12
+ # @param href [String] URL to be used for the Link
13
+ # @param muted [Boolean] Uses light gray for Link color, and blue on hover
14
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
5
15
  def initialize(href:, muted: false, **kwargs)
6
16
  @kwargs = kwargs
7
17
  @kwargs[:tag] = :a
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # Renders an [Octicon](https://primer.style/octicons/) with <%= link_to_style_arguments_docs %>.
4
5
  class OcticonComponent < Primer::Component
5
6
  include Primer::ClassNameHelper
6
7
  include OcticonsHelper
@@ -13,6 +14,18 @@ module Primer
13
14
  }.freeze
14
15
  SIZE_OPTIONS = SIZE_MAPPINGS.keys
15
16
 
17
+ # @example 25|Default
18
+ # <%= render(Primer::OcticonComponent.new(icon: "check")) %>
19
+ #
20
+ # @example 40|Medium
21
+ # <%= render(Primer::OcticonComponent.new(icon: "people", size: :medium)) %>
22
+ #
23
+ # @example 80|Large
24
+ # <%= render(Primer::OcticonComponent.new(icon: "x", size: :large)) %>
25
+ #
26
+ # @param icon [String] Name of [Octicon](https://primer.style/octicons/) to use.
27
+ # @param size [Symbol] <%= one_of(Primer::OcticonComponent::SIZE_OPTIONS) %>
28
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
16
29
  def initialize(icon:, size: SIZE_DEFAULT, **kwargs)
17
30
  @icon, @kwargs = icon, kwargs
18
31
 
@@ -1,12 +1,46 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # Use popovers to bring attention to specific user interface elements, typically to suggest an action or to guide users through a new experience.
5
+ #
6
+ # By default, the popover renders with absolute positioning, meaning it should usually be wrapped in an element with a relative position in order to be positioned properly. To render the popover with relative positioning, use the relative property.
4
7
  class PopoverComponent < Primer::Component
5
8
  include ViewComponent::Slotable
6
9
 
7
10
  with_slot :heading, class_name: "Heading"
8
11
  with_slot :body, class_name: "Body"
9
12
 
13
+ # @example 150|Default
14
+ # <%= render Primer::PopoverComponent.new do |component| %>
15
+ # <% component.slot(:heading) do %>
16
+ # Activity feed
17
+ # <% end %>
18
+ # <% component.slot(:body) do %>
19
+ # This is the Popover body.
20
+ # <% end %>
21
+ # <% end %>
22
+ #
23
+ # @example 150|Large
24
+ # <%= render Primer::PopoverComponent.new do |component| %>
25
+ # <% component.slot(:heading) do %>
26
+ # Activity feed
27
+ # <% end %>
28
+ # <% component.slot(:body, large: true) do %>
29
+ # This is the large Popover body.
30
+ # <% end %>
31
+ # <% end %>
32
+ #
33
+ # @example 150|Caret position
34
+ # <%= render Primer::PopoverComponent.new do |component| %>
35
+ # <% component.slot(:heading) do %>
36
+ # Activity feed
37
+ # <% end %>
38
+ # <% component.slot(:body, caret: :left) do %>
39
+ # This is the large Popover body.
40
+ # <% end %>
41
+ # <% end %>
42
+ #
43
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
10
44
  def initialize(**kwargs)
11
45
  @kwargs = kwargs
12
46
  @kwargs[:tag] ||= :div
@@ -24,6 +58,7 @@ module Primer
24
58
  end
25
59
 
26
60
  class Heading < ViewComponent::Slot
61
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
27
62
  def initialize(**kwargs)
28
63
  @kwargs = kwargs
29
64
  @kwargs[:mb] ||= 2
@@ -52,6 +87,9 @@ module Primer
52
87
  :top_right => "Popover-message--top-right"
53
88
  }.freeze
54
89
 
90
+ # @param caret [Symbol] <%= one_of(Primer::PopoverComponent::Body::CARET_MAPPINGS.keys) %>
91
+ # @param large [Boolean] Whether to use the large version of the component.
92
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
55
93
  def initialize(caret: CARET_DEFAULT, large: false, **kwargs)
56
94
  @kwargs = kwargs
57
95
  @kwargs[:classes] = class_names(
@@ -1,23 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- ##
4
- # Use progress components to visualize task completion.
5
-
6
- ## Basic example
7
- #
8
- # The `Primer::ProgressBarComponent` can take the following arguments:
9
- #
10
- # 1. `size` (string). Can be "small" or "large". Increases the height of the progress bar.
11
- #
12
- # The `Primer::ProgressBarComponent` uses the [Slots API](https://github.com/github/view_component#slots-experimental) and at least one slot is required for the component to render. Each slot accepts a `percentage` parameter, which is used to set the width of the completed bar.
13
- #
14
- # ```ruby
15
- # <%= render(Primer::ProgressBarComponent.new(size: :small)) do |component| %>
16
- # <% component.slot(:item, bg: :blue-4, percentage: 50) %>
17
- # <% end %>
18
- # ```
19
- ##
20
3
  module Primer
4
+ # Use ProgressBar to visualize task completion.
21
5
  class ProgressBarComponent < Primer::Component
22
6
  include ViewComponent::Slotable
23
7
 
@@ -32,8 +16,31 @@ module Primer
32
16
  }.freeze
33
17
 
34
18
  SIZE_OPTIONS = SIZE_MAPPINGS.keys
35
-
36
- def initialize(size: SIZE_DEFAULT, percentage: 0, **kwargs)
19
+ # @example 20|Default
20
+ # <%= render(Primer::ProgressBarComponent.new) do |component| %>
21
+ # <% component.slot(:item, percentage: 25) %>
22
+ # <% end %>
23
+ #
24
+ # @example 20|Small
25
+ # <%= render(Primer::ProgressBarComponent.new(size: :small)) do |component| %>
26
+ # <% component.slot(:item, bg: :blue_4, percentage: 50) %>
27
+ # <% end %>
28
+ #
29
+ # @example 30|Large
30
+ # <%= render(Primer::ProgressBarComponent.new(size: :large)) do |component| %>
31
+ # <% component.slot(:item, bg: :red_4, percentage: 75) %>
32
+ # <% end %>
33
+ #
34
+ # @example 20|Multiple items
35
+ # <%= render(Primer::ProgressBarComponent.new) do |component| %>
36
+ # <% component.slot(:item, percentage: 10) %>
37
+ # <% component.slot(:item, bg: :blue_4, percentage: 20) %>
38
+ # <% component.slot(:item, bg: :red_4, percentage: 30) %>
39
+ # <% end %>
40
+ #
41
+ # @param size [Symbol] <%= one_of(Primer::ProgressBarComponent::SIZE_OPTIONS) %> Increases height.
42
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
43
+ def initialize(size: SIZE_DEFAULT, **kwargs)
37
44
  @kwargs = kwargs
38
45
  @kwargs[:classes] = class_names(
39
46
  @kwargs[:classes],
@@ -52,6 +59,9 @@ module Primer
52
59
  include ClassNameHelper
53
60
  attr_reader :kwargs
54
61
 
62
+ # @param percentage [Integer] Percentage completion of item.
63
+ # @param bg [Symbol] Color of item.
64
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
55
65
  def initialize(percentage: 0, bg: :green, **kwargs)
56
66
  @percentage = percentage
57
67
  @kwargs = kwargs
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # @private
4
5
  class Slot < ViewComponent::Slot
5
6
  include ClassNameHelper
6
7
  include FetchOrFallbackHelper
@@ -22,7 +22,7 @@ module Primer
22
22
  # @example 80|Large
23
23
  # <%= render(Primer::SpinnerComponent.new(size: :large)) %>
24
24
  #
25
- # @param size [Symbol] One of <%= Primer::SpinnerComponent::SIZE_OPTIONS.map { |k| "`:#{k}`" }.to_sentence(last_word_connector: ', or ') %>
25
+ # @param size [Symbol] <%= one_of(Primer::SpinnerComponent::SIZE_OPTIONS) %>
26
26
  def initialize(size: DEFAULT_SIZE, **kwargs)
27
27
  @kwargs = kwargs
28
28
  @kwargs[:tag] = :svg
@@ -1,14 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # Component for rendering the status of an item.
4
5
  class StateComponent < Primer::Component
5
- # Component for rendering the status of an item
6
- #
7
- # title(string): (required) title attribute
8
- # color(symbol): label background color
9
- # size(symbol): label size
10
- # counter(integer): counter value
11
- # **args(hash): utility parameters for Primer::Classify
12
6
  COLOR_DEFAULT = :default
13
7
  COLOR_MAPPINGS = {
14
8
  COLOR_DEFAULT => "",
@@ -28,6 +22,24 @@ module Primer
28
22
  TAG_DEFAULT = :span
29
23
  TAG_OPTIONS = [TAG_DEFAULT, :div, :a]
30
24
 
25
+ # @example 40|Default
26
+ # <%= render(Primer::StateComponent.new(title: "title")) { "State" } %>
27
+ #
28
+ # @example 40|Colors
29
+ # <%= render(Primer::StateComponent.new(title: "title")) { "Default" } %>
30
+ # <%= render(Primer::StateComponent.new(title: "title", color: :green)) { "Green" } %>
31
+ # <%= render(Primer::StateComponent.new(title: "title", color: :red)) { "Red" } %>
32
+ # <%= render(Primer::StateComponent.new(title: "title", color: :purple)) { "Purple" } %>
33
+ #
34
+ # @example 40|Sizes
35
+ # <%= render(Primer::StateComponent.new(title: "title")) { "Default" } %>
36
+ # <%= render(Primer::StateComponent.new(title: "title", size: :small)) { "Small" } %>
37
+ #
38
+ # @param title [String] `title` HTML attribute.
39
+ # @param color [Symbol] Background color. <%= one_of(Primer::StateComponent::COLOR_OPTIONS) %>
40
+ # @param tag [Symbol] HTML tag for element. <%= one_of(Primer::StateComponent::TAG_OPTIONS) %>
41
+ # @param size [Symbol] <%= one_of(Primer::StateComponent::SIZE_OPTIONS) %>
42
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
31
43
  def initialize(
32
44
  title:,
33
45
  color: COLOR_DEFAULT,
@@ -1,26 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # This component consists of a .Subhead container, which has a light gray bottom border.
4
-
5
- # Use a heading element whenever possible as they can be
6
- # used as navigation for assistive technologies, and avoid skipping levels.
7
-
8
- # ## Basic example
9
-
10
- # The `Primer::SubheadComponent` can take the following arguments:
11
-
12
- # 1. `heading` (string). The heading to be rendered.
13
- # 2. `actions` (content). Slot to render any actions to the right of heading.
14
- # 3. `description` (string). Slot to render description under the heading.
15
-
16
- # ```erb
17
- # <%= Primer::SubheadComponent.new(heading: "Hello world")) do |component| %>
18
- # <% component.slot(:actions) do %>
19
- # My Actions
20
- # <% end %>
21
- # <% end %>
22
- # ```
23
3
  module Primer
4
+ # Use the Subhead component for page headings.
24
5
  class SubheadComponent < Primer::Component
25
6
  include ViewComponent::Slotable
26
7
 
@@ -28,6 +9,46 @@ module Primer
28
9
  with_slot :actions, class_name: "Actions"
29
10
  with_slot :description, class_name: "Description"
30
11
 
12
+ # @example 95|Default
13
+ # <%= render(Primer::SubheadComponent.new) do |component| %>
14
+ # <% component.slot(:heading) do %>
15
+ # My Heading
16
+ # <% end %>
17
+ # <% component.slot(:description) do %>
18
+ # My Description
19
+ # <% end %>
20
+ # <% end %>
21
+ #
22
+ # @example 95|Without border
23
+ # <%= render(Primer::SubheadComponent.new(hide_border: true)) do |component| %>
24
+ # <% component.slot(:heading) do %>
25
+ # My Heading
26
+ # <% end %>
27
+ # <% component.slot(:description) do %>
28
+ # My Description
29
+ # <% end %>
30
+ # <% end %>
31
+ #
32
+ # @example 95|With actions
33
+ # <%= render(Primer::SubheadComponent.new) do |component| %>
34
+ # <% component.slot(:heading) do %>
35
+ # My Heading
36
+ # <% end %>
37
+ # <% component.slot(:description) do %>
38
+ # My Description
39
+ # <% end %>
40
+ # <% component.slot(:actions) do %>
41
+ # <%= render(
42
+ # Primer::ButtonComponent.new(
43
+ # tag: :a, href: "http://www.google.com", button_type: :danger
44
+ # )
45
+ # ) { "Action" } %>
46
+ # <% end %>
47
+ # <% end %>
48
+ #
49
+ # @param spacious [Boolean] Whether to add spacing to the Subhead.
50
+ # @param hide_border [Boolean] Whether to hide the border under the heading.
51
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
31
52
  def initialize(spacious: false, hide_border: false, **kwargs)
32
53
  @kwargs = kwargs
33
54
 
@@ -51,6 +72,8 @@ module Primer
51
72
 
52
73
  attr_reader :kwargs
53
74
 
75
+ # @param danger [Boolean] Whether to style the heading as dangerous.
76
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
54
77
  def initialize(danger: false, **kwargs)
55
78
  @kwargs = kwargs
56
79
  @kwargs[:tag] ||= :div
@@ -67,6 +90,7 @@ module Primer
67
90
 
68
91
  attr_reader :kwargs
69
92
 
93
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
70
94
  def initialize(**kwargs)
71
95
  @kwargs = kwargs
72
96
  @kwargs[:tag] = :div
@@ -79,6 +103,7 @@ module Primer
79
103
 
80
104
  attr_reader :kwargs
81
105
 
106
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
82
107
  def initialize(**kwargs)
83
108
  @kwargs = kwargs
84
109
  @kwargs[:tag] = :div
@@ -1,7 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # The Text component is a wrapper component that will apply typography styles to the text inside.
4
5
  class TextComponent < Primer::Component
6
+ # @example 70|Default
7
+ # <%= render(Primer::TextComponent.new(tag: :p, font_weight: :bold)) { "Bold Text" } %>
8
+ # <%= render(Primer::TextComponent.new(tag: :p, color: :red_5)) { "Red Text" } %>
9
+ #
10
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
5
11
  def initialize(**kwargs)
6
12
  @kwargs = kwargs
7
13
  @kwargs[:tag] ||= :span
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Primer
4
+ # Use `TimelineItem` to display items on a vertical timeline, connected by badge elements.
4
5
  class TimelineItemComponent < Primer::Component
5
6
  include ViewComponent::Slotable
6
7
 
@@ -9,6 +10,18 @@ module Primer
9
10
  with_slot :body, class_name: "Body"
10
11
 
11
12
  attr_reader :kwargs
13
+
14
+ # @example 75|Default
15
+ # <div style="padding-left: 60px">
16
+ # <%= render(Primer::TimelineItemComponent.new) do |component| %>
17
+ # <% component.slot(:avatar, src: "https://github.com/github.png", alt: "github") %>
18
+ # <% component.slot(:badge, bg: :green, color: :white, icon: :check) %>
19
+ # <% component.slot(:body) { "Success!" } %>
20
+ # <% end %>
21
+ # </div>
22
+ #
23
+ # @param condensed [Boolean] Reduce the vertical padding and remove the background from the badge item. Most commonly used in commits.
24
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
12
25
  def initialize(condensed: false, **kwargs)
13
26
  @kwargs = kwargs
14
27
  @kwargs[:tag] = :div
@@ -25,6 +38,12 @@ module Primer
25
38
 
26
39
  class Avatar < Primer::Slot
27
40
  attr_reader :kwargs, :alt, :src, :size, :square
41
+
42
+ # @param alt [String] Alt text for avatar image.
43
+ # @param src [String] Src attribute for avatar image.
44
+ # @param size [Integer] Image size.
45
+ # @param square [Boolean] Whether to round the edges of the image.
46
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
28
47
  def initialize(alt: nil, src: nil, size: 40, square: true, **kwargs)
29
48
  @alt = alt
30
49
  @src = src
@@ -42,6 +61,9 @@ module Primer
42
61
 
43
62
  class Badge < Primer::Slot
44
63
  attr_reader :kwargs, :icon
64
+
65
+ # @param icon [String] Name of [Octicon](https://primer.style/octicons/) to use.
66
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
45
67
  def initialize(icon: nil, **kwargs)
46
68
  @icon = icon
47
69
 
@@ -56,6 +78,8 @@ module Primer
56
78
 
57
79
  class Body < Primer::Slot
58
80
  attr_reader :kwargs
81
+
82
+ # @param kwargs [Hash] <%= link_to_style_arguments_docs %>
59
83
  def initialize(**kwargs)
60
84
  @kwargs = kwargs
61
85
  @kwargs[:tag] = :div
@@ -5,7 +5,7 @@ module Primer
5
5
  module VERSION
6
6
  MAJOR = 0
7
7
  MINOR = 0
8
- PATCH = 10
8
+ PATCH = 11
9
9
 
10
10
  STRING = [MAJOR, MINOR, PATCH].join(".")
11
11
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: primer_view_components
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitHub Open Source
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-19 00:00:00.000000000 Z
11
+ date: 2020-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -182,7 +182,7 @@ dependencies:
182
182
  - - "~>"
183
183
  - !ruby/object:Gem::Version
184
184
  version: 0.9.25
185
- description:
185
+ description:
186
186
  email:
187
187
  - opensource+primer_view_components@github.com
188
188
  executables: []
@@ -245,7 +245,7 @@ licenses:
245
245
  - MIT
246
246
  metadata:
247
247
  allowed_push_host: https://rubygems.org
248
- post_install_message:
248
+ post_install_message:
249
249
  rdoc_options: []
250
250
  require_paths:
251
251
  - lib
@@ -260,8 +260,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
260
260
  - !ruby/object:Gem::Version
261
261
  version: '0'
262
262
  requirements: []
263
- rubygems_version: 3.0.3
264
- signing_key:
263
+ rubygems_version: 3.1.2
264
+ signing_key:
265
265
  specification_version: 4
266
266
  summary: ViewComponents for the Primer Design System
267
267
  test_files: []