playbook_ui 14.18.0.pre.rc.4 → 14.18.1.pre.rc.0

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.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +1 -1
  3. data/app/pb_kits/playbook/pb_circle_chart/circleChart.test.js +2 -2
  4. data/app/pb_kits/playbook/pb_circle_chart/circleChartTheme.ts +53 -0
  5. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_block.html.erb +2 -2
  6. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_block.jsx +1 -1
  7. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_colors.html.erb +1 -1
  8. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_colors.jsx +1 -1
  9. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.html.erb +1 -1
  10. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_custom_tooltip.jsx +1 -1
  11. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_default.html.erb +1 -1
  12. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_default.jsx +1 -1
  13. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_legend_position.html.erb +1 -1
  14. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_legend_position.jsx +1 -1
  15. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_live_data.jsx +2 -2
  16. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_pb_styles.jsx +38 -0
  17. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_pb_styles.md +1 -0
  18. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_rounded.html.erb +1 -1
  19. data/app/pb_kits/playbook/pb_circle_chart/docs/_circle_chart_rounded.jsx +1 -1
  20. data/app/pb_kits/playbook/pb_circle_chart/docs/example.yml +2 -3
  21. data/app/pb_kits/playbook/pb_circle_chart/docs/index.js +2 -1
  22. data/app/pb_kits/playbook/pb_circle_icon_button/_circle_icon_button.scss +39 -1
  23. data/app/pb_kits/playbook/pb_circle_icon_button/_circle_icon_button.tsx +4 -0
  24. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.rb +9 -1
  25. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.test.js +14 -0
  26. data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_size.html.erb +28 -0
  27. data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_size.jsx +42 -0
  28. data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_size.md +1 -0
  29. data/app/pb_kits/playbook/pb_circle_icon_button/docs/example.yml +2 -0
  30. data/app/pb_kits/playbook/pb_circle_icon_button/docs/index.js +1 -0
  31. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_hook_rails.html.erb +14 -0
  32. data/app/pb_kits/playbook/pb_copy_button/docs/_copy_button_hook_rails.md +3 -0
  33. data/app/pb_kits/playbook/pb_copy_button/docs/example.yml +1 -0
  34. data/app/pb_kits/playbook/pb_copy_button/index.js +46 -20
  35. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +12 -0
  36. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +12 -0
  37. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +50 -1
  38. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.jsx +4 -1
  39. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_rails.md +4 -0
  40. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_range_limit.md +1 -1
  41. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_react.md +5 -1
  42. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern.jsx +34 -0
  43. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern.md +14 -0
  44. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern_rails.html.erb +20 -0
  45. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern_rails.md +14 -0
  46. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +2 -0
  47. data/app/pb_kits/playbook/pb_date_picker/docs/index.js +1 -0
  48. data/app/pb_kits/playbook/pb_date_picker/plugins/quickPick.tsx +10 -0
  49. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +10 -1
  50. data/app/pb_kits/playbook/pb_dialog/dialog.rb +2 -0
  51. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_turbo_frames.html.erb +117 -0
  52. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_turbo_frames_rails.md +9 -0
  53. data/app/pb_kits/playbook/pb_dialog/docs/example.yml +1 -0
  54. data/app/pb_kits/playbook/pb_dialog/index.js +106 -14
  55. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +43 -0
  56. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_colors.html.erb +55 -0
  57. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_colors_rails.md +1 -0
  58. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -1
  59. data/app/pb_kits/playbook/pb_draggable/draggable.rb +9 -1
  60. data/app/pb_kits/playbook/pb_draggable/index.js +139 -142
  61. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.jsx +4 -1
  62. data/app/pb_kits/playbook/pb_filter/docs/_filter_within_turbo_frames.html.erb +41 -0
  63. data/app/pb_kits/playbook/pb_filter/docs/_filter_within_turbo_frames.md +1 -0
  64. data/app/pb_kits/playbook/pb_filter/docs/example.yml +1 -0
  65. data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +22 -18
  66. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_pb_styles.jsx +30 -0
  67. data/app/pb_kits/playbook/pb_gauge/docs/_gauge_pb_styles.md +1 -0
  68. data/app/pb_kits/playbook/pb_gauge/docs/example.yml +1 -0
  69. data/app/pb_kits/playbook/pb_gauge/docs/index.js +1 -0
  70. data/app/pb_kits/playbook/pb_gauge/gaugeTheme.ts +85 -0
  71. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.jsx +52 -0
  72. data/app/pb_kits/playbook/pb_line_graph/docs/_line_graph_pb_styles.md +1 -0
  73. data/app/pb_kits/playbook/pb_line_graph/docs/example.yml +1 -0
  74. data/app/pb_kits/playbook/pb_line_graph/docs/index.js +1 -0
  75. data/app/pb_kits/playbook/pb_line_graph/lineGraphTheme.ts +110 -0
  76. data/app/pb_kits/playbook/pb_overlay/_overlay.scss +34 -0
  77. data/app/pb_kits/playbook/pb_overlay/_overlay.tsx +25 -4
  78. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_fullscreen_background.jsx +49 -0
  79. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_fullscreen_background.md +1 -0
  80. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_fullscreen_opacity.jsx +81 -0
  81. data/app/pb_kits/playbook/pb_overlay/docs/_overlay_fullscreen_opacity.md +1 -0
  82. data/app/pb_kits/playbook/pb_overlay/docs/example.yml +2 -0
  83. data/app/pb_kits/playbook/pb_overlay/docs/index.js +2 -0
  84. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +13 -0
  85. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +3 -1
  86. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.html.erb +10 -0
  87. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.jsx +20 -0
  88. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_country_search.md +1 -0
  89. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_validation.jsx +8 -1
  90. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +2 -0
  91. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
  92. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
  93. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +19 -0
  94. data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.html.erb +46 -0
  95. data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.md +1 -0
  96. data/app/pb_kits/playbook/pb_popover/docs/example.yml +1 -0
  97. data/app/pb_kits/playbook/pb_popover/index.ts +13 -1
  98. data/app/pb_kits/playbook/pb_popover/popover.rb +2 -0
  99. data/app/pb_kits/playbook/pb_select/docs/_select_error.jsx +7 -2
  100. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.jsx +9 -1
  101. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.jsx +7 -1
  102. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.jsx +6 -2
  103. data/dist/chunks/_typeahead-D8CsVBZO.js +22 -0
  104. data/dist/chunks/_weekday_stacked-CHQsoCdP.js +45 -0
  105. data/dist/chunks/{lib-Cj4H6j1c.js → lib-BmTAc7Nc.js} +1 -1
  106. data/dist/chunks/{pb_form_validation-Bx1OK6xs.js → pb_form_validation-BWjy4bFn.js} +1 -1
  107. data/dist/chunks/vendor.js +1 -1
  108. data/dist/menu.yml +2 -2
  109. data/dist/playbook-doc.js +2 -2
  110. data/dist/playbook-rails-react-bindings.js +1 -1
  111. data/dist/playbook-rails.js +1 -1
  112. data/dist/playbook.css +1 -1
  113. data/lib/playbook/version.rb +2 -2
  114. metadata +42 -8
  115. data/dist/chunks/_typeahead-aRwivA3u.js +0 -22
  116. data/dist/chunks/_weekday_stacked-Bm5175-u.js +0 -45
  117. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_colors.md → _draggable_drop_zones_colors_react.md} +0 -0
  118. /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones.md → _draggable_drop_zones_react.md} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bbb4292478c72d434ee753aec73a3f805c891f91ec56e473fc218235f7db6838
