playbook_ui 13.12.0.pre.alpha.play900startratingasinput1550 → 13.12.0.pre.alpha.play1051highchartstest1556

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.tsx +36 -32
  3. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +68 -63
  4. data/app/pb_kits/playbook/pb_dashboard/pbChartsDarkTheme.ts +257 -3
  5. data/app/pb_kits/playbook/pb_gauge/_gauge.tsx +59 -47
  6. data/app/pb_kits/playbook/pb_line_graph/_line_graph.tsx +40 -34
  7. data/app/pb_kits/playbook/pb_star_rating/_star_rating.scss +47 -80
  8. data/app/pb_kits/playbook/pb_star_rating/_star_rating.tsx +54 -151
  9. data/app/pb_kits/playbook/pb_star_rating/docs/_star_rating_default.html.erb +1 -11
  10. data/app/pb_kits/playbook/pb_star_rating/docs/_star_rating_default.jsx +2 -17
  11. data/app/pb_kits/playbook/pb_star_rating/docs/_star_rating_hide.html.erb +1 -6
  12. data/app/pb_kits/playbook/pb_star_rating/docs/_star_rating_hide.jsx +5 -22
  13. data/app/pb_kits/playbook/pb_star_rating/docs/example.yml +5 -10
  14. data/app/pb_kits/playbook/pb_star_rating/docs/index.js +0 -6
  15. data/app/pb_kits/playbook/pb_star_rating/star_rating.html.erb +15 -56
  16. data/app/pb_kits/playbook/pb_star_rating/star_rating.rb +6 -49
  17. data/app/pb_kits/playbook/pb_star_rating/star_rating.test.js +34 -33
  18. data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +107 -102
  19. data/app/pb_kits/playbook/playbook-doc.js +4 -4
  20. data/app/pb_kits/playbook/playbook-rails-react-bindings.js +4 -4
  21. data/dist/playbook-rails.js +7 -7
  22. data/lib/playbook/version.rb +1 -1
  23. metadata +1 -9
  24. data/app/pb_kits/playbook/pb_star_rating/custom-icons.js +0 -356
  25. data/app/pb_kits/playbook/pb_star_rating/docs/_star_rating_color_options.html.erb +0 -7
  26. data/app/pb_kits/playbook/pb_star_rating/docs/_star_rating_color_options.jsx +0 -40
  27. data/app/pb_kits/playbook/pb_star_rating/docs/_star_rating_number_config.html.erb +0 -12
  28. data/app/pb_kits/playbook/pb_star_rating/docs/_star_rating_number_config.jsx +0 -57
  29. data/app/pb_kits/playbook/pb_star_rating/docs/_star_rating_size_options.html.erb +0 -23
  30. data/app/pb_kits/playbook/pb_star_rating/docs/_star_rating_size_options.jsx +0 -59
  31. data/app/pb_kits/playbook/pb_star_rating/star.svg +0 -3
@@ -1,7 +1,7 @@
1
+ /* eslint-disable */
1
2
  import React, { useState, useEffect } from "react";
2
3
  import classnames from "classnames";
3
4
  import HighchartsReact from "highcharts-react-official";
4
- import Highcharts from "highcharts";
5
5
  import { highchartsTheme } from "../pb_dashboard/pbChartsLightTheme";
6
6
  import { highchartsDarkTheme } from "../pb_dashboard/pbChartsDarkTheme";
7
7
  import mapColors from "../pb_dashboard/pbChartsColorsHelper";
@@ -14,26 +14,26 @@ import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props";
14
14
  import { globalProps } from "../utilities/globalProps";
15
15
 
