playbook_ui 16.2.0.pre.alpha.PLAY2719atpinnedrowsrails14418 → 16.2.0.pre.alpha.PLAY2791closeonclick14636

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 (120) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +1 -46
  3. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +2 -2
  4. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +0 -2
  5. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +0 -1
  6. data/app/pb_kits/playbook/pb_advanced_table/index.js +0 -38
  7. data/app/pb_kits/playbook/pb_advanced_table/table_body.html.erb +4 -21
  8. data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +9 -115
  9. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -16
  10. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.rb +1 -15
  11. data/app/pb_kits/playbook/pb_body/_body.scss +4 -4
  12. data/app/pb_kits/playbook/pb_body/_body_mixins.scss +28 -28
  13. data/app/pb_kits/playbook/pb_caption/_caption.scss +1 -1
  14. data/app/pb_kits/playbook/pb_caption/_caption_mixin.scss +15 -15
  15. data/app/pb_kits/playbook/pb_caption/docs/_caption_colors.html.erb +6 -4
  16. data/app/pb_kits/playbook/pb_caption/docs/_caption_colors.jsx +14 -4
  17. data/app/pb_kits/playbook/pb_checkbox/_checkbox.scss +18 -18
  18. data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +7 -7
  19. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +7 -1
  20. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +2 -2
  21. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +1 -0
  22. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_positions.md +1 -0
  23. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_calendar_input_icon.scss +14 -6
  24. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_input_styles.scss +80 -5
  25. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_time_selection_styles.scss +8 -1
  26. data/app/pb_kits/playbook/pb_detail/_detail.scss +14 -14
  27. data/app/pb_kits/playbook/pb_detail/_detail_mixins.scss +13 -13
  28. data/app/pb_kits/playbook/pb_detail/docs/_detail_colors.html.erb +6 -24
  29. data/app/pb_kits/playbook/pb_detail/docs/_detail_colors.jsx +35 -33
  30. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_compound_components.md +3 -1
  31. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +31 -25
  32. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +14 -3
  33. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_closing_options.jsx +63 -0
  34. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_closing_options.md +1 -0
  35. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_closing_options_rails.html.erb +16 -0
  36. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_closing_options_rails.md +1 -0
  37. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +2 -0
  38. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +1 -0
  39. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -2
  40. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +4 -0
  41. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +1 -1
  42. data/app/pb_kits/playbook/pb_dropdown/index.js +27 -9
  43. data/app/pb_kits/playbook/pb_dropdown/utilities/clickOutsideHelper.tsx +7 -1
  44. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +2 -1
  45. data/app/pb_kits/playbook/pb_form/docs/_form_with_required_indicator.html.erb +2 -0
  46. data/app/pb_kits/playbook/pb_icon/_icon.scss +5 -1
  47. data/app/pb_kits/playbook/pb_icon/icon.rb +168 -19
  48. data/app/pb_kits/playbook/pb_link/_link.scss +16 -1
  49. data/app/pb_kits/playbook/pb_link/docs/_link_underline.jsx +31 -1
  50. data/app/pb_kits/playbook/pb_list/_list_mixin.scss +4 -4
  51. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.scss +28 -10
  52. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +3 -2
  53. data/app/pb_kits/playbook/pb_passphrase/_passphrase.scss +14 -1
  54. data/app/pb_kits/playbook/pb_passphrase/_passphrase.tsx +5 -2
  55. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +11 -11
  56. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +2 -0
  57. data/app/pb_kits/playbook/pb_radio/_radio.scss +17 -17
  58. data/app/pb_kits/playbook/pb_rich_text_editor/_previewer_mixin.scss +6 -6
  59. data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.scss +31 -32
  60. data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.tsx +2 -0
  61. data/app/pb_kits/playbook/pb_rich_text_editor/_tiptap_styles.scss +5 -5
  62. data/app/pb_kits/playbook/pb_select/_select.scss +61 -51
  63. data/app/pb_kits/playbook/pb_select/_select.tsx +28 -18
  64. data/app/pb_kits/playbook/pb_select/docs/_select_required_indicator.html.erb +24 -0
  65. data/app/pb_kits/playbook/pb_select/docs/_select_required_indicator.jsx +33 -0
  66. data/app/pb_kits/playbook/pb_select/docs/_select_required_indicator.md +3 -0
  67. data/app/pb_kits/playbook/pb_select/docs/example.yml +3 -2
  68. data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
  69. data/app/pb_kits/playbook/pb_select/select.html.erb +7 -1
  70. data/app/pb_kits/playbook/pb_select/select.rb +3 -0
  71. data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +69 -20
  72. data/app/pb_kits/playbook/pb_selectable_icon/_selectable_icon.scss +6 -5
  73. data/app/pb_kits/playbook/pb_star_rating/star_rating.html.erb +1 -1
  74. data/app/pb_kits/playbook/pb_star_rating/subcomponents/_star_rating_interactive.tsx +1 -0
  75. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +51 -20
  76. data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +11 -4
  77. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_disabled.jsx +11 -13
  78. data/app/pb_kits/playbook/pb_text_input/text_input.html.erb +2 -2
  79. data/app/pb_kits/playbook/pb_textarea/_textarea.scss +55 -12
  80. data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +52 -21
  81. data/app/pb_kits/playbook/pb_textarea/_textarea_mixin.scss +31 -10
  82. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_disabled.html.erb +10 -0
  83. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_disabled.jsx +27 -0
  84. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_input_options.jsx +68 -0
  85. data/app/pb_kits/playbook/pb_textarea/docs/example.yml +3 -0
  86. data/app/pb_kits/playbook/pb_textarea/docs/index.js +2 -0
  87. data/app/pb_kits/playbook/pb_textarea/textarea.html.erb +2 -2
  88. data/app/pb_kits/playbook/pb_textarea/textarea.rb +3 -0
  89. data/app/pb_kits/playbook/pb_textarea/textarea.test.js +115 -1
  90. data/app/pb_kits/playbook/pb_time_picker/_time_picker.scss +186 -25
  91. data/app/pb_kits/playbook/pb_time_picker/_time_picker.tsx +22 -1
  92. data/app/pb_kits/playbook/pb_time_picker/time_picker.rb +8 -1
  93. data/app/pb_kits/playbook/pb_time_picker/time_picker.test.jsx +2 -2
  94. data/app/pb_kits/playbook/pb_title/_title_mixin.scss +13 -13
  95. data/app/pb_kits/playbook/pb_title/docs/_title_colors.html.erb +2 -0
  96. data/app/pb_kits/playbook/pb_title/docs/_title_colors.jsx +14 -0
  97. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +66 -23
  98. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +1 -1
  99. data/app/pb_kits/playbook/tokens/_colors_accessible.scss +5 -1
  100. data/app/pb_kits/playbook/tokens/_titles.scss +1 -1
  101. data/dist/chunks/{_pb_line_graph-CC2Ywwix.js → _pb_line_graph-BSLb5VXP.js} +1 -1
  102. data/dist/chunks/_typeahead-COVN8XN7.js +1 -0
  103. data/dist/chunks/{globalProps-DYr2qrIf.js → globalProps-DyTB8IdV.js} +1 -1
  104. data/dist/chunks/{lib-DgqmX9CF.js → lib-9wz3x5jl.js} +1 -1
  105. data/dist/chunks/vendor.js +3 -3
  106. data/dist/playbook-rails-react-bindings.js +1 -1
  107. data/dist/playbook-rails.js +1 -1
  108. data/dist/playbook.css +1 -1
  109. data/lib/playbook/forms/builder/checkbox_field.rb +1 -1
  110. data/lib/playbook/forms/builder/collection_select_field.rb +7 -1
  111. data/lib/playbook/forms/builder/intl_telephone_field.rb +11 -1
  112. data/lib/playbook/forms/builder/phone_number_field.rb +3 -2
  113. data/lib/playbook/forms/builder/select_field.rb +7 -1
  114. data/lib/playbook/forms/builder/time_zone_select_field.rb +7 -1
  115. data/lib/playbook/tokens/colors.json +2 -0
  116. data/lib/playbook/version.rb +1 -1
  117. metadata +16 -8
  118. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows_rails.html.erb +0 -57
  119. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows_rails.md +0 -7
  120. data/dist/chunks/_typeahead-DtzfGPUT.js +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e0f32387b1de49c24f6e4900458f3c9e72ee5ff49607ac5a5ab9cb606d4e08a1
