playbook_ui 14.6.2 → 14.7.0.pre.alpha.PBNTR637quickpickdefaultdate4492

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +3 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +8 -1
  4. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +21 -28
  5. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +37 -1
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_custom_cell.jsx +13 -2
  7. data/app/pb_kits/playbook/pb_card/_card.tsx +11 -4
  8. data/app/pb_kits/playbook/pb_card/_card_mixin.scss +1 -2
  9. data/app/pb_kits/playbook/pb_card/docs/_card_light.md +1 -1
  10. data/app/pb_kits/playbook/pb_currency/_currency.tsx +16 -6
  11. data/app/pb_kits/playbook/pb_currency/currency.rb +38 -11
  12. data/app/pb_kits/playbook/pb_currency/currency.test.js +35 -0
  13. data/app/pb_kits/playbook/pb_currency/docs/_currency_comma_separator.html.erb +7 -0
  14. data/app/pb_kits/playbook/pb_currency/docs/_currency_comma_separator.jsx +18 -0
  15. data/app/pb_kits/playbook/pb_currency/docs/_currency_comma_separator.md +3 -0
  16. data/app/pb_kits/playbook/pb_currency/docs/example.yml +3 -1
  17. data/app/pb_kits/playbook/pb_currency/docs/index.js +1 -0
  18. data/app/pb_kits/playbook/pb_date/_date.scss +3 -0
  19. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +1 -1
  20. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_default_date.html.erb +42 -0
  21. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_default_date.jsx +44 -0
  22. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_default_date.md +1 -0
  23. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +2 -0
  24. data/app/pb_kits/playbook/pb_date_picker/docs/index.js +1 -0
  25. data/app/pb_kits/playbook/pb_date_picker/plugins/quickPick.tsx +17 -1
  26. data/app/pb_kits/playbook/pb_dialog/_dialog.tsx +5 -1
  27. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default_rails.html.erb +26 -0
  28. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_default_rails.md +7 -0
  29. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards_rails.html.erb +38 -0
  30. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_cards_rails.md +0 -0
  31. data/app/pb_kits/playbook/pb_draggable/docs/_draggable_with_list_rails.html.erb +19 -0
  32. data/app/pb_kits/playbook/pb_draggable/docs/example.yml +6 -0
  33. data/app/pb_kits/playbook/pb_draggable/draggable.html.erb +3 -0
  34. data/app/pb_kits/playbook/pb_draggable/draggable.rb +18 -0
  35. data/app/pb_kits/playbook/pb_draggable/draggable_container.html.erb +3 -0
  36. data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +15 -0
  37. data/app/pb_kits/playbook/pb_draggable/draggable_item.html.erb +7 -0
  38. data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +18 -0
  39. data/app/pb_kits/playbook/pb_draggable/index.js +125 -0
  40. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +8 -7
  41. data/app/pb_kits/playbook/pb_flex/_flex.tsx +3 -1
  42. data/app/pb_kits/playbook/pb_flex/_flex_item.tsx +8 -2
  43. data/app/pb_kits/playbook/pb_flex/flex_item.html.erb +3 -6
  44. data/app/pb_kits/playbook/pb_flex/flex_item.rb +7 -2
  45. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +6 -2
  46. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +30 -26
  47. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text.html.erb +24 -1
  48. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text.jsx +25 -2
  49. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text_rails.md +3 -0
  50. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text_react.md +1 -0
  51. data/app/pb_kits/playbook/pb_form_pill/form_pill.html.erb +46 -8
  52. data/app/pb_kits/playbook/pb_link/_link.scss +66 -0
  53. data/app/pb_kits/playbook/pb_link/_link.tsx +107 -0
  54. data/app/pb_kits/playbook/pb_link/docs/_link_color.html.erb +30 -0
  55. data/app/pb_kits/playbook/pb_link/docs/_link_color.jsx +40 -0
  56. data/app/pb_kits/playbook/pb_link/docs/_link_disabled.html.erb +5 -0
  57. data/app/pb_kits/playbook/pb_link/docs/_link_disabled.jsx +15 -0
  58. data/app/pb_kits/playbook/pb_link/docs/_link_icon.html.erb +15 -0
  59. data/app/pb_kits/playbook/pb_link/docs/_link_icon.jsx +25 -0
  60. data/app/pb_kits/playbook/pb_link/docs/_link_tag.html.erb +35 -0
  61. data/app/pb_kits/playbook/pb_link/docs/_link_tag.jsx +45 -0
  62. data/app/pb_kits/playbook/pb_link/docs/_link_underline.html.erb +5 -0
  63. data/app/pb_kits/playbook/pb_link/docs/_link_underline.jsx +15 -0
  64. data/app/pb_kits/playbook/pb_link/docs/example.yml +16 -0
  65. data/app/pb_kits/playbook/pb_link/docs/index.js +5 -0
  66. data/app/pb_kits/playbook/pb_link/link.html.erb +21 -0
  67. data/app/pb_kits/playbook/pb_link/link.rb +44 -0
  68. data/app/pb_kits/playbook/pb_link/link.test.jsx +92 -0
  69. data/app/pb_kits/playbook/pb_popover/_popover.tsx +1 -1
  70. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +67 -1
  71. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.tsx +1 -0
  72. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.html.erb +1 -1
  73. data/app/pb_kits/playbook/pb_selectable_card/selectable_card.rb +5 -1
  74. data/app/pb_kits/playbook/pb_skeleton_loading/_skeleton_loading.scss +37 -0
  75. data/app/pb_kits/playbook/pb_skeleton_loading/_skeleton_loading.tsx +67 -0
  76. data/app/pb_kits/playbook/pb_skeleton_loading/_skeleton_loading_mixins.scss +40 -0
  77. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_border_radius.jsx +51 -0
  78. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_border_radius.md +1 -0
  79. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_color.jsx +26 -0
  80. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_color.md +1 -0
  81. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_default.html.erb +1 -0
  82. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_default.jsx +11 -0
  83. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_height_width.jsx +59 -0
  84. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_height_width.md +3 -0
  85. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_layout.jsx +20 -0
  86. data/app/pb_kits/playbook/pb_skeleton_loading/docs/_skeleton_loading_layout.md +3 -0
  87. data/app/pb_kits/playbook/pb_skeleton_loading/docs/example.yml +13 -0
  88. data/app/pb_kits/playbook/pb_skeleton_loading/docs/index.js +5 -0
  89. data/app/pb_kits/playbook/pb_skeleton_loading/skeleton_loading.html.erb +12 -0
  90. data/app/pb_kits/playbook/pb_skeleton_loading/skeleton_loading.rb +8 -0
  91. data/app/pb_kits/playbook/pb_skeleton_loading/skeleton_loading.test.jsx +81 -0
  92. data/app/pb_kits/playbook/pb_timeline/_item.tsx +59 -23
  93. data/app/pb_kits/playbook/pb_timeline/_timeline.tsx +8 -0
  94. data/app/pb_kits/playbook/pb_timeline/detail.html.erb +3 -0
  95. data/app/pb_kits/playbook/pb_timeline/detail.rb +11 -0
  96. data/app/pb_kits/playbook/pb_timeline/docs/_timeline_with_children.html.erb +43 -0
  97. data/app/pb_kits/playbook/pb_timeline/docs/_timeline_with_children.jsx +68 -0
  98. data/app/pb_kits/playbook/pb_timeline/docs/_timeline_with_children.md +2 -0
  99. data/app/pb_kits/playbook/pb_timeline/docs/example.yml +2 -1
  100. data/app/pb_kits/playbook/pb_timeline/docs/index.js +1 -0
  101. data/app/pb_kits/playbook/pb_timeline/item.html.erb +17 -21
  102. data/app/pb_kits/playbook/pb_timeline/item.rb +4 -0
  103. data/app/pb_kits/playbook/pb_timeline/label.html.erb +12 -0
  104. data/app/pb_kits/playbook/pb_timeline/label.rb +13 -0
  105. data/app/pb_kits/playbook/pb_timeline/step.html.erb +14 -0
  106. data/app/pb_kits/playbook/pb_timeline/step.rb +16 -0
  107. data/app/pb_kits/playbook/pb_timeline/subcomponents/Detail.tsx +29 -0
  108. data/app/pb_kits/playbook/pb_timeline/subcomponents/Label.tsx +38 -0
  109. data/app/pb_kits/playbook/pb_timeline/subcomponents/Step.tsx +42 -0
  110. data/app/pb_kits/playbook/pb_timeline/subcomponents/index.tsx +3 -0
  111. data/app/pb_kits/playbook/pb_timeline/timeline.test.js +84 -0
  112. data/app/pb_kits/playbook/tokens/_typography.scss +35 -0
  113. data/app/pb_kits/playbook/utilities/_hover.scss +46 -43
  114. data/app/pb_kits/playbook/utilities/globalPropNames.mjs +4 -0
  115. data/app/pb_kits/playbook/utilities/globalProps.ts +44 -2
  116. data/dist/chunks/_typeahead-DZmYDBaL.js +22 -0
  117. data/dist/chunks/_weekday_stacked-CgPamJiY.js +45 -0
  118. data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
  119. data/dist/chunks/{lib-D-mTv-kp.js → lib-BC6ESsxG.js} +1 -1
  120. data/dist/chunks/{pb_form_validation-BkWGwJsl.js → pb_form_validation-B_Z9rEbg.js} +1 -1
  121. data/dist/chunks/vendor.js +1 -1
  122. data/dist/menu.yml +8 -2
  123. data/dist/playbook-doc.js +1 -1
  124. data/dist/playbook-rails-react-bindings.js +1 -1
  125. data/dist/playbook-rails.js +1 -1
  126. data/dist/playbook.css +1 -1
  127. data/lib/playbook/hover.rb +4 -1
  128. data/lib/playbook/kit_base.rb +43 -5
  129. data/lib/playbook/version.rb +2 -2
  130. metadata +78 -11
  131. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text.md +0 -1
  132. data/dist/chunks/_typeahead-BV_n6U5W.js +0 -22
  133. data/dist/chunks/_weekday_stacked-Cy__g00H.js +0 -45
  134. data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
