playbook_ui 14.0.0.pre.alpha.PBNTR415starratingform3493 → 14.0.0.pre.alpha.PBNTR416formpillsizes3506

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e48c673fcdd7852fd5977b8ce17d71c523ca69e9dcadec1d3180b966b59ce47c
4
- data.tar.gz: c8074c07413cea2276de3d024279dc1094265934ddb4988831060d76e45b5114
3
+ metadata.gz: fb1f8b144b843e80a273836c1ca36bbeaf0805087e03977c4e2db65b180b75e9
4
+ data.tar.gz: c9fdf3e9bc64cb4ec72a048aabc43d05d17b2356e7637ee67dfe292dd25e5f0c
5
5
  SHA512:
6
- metadata.gz: 3fd337fe00dc873d100fa544b1b0343d17aaadd361831a2de2923a06c36066760947c21af97b449ee4dc488e1e504e18a91549c2c2c3e80f431359710b2dbe8e
7
- data.tar.gz: 2b7574bf9f460929281b5107c28a833411bd16d0f886a9060d1faf16cdc257de9ee227a4d7a25e11021d7e50ee25603c68e10a3881daeba1319338af9c08e86c
6
+ metadata.gz: efdf11b236ee0a90af8bae6c2bca5a3057841804746ffac6e76e6e3c939ebae392c4c352fd927e1b3b463f4a95d40bce997bf82b81ff823c296ba98aef013356
7
+ data.tar.gz: d65038299477dfa06796130b8a116578bc5ffff990a219a91dd223b8d0af4592e307a34192dd2f6b91c9b976f5703b13cabc12e6240ec02e33055b25a338c5c4
@@ -35,7 +35,6 @@
35
35
  <%= form.collection_select :example_collection_select, example_collection, :value, :name, props: { label: true, blank_selection: "Select One...", required: true } %>
36
36
  <%= form.check_box :example_checkbox, props: { text: "Example Checkbox", label: true, required: true } %>
37
37
  <%= form.date_picker :example_date_picker_2, props: { label: true, required: true } %>
38
- <%= form.star_rating_field :example_star_rating, props: { variant: "interactive", label: true, required: true } %>
39
38
 
40
39
  <%= form.actions do |action| %>
41
40
  <%= action.submit %>
@@ -3,9 +3,10 @@
3
3
  @import "../tokens/opacity";
4
4
  @import "../tokens/shadows";
5
5
  @import "../pb_avatar/avatar";
6
+ @import "../tokens/typography";
6
7
 
7
8
  $selector: ".pb_form_pill";