4
- data.tar.gz: 7570bfc0deb31f3d41290d87a8332e976d11d6fa6f7aa7abd2061f3dcd5eda07
3
+ metadata.gz: cfccccc8ec73a171782599bac37606fbbdc9c917eb9c48bb33c2cbfd4aa68258
4
+ data.tar.gz: 779c27fc41b966c1d0d2ce21369643049bdc3b80b8cd2efcc9400b27d8554836
5
5
  SHA512:
6
- metadata.gz: dc61efb31c01ed5d50b7f669a623173e88d7516404241fc4e3675db1e4456ef0594ce640724eefd50ee79a62e04f28601dfb3566f1cf23e1362138b1d128a332
7
- data.tar.gz: a0def085b16be4e5c142cfd0a83eea3631b19563169297d161b5744062797f85873a453b31b749132f94c6f688c0f7381c8ce9017142a88a903d57ffc6037ff9
6
+ metadata.gz: 6e31002ccaa72626ea3eaaa01c9e5e2b299a05dbdaeebd7a5f9c54d80d1503155974a93fc25b6b78e906455dd389aeec2707e55e1904177c4e7e14c2f93f263e
7
+ data.tar.gz: 5663ca65cca211f1a494ef7535a2a82162bc2416db6653bb38f7fcd6e3485775f0ca7c7fd3cc610c71a498c599e377c5e0f5a742a95c0cf7abcde194ecd5a0e7
@@ -63,51 +63,6 @@
63
63
  width: 100%;
64
64
  }
65
65
 