4
- data.tar.gz: 9e07e43e6d9da0149a3472a74539b092d6743a425905377ab55938667e745984
3
+ metadata.gz: 676d756bcd1eb62b676282c0e74441ffade83e9b25d10e796a50bdbe822d84aa
4
+ data.tar.gz: 389e14aff56bbe684b8ecda79b54db9e4903142ebf20ab6a9227a36b6b12879d
5
5
  SHA512:
6
- metadata.gz: a3f6051e964012be59826c377cd47aac04f6e14330026b2f7daee6dfa4c0798ebc6fb2a0d866411fdbc2a6ed02876fb6f505b4026664b0719b4d725570db72ec
7
- data.tar.gz: 5e1bbb99105ed4d85d434f7381d2e6f8670bd46d5a5209219d55ce163524b8bbdf03d5fc9e4e6f27723c482921907e817cf38b4a410ab050dac749c6621113a0
6
+ metadata.gz: cf48871b90e1b69e6b52380b9af3228843758e70d1889744044bfccb80e12f2dfeb590b552489a838c13d8b04157c6ed20b84fcd50d648472fad7197c12e4b45
7
+ data.tar.gz: 591f7a30be8318184e0b1fe2679b04758666464a1fc3e705172530389bb6c81327b7f60083ea1607225f280b477545d3ec274f82d8eb5e978158deba63903668
@@ -10,7 +10,7 @@ import { highchartsDarkTheme } from "../pb_dashboard/pbChartsDarkTheme";
10
10
  import mapColors from "../pb_dashboard/pbChartsColorsHelper";