@@ -13,7 +13,30 @@
13
13
  id: "typeahead-form-pill",
14
14
  is_multi: true,
15
15
  options: names,
16
- label: "Names",
16
+ label: "Truncation Within Typeahead",
17
17
  pills: true,
18
18
  truncate: 1,
19
19
  }) %>
20
+
21
+ <%= pb_rails("caption", props: { text: "Form Pill Truncation" }) %>
22
+ <%= pb_rails("card", props: { max_width: "xs" }) do %>
23
+ <%= pb_rails("form_pill", props: {
24
+ name: "Princess Amelia Mignonette Grimaldi Thermopolis Renaldo",
25
+ avatar_url: "https://randomuser.me/api/portraits/women/44.jpg",
26
+ tabindex: 0,
27
+ truncate: 1,
28
+ id: "truncation-1"
29
+ }) %>
30
+ <%= pb_rails("form_pill", props: {
31
+ icon: "badge-check",
32
+ text: "icon and a very long tag to show truncation",
33
+ tabindex: 0,
34
+ truncate: 1,
35
+ id: "truncation-2"
36
+ }) %>
37
+ <%= pb_rails("form_pill", props: {
38
+ text: "form pill long tag no tooltip show truncation",
39
+ tabindex: 0,
40
+ truncate: 1,
41
+ }) %>
42
+ <% end %>
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import Typeahead from '../../pb_typeahead/_typeahead'
2
+ import { Card, Caption, FormPill, Typeahead } from 'playbook-ui'
3
3
 