66
- // Override pb_table endcap: first and last column use same padding as rest of row
67
- // First column
68
- [class^="pb_table"].table-sm tbody tr td:first-child,
69
- [class^="pb_table"].table-sm tbody tr .pb_table_td:first-child,
70
- [class^="pb_table"].table-sm tbody .pb_table_tr td:first-child,
71
- [class^="pb_table"].table-sm tbody .pb_table_tr .pb_table_td:first-child,
72
- [class^="pb_table"].table-sm .pb_table_tbody tr td:first-child,
73
- [class^="pb_table"].table-sm .pb_table_tbody tr .pb_table_td:first-child,
74
- [class^="pb_table"].table-sm .pb_table_tbody .pb_table_tr td:first-child,
75
- [class^="pb_table"].table-sm .pb_table_tbody .pb_table_tr .pb_table_td:first-child {
76
- padding-left: $space-xs;
77
- }
78
- [class^="pb_table"].table-md tbody tr td:first-child,
79
- [class^="pb_table"].table-md tbody tr .pb_table_td:first-child,
80
- [class^="pb_table"].table-md tbody .pb_table_tr td:first-child,
81
- [class^="pb_table"].table-md tbody .pb_table_tr .pb_table_td:first-child,
82
- [class^="pb_table"].table-md .pb_table_tbody tr td:first-child,
83
- [class^="pb_table"].table-md .pb_table_tbody tr .pb_table_td:first-child,
84
- [class^="pb_table"].table-md .pb_table_tbody .pb_table_tr td:first-child,
85
- [class^="pb_table"].table-md .pb_table_tbody .pb_table_tr .pb_table_td:first-child {
86
- padding-left: $space-sm;
87
- }
88
-
89
- // Last column
90
- [class^="pb_table"].table-sm tbody tr td:last-child,
91
- [class^="pb_table"].table-sm tbody tr .pb_table_td:last-child,
92
- [class^="pb_table"].table-sm tbody .pb_table_tr td:last-child,
93
- [class^="pb_table"].table-sm tbody .pb_table_tr .pb_table_td:last-child,
94
- [class^="pb_table"].table-sm .pb_table_tbody tr td:last-child,
95
- [class^="pb_table"].table-sm .pb_table_tbody tr .pb_table_td:last-child,
96
- [class^="pb_table"].table-sm .pb_table_tbody .pb_table_tr td:last-child,
97
- [class^="pb_table"].table-sm .pb_table_tbody .pb_table_tr .pb_table_td:last-child {
98
- padding-right: $space-xs;
99
- }
100
- [class^="pb_table"].table-md tbody tr td:last-child,
101
- [class^="pb_table"].table-md tbody tr .pb_table_td:last-child,
102
- [class^="pb_table"].table-md tbody .pb_table_tr td:last-child,
103
- [class^="pb_table"].table-md tbody .pb_table_tr .pb_table_td:last-child,
104
- [class^="pb_table"].table-md .pb_table_tbody tr td:last-child,
105
- [class^="pb_table"].table-md .pb_table_tbody tr .pb_table_td:last-child,
106
- [class^="pb_table"].table-md .pb_table_tbody .pb_table_tr td:last-child,
107
- [class^="pb_table"].table-md .pb_table_tbody .pb_table_tr .pb_table_td:last-child {
108
- padding-right: $space-sm;
109
- }
110
-
111
66
  // Virtualized Table and Rows for Infinite Scroll
112
67
  scrollbar-gutter: stable right-edges;
113
68
  .virtualized-header-row-header {
@@ -765,7 +720,7 @@
765
720
  }
766
721
  }
767
722
 
768
- // Row Pinning - React uses inline style; Rails passes same style via html_options from table_body
723
+ // Row Pinning - additional inline styles in RegularTableView.tsx
769
724
  .pinned-row {
770
725
  box-shadow: 0 4px 10px 0 rgba($shadow, 0.16) !important;
771
726
  }
@@ -7,12 +7,12 @@
7
7
  }) %>
8
8
  <% end %>
9
9
 
10
- <%= pb_rails("table", props: { size: "sm", data_table: true, number_spacing:"tabular", responsive:"none", dark: dark, classname: object.loading ? "content-loading" : "" }.merge(object.table_props || {})) do %>
10
+ <%= pb_rails("table", props: { size: "sm", data_table: true, number_spacing:"tabular", responsive:"none", dark: dark, classname: object.loading ? "content-loading" : "" }.merge(object.table_props)) do %>
11
11
  <% if content.present? %>
12
12
  <% content.presence %>
13
13
  <% else %>
14
14
  <%= pb_rails("advanced_table/table_header", props: { table_id: object.id, column_definitions: object.column_definitions, enable_toggle_expansion: object.enable_toggle_expansion, responsive: object.responsive, loading: object.loading, selectable_rows: object.selectable_rows, show_actions_bar: object.show_actions_bar, inline_row_loading: object.inline_row_loading, persist_toggle_expansion_button: object.persist_toggle_expansion_button, table_data: object.table_data }) %>
15
- <%= pb_rails("advanced_table/table_body", props: { table_id: object.id, table_data: object.table_data, column_definitions: object.column_definitions, responsive: object.responsive, loading: object.loading, selectable_rows: object.selectable_rows, enable_toggle_expansion: object.enable_toggle_expansion, row_styling: object.row_styling, inline_row_loading: object.inline_row_loading, pinned_rows: object.pinned_rows }) %>
15
+ <%= pb_rails("advanced_table/table_body", props: { table_id: object.id, table_data: object.table_data, column_definitions: object.column_definitions, responsive: object.responsive, loading: object.loading, selectable_rows: object.selectable_rows, enable_toggle_expansion: object.enable_toggle_expansion, row_styling: object.row_styling, inline_row_loading: object.inline_row_loading }) %>
16
16
  <% end %>