11
11
  import { globalProps } from "../utilities/globalProps";
12
12
  import { buildAriaProps, buildDataProps, buildHtmlProps } from "../utilities/props";
13
- import { merge } from '../utilities/object'
13
+ import { merge } from '../utilities/object'
14
14
 
15
15
  type CircleChartProps = {
16
16
  align?: "left" | "right" | "center";
@@ -28,7 +28,7 @@ test('uses exact classname', () => {
28
28
  value: 49,
29
29
  },
30
30
  {
31
- name: 'After call',
31
+ name: 'After Call',
32
32
  value: 10,
33
33
  },
34
34
  ]
@@ -39,7 +39,7 @@ test('uses exact classname', () => {
39
39
  id='circlechartid'
40
40
  />
41
41
  );
42
-
42
+
43
43
  const kit = screen.getByTestId(testId);
44
44
  expect(kit).toHaveClass('pb_circle_chart');
45
45
  });
@@ -0,0 +1,53 @@
1
+ import colors from '../tokens/exports/_colors.module.scss'
2
+ import typography from '../tokens/exports/_typography.module.scss'
3
+
4
+ const circleChartTheme = {
5
+ title: { text: "" },
6
+ chart: {
7
+ type: "pie",
8
+ },
9
+ tooltip: {
10
+ backgroundColor: {
11
+ linearGradient: { x1: 0, y1: 0, x2: 0, y2: 1 },
12
+ stops: [
13
+ [0, colors.bg_dark],
14
+ [1, colors.bg_dark],
15
+ ],
16
+ },
17
+ pointFormat:
18
+ '<span style="font-weight: bold; color:{point.color};">●</span>{point.name}: ' +
19
+ "<b>{point.y}</b>",
20
+ followPointer: true,
21
+ shadow: false,
22
+ borderWidth: 0,
23
+ borderRadius: 10,
24
+ style: {
25
+ fontFamily: typography.font_family_base,
26
+ color: colors.text_dk_default,
27
+ fontWeight: typography.regular,
28
+ fontSize: typography.text_smaller,
29
+ },
30
+ },
31
+ plotOptions: {
32
+ pie: {
33
+ dataLabels: {
34
+ enabled: false,
35
+ },
36
+ innerSize: '50%',
37
+ borderColor: "",
38
+ borderWidth: null as number | null,
39
+ colors: [
40
+ colors.data_1,
41
+ colors.data_2,
42
+ colors.data_3,
43
+ colors.data_4,
44
+ colors.data_5,
45
+ colors.data_6,
46
+ colors.data_7,
47
+ ],
48
+ },
49
+ },
50
+ credits: { enabled: false }
51
+ }
52
+
53
+ export default circleChartTheme;
@@ -7,7 +7,7 @@
7
7
  value: 49,