8
- $pb_form_pill_height: 37px;
9
+ $pb_form_pill_height: 27px;
9
10
  $form_pill_colors: (
10
11
  primary: map-get($status_color_text, "primary"),
11
12
  neutral: map-get($status_color_text, "neutral"),
@@ -16,18 +17,24 @@ $form_pill_colors: (
16
17
  display: inline-flex;
17
18
  justify-content: center;
18
19
  align-items: center;
19
- padding: 0 calc($space-sm/3);
20
+ padding: 0 calc($space-md/2);
20
21
  height: $pb_form_pill_height;
21
22
  border-radius: calc($pb_form_pill_height/2);
22
23
  margin-bottom: 2px;
23
24
  margin-top: 2px;
24
25
  cursor: pointer;
26
+ .pb_form_pill_text, .pb_form_pill_close, .pb_form_pill_tag{
27
+ font-size: $font_small !important;
28
+ }
25
29
  @each $color_name, $color_value in $form_pill_colors {
26
30
  &[class*=_#{$color_name}] {
27
31
  background-color: mix($color_value, $card_light, 10%);
28
32
  @if ($color_name == "neutral") {
29
33
  background-color: $white;
30
34
  border: 1px solid $border_light;
35
+ .pb_form_pill_icon {
36
+ color: $text_lt_default;
37
+ }
31
38
  }
32
39
  transition: background-color 0.2s ease;
33
40
  box-shadow: none;
@@ -51,20 +58,18 @@ $form_pill_colors: (
51
58
  @if ($color_name == "neutral") {
52
59
  color: $text_lt_default;
53
60
  }
54
- padding-left: $space-sm;
55
- padding-right: calc($space-sm/2);
61
+ padding: 0 $space-xs;
56
62
  }
57
63
  #{$selector}_close {
58
64
  color: $color_value;
59
- padding-left: calc($space-sm/4);
60
- padding-right: calc($space-sm/4);
61
65
  display: flex;
62
66
  align-items: center;
63
- // I had to temporarily change height to 27px so new hover state darker background forms a circle not an oval
64
- // before size change (ticket 2 of 4) - change back to 100% when $pb_form_pill_height changed to 27px from 37px
65
- height: 27px;
66
- border-radius: 70px;
67
+ height: 17px;
68
+ border-radius: calc(50%);
67
69
  cursor: pointer;
70
+ @if ($color_name == "neutral") {
71
+ color: $text_lt_default;
72
+ }
68
73
  &:hover {
69
74
  background-color: mix($color_value, $card_light, 40%);
70
75
  @if ($color_name == "neutral") {
@@ -74,7 +79,7 @@ $form_pill_colors: (
74
79
  }
75
80
  #{$selector}_tag {
76
81
  color: $color_value;
77
- padding-left: $space-sm;
82
+ padding: 0 $space-xs;
78
83
  @if ($color_name == "neutral") {
79
84
  color: $text_lt_default;
80
85
  }
@@ -92,24 +97,37 @@ $form_pill_colors: (
92
97
  .pb_form_pill_icon {
93
98
  height: 12px !important;
94
99
  width: 12px !important;
100
+ padding-right: $space_xs;
101
+ + .pb_form_pill_text, + .pb_form_pill_tag {
102
+ padding-left: 0;
103
+ }
95
104
  }
96
105
  &.small {
97
- height: fit-content;
98
- height: -moz-fit-content;
106
+ height: 17px;
107
+ padding: 0 $space-xs;
99
108
  .pb_form_pill_text, .pb_form_pill_close, .pb_form_pill_tag {
100
- font-size: $font_base;
101
- font-weight: $regular;
109
+ font-size: $font_smallest !important;
102
110
  }
103
111
  .pb_form_pill_text, .pb_form_pill_tag {
104
112
  line-height: 1.7;
105
- padding-left: $space_xs;
106
- padding-right: 2px;
113
+ padding: 0 $space_xxs;
114
+ }
115
+ .pb_form_pill_close {
116
+ height: 10px;
117
+ border-radius: calc(50%);
107
118
  }
108
- [class^=pb_avatar_kit], [class^=pb_avatar_kit] .avatar_wrapper {
109
- width: 20px;
110
- height: 20px;
111
- flex-basis: 20px;
112
- &::before { line-height: 21px; }
119
+ [class^=pb_avatar_kit] .avatar_wrapper {
120
+ flex-basis: 16px;
121
+ height: 16px;
122
+ margin-top: 2px;
123
+ width: 16px;
124
+ &::before { line-height: 16.5px; }
125
+ }
126
+ .pb_form_pill_icon {
127
+ padding-right: $space_xxs;
128
+ + .pb_form_pill_text, + .pb_form_pill_tag {
129
+ padding-left: 0;
130
+ }
113
131
  }
114
132
  }
115
133
  &.dark {
@@ -118,7 +136,7 @@ $form_pill_colors: (
118
136
  // Primary and Neutral are exceptions to the general rule in the handoff
119
137
  &[class*=_#{$color_name}] {
120
138
  // background-color: mix($color_value, $card_dark, 10%);
121
- // .pb_form_pill_tag {
139
+ // .pb_form_pill_text, .pb_form_pill_tag, .pb_form_pill_icon {
122
140
  // color: $color_name;
123
141
  // }
124
142
  // .pb_form_pill_close {
@@ -136,7 +154,7 @@ $form_pill_colors: (
136
154
  @if ($color_name == "neutral") {
137
155
  background-color: transparent;
138
156
  border: 1px solid $border_dark;
139
- .pb_form_pill_text, .pb_form_pill_tag {
157
+ .pb_form_pill_text, .pb_form_pill_tag, .pb_form_pill_icon {
140
158
  color: $text_dk_default;
141
159
  }
142
160
  .pb_form_pill_close {
@@ -157,7 +175,7 @@ $form_pill_colors: (
157
175
  }
158
176
  @if ($color_name == "primary") {
159
177
  background-color: mix($active_dark, $card_dark, 10%);
160
- .pb_form_pill_text, .pb_form_pill_tag {
178
+ .pb_form_pill_text, .pb_form_pill_tag, .pb_form_pill_icon {
161
179
  color: $active_dark;
162
180
  }
163
181
  .pb_form_pill_close {
@@ -46,6 +46,7 @@ const FormPill = (props: FormPillProps): React.ReactElement => {
46
46
  } = props
47
47
 
48
48
  const iconClass = icon ? "_icon" : ""
49
+ const closeIconSize = size === "small" ? "xs" : "sm"
49
50
  const css = classnames(
50
51
  `pb_form_pill_kit_${color}${iconClass}`,
51
52
  globalProps(props),
@@ -69,7 +70,7 @@ const FormPill = (props: FormPillProps): React.ReactElement => {
69
70
  <Avatar
70
71
  imageUrl={avatarUrl}
71
72
  name={name}
72
- size="xs"
73
+ size="xxs"
73
74
  status={null}
74
75
  />
75
76
  <Title
@@ -84,7 +85,7 @@ const FormPill = (props: FormPillProps): React.ReactElement => {
84
85
  <Avatar
85
86
  imageUrl={avatarUrl}
86
87
  name={name}
87
- size="xs"
88
+ size="xxs"
88
89
  status={null}
89
90
  />
90
91
  <Title
@@ -94,6 +95,7 @@ const FormPill = (props: FormPillProps): React.ReactElement => {
94
95
  />
95
96
  <Icon
96
97
  className="pb_form_pill_icon"
98
+ color={color}
97
99
  icon={icon}
98
100
  />
99
101
  </>
@@ -102,6 +104,7 @@ const FormPill = (props: FormPillProps): React.ReactElement => {
102
104
  <>
103
105
  <Icon
104
106
  className="pb_form_pill_icon"
107
+ color={color}
105
108
  icon={icon}
106
109
  />
107
110
  <Title
@@ -126,6 +129,7 @@ const FormPill = (props: FormPillProps): React.ReactElement => {
126
129
  <Icon
127
130
  fixedWidth
128
131
  icon="times"
132
+ size={closeIconSize}
129
133
  />
130
134
  </div>
131
135
  </div>
@@ -5,11 +5,11 @@ examples:
5
5
  - form_pill_size: Form Pill Size
6
6
  - form_pill_tag: Form Pill Tag
7
7
  - form_pill_example: Example
8
- # - form_pill_icon: Form Pill Icon
8
+ - form_pill_icon: Form Pill Icon
9
9
 
10
10
  react:
11
11
  - form_pill_user: Form Pill User
12
12
  - form_pill_size: Form Pill Size
13
13
  - form_pill_tag: Form Pill Tag
14
14
  - form_pill_example: Example
15
- # - form_pill_icon: Form Pill Icon
15
+ - form_pill_icon: Form Pill Icon
@@ -1,19 +1,19 @@
1
1
  <%= content_tag(:div, id: object.id, data: object.data, class: object.classname + object.size_class, tabindex: object.tabindex, **combined_html_options) do %>
2
2
  <% if object.name.present? %>
3
- <%= pb_rails("avatar", props: { name: object.name, image_url: object.avatar_url, size: "xs" }) %>
3
+ <%= pb_rails("avatar", props: { name: object.name, image_url: object.avatar_url, size: "xxs" }) %>
4
4
  <%= pb_rails("title", props: { text: object.name, size: 4, classname: "pb_form_pill_text" }) %>
5
5
  <% if object.icon.present? %>
6
- <%= pb_rails("icon", props: { classname: "pb_form_pill_icon", icon: object.icon }) %>
6
+ <%= pb_rails("icon", props: { classname: "pb_form_pill_icon", color: object.color, icon: object.icon }) %>
7
7
  <% end %>
8
8
  <% elsif object.text.present? %>
9
9
  <% if object.icon.present? %>
10
- <%= pb_rails("icon", props: { classname: "pb_form_pill_icon", icon: object.icon }) %>
10
+ <%= pb_rails("icon", props: { classname: "pb_form_pill_icon", color: object.color, icon: object.icon }) %>
11
11
  <% end %>
12
12
  <% if object.text.present? %>
13
13
  <%= pb_rails("title", props: { text: object.text, size: 4, classname: "pb_form_pill_tag" }) %>
14
14
  <% end %>
15
15
  <% end %>
16
16
  <%= pb_rails("body", props: { classname: "pb_form_pill_close" }) do %>
17
- <%= pb_rails("icon", props: { icon: 'times' , fixed_width: true }) %>
17
+ <%= pb_rails("icon", props: { icon: 'times', fixed_width: true, size: object.close_icon_size }) %>
18
18
  <% end %>
19
19
  <% end %>
@@ -32,6 +32,10 @@ module Playbook
32
32
  def icon_class
33
33
  icon ? "icon" : nil
34
34
  end
35
+
36
+ def close_icon_size
37
+ size == "small" ? "xs" : "sm"
38
+ end
35
39
  end
36
40
  end
37
41
  end
@@ -1,156 +1,119 @@
1
- import PbEnhancedElement from "../pb_enhanced_element"
1
+ import PbEnhancedElement from "../pb_enhanced_element";
2
2
 
3
- const STAR_RATING_WRAPPER_SELECTOR = "[data-pb-star-rating-wrapper]"
4
- const STAR_RATING_SELECTOR = "[data-pb-star-rating]"
5
- const STAR_RATING_INPUT_DATA_SELECTOR = "[data-pb-star-rating-input]"
3
+ const STAR_RATING_SELECTOR = "[data-pb-star-rating]";
4
+ const STAR_RATING_INPUT_ID = "star-rating-input";
6
5
 
7
6
  export default class PbStarRating extends PbEnhancedElement {
8
7
  static get selector() {
9
- return STAR_RATING_WRAPPER_SELECTOR
8
+ return STAR_RATING_SELECTOR;
10
9
  }
11
10
 
12
11
  connect() {
13
- this.addEventListeners()
14
- this.handleFormReset()
15
- }
16
-
17
- addEventListeners() {
18
- this.element.querySelectorAll(STAR_RATING_SELECTOR).forEach(star => {
19
- star.addEventListener("click", (event) => {
20
- const clickedStarId = event.currentTarget.id
21
- this.updateStarColors(clickedStarId)
22
- this.updateHiddenInputValue(clickedStarId)
23
- this.clearFormValidation()
24
- })
12
+ this.element.addEventListener("click", (event) => {
13
+ const clickedStarId = event.currentTarget.id;
14
+ this.updateStarColors(clickedStarId);
15
+ this.updateHiddenInputValue(clickedStarId);
16
+ });
25
17
 
18
+ document.querySelectorAll(STAR_RATING_SELECTOR).forEach(star => {
26
19
  star.addEventListener("mouseenter", (event) => {
27
20
  const hoveredStarId = event.currentTarget.id
28
- this.updateStarHoverColors(hoveredStarId)
21
+ this.updateStarHoverColors(hoveredStarId);
29
22
  })
30
23
 
31
24
  star.addEventListener("mouseleave", () => {
32
- this.removeStarHoverColors()
25
+ this.removeStarHoverColors();
33
26
  })
34
27
 
35
28
  star.addEventListener("keydown", (event) => {
36
29
  if (event.key === 'Enter' || event.key === ' ') {
37
- event.preventDefault()
38
- this.handleStarClick(star.id)
30
+ event.preventDefault();
31
+ this.handleStarClick(star.id);
39
32
  }
40
33
  })
41
34
  })
42
35
  }
43
36
 
44
37
  handleStarClick(starId) {
45
- this.updateStarColors(starId)
46
- this.updateHiddenInputValue(starId)
38
+ this.updateStarColors(starId);
39
+ this.updateHiddenInputValue(starId);
47
40
  }
48
41
 
49
42
  updateStarColors(clickedStarId) {
50
- const allStars = this.element.querySelectorAll(STAR_RATING_SELECTOR)
43
+ const allStars = document.querySelectorAll(STAR_RATING_SELECTOR);
51
44
 
52
45
  allStars.forEach(star => {
53
- const starId = star.id
54
- const icon = star.querySelector(".interactive-star-icon")
46
+ const starId = star.id;
47
+ const icon = star.querySelector(".interactive-star-icon");
55
48
 
56
49
  if (icon) {
57
50
  if (starId <= clickedStarId) {
58
51
  if (star.classList.contains("yellow_star")) {
59
- icon.classList.add("yellow-star-selected")
52
+ icon.classList.add("yellow-star-selected");
60
53
  } else if (star.classList.contains("primary_star_light")) {
61
- icon.classList.add("primary-star-selected")
54
+ icon.classList.add("primary-star-selected");
62
55
  } else if (star.classList.contains("primary_star_dark")) {
63
- icon.classList.add("primary-star-selected")
56
+ icon.classList.add("primary-star-selected");
64
57
  } else if (star.classList.contains("subtle_star_light")) {
65
- icon.classList.add("subtle-star-selected")
58
+ icon.classList.add("subtle-star-selected");
66
59
  } else if (star.classList.contains("subtle_star_dark")) {
67
- icon.classList.add("subtle-star-selected")
60
+ icon.classList.add("subtle-star-selected");
68
61
  } else {
69
- icon.classList.add("yellow-star-selected")
62
+ icon.classList.add("yellow-star-selected");
70
63
  }
71
64
  } else {
72
- icon.classList.remove("yellow-star-selected", "primary-star-selected", "subtle-star-selected")
65
+ icon.classList.remove("yellow-star-selected", "primary-star-selected", "subtle-star-selected");
73
66
  }
74
- icon.classList.remove("star-hovered")
67
+ icon.classList.remove("star-hovered");
75
68
  }
76
- })
69
+ });
77
70
  }
78
71
 
79
72
  updateHiddenInputValue(value) {
80
- const hiddenInput = this.element.querySelector(STAR_RATING_INPUT_DATA_SELECTOR)
73
+ const hiddenInput = document.getElementById(STAR_RATING_INPUT_ID);
81
74
  if (hiddenInput) {
82
- hiddenInput.value = value
75
+ hiddenInput.value = value;
83
76
  }
84
77
  }
85
78
 
86
79
  updateStarHoverColors(hoveredStarId) {
87
- const allStars = this.element.querySelectorAll(STAR_RATING_SELECTOR)
80
+ const allStars = document.querySelectorAll(STAR_RATING_SELECTOR);
88
81
 
89
82
  allStars.forEach(star => {
90
- const starId = star.id
91
- const icon = star.querySelector(".interactive-star-icon")
83
+ const starId = star.id;
84
+ const icon = star.querySelector(".interactive-star-icon");
92
85
 
93
86
  if (icon) {
94
87
  if (starId <= hoveredStarId) {
95
88
  if (!icon.classList.contains("yellow-star-selected") &&
96
89
  !icon.classList.contains("primary-star-selected") &&
97
90
  !icon.classList.contains("subtle-star-selected")) {
98
- icon.classList.add("star-hovered")
91
+ icon.classList.add("star-hovered");
99
92
  }
100
93
  } else {
101
- icon.classList.remove("star-hovered")
94
+ icon.classList.remove("star-hovered");
102
95
  }
103
96
  }
104
- })
97
+ });
105
98
  }
106
99
 
107
100
 
108
101
  removeStarHoverColors() {
109
- const allStars = this.element.querySelectorAll(STAR_RATING_SELECTOR)
102
+ const allStars = document.querySelectorAll(STAR_RATING_SELECTOR);
110
103
 
111
104
  allStars.forEach(star => {
112
- const icon = star.querySelector(".interactive-star-icon")
105
+ const icon = star.querySelector(".interactive-star-icon");
113
106
  if (icon) {
114
107
  if (!icon.classList.contains("yellow-star-selected") &&
115
108
  !icon.classList.contains("primary-star-selected") &&
116
109
  !icon.classList.contains("subtle-star-selected")) {
117
- icon.classList.remove("star-hovered")
110
+ icon.classList.remove("star-hovered");
118
111
  }
119
112
  }
120
- })
113
+ });
121
114
  }
122
115
 
123
116
  isStarSelected() {
124
- return this.element.querySelectorAll(".yellow-star-selected, .primary-star-selected, .subtle-star-selected").length > 0
125
- }
126
-
127
- handleFormReset() {
128
- const form = this.element.closest("form")
129
- if (form) {
130
- form.addEventListener("reset", () => {
131
- this.updateHiddenInputValue("")
132
- this.resetStarRatingValues()
133
- })
134
- }
135
- }
136
-
137
- resetStarRatingValues() {
138
- const allStars = this.element.querySelectorAll(STAR_RATING_SELECTOR)
139
- allStars.forEach(star => {
140
- const icon = star.querySelector(".interactive-star-icon")
141
- if (icon) {
142
- icon.classList.remove("yellow-star-selected", "primary-star-selected", "subtle-star-selected")
143
- }
144
- })
145
- }
146
-
147
- clearFormValidation() {
148
- const hiddenInput = this.element.querySelector(STAR_RATING_INPUT_DATA_SELECTOR)
149
- if (hiddenInput.checkValidity()) {
150
- const errorLabelElement = this.element.querySelector(".pb_body_kit_negative")
151
- if (errorLabelElement) {
152
- errorLabelElement.remove()
153
- }
154
- }
117
+ return document.querySelectorAll(".yellow-star-selected, .primary-star-selected, .subtle-star-selected").length > 0;
155
118
  }
156
119
  }
@@ -39,13 +39,11 @@
39
39
  <% end %>
40
40
 
41
41
  <% else %>
42
- <%= pb_rails("flex", props: { data: {"pb-star-rating-wrapper": "true" }, orientation: "column" }) do %>
42
+ <%= pb_rails("flex", props: { orientation: "column" }) do %>
43
43
  <% if object.label.present? %>
44
44
  <%= pb_rails("caption", props: {text: object.label, margin_bottom:"xs"}) %>
45
45
  <% end %>
46
-
47
- <%= hidden_input_tag %>
48
-
46
+ <input type="hidden" id="star-rating-input" value="" name="<%= object.name %>"/>
49
47
  <%= pb_rails("flex", props: { orientation: "row" }) do %>
50
48
  <% object.denominator.times do |index| %>
51
49
  <div data-pb-star-rating id="<%= index + 1 %>" class="<%= star_color %>">
@@ -30,10 +30,6 @@ module Playbook
30
30
  default: "display"
31
31
  prop :label, type: Playbook::Props::String
32
32
  prop :name, type: Playbook::Props::String
33
- prop :required, type: Playbook::Props::Boolean,
34
- default: false
35
- prop :input_options, type: Playbook::Props::HashProp,
36
- default: {}
37
33
 
38
34
  def one_decimal_rating
39
35
  rating.to_f.round(1)
@@ -110,19 +106,6 @@ module Playbook
110
106
  def classname
111
107
  generate_classname("pb_star_rating_kit")
112
108
  end
113
-
114
- def hidden_input_tag
115
- tag(:input, all_input_options)
116
- end
117
-
118
- def all_input_options
119
- input_options.merge(
120
- data: { "pb-star-rating-input": true },
121
- name: name,
122
- required: required,
123
- style: "display: none"
124
- )
125
- end
126
109
  end
127
110
  end
128
111
  end