17
17
  <% end %>
18
18
  <% end %>
@@ -37,8 +37,6 @@ module Playbook
37
37
  default: false
38
38
  prop :persist_toggle_expansion_button, type: Playbook::Props::Boolean,
39
39
  default: false
40
- prop :pinned_rows, type: Playbook::Props::HashProp,
41
- default: {}
42
40
 
43
41
  def classname
44
42
  additional_classes = [
@@ -7,7 +7,6 @@ examples:
7
7
  - advanced_table_table_props: Table Props
8
8
  - advanced_table_sticky_header_rails: Sticky Header
9
9
  - advanced_table_table_props_sticky_header: Sticky Header for Responsive Table
10
- - advanced_table_pinned_rows_rails: Pinned Rows
11
10
  - advanced_table_beta_sort: Enable Sorting
12
11
  - advanced_table_responsive: Responsive Tables
13
12
  - advanced_table_custom_cell_rails: Custom Components for Cells
@@ -304,36 +304,9 @@ export default class PbAdvancedTable extends PbEnhancedElement {
304
304
  lastVisibleRow.classList.add("last-visible-row");
305
305
  lastVisibleRow.classList.add("last-row-cell");
306
306
  }
307
-
308
- PbAdvancedTable.updatePinnedRowsStickyTops(table);
309
307
  }
310
308
  }
311
309
 