8
8
  },
9
9
  {
10
- name: 'After call',
10
+ name: 'After Call',
11
11
  value: 10,
12
12
  }
13
13
  ] %>
@@ -18,7 +18,7 @@
18
18
  chart_data: data_51,
19
19
  id: "with-a-block-2",
20
20
  rounded: true,
21
- }) do %>
21
+ }) do %>
22
22
  <%= pb_rails('title', props: {text: "83", size: 1, tag: 'div'}) %>
23
23
  <% end %>
24
24
 
@@ -13,7 +13,7 @@ const dataWithABlock = [
13
13
  value: 49,
14
14
  },
15
15
  {
16
- name: 'After call',
16
+ name: 'After Call',
17
17
  value: 10,
18
18
  },
19
19
  ]
@@ -7,7 +7,7 @@
7
7
  value: 49,
8
8
  },
9
9
  {
10
- name: 'After call',
10
+ name: 'After Call',
11
11
  value: 10,
12
12
  }
13
13
  ] %>
@@ -12,7 +12,7 @@ const dataWithColors = [
12
12
  value: 49,
13
13
  },
14
14
  {
15
- name: 'After call',
15
+ name: 'After Call',
16
16
  value: 10,
17
17
  },
18
18
  ]
@@ -7,7 +7,7 @@
7
7
  value: 49,
8
8
  },
9
9
  {
10
- name: 'After call',
10
+ name: 'After Call',
11
11
  value: 10,
12
12
  }
13
13
  ] %>
@@ -12,7 +12,7 @@ const data = [
12
12
  value: 49,
13
13
  },
14
14
  {
15
- name: 'After call',
15
+ name: 'After Call',
16
16
  value: 10,
17
17
  },
18
18
  ]
@@ -7,7 +7,7 @@
7
7
  value: 49,
8
8
  },
9
9
  {
10
- name: 'After call',
10
+ name: 'After Call',
11
11
  value: 10,
12
12
  }
13
13
  ] %>
@@ -12,7 +12,7 @@ const data = [
12
12
  value: 49,
13
13
  },
14
14
  {
15
- name: 'After call',
15
+ name: 'After Call',
16
16
  value: 10,
17
17
  },
18
18
  ]
@@ -7,7 +7,7 @@
7
7
  value: 49,
8
8
  },
9
9
  {
10
- name: 'After call',
10
+ name: 'After Call',
11
11
  value: 10,
12
12
  }
13
13
  ] %>
@@ -14,7 +14,7 @@ const data = [
14
14
  value: 49,
15
15
  },
16
16
  {
17
- name: 'After call',
17
+ name: 'After Call',
18
18
  value: 10,
19
19
  },
20
20
  ]
@@ -14,7 +14,7 @@ const CircleChartLiveData = (props) => {
14
14
  value: 49,
15
15
  },
16
16
  {
17
- name: 'After call',
17
+ name: 'After Call',
18
18
  value: 10,
19
19
  },
20
20
  ])
@@ -29,7 +29,7 @@ const CircleChartLiveData = (props) => {
29
29
  value: 12,
30
30
  },
31
31
  {
32
- name: 'After call',
32
+ name: 'After Call',
33
33
  value: 140,
34
34
  },
35
35
  ]