16
16
  type GaugeProps = {
17
- aria: { [key: string]: string };
18
- className?: string;
19
- chartData?: { name: string; value: number[] | number }[];
20
- dark?: Boolean;
21
- data?: { [key: string]: string };
22
- disableAnimation?: boolean;
23
- fullCircle?: boolean;
24
- height?: string;
25
- id?: string;
26
- max?: number;
27
- min?: number;
28
- prefix?: string;
29
- showLabels?: boolean;
30
- style?: string;
31
- suffix?: string;
32
- title?: string;
33
- tooltipHtml?: string;
34
- colors: string[];
35
- minorTickInterval: any;
36
- circumference: number[];
17
+ aria: { [key: string]: string },
18
+ className?: string,
19
+ chartData?: { name: string, value: number[] | number }[],
20
+ dark?: boolean,
21
+ data?: { [key: string]: string },
22
+ disableAnimation?: boolean,
23
+ fullCircle?: boolean,
24
+ height?: string,
25
+ id?: string,
26
+ max?: number,
27
+ min?: number,
28
+ prefix?: string,
29
+ showLabels?: boolean,
30
+ style?: string,
31
+ suffix?: string,
32
+ title?: string,
33
+ tooltipHtml?: string,
34
+ colors: string[],
35
+ minorTickInterval: any,
36
+ circumference: number[],
37
37
  };
38
38
 