312
- /**
313
- * Recompute sticky top for visible pinned rows so collapsed rows don't leave a gap.
314
- * Call after expand/collapse and on load.
315
- */
316
- static updatePinnedRowsStickyTops(advancedTableWrapper) {
317
- const pinnedTbody = advancedTableWrapper?.querySelector("tbody.pinned-rows-tbody");
318
- if (!pinnedTbody) return;
319
-
320
- const pinnedRows = Array.from(pinnedTbody.querySelectorAll("tr.pinned-row"));
321
- const visibleRows = pinnedRows.filter(
322
- (tr) => tr.style.display !== "none" && tr.offsetParent !== null
323
- );
324
-
325
- const headerOffset = "var(--advanced-table-header-height, 44px)";
326
- visibleRows.forEach((tr, index) => {
327
- tr.style.top = `calc(${headerOffset} + 2.5em * ${index})`;
328
- });
329
- }
330
-
331
- static updatePinnedRowsStickyTopsForAll() {
332
- document.querySelectorAll(".pb_advanced_table").forEach((wrapper) => {
333
- PbAdvancedTable.updatePinnedRowsStickyTops(wrapper);
334
- });
335
- }
336
-
337
310
  hideCloseIcon() {
338
311
  const closeIcon = this.element.querySelector(UP_ARROW_SELECTOR);
339
312
  closeIcon.style.display = "none";
@@ -527,14 +500,3 @@ window.expandAllRows = (element) => {
527
500
  window.expandAllSubRows = (element, rowDepth) => {
528
501
  PbAdvancedTable.handleToggleAllSubRows(element, rowDepth);
529
502
  };
530
-
531
- // Fix pinned row sticky tops on load (collapsed rows would otherwise leave a gap)
532
- if (typeof document !== "undefined") {
533
- if (document.readyState === "loading") {
534
- document.addEventListener("DOMContentLoaded", () =>
535
- PbAdvancedTable.updatePinnedRowsStickyTopsForAll()
536
- );
537
- } else {
538
- PbAdvancedTable.updatePinnedRowsStickyTopsForAll();
539
- }
540
- }
@@ -1,22 +1,5 @@
1
- <% table_data = object.table_data || [] %>
2
- <% if object.has_pinned_rows? %>
3
- <%= pb_content_tag(:tbody, class: "pinned-rows-tbody") do %>
4
- <% next_index = 0 %>
5
- <% object.pinned_root_rows.each do |root_info| %>
6
- <% row_output, next_index = object.render_row_and_children(root_info[:row], object.column_definitions, root_info[:depth], root_info[:depth] > 0, root_info[:ancestor_ids] || [], root_info[:ancestor_ids]&.first, immediate_parent_row_id: object.row_id_for(root_info[:parent_row]), is_pinned_row: true, pinned_index: next_index, initial_table_data_attributes: root_info[:depth].to_i > 0 ? object.pinned_root_initial_data_attributes(root_info) : nil) %>
7
- <%= row_output %>
8
- <% end %>
9
- <% end %>
10
- <%= pb_content_tag(:tbody) do %>
11
- <% table_data.each do |row| %>
12
- <% result = object.render_row_and_children(row, object.column_definitions, 0, false, skip_pinned_ids: object.pinned_ids_set) %>
13
- <%= result.is_a?(Array) ? result[0] : result %>
14
- <% end %>
15
- <% end %>
16
- <% else %>
17
- <%= pb_content_tag(:tbody) do %>
18
- <% table_data.each do |row| %>
19
- <%= object.render_row_and_children(row, object.column_definitions, 0, false) %>
20
- <% end %>
21
- <% end %>
1
+ <%= pb_content_tag(:tbody) do %>
2
+ <% object.table_data.each do |row| %>
3
+ <%= render_row_and_children(row, object.column_definitions, 0, false) %>
4
+ <% end %>
22
5
  <% end %>
@@ -27,8 +27,6 @@ module Playbook
27
27
  default: []
28
28
  prop :inline_row_loading, type: Playbook::Props::Boolean,
29
29
  default: false
30
- prop :pinned_rows, type: Playbook::Props::HashProp,
31
- default: {}
32
30
 
33
31
  def flatten_columns(columns)
34
32
  columns.flat_map do |col|
@@ -44,21 +42,14 @@ module Playbook
44
42
  end.compact
45
43
  end
46
44
 
47
- def render_row_and_children(row, column_definitions, current_depth, first_parent_child, ancestor_ids = [], top_parent_id = nil, additional_classes: "", table_data_attributes: {}, immediate_parent_row_id: nil, is_pinned_row: false, pinned_index: nil, skip_pinned_ids: nil, initial_table_data_attributes: nil)
48
- if skip_pinned_ids && row_id_for(row) && skip_pinned_ids.include?(row_id_for(row).to_s)
49
- return is_pinned_row ? [ActiveSupport::SafeBuffer.new, pinned_index] : ActiveSupport::SafeBuffer.new
50
- end
51
-
45
+ def render_row_and_children(row, column_definitions, current_depth, first_parent_child, ancestor_ids = [], top_parent_id = nil, additional_classes: "", table_data_attributes: {}, immediate_parent_row_id: nil)
52
46
  top_parent_id ||= row.object_id
53
47
  new_ancestor_ids = ancestor_ids + [row.object_id]
54
- leaf_columns = flatten_columns(column_definitions || [])
48
+ leaf_columns = flatten_columns(column_definitions)
55
49
 
56
50
  output = ActiveSupport::SafeBuffer.new
57
- subrow_headers_arr = subrow_headers || []
58
- is_first_child_of_subrow = current_depth.positive? && first_parent_child && subrow_headers_arr[current_depth - 1].present?
59
- last_row = subrow_headers_arr.length == current_depth
60
-
61
- next_pinned_index = pinned_index
51
+ is_first_child_of_subrow = current_depth.positive? && first_parent_child && subrow_headers[current_depth - 1].present?
52
+ last_row = subrow_headers.length == current_depth
62
53
 
63
54
  subrow_ancestor_ids = ancestor_ids + ["#{row.object_id}sr"]
64
55
  subrow_data_attributes = {
@@ -67,16 +58,7 @@ module Playbook
67
58
  row_parent: "#{table_id}_#{ancestor_ids.last}",
68
59
  }
69
60
  # Subrow header if applicable
70
- if is_first_child_of_subrow && enable_toggle_expansion == "all"
71
- subrow_props = { row: row, column_definitions: leaf_columns, depth: current_depth, subrow_header: subrow_headers_arr[current_depth - 1], collapsible_trail: collapsible_trail, classname: "toggle-content", responsive: responsive, subrow_data_attributes: subrow_data_attributes, last_row: last_row, immediate_parent_row_id: immediate_parent_row_id }
72
- if is_pinned_row && next_pinned_index
73
- subrow_props[:is_pinned_row] = true
74
- subrow_props[:pinned_index] = next_pinned_index
75
- subrow_props[:html_options] = { style: build_pinned_row_style(next_pinned_index, background: "var(--pb_table_sticky_bg, #f5f5f5)") }
76
- next_pinned_index += 1
77
- end
78
- output << pb_rails("advanced_table/table_subrow_header", props: subrow_props)
79
- end
61
+ output << pb_rails("advanced_table/table_subrow_header", props: { row: row, column_definitions: leaf_columns, depth: current_depth, subrow_header: subrow_headers[current_depth - 1], collapsible_trail: collapsible_trail, classname: "toggle-content", responsive: responsive, subrow_data_attributes: subrow_data_attributes, last_row: last_row, immediate_parent_row_id: immediate_parent_row_id }) if is_first_child_of_subrow && enable_toggle_expansion == "all"
80
62
 
81
63
  current_data_attributes = if current_depth.zero?
82
64
  {
@@ -85,19 +67,11 @@ module Playbook
85
67
  row_parent: nil,
86
68
  }
87
69
  else
88
- initial_table_data_attributes || table_data_attributes
70
+ table_data_attributes
89
71
  end
90
72
 
91
73
  # Additional class and data attributes needed for toggle logic
92
- row_props = { table_id: table_id, row: row, column_definitions: leaf_columns, depth: current_depth, collapsible_trail: collapsible_trail, classname: additional_classes, table_data_attributes: current_data_attributes, responsive: responsive, loading: loading, selectable_rows: selectable_rows, row_id: row[:id], enable_toggle_expansion: enable_toggle_expansion, row_styling: row_styling, last_row: last_row, immediate_parent_row_id: immediate_parent_row_id, inline_row_loading: inline_row_loading }
93
- if is_pinned_row && next_pinned_index
94
- row_props[:is_pinned_row] = true
95
- row_props[:pinned_index] = next_pinned_index
96
- row_bg = (row_styling || []).find { |s| s[:row_id].to_s == row_id_for(row).to_s }&.[](:background_color) || "white"
97
- row_props[:html_options] = { style: build_pinned_row_style(next_pinned_index, background: row_bg) }
98
- next_pinned_index += 1
99
- end
100
- output << pb_rails("advanced_table/table_row", props: row_props)
74
+ output << pb_rails("advanced_table/table_row", props: { table_id: table_id, row: row, column_definitions: leaf_columns, depth: current_depth, collapsible_trail: collapsible_trail, classname: additional_classes, table_data_attributes: current_data_attributes, responsive: responsive, loading: loading, selectable_rows: selectable_rows, row_id: row[:id], enable_toggle_expansion: enable_toggle_expansion, row_styling: row_styling, last_row: last_row, immediate_parent_row_id: immediate_parent_row_id, inline_row_loading: inline_row_loading })
101
75
 
102
76
  # Render inline loading row when inline_row_loading is enabled and row has empty children
103
77
  if inline_row_loading
@@ -129,21 +103,11 @@ module Playbook
129
103
  advanced_table_content: data_content,
130
104
  }
131
105
 
132
- child_opts = { additional_classes: "toggle-content", table_data_attributes: child_data_attributes, immediate_parent_row_id: row[:id] }
133
- child_opts[:is_pinned_row] = is_pinned_row
134
- child_opts[:pinned_index] = next_pinned_index if is_pinned_row
135
- child_opts[:skip_pinned_ids] = skip_pinned_ids if skip_pinned_ids
136
-
137
- child_output, next_pinned_index = render_row_and_children(child_row, column_definitions, current_depth + 1, is_first_child, new_ancestor_ids, top_parent_id, **child_opts)
138
- output << child_output
106
+ output << render_row_and_children(child_row, column_definitions, current_depth + 1, is_first_child, new_ancestor_ids, top_parent_id, additional_classes: "toggle-content", table_data_attributes: child_data_attributes, immediate_parent_row_id: row[:id])
139
107
  end
140
108
  end
141
109
 
142
- if is_pinned_row
143
- [output, next_pinned_index]
144
- else
145
- output
146
- end
110
+ output
147
111
  end
148
112
 
149
113
  def classname
@@ -178,76 +142,6 @@ module Playbook
178
142
  end
179
143
  end
180
144
 
181
- def row_id_for(row)
182
- return nil if row.nil?
183
-
184
- row[:id] || row["id"]
185
- end
186
-
187
- def pinned_top_ids
188
- return [] if pinned_rows.nil? || !pinned_rows.respond_to?(:[])
189
-
190
- top = pinned_rows["top"] || pinned_rows[:top]
191
- Array(top).map(&:to_s)
192
- end
193
-
194
- def pinned_ids_set
195
- return Set.new if pinned_top_ids.blank?
196
-
197
- set = Set.new
198
- pinned_root_rows.each do |root|
199
- collect_row_and_descendant_ids(root[:row], set)
200
- end
201
- set
202
- end
203
-
204
- def collect_row_and_descendant_ids(row, set)
205
- id = row_id_for(row)
206
- set.add(id.to_s) if id
207
- row_children_for(row)&.each { |child| collect_row_and_descendant_ids(child, set) }
208
- end
209
-
210
- def find_row_by_id(data, id, depth: 0, ancestor_ids: [], parent_row: nil)
211
- id_str = id.to_s
212
- Array(data).each do |row|
213
- return { row: row, depth: depth, ancestor_ids: ancestor_ids, parent_row: parent_row } if row_id_for(row).to_s == id_str
214
-
215
- found = find_row_by_id(row_children_for(row), id_str, depth: depth + 1, ancestor_ids: ancestor_ids + [row.object_id], parent_row: row)
216
- return found if found
217
- end
218
- nil
219
- end
220
-
221
- def pinned_root_rows
222
- return [] if pinned_top_ids.blank?
223
-
224
- pinned_top_ids.filter_map { |id| find_row_by_id(table_data, id) }
225
- end
226
-
227
- def has_pinned_rows?
228
- pinned_root_rows.any?
229
- end
230
-
231
- # Build inline style for sticky pinned row (matches React). Pass via html_options so the tr gets the attribute.
232
- def build_pinned_row_style(pinned_index, background: "white")
233
- header_offset = "var(--advanced-table-header-height, 44px)"
234
- row_offset = "calc(2.5em * #{pinned_index})"
235
- "position: sticky; top: calc(#{header_offset} + #{row_offset}); z-index: 3; background: #{background};"
236
- end
237
-
238
- def pinned_root_initial_data_attributes(root_info)
239
- return {} if root_info[:depth].to_i.zero?
240
-
241
- anc = root_info[:ancestor_ids] || []
242
- content = (anc + [root_info[:row].object_id]).join("-")
243
- {
244
- top_parent: "#{table_id}_#{anc.first}",
245
- row_depth: root_info[:depth],
246
- row_parent: "#{table_id}_#{anc.last}",
247
- advanced_table_content: content,
248
- }
249
- end
250
-
251
145
  def cell_accessors_length(col_defs)
252
146
  first_col = col_defs.first
253
147
  return 0 unless first_col
@@ -35,28 +35,13 @@ module Playbook
35
35
  default: ""
36
36
  prop :inline_row_loading, type: Playbook::Props::Boolean,
37
37
  default: false
38
- prop :is_pinned_row, type: Playbook::Props::Boolean,
39
- default: false
40
- prop :pinned_index, type: Playbook::Props::Numeric,
41
- default: nil
42
38
 
43
39
  def data
44
40
  Hash(prop(:data)).merge(table_data_attributes)
45
41
  end
46
42
 
47
43
  def classname
48
- classes = ["pb_table_tr", "pb-bg-row-white", subrow_depth_classname]
49
- classes << "pinned-row" if is_pinned_row
50
- generate_classname(*classes, separator: " ")
51
- end
52
-
53
- def pinned_row_style
54
- return nil unless is_pinned_row && pinned_index.is_a?(Numeric)
55
-
56
- header_offset = "var(--advanced-table-header-height, 40px)"
57
- row_offset = "calc(2.5em * #{pinned_index})"
58
- bg = row_styling.find { |style| style[:row_id].to_s == row_id.to_s }&.[](:background_color) || "white"
59
- "position: sticky; top: calc(#{header_offset} + #{row_offset}); z-index: 3; background: #{bg};"
44
+ generate_classname("pb_table_tr", "pb-bg-row-white", subrow_depth_classname, separator: " ")
60
45
  end
61
46
 
62
47
  def td_classname(column, index)
@@ -19,27 +19,13 @@ module Playbook
19
19
  prop :responsive, type: Playbook::Props::Enum,
20
20
  values: %w[none scroll],
21
21
  default: "scroll"
22
- prop :is_pinned_row, type: Playbook::Props::Boolean,
23
- default: false
24
- prop :pinned_index, type: Playbook::Props::Numeric,
25
- default: nil
26
22
 
27
23
  def data
28
24
  Hash(prop(:data)).merge(subrow_data_attributes)
29
25
  end
30
26
 
31
27
  def classname
32
- classes = ["pb_table_tr", "bg-silver", "pb_subrow_header", subrow_depth_classname]
33
- classes << "pinned-row" if is_pinned_row
34
- generate_classname(*classes, separator: " ")
35
- end
36
-
37
- def pinned_row_style
38
- return nil unless is_pinned_row && pinned_index.is_a?(Numeric)
39
-
40
- header_offset = "var(--advanced-table-header-height, 40px)"
41
- row_offset = "calc(2.5em * #{pinned_index})"
42
- "position: sticky; top: calc(#{header_offset} + #{row_offset}); z-index: 3; background: var(--pb_table_sticky_bg, #f5f5f5);"
28
+ generate_classname("pb_table_tr", "bg-silver", "pb_subrow_header", subrow_depth_classname, separator: " ")
43
29
  end
44
30
 
45
31
  def td_classname(index)
@@ -30,7 +30,7 @@
30
30
  .pb_body_kit_error_neutral,
31
31
  .pb_body_kit_error_positive,
32
32
  .pb_body_kit_error_negative {
33
- @include pb_body($text_lt_default);
33
+ @include pb_body($text_default_color);
34
34
 
35
35
  b,
36
36
  strong {
@@ -38,9 +38,9 @@
38
38
  }
39
39
 
40
40
  a {
41
- color: $primary;
41
+ color: $text_link;
42
42
  &:hover {
43
- color: $text_lt_default;
43
+ color: $text_default_color;
44
44
  }
45
45
  }
46
46
 
@@ -110,7 +110,7 @@
110
110
  @include pb_body_dark();
111
111
 
112
112
  a {
113
- color: $active_dark;
113
+ color: $text_link_dark;
114
114
  }
115
115
  }
116
116
 
@@ -3,38 +3,38 @@
3
3
  @import "../tokens/typography";
4
4
 
5
5
  $pb_body_colors: (
6
- default: $text_lt_default,
7
- light: $text_lt_light,
8
- lighter: $text_lt_lighter,
9
- link: $primary,
10
- error: $error,
11
- success: $text_lt_success_sm,
6
+ default: $text_default_color,
7
+ light: $text_light,
8
+ lighter: $text_lighter,
9
+ link: $text_link,
10
+ error: $text_error,
11
+ success: $text_success,
12
12
  );
13
13
 
14
14
  $pb_dark_body_colors: (
15
- default: $text_dk_default,
16
- light: $text_dk_light,
17
- lighter: $text_dk_lighter,
18
- link: $active_dark,
19
- error: $error,
20
- success: $text_dk_success_sm,
15
+ default: $text_default_dark,
16
+ light: $text_light_dark,
17
+ lighter: $text_lighter_dark,
18
+ link: $text_link_dark,
19
+ error: $text_error_dark,
20
+ success: $text_success_dark,
21
21
  );
22
22
 
23
23
  // Order is important here!
24
24
  $pb_body_status: (
25
- default: $text_lt_default,
26
- negative: $error,
27
- dark_error: $error_dark_body,
28
- positive: $text_lt_success_sm,
25
+ default: $text_default_color,
26
+ negative: $text_error,
27
+ dark_error: $text_error_dark,
28
+ positive: $text_success,
29
29
  );
30
30
 
31
31
  $pb_dark_body_status: (
32
- default: $text_dk_default,
33
- negative: $error_dark,
34
- positive: $text_dk_success_sm,
32
+ default: $text_default_dark,
33
+ negative: $text_error_dark,
34
+ positive: $text_success_dark,
35
35
  );
36
36
 
37
- @mixin pb_body($color: $text_lt_default) {
37
+ @mixin pb_body($color: $text_default_color) {
38
38
  line-height: $lh_tight;
39
39
  color: $color;
40
40
  font-size: $text_default;
@@ -44,34 +44,34 @@ $pb_dark_body_status: (
44
44
 
45
45
  // Colors ======================
46
46
  @mixin pb_body_light {
47
- @include pb_body($text_lt_light);
47
+ @include pb_body($text_light);
48
48
  }
49
49
 
50
50
  @mixin pb_body_lighter {
51
- @include pb_body($text_lt_lighter);
51
+ @include pb_body($text_lighter);
52
52
  }
53
53
 
54
54
  @mixin pb_body_dark {
55
- @include pb_body($text_dk_default);
55
+ @include pb_body($text_default_dark);
56
56
  }
57
57
 
58
58
  @mixin pb_body_light_dark {
59
- @include pb_body($text_dk_light);
59
+ @include pb_body($text_light_dark);
60
60
  }
61
61
 
62
62
  @mixin pb_body_lighter_dark {
63
- @include pb_body($text_dk_lighter);
63
+ @include pb_body($text_lighter_dark);
64
64
  }
65
65
 
66
66
  // Statuses =====================
67
67
  @mixin pb_body_negative {
68
- @include pb_body($error);
68
+ @include pb_body($text_error);
69
69
  }
70
70
 
71
71
  @mixin pb_body_dark_error {
72
- @include pb_body($error_dark_body);
72
+ @include pb_body($text_error_dark);
73
73
  }
74
74
 
75
75
  @mixin pb_body_positive {
76
- @include pb_body($success);
76
+ @include pb_body($text_success);
77
77
  }
@@ -88,7 +88,7 @@
88
88
  .pb_caption_kit_base_link,
89
89
  .pb_caption_kit_lg_link,
90
90
  .pb_caption_kit_xl_link {
91
- color: $primary;
91
+ color: $text_link;
92
92
  }
93
93
 
94
94
  // Dark theme variants
@@ -2,33 +2,33 @@
2
2
  @import "../tokens/typography";
3
3
 
4
4
  $pb_caption_colors: (
5
- default: $text_lt_default,
6
- light: $text_lt_light,
7
- link: $primary,
8
- lighter: $text_lt_lighter,
9
- success: $text_lt_success_sm,
10
- error: $error,
5
+ default: $text_default_color,
6
+ light: $text_light,
7
+ link: $text_link,
8
+ lighter: $text_lighter,
9
+ success: $text_success,
10
+ error: $text_error,
11
11
  );
12
12
 
13
13
  $pb_dark_caption_colors: (
14
- default: $text_dk_default,
15
- light: $text_dk_light,
16
- lighter: $text_dk_lighter,
17
- link: $active_dark,
18
- success: $text_dk_success_sm,
19
- error: $error_dark,
14
+ default: $text_default_dark,
15
+ light: $text_light_dark,
16
+ lighter: $text_lighter_dark,
17
+ link: $text_link_dark,
18
+ success: $text_success_dark,
19
+ error: $text_error_dark,
20
20
  );
21
21
 
22
22
 
23
23
  @mixin caption($font_size: $font_smaller, $font_weight: $bold) {
24
24
  font-weight: $font_weight;
25
- color: $text_lt_light;
25
+ color: $text_light;
26
26
  text-transform: uppercase;
27
27
  font-size: $font_size;
28
28
  letter-spacing: $lspace_loosest;
29
29
  }
30
30
 
31
- @mixin caption_color($color: $text_lt_light) {
31
+ @mixin caption_color($color: $text_light) {
32
32
  color: $color;
33
33
  }
34
34
 
@@ -43,5 +43,5 @@ $pb_dark_caption_colors: (
43
43
  }
44
44
 
45
45
  @mixin caption_dark {
46
- color: $text_dk_light;
46
+ color: $text_light_dark;
47
47
  }
@@ -1,4 +1,6 @@
1
- <%= pb_rails("caption", props: { text: "Test colors" }) %>
2
- <%= pb_rails("caption", props: { text: "Test colors", color: "success" }) %>
3
- <%= pb_rails("caption", props: { text: "Test colors", color: "error" }) %>
4
- <%= pb_rails("caption", props: { text: "Test colors", color: "link" }) %>
1
+ <%= pb_rails("caption", props: { text: "Caption light" }) %>
2
+ <%= pb_rails("caption", props: { text: "Caption default", color: "default" }) %>
3
+ <%= pb_rails("caption", props: { text: "Caption lighter", color: "lighter" }) %>
4
+ <%= pb_rails("caption", props: { text: "Caption success", color: "success" }) %>
5
+ <%= pb_rails("caption", props: { text: "Caption error", color: "error" }) %>
6
+ <%= pb_rails("caption", props: { text: "Caption link", color: "link" }) %>