@@ -0,0 +1,38 @@
1
+ import React from 'react'
2
+ import circleChartTheme from '../circleChartTheme'
3
+ import Highcharts from "highcharts"
4
+ import HighchartsReact from "highcharts-react-official"
5
+
6
+ const data = [
7
+ {
8
+ name: 'Waiting for Calls',
9
+ y: 41,
10
+ },
11
+ {
12
+ name: 'On Call',
13
+ y: 49,
14
+ },
15
+ {
16
+ name: 'After Call',
17
+ y: 10,
18
+ },
19
+ ]
20
+
21
+ const baseOptions = {
22
+ series: [{ data: data }],
23
+ }
24
+
25
+ const CircleChartPbStyles = () => {
26
+ const options = Highcharts.merge({}, circleChartTheme, baseOptions )
27
+
28
+ return (
29
+ <div>
30
+ <HighchartsReact
31
+ highcharts={Highcharts}
32
+ options={options}
33
+ />
34
+ </div>
35
+ );
36
+ };
37
+
38
+ export default CircleChartPbStyles;
@@ -0,0 +1 @@
1
+ You don't need to use the Circle Chart Kit to apply Playbook styles to your Highcharts circle chart. Just import circleChartTheme.ts and merge it with your chart options—Playbook’s styling will apply automatically.
@@ -7,7 +7,7 @@
7
7
  value: 49,
8
8
  },
9
9
  {
10
- name: 'After call',
10
+ name: 'After Call',
11
11
  value: 10,
12
12
  }
13
13
  ] %>
@@ -12,7 +12,7 @@ const dataRounded = [
12
12
  value: 49,
13
13
  },
14
14
  {
15
- name: 'After call',
15
+ name: 'After Call',
16
16
  value: 10,
17
17
  },
18
18
  ]
@@ -14,6 +14,7 @@ examples:
14
14
 
15
15
  react:
16
16
  - circle_chart_default: Default Style
17
+ - circle_chart_pb_styles: Playbook Styles
17
18
  - circle_chart_live_data: Live Data
18
19
  - circle_chart_rounded: Rounded Corners
19
20
  - circle_chart_block: Accepts Any Block
@@ -22,7 +23,5 @@ examples:
22
23
  - circle_chart_with_legend_kit: Legend
23
24
  - circle_chart_legend_position: Legend Position
24
25
  - circle_chart_with_title: Title
25
- - circle_chart_inner_sizes: Inner Circle Size Options
26
+ - circle_chart_inner_sizes: Inner Circle Size Options
26
27
  - circle_chart_custom_tooltip: Tooltip Customization
27
-
28
-
@@ -8,4 +8,5 @@ export { default as CircleChartWithLegendKit } from './_circle_chart_with_legend
8
8
  export { default as CircleChartLegendPosition } from './_circle_chart_legend_position.jsx'
9
9
  export { default as CircleChartWithTitle } from './_circle_chart_with_title.jsx'
10
10
  export { default as CircleChartInnerSizes } from './_circle_chart_inner_sizes.jsx'
11
- export { default as CircleChartCustomTooltip } from "./_circle_chart_custom_tooltip.jsx"
11
+ export { default as CircleChartCustomTooltip } from "./_circle_chart_custom_tooltip.jsx"
12
+ export { default as CircleChartPbStyles } from "./_circle_chart_pb_styles.jsx"
@@ -53,4 +53,42 @@ $pb_button_styles: (
53
53
  }
54
54
  }
55
55
  }