39
39
  const Gauge = ({
@@ -54,7 +54,7 @@ const Gauge = ({
54
54
  suffix = "",
55
55
  title = "",
56
56
  tooltipHtml = '<span style="font-weight: bold; color:{point.color};">●</span>{point.name}: ' +
57
- "<b>{point.y}</b>",
57
+ "<b>{point.y}</b>",
58
58
  colors = [],
59
59
  minorTickInterval = null,
60
60
  circumference = fullCircle ? [0, 360] : [-100, 100],
@@ -62,28 +62,13 @@ const Gauge = ({
62
62
  }: GaugeProps) => {
63
63
  const ariaProps = buildAriaProps(aria);
64
64
  const dataProps = buildDataProps(data);
65
- highchartsMore(Highcharts);
66
- solidGauge(Highcharts);
67
- const setupTheme = () => {
68
- dark
69
- ? Highcharts.setOptions(highchartsDarkTheme)
70
- : Highcharts.setOptions(highchartsTheme);
71
- };
72
- setupTheme();
73
-
74
- //set tooltip directly to prevent being overriden by Highcharts defaults
75
- Highcharts.setOptions({
76
- tooltip: {
77
- pointFormat: tooltipHtml,
78
- followPointer: true,
79
- },
80
- });
81
65
 
82
66
  const css = buildCss({
83
67
  pb_gauge_kit: true,
84
68
  });
85
69
 
86
70
  const [options, setOptions] = useState({});
71
+ const [isHighchartsLoaded, setIsHighchartsLoaded] = useState(false);
87
72
 
88
73
  useEffect(() => {
89
74
  const formattedChartData = chartData.map((obj: any) => {
@@ -174,18 +159,45 @@ const Gauge = ({
174
159
 
175
160
  setOptions({ ...staticOptions });
176
161
 
177
- if (document.querySelector(".prefix")) {
178
- document.querySelectorAll(".prefix").forEach((prefix) => {
179
- prefix.setAttribute("y", "28");
180
- });
181
- document
182
- .querySelectorAll(".fix")
183
- .forEach((fix) => fix.setAttribute("y", "38"));
184
- }
162
+ const interval = setInterval(() => {
163
+ if (window.Highcharts) {
164
+ clearInterval(interval)
165
+
166
+ const gaugeInterval = setInterval(() => {
167
+ if (document.querySelector(".prefix")) {
168
+ clearInterval(gaugeInterval)
169
+ document.querySelectorAll(".prefix").forEach((prefix) => {
170
+ prefix.setAttribute("y", "28");
171
+ });
172
+ document
173
+ .querySelectorAll(".fix")
174
+ .forEach((fix) => fix.setAttribute("y", "38"));
175
+ }
176
+ }, 0)
177
+
178
+ dark
179
+ ? window.Highcharts.setOptions(highchartsDarkTheme(window.Highcharts))
180
+ : window.Highcharts.setOptions(highchartsTheme)
181
+
182
+ highchartsMore(window.Highcharts);
183
+ solidGauge(window.Highcharts);
184
+
185
+ //set tooltip directly to prevent being overriden by window.Highcharts defaults
186
+ window.Highcharts.setOptions({
187
+ tooltip: {
188
+ pointFormat: tooltipHtml,
189
+ followPointer: true,
190
+ },
191
+ });
192
+
193
+ setIsHighchartsLoaded(true)
194
+ }
195
+ }, 0)
185
196
 
186
197
  }, [chartData]);
187
198
 
188
199
  return (
200
+ isHighchartsLoaded &&
189
201
  <HighchartsReact
190
202
  containerProps={{
191
203
  className: classnames(css, globalProps(props)),
@@ -193,7 +205,7 @@ const Gauge = ({
193
205
  ...ariaProps,
194
206
  ...dataProps,
195
207
  }}
196
- highcharts={Highcharts}
208
+ highcharts={window.Highcharts}
197
209
  options={options}
198
210
  />
199
211
  );
@@ -1,42 +1,42 @@
1
+ /* eslint-disable */
1
2
  import React, { useState, useEffect } from "react";
2
3
  import classnames from "classnames";
3
4
  import { globalProps } from "../utilities/globalProps";
4
5
  import { buildAriaProps, buildDataProps } from "../utilities/props";
5
6
 
6
7
  import HighchartsReact from "highcharts-react-official";
7
- import Highcharts from "highcharts";
8
8
  import { highchartsTheme } from "../pb_dashboard/pbChartsLightTheme";
9
9
  import { highchartsDarkTheme } from "../pb_dashboard/pbChartsDarkTheme";
10
10
  import mapColors from "../pb_dashboard/pbChartsColorsHelper";
11
11
 
12
12
  type LineGraphProps = {
13
- align?: "left" | "right" | "center";
14
- axisTitle?: string;
15
- dark?: Boolean;
16
- xAxisCategories: [];
17
- yAxisMin: number;
18
- yAxisMax: number;
19
- className?: string;
13
+ align?: "left" | "right" | "center",
14
+ axisTitle?: string,
15
+ dark?: boolean,
16
+ xAxisCategories: [],
17
+ yAxisMin: number,
18
+ yAxisMax: number,
19
+ className?: string,
20
20
  chartData: {
21
- name: string;
22
- data: number[];
23
- }[];
24
- gradient?: boolean;
25
- id: string;
26
- pointStart: number;
27
- subTitle?: string;
28
- title: string;
29
- type?: string;
30
- legend?: boolean;
31
- toggleLegendClick?: boolean;
32
- height?: string;
33
- colors: string[];
34
- layout?: "horizontal" | "vertical" | "proximate";
35
- verticalAlign?: "top" | "middle" | "bottom";
36
- x?: number;
37
- y?: number;
38
- aria?: { [key: string]: string };
39
- data?: { [key: string]: string };
21
+ name: string,
22
+ data: number[],
23
+ }[],
24
+ gradient?: boolean,
25
+ id: string,
26
+ pointStart: number,
27
+ subTitle?: string,
28
+ title: string,
29
+ type?: string,
30
+ legend?: boolean,
31
+ toggleLegendClick?: boolean,
32
+ height?: string,
33
+ colors: string[],
34
+ layout?: "horizontal" | "vertical" | "proximate",
35
+ verticalAlign?: "top" | "middle" | "bottom",
36
+ x?: number,
37
+ y?: number,
38
+ aria?: { [key: string]: string },
39
+ data?: { [key: string]: string },
40
40
  };
41
41
 
42
42
  const LineGraph = ({
@@ -68,12 +68,6 @@ const LineGraph = ({
68
68
  }: LineGraphProps) => {
69
69
  const ariaProps = buildAriaProps(aria);
70
70
  const dataProps = buildDataProps(data);
71
- const setupTheme = () => {
72
- dark
73
- ? Highcharts.setOptions(highchartsDarkTheme)
74
- : Highcharts.setOptions(highchartsTheme);
75
- };
76
- setupTheme();
77
71
 
78
72
  const staticOptions = {
79
73
  title: {
@@ -126,12 +120,24 @@ const LineGraph = ({
126
120
  }
127
121
 
128
122
  const [options, setOptions] = useState({});
123
+ const [isHighchartsLoaded, setIsHighchartsLoaded] = useState(false);
129
124
 
130
125
  useEffect(() => {
131
126
  setOptions({ ...staticOptions });
127
+
128
+ const interval = setInterval(() => {
129
+ if (window.Highcharts) {
130
+ clearInterval(interval)
131
+ dark
132
+ ? window.Highcharts.setOptions(highchartsDarkTheme(window.Highcharts))
133
+ : window.Highcharts.setOptions(highchartsTheme)
134
+ setIsHighchartsLoaded(true)
135
+ }
136
+ }, 0)
132
137
  }, [chartData]);
133
138
 
134
139
  return (
140
+ isHighchartsLoaded &&
135
141
  <HighchartsReact
136
142
  containerProps={{
137
143
  className: classnames(globalProps(props), className),
@@ -139,7 +145,7 @@ const LineGraph = ({
139
145
  ...ariaProps,
140
146
  ...dataProps,
141
147
  }}
142
- highcharts={Highcharts}
148
+ highcharts={window.Highcharts}
143
149
  options={options}
144
150
  />
145
151
  );
@@ -2,94 +2,61 @@
2
2
  @import "../tokens/opacity";
3
3
  @import "../tokens/spacing";
4
4
 
5
+ $pb_star_rating_number_width: 30px;
6
+ $pb_star_rating_wrapper_width: 90px;
7
+ $pb_star_rating_height: 26px;
5
8
 
6
- [class*=pb_star_rating_kit] {
7
- display: flex;
8
- align-items: flex-end;
9
+ [class^=pb_star_rating_kit] {
10
+ position: relative;
11
+ display: inline-flex;
9
12
  justify-content: flex-start;
10
-
11
- path {
12
- &.suble_star_dark {
13
- fill: $text_dk_default; // Replace "red" with your desired color
14
- }
15
- &.suble_star_light {
16
- fill: #242B42; // Replace "red" with your desired color
17
- }
18
- &.outline_star_dark {
19
- stroke: $text_dk_lighter; // Replace "red" with your desired color
20
- }
21
- &.outline_star_light {
22
- stroke: #C1CDD6; // Replace "red" with your desired color
23
- }
24
- &.empty_star_dark {
25
- fill: $border_dark; // Replace "red" with your desired color
26
- }
27
- &.empty_star_light {
28
- fill: #E4E8F0; // Replace "red" with your desired color
29
- }
30
- }
31
-
32
- .number_rails_xs {
33
- height: 22px !important;
34
- }
35
-
36
- .number_rails_sm {
37
- height: 22px !important;
38
- }
39
-
40
- .number_rails_md {
41
- height: 26px;
42
- }
43
-
44
- .number_rails_lg {
45
- height: 38px;
46
- }
47
-
48
- .pb_star_rating_wrapper {
49
- display: flex;
50
- }
51
-
52
- .pb_star_rating_number_xs {
53
- max-height: 16px;
54
- }
55
-
56
- .pb_star_rating_number_sm {
57
- max-height: 16px;
58
- }
59
-
60
- .pb_star_rating_number_md {
61
- max-height: 32px;
62
- }
63
-
64
- .pb_star_rating_number_lg {
65
- max-height: 56px;
66
- }
67
-
68
- .pb_star_xs {
13
+ align-items: flex-start;
14
+
15
+ .pb_star_rating_number {
16
+ flex-shrink: 0;
17
+ flex-grow: 0;
18
+ flex-basis: $pb_star_rating_number_width;
19
+ width: $pb_star_rating_number_width;
20
+ min-height: $pb_star_rating_height;
21
+ padding: 0 $space-xs 0;
22
+ color: $text_lt_light;
23
+ font-size: $text-small;
69
24
  display: flex;
70
- align-items: center;
71
25
  justify-content: center;
72
- padding-right: 4px;
73
- }
74
-
75
- .pb_star_sm {
76
- display: flex;
77
26
  align-items: center;
78
- justify-content: center;
79
- padding-right: 4px;
80
27
  }
81
28
 
82
- .pb_star_md {
83
- display: flex;
84
- align-items: center;
85
- justify-content: center;
86
- padding-right: 6px;
29
+ .pb_star_rating_wrapper {
30
+ position: relative;
31
+ width: $pb_star_rating_wrapper_width;
32
+ flex-basis: $pb_star_rating_wrapper_width;
33
+ flex-shrink: 0;
34
+ flex-grow: 1;
35
+ min-height: $pb_star_rating_height;
36
+
37
+ .pb_star_rating_highlight {
38
+ display: flex;
39
+ position: absolute;
40
+ top: 5px;
41
+ left: 0;
42
+ z-index: 5;
43
+ color: $yellow;
44
+ line-height: $pb_star_rating_height;
45
+ }
46
+ .pb_star_rating_base {
47
+ display: flex;
48
+ position: absolute;
49
+ top: 5px;
50
+ left: 0;
51
+ z-index: 0;
52
+ color: rgba($slate, $opacity-4);
53
+ line-height: $pb_star_rating_height;
54
+ }
87
55
  }
88
56
 
89
- .pb_star_lg {
90
- display: flex;
91
- align-items: center;
92
- justify-content: center;
93
- padding-right: 12px;
57
+ &[class*=_hide_rating] {
58
+ .pb_star_rating_number {
59
+ display: none;
60
+ }
94
61
  }
95
62
  }
@@ -2,36 +2,27 @@ import React from "react"
2
2
  import classnames from "classnames"
3
3
 
4
4
  import { buildAriaProps, buildDataProps } from "../utilities/props"
5
- import Caption from '../pb_caption/_caption'
6
- import Body from '../pb_body/_body'
7
- import Title from '../pb_title/_title'
5
+
6
+ import Icon from "../pb_icon/_icon"
8
7
 
9
8
  type StarRatingProps = {
10
9
  aria?: {[key: string]: string},
11
10
  className?: string,
12
11
  data?: object,
13
- dark?: boolean,
14
12
  fixedWidth?: boolean,
15
- layoutOption?: "default" | "number" | "onestar",
13
+ hideRating: boolean,
16
14
  icon?: string,
17
15
  id?: string,
18
16
  rating: number,
19
- denominator: number,
20
- colorOption?: "yellow" | "primary" | "subtle" | "outline",
21
- size?: "xs" | "sm" | "md" | "lg";
22
17
  };
23
18
 
24
19
  const StarRating = ({
25
20
  aria = {},
26
21
  className,
27
22
  data = {},
28
- dark = false,
29
- layoutOption = "default",
23
+ hideRating = false,
30
24
  id,
31
25
  rating = 0,
32
- denominator = 5,
33
- colorOption = "yellow",
34
- size = "sm",
35
26
  }: StarRatingProps) => {
36
27
  const ariaProps = buildAriaProps(aria)
37
28
  const dataProps = buildDataProps(data)
@@ -39,51 +30,12 @@ const StarRating = ({
39
30
  "pb_star_rating_kit", className,
40
31
  ])
41
32
 
42
- const denominatorStyle = layoutOption === "onestar" ? 1 : denominator
43
- const activeStars = Math.round(rating) > denominatorStyle ? denominatorStyle : Math.round(rating)
44
- const emptyStars = denominatorStyle - Math.round(rating) < 0 ? 0 : denominatorStyle - Math.round(rating)
45
- let svgSize
46
-
47
- if (size === 'xs') {
48
- svgSize = 14;
49
- } else if (size === 'sm') {
50
- svgSize = 16;
51
- } else if (size === 'md') {
52
- svgSize = 24;
53
- } else if (size === 'lg') {
54
- svgSize = 48;
55
- } else {
56
- svgSize = 16;
57
- }
58
-
59
- const starYellow = (
60
- <svg width={svgSize} height={svgSize} viewBox="0 0 18 16" fill="none" xmlns="http://www.w3.org/2000/svg">
61
- <path fillRule="evenodd" clipRule="evenodd" d="M9.86015 0.4371C9.73527 0.187329 9.4855 0 9.17328 0C8.89229 0 8.64252 0.187329 8.51763 0.4371L6.36335 4.83932L1.58647 5.55742C1.30547 5.58864 1.08692 5.80719 0.99326 6.05696C0.899595 6.33795 0.962038 6.61895 1.18059 6.8375L4.64617 10.2719L3.80319 15.1112C3.77197 15.3922 3.89685 15.7044 4.11541 15.8605C4.36518 16.0166 4.64617 16.0478 4.89594 15.9229L9.17328 13.6126L13.4506 15.9229C13.7004 16.0478 14.0126 16.0166 14.2624 15.8605C14.4809 15.7044 14.6058 15.3922 14.5434 15.1112L13.7316 10.2719L17.1972 6.8375C17.4157 6.61895 17.4782 6.33795 17.3845 6.05696C17.2909 5.80719 17.0723 5.58864 16.7913 5.55742L12.0144 4.83932L9.86015 0.4371Z" fill="#F9BB00"/>
62
- </svg>
63
- )
64
-
65
- const starPrimary = (
66
- <svg width={svgSize} height={svgSize} viewBox="0 0 18 16" fill="none" xmlns="http://www.w3.org/2000/svg">
67
- <path fillRule="evenodd" clipRule="evenodd" d="M9.86015 0.4371C9.73527 0.187329 9.4855 0 9.17328 0C8.89229 0 8.64252 0.187329 8.51763 0.4371L6.36335 4.83932L1.58647 5.55742C1.30547 5.58864 1.08692 5.80719 0.99326 6.05696C0.899595 6.33795 0.962038 6.61895 1.18059 6.8375L4.64617 10.2719L3.80319 15.1112C3.77197 15.3922 3.89685 15.7044 4.11541 15.8605C4.36518 16.0166 4.64617 16.0478 4.89594 15.9229L9.17328 13.6126L13.4506 15.9229C13.7004 16.0478 14.0126 16.0166 14.2624 15.8605C14.4809 15.7044 14.6058 15.3922 14.5434 15.1112L13.7316 10.2719L17.1972 6.8375C17.4157 6.61895 17.4782 6.33795 17.3845 6.05696C17.2909 5.80719 17.0723 5.58864 16.7913 5.55742L12.0144 4.83932L9.86015 0.4371Z" fill="#0056CF"/>
68
- </svg>
69
- );
70
-
71
- const starSubtle = (
72
- <svg width={svgSize} height={svgSize} viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
73
- <path className={dark === true ? "suble_star_dark" : "suble_star_light"} fillRule="evenodd" clipRule="evenodd" d="M8.90904 0.4371C8.78416 0.187329 8.53438 0 8.22217 0C7.94118 0 7.69141 0.187329 7.56652 0.4371L5.41224 4.83932L0.635357 5.55742C0.354364 5.58864 0.135813 5.80719 0.042149 6.05696C-0.0515154 6.33795 0.0109275 6.61895 0.229478 6.8375L3.69506 10.2719L2.85208 15.1112C2.82086 15.3922 2.94574 15.7044 3.16429 15.8605C3.41407 16.0166 3.69506 16.0478 3.94483 15.9229L8.22217 13.6126L12.4995 15.9229C12.7493 16.0478 13.0615 16.0166 13.3113 15.8605C13.5298 15.7044 13.6547 15.3922 13.5923 15.1112L12.7805 10.2719L16.2461 6.8375C16.4646 6.61895 16.5271 6.33795 16.4334 6.05696C16.3397 5.80719 16.1212 5.58864 15.8402 5.55742L11.0633 4.83932L8.90904 0.4371Z" />
74
- </svg>
75
- );
76
-
77
- const starBackground = (
78
- <svg width={svgSize} height={svgSize} viewBox="0 0 17 16" fill="none" xmlns="http://www.w3.org/2000/svg">
79
- <path className={dark === true ? "empty_star_dark" : "empty_star_light"} fillRule="evenodd" clipRule="evenodd" d="M9.31126 0.4371C9.18638 0.187329 8.93661 0 8.62439 0C8.3434 0 8.09363 0.187329 7.96874 0.4371L5.81446 4.83932L1.03758 5.55742C0.756585 5.58864 0.538035 5.80719 0.444371 6.05696C0.350706 6.33795 0.413149 6.61895 0.631699 6.8375L4.09728 10.2719L3.2543 15.1112C3.22308 15.3922 3.34797 15.7044 3.56652 15.8605C3.81629 16.0166 4.09728 16.0478 4.34705 15.9229L8.62439 13.6126L12.9017 15.9229C13.1515 16.0478 13.4637 16.0166 13.7135 15.8605C13.932 15.7044 14.0569 15.3922 13.9945 15.1112L13.1827 10.2719L16.6483 6.8375C16.8669 6.61895 16.9293 6.33795 16.8356 6.05696C16.742 5.80719 16.5234 5.58864 16.2424 5.55742L11.4655 4.83932L9.31126 0.4371Z" />
80
- </svg>
33
+ const starCount = () => (
34
+ [...Array(Math.floor(rating))]
81
35
  )
82
36
 
83
- const starOutline = (
84
- <svg width={svgSize} height={svgSize} fill="none" xmlns="http://www.w3.org/2000/svg">
85
- <path className={dark === true ? "outline_star_dark" : "outline_star_light"} d="M5.91323 5.33377L6.17269 5.29477L6.28801 5.0591L8.44116 0.659187C8.49971 0.543364 8.59517 0.5 8.64884 0.5C8.74499 0.5 8.83506 0.555009 8.88775 0.659235L11.0409 5.0591L11.1562 5.29477L11.4157 5.33377L16.1925 6.05186L16.2021 6.0533L16.2117 6.05436C16.2359 6.05706 16.2671 6.06847 16.3024 6.09973C16.3374 6.13062 16.3686 6.17476 16.3886 6.22412C16.4186 6.32162 16.401 6.40181 16.3198 6.48332C16.3196 6.48353 16.3194 6.48374 16.3192 6.48394L12.8552 9.91671L12.6712 10.0991L12.7141 10.3546L13.5258 15.1939L13.528 15.2068L13.5308 15.2196C13.5488 15.3004 13.5074 15.402 13.4567 15.4462C13.3391 15.5132 13.2227 15.5096 13.1546 15.4781L8.88646 13.1726L8.64884 13.0443L8.41121 13.1726L4.14274 15.4782C4.07877 15.5083 3.99031 15.5147 3.87267 15.4466C3.82302 15.4033 3.76655 15.2914 3.77463 15.1781L4.61431 10.3577L4.65911 10.1005L4.47368 9.91671L1.0097 6.48394C1.00947 6.48372 1.00925 6.4835 1.00903 6.48327C0.927878 6.40178 0.910311 6.3216 0.94026 6.22412C0.960274 6.17476 0.99154 6.13062 1.02646 6.09973C1.0618 6.06847 1.09296 6.05706 1.11724 6.05436L1.12682 6.0533L1.13635 6.05186L5.91323 5.33377Z"/>
86
- </svg>
37
+ const hasHalfStar = () => (
38
+ rating % 1 !== 0
87
39
  )
88
40
 
89
41
  return (
@@ -93,102 +45,53 @@ const StarRating = ({
93
45
  className={css}
94
46
  id={id}
95
47
  >
96
- {layoutOption === "number" && (
97
- <div className={`pb_star_rating_number_${size}`}>
98
- {size === 'xs' && (
99
- <Caption
100
- text={rating.toString()}
101
- size="xs"
102
- paddingRight="xs"
103
- dark={dark}
104
- />
105
- )}
106
- {size === 'sm' && (
107
- <Caption
108
- text={rating.toString()}
109
- size="xs"
110
- paddingRight="xs"
111
- dark={dark}
112
- />
113
- )}
114
- {size === 'md' && (
115
- <Body
116
- text={rating.toString()}
117
- paddingRight="xs"
118
- dark={dark}
119
- />
120
- )}
121
- {size === 'lg' && (
122
- <Title
123
- text={rating.toString()}
124
- size={2}
125
- paddingRight="sm"
126
- dark={dark}
127
- />
128
- )}
129
- </div>
130
- )}
131
- <div className={`pb_star_rating_wrapper ${layoutOption}`}>
132
- {[...Array(activeStars)].map((_, index) => (
133
- <div className={`pb_star_${size}`} key={index}>
134
- {colorOption === 'yellow' && (
135
- starYellow
136
- ) }
137
- {colorOption === 'primary' && (
138
- starPrimary
139
- ) }
140
- {colorOption === 'outline' && (
141
- starPrimary
142
- ) }
143
- {colorOption === 'subtle' && (
144
- starSubtle
145
- ) }
146
- </div>
147
- ))}
148
- {[...Array(emptyStars)].map((_, index) => (
149
- <div className={`pb_star_${size}`} key={index}>
150
- {colorOption === 'outline' && (
151
- starOutline
152
- ) }
153
- {colorOption !== 'outline' && (
154
- starBackground
155
- ) }
156
- </div>
157
- ))}
48
+ {!hideRating && (
49
+ <div className="pb_star_rating_number">
50
+ {rating}
158
51
  </div>
159
- {layoutOption === "onestar" && (
160
- <div className={`pb_star_rating_number_${size}`}>
161
- {size === 'xs' && (
162
- <Caption
163
- text={`${rating.toString()} of ${denominator}`}
164
- size="xs"
165
- dark={dark}
166
- />
167
- )}
168
- {size === 'sm' && (
169
- <Caption
170
- text={`${rating.toString()} of ${denominator}`}
171
- size="xs"
172
- dark={dark}
173
- />
174
- )}
175
- {size === 'md' && (
176
- <Body
177
- text={`${rating.toString()} of ${denominator}`}
178
- dark={dark}
179
- />
180
- )}
181
- {size === 'lg' && (
182
- <Title
183
- text={`${rating.toString()} of ${denominator}`}
184
- size={2}
185
- dark={dark}
186
- />
187
- )}
188
- </div>
189
- )}
52
+ )}
53
+ <div className="pb_star_rating_wrapper">
54
+ <div className="pb_star_rating_highlight">
55
+ {starCount().map((_, index) => (
56
+ <Icon
57
+ fixedWidth={false}
58
+ icon="star"
59
+ key={index}
60
+ />
61
+ ))}
62
+ {hasHalfStar() && (
63
+ <Icon
64
+ fixedWidth={false}
65
+ icon="star-half"
66
+ />
67
+ )}
68
+ </div>
69
+
70
+ <div className="pb_star_rating_base">
71
+ <Icon
72
+ fixedWidth={false}
73
+ icon="star"
74
+ />
75
+ <Icon
76
+ fixedWidth={false}
77
+ icon="star"
78
+ />
79
+ <Icon
80
+ fixedWidth={false}
81
+ icon="star"
82
+ />
83
+ <Icon
84
+ fixedWidth={false}
85
+ icon="star"
86
+ />
87
+ <Icon
88
+ fixedWidth={false}
89
+ icon="star"
90
+ />
91
+ </div>
190
92
  </div>
191
- )
192
- }
93
+ </div>
94
+ )
95
+ }
193
96
 
194
97
  export default StarRating
@@ -2,22 +2,12 @@
2
2
 
3
3
  <br>
4
4
 
5
- <%= pb_rails("star_rating", props: { rating: 1 }) %>
6
-
7
- <br>
8
-
9
- <%= pb_rails("star_rating", props: { rating: 2}) %>
10
-
11
- <br>
12
-
13
5
  <%= pb_rails("star_rating", props: { rating: 3 }) %>
14
6
 
15
7
  <br>
16
8
 
17
- <%= pb_rails("star_rating", props: { rating: 4 }) %>
9
+ <%= pb_rails("star_rating", props: { rating: 1.5 }) %>
18
10
 
19
11
  <br>
20
12
 
21
13
  <%= pb_rails("star_rating", props: { rating: 5 }) %>
22
-
23
- <br>