4
4
  const names = [
5
5
  { label: 'Alexander Nathaniel Montgomery', value: 'Alexander Nathaniel Montgomery' },
@@ -15,11 +15,34 @@ const FormPillTruncatedText = (props) => {
15
15
  <Typeahead
16
16
  htmlOptions={{ style: { maxWidth: "240px" }}}
17
17
  isMulti
18
- label="Names"
18
+ label="Truncation Within Typeahead"
19
19
  options={names}
20
20
  truncate={1}
21
21
  {...props}
22
22
  />
23
+ <Caption text="Form Pill Truncation"/>
24
+ <Card maxWidth="xs">
25
+ <FormPill
26
+ avatarUrl="https://randomuser.me/api/portraits/women/44.jpg"
27
+ name="Princess Amelia Mignonette Grimaldi Thermopolis Renaldo"
28
+ onClick={() => alert('Click!')}
29
+ tabIndex={0}
30
+ truncate={1}
31
+ />
32
+ <FormPill
33
+ icon="badge-check"
34
+ onClick={() => {alert('Click!')}}
35
+ tabIndex={0}
36
+ text="icon and a very long tag to show truncation"
37
+ truncate={1}
38
+ />
39
+ <FormPill
40
+ onClick={() => {alert('Click!')}}
41
+ tabIndex={0}
42
+ text="form pill with a very long tag to show truncation"
43
+ truncate={1}
44
+ />
45
+ </Card>
23
46
  </>
24
47
  )
25
48
  }