56
- }
56
+ &.size_small {
57
+ @each $style in $pb_button_styles {
58
+ [class^=pb_button_kit][class*=_#{$style}] {
59
+ width: 20px;
60
+ height: 20px;
61
+ min-height: 20px;
62
+ border-radius: 10px;
63
+ line-height: 20px;
64
+ flex-basis: 20px;
65
+ min-width: 20px;
66
+ padding: 0;
67
+ }
68
+ }
69
+ // centering small icon svg
70
+ .pb_button_content {
71
+ display: flex;
72
+ align-items: center;
73
+ justify-content: center;
74
+ // rails
75
+ svg.pb_custom_icon {
76
+ height: 14px;
77
+ width: 14px;
78
+ vertical-align: middle;
79
+ }
80
+ // react (nested within an additional span)
81
+ > span {
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: center;
85
+ > svg.pb_custom_icon {
86
+ height: 14px;
87
+ width: 14px;
88
+ vertical-align: middle;
89
+ display: inline-block;
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
@@ -22,6 +22,7 @@ type CircleIconButtonProps = {
22
22
  type?: 'button' | 'submit' | 'reset' | undefined,
23
23
  target?: string
24
24
  variant?: 'primary' | 'secondary' | 'link',
25
+ size?: 'default' | 'sm',
25
26
  }
26
27
 
27
28
  const CircleIconButton = (props: CircleIconButtonProps): React.ReactElement => {
@@ -41,13 +42,16 @@ const CircleIconButton = (props: CircleIconButtonProps): React.ReactElement => {
41
42
  link,
42
43
  newWindow,
43
44
  variant,
45
+ size = 'default',
44
46
  } = props
45
47
 
46
48
  const ariaProps = buildAriaProps(aria)
47
49
  const dataProps = buildDataProps(data)
48
50
  const htmlProps = buildHtmlProps(htmlOptions)
51
+ const sizeClass = size === 'sm' ? 'size_small' : ''
49
52
  const classes = classnames(
50
53
  buildCss('pb_circle_icon_button_kit'),
54
+ sizeClass,
51
55
  globalProps(props),
52
56
  className
53
57
  )
@@ -18,8 +18,16 @@ module Playbook
18
18
  prop :new_window, type: Playbook::Props::Boolean,
19
19
  default: false
20
20
  prop :target
21
+ prop :size, type: Playbook::Props::Enum,
22
+ values: %w[default sm],
23
+ default: "default"
24
+
21
25
  def classname
22
- generate_classname("pb_circle_icon_button_kit")
26
+ generate_classname("pb_circle_icon_button_kit") + size_class
27
+ end
28
+
29
+ def size_class
30
+ size == "sm" ? " size_small" : ""
23
31
  end
24
32
  end
25
33
  end
@@ -30,3 +30,17 @@ test('passes loading prop to button', () => {
30
30
 
31
31
  expect(button).toBeInTheDocument()
32
32
  })
33
+
34
+ test('adds size_small class when size is sm', () => {
35
+ render(
36
+ <CircleIconButton
37
+ data={{ testid: 'small-size-test' }}
38
+ icon="plus"
39
+ size="sm"
40
+ />
41
+ )
42
+
43
+ const kit = screen.getByTestId('small-size-test')
44
+
45
+ expect(kit).toHaveClass('pb_circle_icon_button_kit size_small')
46
+ })
@@ -0,0 +1,28 @@
1
+ <%= pb_rails("flex", props: { orientation: "column", gap: "sm" }) do %>
2
+ <%= pb_rails("circle_icon_button", props: {
3
+ icon: "plus",
4
+ size: "sm",
5
+ variant: "primary"
6
+ }) %>
7
+
8
+ <%= pb_rails("circle_icon_button", props: {
9
+ icon: "pen",
10
+ loading: true,
11
+ size: "sm",
12
+ variant: "secondary"
13
+ }) %>
14
+
15
+ <%= pb_rails("circle_icon_button", props: {
16
+ disabled: true,
17
+ icon: "times",
18
+ size: "sm"
19
+ }) %>
20
+
21
+ <%= pb_rails("circle_icon_button", props: {
22
+ icon: "info",
23
+ link: "https://playbook.powerapp.cloud/",
24
+ size: "sm",
25
+ target: "child",
26
+ variant: "link"
27
+ }) %>
28
+ <% end %>
@@ -0,0 +1,42 @@
1
+ import React from 'react'
2
+
3
+ import CircleIconButton from '../_circle_icon_button'
4
+ import Flex from '../../pb_flex/_flex'
5
+
6
+ const CircleIconButtonSize = (props) => (
7
+ <>
8
+ <Flex gap="sm"
9
+ orientation="column"
10
+ >
11
+ <CircleIconButton
12
+ icon="plus"
13
+ size="sm"
14
+ variant="primary"
15
+ {...props}
16
+ />
17
+ <CircleIconButton
18
+ icon="pen"
19
+ loading
20
+ size="sm"
21
+ variant="secondary"
22
+ {...props}
23
+ />
24
+ <CircleIconButton
25
+ disabled
26
+ icon="times"
27
+ size="sm"
28
+ {...props}
29
+ />
30
+ <CircleIconButton
31
+ icon="info"
32
+ link="https://playbook.powerapp.cloud/"
33
+ size="sm"
34
+ target="child"
35
+ variant="link"
36
+ {...props}
37
+ />
38
+ </Flex>
39
+ </>
40
+ )
41
+
42
+ export default CircleIconButtonSize
@@ -0,0 +1 @@
1
+ The `size` prop accepts "sm" as a value to make the Circle Icon Button 20px x 20px instead of the default 40px x 40px size.
@@ -4,9 +4,11 @@ examples:
4
4
  - circle_icon_button_default: Default
5
5
  - circle_icon_button_link: Link
6
6
  - circle_icon_button_loading: Loading
7
+ - circle_icon_button_size: Size
7
8
 
8
9
  react:
9
10
  - circle_icon_button_default: Default
10
11
  - circle_icon_button_click: Click Handler
11
12
  - circle_icon_button_link: Link
12
13
  - circle_icon_button_loading: Loading
14
+ - circle_icon_button_size: Size
@@ -2,3 +2,4 @@ export { default as CircleIconButtonDefault } from './_circle_icon_button_defaul
2
2
  export { default as CircleIconButtonClick } from './_circle_icon_button_click.jsx'
3
3
  export { default as CircleIconButtonLink } from './_circle_icon_button_link.jsx'
4
4
  export { default as CircleIconButtonLoading } from './_circle_icon_button_loading.jsx'
5
+ export { default as CircleIconButtonSize } from './_circle_icon_button_size.jsx'
@@ -0,0 +1,14 @@
1
+ <%= pb_rails("body", props: { cursor: "pointer", data: { "external-copy-from": "hookbody"} }) do %>
2
+ <span id="hookbody">I'm a custom copy hook! Click this body to copy this text!</span>
3
+ <% end %>
4
+
5
+ <%= pb_rails("tooltip", props: {
6
+ trigger_element_selector: "#hookbody",
7
+ tooltip_id: "hookbody_tooltip",
8
+ position: 'top',
9
+ trigger_method: "click"
10
+ }) do %>
11
+ Copied!
12
+ <% end %>
13
+
14
+ <%= pb_rails("textarea", props: { margin_top: "xs", placeholder: "Paste here" }) %>
@@ -0,0 +1,3 @@
1
+ You can use any external control (like the text itself or an icon) to copy. To use this hook, set the `data-external-copy-from` attribute on the external control to the copying ID. This will grab the `innerText` from `your_id` element, or `value` if it is an input element. Alternatively, you can set a `data-external-copy-value` attribute and copy custom text.
2
+
3
+ See the code example for details.
@@ -2,6 +2,7 @@ examples:
2
2
  rails:
3
3
  - copy_button_default: Default
4
4
  - copy_button_from: Copy From
5
+ - copy_button_hook_rails: Copy Hook
5
6
 
6
7
  react:
7
8
  - copy_button_default: Default
@@ -1,6 +1,33 @@
1
1
  import PbEnhancedElement from "../pb_enhanced_element"
2
2
 
3
- export default class PbCopyButton extends PbEnhancedElement {
3
+ function getTextFromElement(element) {
4
+ if (!element) return ''
5
+ return element.tagName.toLowerCase() === 'input'
6
+ ? element.value
7
+ : element.innerText
8
+ }
9
+
10
+ function copyTextToClipboard(text) {
11
+ if (!text) return
12
+ navigator.clipboard.writeText(text)
13
+ .catch(err => console.error('Failed to copy text:', err))
14
+ }
15
+
16
+ function handleExternalControlCopyClick(element) {
17
+ const value = element.getAttribute('data-external-copy-value')
18
+ const fromId = element.getAttribute('data-external-copy-from')
19
+
20
+ if (value) {
21
+ copyTextToClipboard(value)
22
+ } else if (fromId) {
23
+ const fromElement = document.querySelector(`#${fromId}`)
24
+ copyTextToClipboard(getTextFromElement(fromElement))
25
+ } else {
26
+ console.warn('Failed to copy:', element)
27
+ }
28
+ }
29
+
30
+ export class PbCopyButton extends PbEnhancedElement {
4
31
  static get selector() {
5
32
  return '.pb_copy_button_kit'
6
33
  }
@@ -20,28 +47,27 @@ export default class PbCopyButton extends PbEnhancedElement {
20
47
  }
21
48
 
22
49
  handleClick() {
50
+ const value = this.element.getAttribute('data-copy-value')
23
51
  const fromId = this.element.getAttribute('data-from')
24
- if (fromId) {
25
- const fromElement = document.querySelector(`#${fromId}`)
26
- if (fromElement) {
27
- let contentToCopy = ''
28
- if (fromElement.tagName.toLowerCase() === 'input') {
29
- contentToCopy = fromElement.value
30
- } else {
31
- contentToCopy = fromElement.innerText
32
- }
33
- navigator.clipboard.writeText(contentToCopy)
34
- .catch(err => console.error('Failed to copy text', err))
35
- return
36
- }
37
- }
38
52
 
39
- const textToCopy = this.element.getAttribute('data-copy-value')
40
- if (textToCopy) {
41
- navigator.clipboard.writeText(textToCopy)
42
- .catch(err => console.error('Failed to copy text', err))
53
+ if (value) {
54
+ copyTextToClipboard(value)
55
+ } else if (fromId) {
56
+ const fromElement = document.querySelector(`#${fromId}`)
57
+ copyTextToClipboard(getTextFromElement(fromElement))
43
58
  } else {
44
- console.warn('No data-copy-value attribute found or data-from element')
59
+ console.warn('No data-copy-value or data-from attribute found')
45
60
  }
46
61
  }
47
62
  }
63
+
64
+ export function addCopyEventListeners() {
65
+ const externalCopyElements = [
66
+ ...document.querySelectorAll('div[data-external-copy-value]'),
67
+ ...document.querySelectorAll('div[data-external-copy-from]')
68
+ ]
69
+
70
+ externalCopyElements.forEach(element => {
71
+ element.addEventListener('click', () => handleExternalControlCopyClick(element))
72
+ })
73
+ }
@@ -50,6 +50,10 @@ type DatePickerProps = {
50
50
  timeFormat?: string,
51
51
  type?: string,
52
52
  yearRange?: number[],
53
+ controlsStartId?: string,
54
+ controlsEndId?: string,
55
+ syncStartWith?: string,
56
+ syncEndWith?: string,
53
57
  } & GlobalProps
54
58
 
55
59
  const DatePicker = (props: DatePickerProps): React.ReactElement => {
@@ -98,6 +102,10 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
98
102
  staticPosition = true,
99
103
  thisRangesEndToday = false,
100
104
  yearRange = [1900, 2100],
105
+ controlsStartId,
106
+ controlsEndId,
107
+ syncStartWith,
108
+ syncEndWith,
101
109
  } = props
102
110
 
103
111
  const ariaProps = buildAriaProps(aria)
@@ -134,6 +142,10 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
134
142
  staticPosition,
135
143
  thisRangesEndToday,
136
144
  yearRange,
145
+ controlsStartId,
146
+ controlsEndId,
147
+ syncStartWith,
148
+ syncEndWith,
137
149
  required: false,
138
150
  }, scrollContainer)
139
151
  }, initializeOnce ? [] : undefined)