@@ -0,0 +1,3 @@
1
+ For Form Pills with longer text, the truncate global prop can be used to truncate the label within each Form Pill. See [here](https://playbook.powerapp.cloud/visual_guidelines/truncate) for more information on the truncate global prop.
2
+
3
+ __NOTE__: For Rails Form Pills (not ones embedded within a React-rendered Typeahead or MultiLevelSelect), a unique `id` is required to enable the Tooltip functionality displaying the text or tag section of the Form Pill.
@@ -0,0 +1 @@
1
+ For Form Pills with longer text, the `truncate` global prop can be used to truncate the label within each Form Pill. Hover over the truncated Form Pill and a Tooltip containing the text or tag section of the Form Pill will appear. See [here](https://playbook.powerapp.cloud/visual_guidelines/truncate) for more information on the truncate global prop.
@@ -1,19 +1,57 @@
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
3
  <%= pb_rails("avatar", props: { name: object.name, image_url: object.avatar_url, size: "xxs" }) %>
4
- <%= pb_rails("title", props: { text: object.name, size: 4, classname: "pb_form_pill_text" }) %>
4
+ <% if object.truncate %>
5
+ <div>
6
+ <%= pb_rails("title", props: {
7
+ classname: "pb_form_pill_text truncate_#{object.truncate}",
8
+ id: object.id,
9
+ size: 4,
10
+ text: object.name,
11
+ }) %>
12
+ <% if object.id.present? %>
13
+ <%= pb_rails("tooltip", props: {
14
+ position: "top",
15
+ tooltip_id: "tooltip-#{object.id}",
16
+ trigger_element_selector: "##{object.id}"
17
+ }) do %>
18
+ <%= object.name %>
19
+ <% end %>
20
+ <% end %>
21
+ </div>
22
+ <% else %>
23
+ <%= pb_rails("title", props: { classname: "pb_form_pill_text", id: object.id, size: 4, text: object.name }) %>
24
+ <% end %>
5
25
  <% if object.icon.present? %>
6
26
  <%= pb_rails("icon", props: { classname: "pb_form_pill_icon", color: object.color, icon: object.icon }) %>
7
27
  <% end %>
8
28
  <% elsif object.text.present? %>
9
- <% if object.icon.present? %>
10
- <%= pb_rails("icon", props: { classname: "pb_form_pill_icon", color: object.color, icon: object.icon }) %>
11
- <% end %>
12
- <% if object.text.present? %>
13
- <%= pb_rails("title", props: { text: object.text, size: 4, classname: "pb_form_pill_tag" }) %>
14
- <% end %>
29
+ <% if object.icon.present? %>
30
+ <%= pb_rails("icon", props: { classname: "pb_form_pill_icon", color: object.color, icon: object.icon }) %>
31
+ <% end %>
32
+ <% if object.truncate %>
33
+ <div>
34
+ <%= pb_rails("title", props: {
35
+ classname: "pb_form_pill_tag truncate_#{object.truncate}",
36
+ id: object.id,
37
+ size: 4,
38
+ text: object.text,
39
+ }) %>
40
+ <% if object.id.present? %>
41
+ <%= pb_rails("tooltip", props: {
42
+ position: "top",
43
+ tooltip_id: "tooltip-#{object.id}",
44
+ trigger_element_selector: "##{object.id}"
45
+ }) do %>
46
+ <%= object.text %>
47
+ <% end %>
48
+ <% end %>
49
+ </div>
50
+ <% else %>
51
+ <%= pb_rails("title", props: { classname: "pb_form_pill_tag", id: object.id, size: 4, text: object.text, }) %>
52
+ <% end %>
15
53
  <% end %>
16
54
  <%= pb_rails("body", props: { classname: "pb_form_pill_close" }) do %>
17
55
  <%= pb_rails("icon", props: { icon: 'times', fixed_width: true, size: object.close_icon_size }) %>
18
56
  <% end %>
19
- <% end %>
57
+ <% end %>
@@ -0,0 +1,66 @@
1
+ @import "../tokens/colors";
2
+ @import "../tokens/line_height";
3
+ @import "../tokens/typography";
4
+ @import "../tokens/border_radius";
5
+
6
+ [class^=pb_link_kit]{
7
+ @include pb_link($primary);
8
+ &:hover {
9
+ color: $text_lt_default;
10
+ }
11
+ &:focus {
12
+ outline: none;
13
+ }
14
+ &:focus-visible {
15
+ border-radius: $border_rad_light;
16
+ outline: 1px solid $primary;
17
+ outline-offset: 2px;
18
+ }
19
+ &:visited {
20
+ color: $data_3;
21
+ }
22
+ &.dark {
23
+ @include pb_link($active_dark);
24
+ &:hover {
25
+ color: $text_dk_default;
26
+ }
27
+ }
28
+ @each $color_name, $color_value in $pb_link_colors {
29
+ &[class*=_#{"" + $color_name}] {
30
+ @include pb_link($color_value);
31
+
32
+ &:hover {
33
+ color: map-get($pb_link_hover_colors, $color_name);
34
+ }
35
+
36
+ &:visited {
37
+ color: $data_3;
38
+ }
39
+ }
40
+ }
41
+
42
+ @each $dark_color_name, $dark_color_value in $pb_dark_link_colors{
43
+ &[class*=_#{$dark_color_name}][class*=dark]{
44
+ @include pb_link($dark_color_value);
45
+
46
+ &:hover {
47
+ color: map-get($pb_dark_link_hover_colors, $dark_color_name);
48
+ }
49
+
50
+ &:visited {
51
+ color: $data_3;
52
+ }
53
+ }
54
+ }
55
+
56
+ &[class*=_underline] {
57
+ text-decoration: underline;
58
+ }
59
+
60
+ &[class*=_disabled] {
61
+ pointer-events: none;
62
+ cursor: default;
63
+ color: $text_lt_lighter;
64
+ }
65
+
66
+ }
@@ -0,0 +1,107 @@
1
+ import React from 'react'
2
+ import classnames from 'classnames'
3
+
4
+ import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
5
+ import { globalProps, GlobalProps } from '../utilities/globalProps'
6
+
7
+ import Icon from '../pb_icon/_icon'
8
+
9
+ type LinkProps = {
10
+ aria?: {[key: string]: string},
11
+ className?: string,
12
+ children?: React.ReactChild[] | React.ReactChild,
13
+ color?: 'default' | 'body' | 'muted' | 'destructive',
14
+ dark?: boolean,
15
+ data?: {[key: string]: string},
16
+ disabled?: boolean,
17
+ href?: string,
18
+ htmlOptions?: {[key: string]: string | number | boolean | (() => void) | ((arg?: Event) => void)},
19
+ icon?: string,
20
+ iconRight?: string,
21
+ id?: string,
22
+ tag?: 'a' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div',
23
+ text?: string,
24
+ underline?: boolean,
25
+ } & GlobalProps
26
+
27
+ const Link = (props: LinkProps): React.ReactElement => {
28
+ const {
29
+ aria = {},
30
+ children,
31
+ className,
32
+ color = '',
33
+ data = {},
34
+ disabled = false,
35
+ href= '',
36
+ htmlOptions = {},
37
+ icon = '',
38
+ iconRight = '',
39
+ id = '',
40
+ tag = 'a',
41
+ text = '',
42
+ underline = false,
43
+ } = props
44
+
45
+ const ariaProps: {[key: string]: string} = buildAriaProps(aria)
46
+ const dataProps: {[key: string]: string} = buildDataProps(data)
47
+ const htmlProps = buildHtmlProps(htmlOptions);
48
+ const classes = classnames(
49
+ buildCss('pb_link_kit', color, underline ? 'underline' : '', disabled ? 'disabled' : ''),
50
+ globalProps(props),
51
+ className
52
+ )
53
+ const Tag = tag as keyof JSX.IntrinsicElements
54
+
55
+ const renderContent = () => (
56
+ <>
57
+ {icon && (
58
+ <Icon
59
+ fixedWidth
60
+ icon={icon}
61
+ marginRight="xxs"
62
+ size="xs"
63
+ />
64
+ )}
65
+ {text || children}
66
+ {iconRight && (
67
+ <Icon
68
+ fixedWidth
69
+ icon={iconRight}
70
+ marginLeft="xxs"
71
+ size="xs"
72
+ />
73
+ )}
74
+ </>
75
+ )
76
+
77
+ const commonProps = {
78
+ ...ariaProps,
79
+ ...dataProps,
80
+ ...htmlProps,
81
+ className: classes,
82
+ id,
83
+ }
84
+
85
+ if (tag === 'a') {
86
+ return (
87
+ <a
88
+ {...commonProps}
89
+ href={href}
90
+ >
91
+ {renderContent()}
92
+ </a>
93
+ )
94
+ } else {
95
+ return (
96
+ <a
97
+ {...commonProps}
98
+ href={href}
99
+ >
100
+ <Tag>{renderContent()}</Tag>
101
+ </a>
102
+ )
103
+ }
104
+
105
+ }
106
+
107
+ export default Link
@@ -0,0 +1,30 @@
1
+ <div>
2
+ <%= pb_rails("link", props: {
3
+ text: "link example",
4
+ href: "https://www.google.com/search?q=playbook+design+system",
5
+ }) %>
6
+ </div>
7
+
8
+ <div>
9
+ <%= pb_rails("link", props: {
10
+ text: "link example",
11
+ href: "https://www.youtube.com/@PowerHRG",
12
+ color: "body",
13
+ }) %>
14
+ </div>
15
+
16
+ <div>
17
+ <%= pb_rails("link", props: {
18
+ text: "link example",
19
+ href: "https://github.com/powerhome/.github/blob/main/profile/README.md",
20
+ color: "muted",
21
+ }) %>
22
+ </div>
23
+
24
+ <div>
25
+ <%= pb_rails("link", props: {
26
+ text: "link example",
27
+ href: "https://rubygems.org/gems/playbook_ui/",
28
+ color: "destructive",
29
+ }) %>
30
+ </div>
@@ -0,0 +1,40 @@
1
+ import React from 'react'
2
+ import { Link } from 'playbook-ui'
3
+
4
+ const LinkColor = (props) => (
5
+ <div>
6
+ <div>
7
+ <Link
8
+ href="https://www.google.com/search?q=playbook+design+system"
9
+ text="link example"
10
+ {...props}
11
+ />
12
+ </div>
13
+ <div>
14
+ <Link
15
+ color="body"
16
+ href="https://www.youtube.com/@PowerHRG"
17
+ text="link example"
18
+ {...props}
19
+ />
20
+ </div>
21
+ <div>
22
+ <Link
23
+ color="muted"
24
+ href="https://github.com/powerhome/.github/blob/main/profile/README.md"
25
+ text="link example"
26
+ {...props}
27
+ />
28
+ </div>
29
+ <div>
30
+ <Link
31
+ color="destructive"
32
+ href="https://rubygems.org/gems/playbook_ui/"
33
+ text="link example"
34
+ {...props}
35
+ />
36
+ </div>
37
+ </div>
38
+ )
39
+
40
+ export default LinkColor
@@ -0,0 +1,5 @@
1
+ <%= pb_rails("link", props: {
2
+ text: "link example",
3
+ href: "#disabled",
4
+ disabled: true,
5
+ }) %>
@@ -0,0 +1,15 @@
1
+ import React from 'react'
2
+ import { Link } from 'playbook-ui'
3
+
4
+ const LinkDisabled = (props) => (
5
+ <div>
6
+ <Link
7
+ disabled
8
+ href="#disabled"
9
+ text="link example"
10
+ {...props}
11
+ />
12
+ </div>
13
+ )
14
+
15
+ export default LinkDisabled
@@ -0,0 +1,15 @@
1
+ <div>
2
+ <%= pb_rails("link", props: {
3
+ text: "link example",
4
+ href: "#icon",
5
+ icon: "arrow-up-right-from-square",
6
+ }) %>
7
+ </div>
8
+
9
+ <div>
10
+ <%= pb_rails("link", props: {
11
+ text: "link example",
12
+ href: "#icon2",
13
+ icon_right: "chevron-right",
14
+ }) %>
15
+ </div>
@@ -0,0 +1,25 @@
1
+ import React from 'react'
2
+ import { Link } from 'playbook-ui'
3
+
4
+ const LinkIcon = (props) => (
5
+ <div>
6
+ <div>
7
+ <Link
8
+ href="#icon"
9
+ icon="arrow-up-right-from-square"
10
+ text="link example"
11
+ {...props}
12
+ />
13
+ </div>
14
+ <div>
15
+ <Link
16
+ href="#icon2"
17
+ iconRight="chevron-right"
18
+ text="link example"
19
+ {...props}
20
+ />
21
+ </div>
22
+ </div>
23
+ )
24
+
25
+ export default LinkIcon
@@ -0,0 +1,35 @@
1
+ <%= pb_rails("link", props: {
2
+ text: "h1 link example",
3
+ href: "#tag",
4
+ icon: "arrow-up-right-from-square",
5
+ tag: "h1",
6
+ }) %>
7
+
8
+ <%= pb_rails("link", props: {
9
+ text: "h3 link example",
10
+ href: "#tag2",
11
+ tag: "h3",
12
+ underline: true,
13
+ }) %>
14
+
15
+ <%= pb_rails("link", props: {
16
+ color: "destructive",
17
+ text: "h6 link example",
18
+ href: "#tag3",
19
+ tag: "h6",
20
+ }) %>
21
+
22
+ <%= pb_rails("link", props: {
23
+ text: "p link example",
24
+ href: "#tag4",
25
+ icon_right: "chevron-right",
26
+ tag: "p",
27
+ }) %>
28
+
29
+ <div>
30
+ This is a <%= pb_rails("link", props: {
31
+ text: "span link example",
32
+ href: "#tag5",
33
+ tag: "span",
34
+ }) %>
35
+ </div>
@@ -0,0 +1,45 @@
1
+ import React from 'react'
2
+ import { Link } from 'playbook-ui'
3
+
4
+ const LinkTag = (props) => (
5
+ <div>
6
+ <Link
7
+ href="#tag"
8
+ icon="arrow-up-right-from-square"
9
+ tag="h1"
10
+ text="h1 link example"
11
+ {...props}
12
+ />
13
+ <Link
14
+ href="#tag2"
15
+ tag="h3"
16
+ text="h3 link example"
17
+ underline
18
+ {...props}
19
+ />
20
+ <Link
21
+ color="destructive"
22
+ href="#tag3"
23
+ tag="h6"
24
+ text="h6 link example"
25
+ {...props}
26
+ />
27
+ <Link
28
+ href="#tag4"
29
+ iconRight="chevron-right"
30
+ tag="p"
31
+ text="p link example"
32
+ {...props}
33
+ />
34
+ <div>
35
+ This is a <Link
36
+ href="#tag5"
37
+ tag="span"
38
+ text="span link example"
39
+ {...props}
40
+ />
41
+ </div>
42
+ </div>
43
+ )
44
+
45
+ export default LinkTag
@@ -0,0 +1,5 @@
1
+ <%= pb_rails("link", props: {
2
+ text: "link example",
3
+ href: "#underline",
4
+ underline: true,
5
+ }) %>
@@ -0,0 +1,15 @@
1
+ import React from 'react'
2
+ import { Link } from 'playbook-ui'
3
+
4
+ const LinkUnderline = (props) => (
5
+ <div>
6
+ <Link
7
+ href="#underline"
8
+ text="link example"
9
+ underline
10
+ {...props}
11
+ />
12
+ </div>
13
+ )
14
+
15
+ export default LinkUnderline
@@ -0,0 +1,16 @@
1
+ examples:
2
+
3
+ rails:
4
+ - link_color: Color
5
+ - link_underline: Underline
6
+ - link_icon: Icon
7
+ - link_disabled: Disabled
8
+ - link_tag: Tag
9
+
10
+
11
+ react:
12
+ - link_color: Color
13
+ - link_underline: Underline
14
+ - link_icon: Icon
15
+ - link_disabled: Disabled
16
+ - link_tag: Tag
@@ -0,0 +1,5 @@
1
+ export { default as LinkColor } from './_link_color.jsx'
2
+ export { default as LinkUnderline } from './_link_underline.jsx'
3
+ export { default as LinkIcon } from './_link_icon.jsx'
4
+ export { default as LinkDisabled } from './_link_disabled.jsx'
5
+ export { default as LinkTag } from './_link_tag.jsx'
@@ -0,0 +1,21 @@
1
+ <% link_content = proc do %>
2
+ <% if object.icon.present? %>
3
+ <%= pb_rails("icon", props: { icon: object.icon, fixed_width: true, size: "xs", margin_right: "xxs" }) %>
4
+ <% end %>
5
+ <%= object.content %>
6
+ <% if object.icon_right.present? %>
7
+ <%= pb_rails("icon", props: { icon: object.icon_right, fixed_width: true, size: "xs", margin_left: "xxs" }) %>
8
+ <% end %>
9
+ <% end %>
10
+
11
+ <% if object.tag == "a" %>
12
+ <%= pb_content_tag(object.tag, { href: object.href }) do %>
13
+ <%= link_content.call %>
14
+ <% end %>
15
+ <% else %>
16
+ <%= pb_content_tag(:a, { href: object.href }) do %>
17
+ <%= content_tag(object.tag) do %>
18
+ <%= link_content.call %>
19
+ <% end %>
20
+ <% end %>
21
+ <% end %>
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbLink
5
+ class Link < ::Playbook::KitBase
6
+ prop :color, type: Playbook::Props::Enum,
7
+ values: %w[default body muted destructive],
8
+ default: "default"
9
+ prop :disabled, type: Playbook::Props::Boolean,
10
+ default: false
11
+ prop :href
12
+ prop :icon
13
+ prop :icon_right
14
+ prop :tag, type: Playbook::Props::Enum,
15
+ values: %w[a h1 h2 h3 h4 h5 h6 p span div],
16
+ default: "a"
17
+ prop :text
18
+ prop :underline, type: Playbook::Props::Boolean,
19
+ default: false
20
+
21
+ def classname
22
+ generate_classname("pb_link_kit", color_class, underline_class, disabled_class)
23
+ end
24
+
25
+ def content
26
+ text
27
+ end
28
+
29
+ private
30
+
31
+ def color_class
32
+ color == "default" ? nil : color
33
+ end
34
+
35
+ def disabled_class
36
+ disabled ? "disabled" : nil
37
+ end
38
+
39
+ def underline_class
40
+ underline ? "underline" : nil
41
+ end
42
+ end
43
+ end
44
+ end