@12-apps/ui 6.66.2 → 6.67.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 (196) hide show
  1. package/dist/_internal/components/data-display/Avatar/Avatar.js +4 -4
  2. package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
  3. package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
  4. package/dist/_internal/components/data-display/Chart/Chart.js +3 -3
  5. package/dist/_internal/components/data-display/Chart/SpecChart.js +6 -6
  6. package/dist/_internal/components/data-display/Chart/chart-renderers.js +2 -2
  7. package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
  8. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
  9. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +31 -28
  10. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +33 -30
  11. package/dist/_internal/components/data-display/DataViews/base-card.js +2 -2
  12. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +5 -5
  13. package/dist/_internal/components/data-display/DataViews/base-list-card-layout.js +6 -6
  14. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +4 -4
  15. package/dist/_internal/components/data-display/DataViews/base-list-card.js +8 -8
  16. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +4 -4
  17. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +3 -3
  18. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +5 -3
  19. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +3 -3
  20. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +7 -6
  21. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +28 -25
  22. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +11 -5
  23. package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +2 -2
  24. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +8 -3
  25. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +7 -4
  26. package/dist/_internal/components/data-display/DataViews/data-views-overflow-fields.js +18 -0
  27. package/dist/_internal/components/data-display/DataViews/data-views-overflow-fields.js.map +1 -0
  28. package/dist/_internal/components/data-display/DataViews/data-views-overflow.js +6 -2
  29. package/dist/_internal/components/data-display/DataViews/data-views-quick-chip.js +20 -0
  30. package/dist/_internal/components/data-display/DataViews/data-views-quick-chip.js.map +1 -0
  31. package/dist/_internal/components/data-display/DataViews/data-views-quick-types.js +1 -0
  32. package/dist/_internal/components/data-display/DataViews/data-views-quick-types.js.map +1 -0
  33. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
  34. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +3 -3
  35. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +8 -7
  36. package/dist/_internal/components/data-display/DataViews/data-views-sticky-head.js +21 -0
  37. package/dist/_internal/components/data-display/DataViews/data-views-sticky-head.js.map +1 -0
  38. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +7 -6
  39. package/dist/_internal/components/data-display/DataViews/data-views-types.js +1 -1
  40. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +3 -3
  41. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +3 -3
  42. package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +2 -2
  43. package/dist/_internal/components/data-display/index.js +19 -19
  44. package/dist/_internal/components/index.js +19 -19
  45. package/dist/_internal/user-avatar/user-avatar.js +5 -5
  46. package/dist/charts.js +11 -11
  47. package/dist/{chunk-35L5YMYQ.js → chunk-2QB4WIU5.js} +6 -6
  48. package/dist/chunk-4IE66GY2.js +89 -0
  49. package/dist/chunk-4IE66GY2.js.map +1 -0
  50. package/dist/{chunk-JYMXYSDP.js → chunk-5CAWRMDX.js} +2 -2
  51. package/dist/{chunk-L7OWFJUU.js → chunk-5RC7WAHH.js} +40 -34
  52. package/dist/chunk-5RC7WAHH.js.map +1 -0
  53. package/dist/{chunk-647DEGIU.js → chunk-5WJFCQFN.js} +7 -7
  54. package/dist/{chunk-K6KBASL2.js → chunk-72L5C74V.js} +2 -2
  55. package/dist/{chunk-TKLPPAS5.js → chunk-AHNEEFK6.js} +2 -2
  56. package/dist/chunk-AT6UKTH4.js +129 -0
  57. package/dist/chunk-AT6UKTH4.js.map +1 -0
  58. package/dist/{chunk-BI7YMVKZ.js → chunk-B2JSUFDX.js} +2 -2
  59. package/dist/{chunk-7J5JR33K.js → chunk-BBBHPK2Q.js} +2 -2
  60. package/dist/{chunk-UZ2CEJOO.js → chunk-CSJ7WNXU.js} +2 -2
  61. package/dist/{chunk-6QYKZMEE.js → chunk-CSLBRJ7N.js} +40 -25
  62. package/dist/chunk-CSLBRJ7N.js.map +1 -0
  63. package/dist/{chunk-LMIOWP6H.js → chunk-D34PZJH3.js} +2 -2
  64. package/dist/{chunk-SUZLGB5I.js → chunk-E6K2UZGR.js} +3 -3
  65. package/dist/{chunk-7XSCEHGA.js → chunk-EOQ6EKTS.js} +7 -7
  66. package/dist/chunk-GCYGVWOI.js +59 -0
  67. package/dist/chunk-GCYGVWOI.js.map +1 -0
  68. package/dist/{chunk-AMLHEKSV.js → chunk-HI7JPDD6.js} +5 -5
  69. package/dist/{chunk-O2P2KTKN.js → chunk-HLYYB4O5.js} +1 -1
  70. package/dist/chunk-HLYYB4O5.js.map +1 -0
  71. package/dist/{chunk-KARMRTTM.js → chunk-J2RUDZVJ.js} +7 -7
  72. package/dist/{chunk-HQCZT6TO.js → chunk-JVOEVTCZ.js} +5 -5
  73. package/dist/{chunk-VJB63DUM.js → chunk-K3PMMW23.js} +2 -2
  74. package/dist/{chunk-J6DYHBID.js → chunk-LIN4A2BW.js} +7 -7
  75. package/dist/{chunk-FXZUVZON.js → chunk-LWZ2K225.js} +6 -6
  76. package/dist/{chunk-6S3S2K7O.js → chunk-P3USTYIO.js} +3 -3
  77. package/dist/chunk-P3USTYIO.js.map +1 -0
  78. package/dist/{chunk-MJ6EAND6.js → chunk-Q7BGMLCX.js} +2 -2
  79. package/dist/{chunk-6ATXOJVQ.js → chunk-QADTI63U.js} +4 -4
  80. package/dist/{chunk-M6V7Y7CP.js → chunk-QAZLQYSD.js} +3 -3
  81. package/dist/chunk-QAZLQYSD.js.map +1 -0
  82. package/dist/{chunk-L6MGAPBX.js → chunk-RCZ4KL2H.js} +5 -3
  83. package/dist/chunk-RCZ4KL2H.js.map +1 -0
  84. package/dist/{chunk-YLSSQJZM.js → chunk-T7ZERP7A.js} +30 -2
  85. package/dist/chunk-T7ZERP7A.js.map +1 -0
  86. package/dist/{chunk-SB2SEGR6.js → chunk-TIM4PXWN.js} +3 -3
  87. package/dist/{chunk-Y7YKIIYS.js → chunk-TQXB2OHP.js} +28 -4
  88. package/dist/chunk-TQXB2OHP.js.map +1 -0
  89. package/dist/{chunk-3WLS7Z7D.js → chunk-UMOHHWXY.js} +3 -3
  90. package/dist/{chunk-S4JXSC4D.js → chunk-V6SRBQMN.js} +5 -5
  91. package/dist/{chunk-JY5YINUH.js → chunk-WQ32YFM5.js} +15 -7
  92. package/dist/chunk-WQ32YFM5.js.map +1 -0
  93. package/dist/{chunk-ERA3AEWU.js → chunk-WTGIW7LX.js} +12 -3
  94. package/dist/chunk-WTGIW7LX.js.map +1 -0
  95. package/dist/{chunk-2VMIHFMX.js → chunk-WVIJFS5Y.js} +9 -4
  96. package/dist/chunk-WVIJFS5Y.js.map +1 -0
  97. package/dist/{chunk-375HTCF2.js → chunk-Y2CCXB7R.js} +18 -2
  98. package/dist/chunk-Y2CCXB7R.js.map +1 -0
  99. package/dist/{chunk-33XGC4YU.js → chunk-YEGZIYVM.js} +2 -2
  100. package/dist/data-display/Avatar.js +4 -4
  101. package/dist/data-display/CardKit.js +7 -7
  102. package/dist/data-display/Carousel.js +2 -2
  103. package/dist/data-display/Chart.js +11 -11
  104. package/dist/data-display/DataGrid.js +2 -2
  105. package/dist/data-display/DataViews.js +42 -39
  106. package/dist/types/components/data-display/DataViews/DataViewsGrid.d.ts +15 -1
  107. package/dist/types/components/data-display/DataViews/DataViewsGrid.d.ts.map +1 -1
  108. package/dist/types/components/data-display/DataViews/DataViewsTableBase.d.ts +5 -1
  109. package/dist/types/components/data-display/DataViews/DataViewsTableBase.d.ts.map +1 -1
  110. package/dist/types/components/data-display/DataViews/data-views-empty.d.ts +10 -0
  111. package/dist/types/components/data-display/DataViews/data-views-empty.d.ts.map +1 -1
  112. package/dist/types/components/data-display/DataViews/data-views-grid-bodies.d.ts +2 -0
  113. package/dist/types/components/data-display/DataViews/data-views-grid-bodies.d.ts.map +1 -1
  114. package/dist/types/components/data-display/DataViews/data-views-grid-parts.d.ts +5 -1
  115. package/dist/types/components/data-display/DataViews/data-views-grid-parts.d.ts.map +1 -1
  116. package/dist/types/components/data-display/DataViews/data-views-inline-bar.d.ts +4 -1
  117. package/dist/types/components/data-display/DataViews/data-views-inline-bar.d.ts.map +1 -1
  118. package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts +10 -1
  119. package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts.map +1 -1
  120. package/dist/types/components/data-display/DataViews/data-views-more-filters.d.ts.map +1 -1
  121. package/dist/types/components/data-display/DataViews/data-views-overflow-fields.d.ts +56 -0
  122. package/dist/types/components/data-display/DataViews/data-views-overflow-fields.d.ts.map +1 -0
  123. package/dist/types/components/data-display/DataViews/data-views-overflow.d.ts +7 -5
  124. package/dist/types/components/data-display/DataViews/data-views-overflow.d.ts.map +1 -1
  125. package/dist/types/components/data-display/DataViews/data-views-quick-chip.d.ts +16 -0
  126. package/dist/types/components/data-display/DataViews/data-views-quick-chip.d.ts.map +1 -0
  127. package/dist/types/components/data-display/DataViews/data-views-quick-types.d.ts +33 -0
  128. package/dist/types/components/data-display/DataViews/data-views-quick-types.d.ts.map +1 -0
  129. package/dist/types/components/data-display/DataViews/data-views-range-types.d.ts +2 -0
  130. package/dist/types/components/data-display/DataViews/data-views-range-types.d.ts.map +1 -1
  131. package/dist/types/components/data-display/DataViews/data-views-shell-toolbar.d.ts +11 -6
  132. package/dist/types/components/data-display/DataViews/data-views-shell-toolbar.d.ts.map +1 -1
  133. package/dist/types/components/data-display/DataViews/data-views-sticky-head.d.ts +45 -0
  134. package/dist/types/components/data-display/DataViews/data-views-sticky-head.d.ts.map +1 -0
  135. package/dist/types/components/data-display/DataViews/data-views-toolbar.d.ts +6 -0
  136. package/dist/types/components/data-display/DataViews/data-views-toolbar.d.ts.map +1 -1
  137. package/dist/types/components/data-display/DataViews/data-views-types.d.ts +7 -4
  138. package/dist/types/components/data-display/DataViews/data-views-types.d.ts.map +1 -1
  139. package/dist/types/components/data-display/DataViews/index.d.ts +1 -1
  140. package/dist/types/components/data-display/DataViews/index.d.ts.map +1 -1
  141. package/dist/user-avatar.js +5 -5
  142. package/package.json +1 -1
  143. package/src/components/data-display/DataViews/DataViewsGrid.tsx +15 -0
  144. package/src/components/data-display/DataViews/DataViewsTableBase.tsx +5 -0
  145. package/src/components/data-display/DataViews/RESPONSIVE-BEHAVIOUR.md +50 -0
  146. package/src/components/data-display/DataViews/data-views-empty.tsx +25 -0
  147. package/src/components/data-display/DataViews/data-views-grid-bodies.tsx +11 -1
  148. package/src/components/data-display/DataViews/data-views-grid-parts.tsx +27 -15
  149. package/src/components/data-display/DataViews/data-views-inline-bar.tsx +24 -1
  150. package/src/components/data-display/DataViews/data-views-more-fields.tsx +34 -1
  151. package/src/components/data-display/DataViews/data-views-more-filters.tsx +20 -4
  152. package/src/components/data-display/DataViews/data-views-overflow-fields.ts +110 -0
  153. package/src/components/data-display/DataViews/data-views-overflow.ts +58 -36
  154. package/src/components/data-display/DataViews/data-views-quick-chip.tsx +143 -0
  155. package/src/components/data-display/DataViews/data-views-quick-types.ts +33 -0
  156. package/src/components/data-display/DataViews/data-views-range-types.ts +2 -0
  157. package/src/components/data-display/DataViews/data-views-shell-toolbar.tsx +31 -23
  158. package/src/components/data-display/DataViews/data-views-sticky-head.ts +132 -0
  159. package/src/components/data-display/DataViews/data-views-toolbar.tsx +9 -0
  160. package/src/components/data-display/DataViews/data-views-types.ts +7 -11
  161. package/src/components/data-display/DataViews/index.ts +1 -0
  162. package/dist/chunk-2VMIHFMX.js.map +0 -1
  163. package/dist/chunk-375HTCF2.js.map +0 -1
  164. package/dist/chunk-6QYKZMEE.js.map +0 -1
  165. package/dist/chunk-6S3S2K7O.js.map +0 -1
  166. package/dist/chunk-ERA3AEWU.js.map +0 -1
  167. package/dist/chunk-JY5YINUH.js.map +0 -1
  168. package/dist/chunk-L6MGAPBX.js.map +0 -1
  169. package/dist/chunk-L7OWFJUU.js.map +0 -1
  170. package/dist/chunk-M6V7Y7CP.js.map +0 -1
  171. package/dist/chunk-O2P2KTKN.js.map +0 -1
  172. package/dist/chunk-Y7YKIIYS.js.map +0 -1
  173. package/dist/chunk-YLSSQJZM.js.map +0 -1
  174. /package/dist/{chunk-35L5YMYQ.js.map → chunk-2QB4WIU5.js.map} +0 -0
  175. /package/dist/{chunk-JYMXYSDP.js.map → chunk-5CAWRMDX.js.map} +0 -0
  176. /package/dist/{chunk-647DEGIU.js.map → chunk-5WJFCQFN.js.map} +0 -0
  177. /package/dist/{chunk-K6KBASL2.js.map → chunk-72L5C74V.js.map} +0 -0
  178. /package/dist/{chunk-TKLPPAS5.js.map → chunk-AHNEEFK6.js.map} +0 -0
  179. /package/dist/{chunk-BI7YMVKZ.js.map → chunk-B2JSUFDX.js.map} +0 -0
  180. /package/dist/{chunk-7J5JR33K.js.map → chunk-BBBHPK2Q.js.map} +0 -0
  181. /package/dist/{chunk-UZ2CEJOO.js.map → chunk-CSJ7WNXU.js.map} +0 -0
  182. /package/dist/{chunk-LMIOWP6H.js.map → chunk-D34PZJH3.js.map} +0 -0
  183. /package/dist/{chunk-SUZLGB5I.js.map → chunk-E6K2UZGR.js.map} +0 -0
  184. /package/dist/{chunk-7XSCEHGA.js.map → chunk-EOQ6EKTS.js.map} +0 -0
  185. /package/dist/{chunk-AMLHEKSV.js.map → chunk-HI7JPDD6.js.map} +0 -0
  186. /package/dist/{chunk-KARMRTTM.js.map → chunk-J2RUDZVJ.js.map} +0 -0
  187. /package/dist/{chunk-HQCZT6TO.js.map → chunk-JVOEVTCZ.js.map} +0 -0
  188. /package/dist/{chunk-VJB63DUM.js.map → chunk-K3PMMW23.js.map} +0 -0
  189. /package/dist/{chunk-J6DYHBID.js.map → chunk-LIN4A2BW.js.map} +0 -0
  190. /package/dist/{chunk-FXZUVZON.js.map → chunk-LWZ2K225.js.map} +0 -0
  191. /package/dist/{chunk-MJ6EAND6.js.map → chunk-Q7BGMLCX.js.map} +0 -0
  192. /package/dist/{chunk-6ATXOJVQ.js.map → chunk-QADTI63U.js.map} +0 -0
  193. /package/dist/{chunk-SB2SEGR6.js.map → chunk-TIM4PXWN.js.map} +0 -0
  194. /package/dist/{chunk-3WLS7Z7D.js.map → chunk-UMOHHWXY.js.map} +0 -0
  195. /package/dist/{chunk-S4JXSC4D.js.map → chunk-V6SRBQMN.js.map} +0 -0
  196. /package/dist/{chunk-33XGC4YU.js.map → chunk-YEGZIYVM.js.map} +0 -0
@@ -0,0 +1,89 @@
1
+ // src/components/data-display/DataViews/data-views-sticky-head.ts
2
+ import { useEffect } from "react";
3
+ var SHELL_ATTR = "data-dv-shell";
4
+ var STICKY_BAR_ATTR = "data-dv-sticky-bar";
5
+ var SHELL_PROPS = { [SHELL_ATTR]: "" };
6
+ function headShift(tableTop, tableHeight, headHeight, edge) {
7
+ return Math.max(0, Math.min(edge - tableTop, tableHeight - headHeight));
8
+ }
9
+ function stickyEdge(wrapper) {
10
+ const bar = wrapper.closest(`[${SHELL_ATTR}]`)?.querySelector(`[${STICKY_BAR_ATTR}]`);
11
+ return bar ? bar.getBoundingClientRect().bottom : 0;
12
+ }
13
+ function scrollParent(element) {
14
+ for (let node = element.parentElement; node; node = node.parentElement) {
15
+ const { overflowY } = getComputedStyle(node);
16
+ if (overflowY === "auto" || overflowY === "scroll") return node;
17
+ }
18
+ return null;
19
+ }
20
+ function useStickyBarTop(ref, enabled) {
21
+ useEffect(() => {
22
+ const shell = ref.current;
23
+ const bar = shell?.querySelector(`[${STICKY_BAR_ATTR}]`);
24
+ if (!enabled || !shell || !bar) return void 0;
25
+ const apply = () => {
26
+ const parent = scrollParent(bar);
27
+ bar.style.top = parent ? `calc(-1 * ${getComputedStyle(parent).paddingTop})` : "";
28
+ };
29
+ apply();
30
+ window.addEventListener("resize", apply);
31
+ return () => {
32
+ window.removeEventListener("resize", apply);
33
+ bar.style.top = "";
34
+ };
35
+ }, [ref, enabled]);
36
+ }
37
+ function paint(head, shift) {
38
+ const transform = shift > 0 && typeof DOMMatrixReadOnly !== "undefined" ? new DOMMatrixReadOnly().translate(0, shift).toString() : "";
39
+ head.querySelectorAll("th").forEach((cell) => {
40
+ cell.style.transform = transform;
41
+ cell.style.zIndex = transform ? "2" : "";
42
+ });
43
+ }
44
+ function useStickyTableHead(ref, enabled) {
45
+ useEffect(() => {
46
+ const wrapper = ref.current;
47
+ if (!enabled || !wrapper) return void 0;
48
+ let frame = 0;
49
+ const apply = () => {
50
+ frame = 0;
51
+ const table = wrapper.querySelector("table");
52
+ const head = table?.querySelector("thead");
53
+ if (!table || !head) return;
54
+ const box = table.getBoundingClientRect();
55
+ const shift = headShift(box.top, box.height, head.getBoundingClientRect().height, stickyEdge(wrapper));
56
+ paint(head, shift);
57
+ };
58
+ const schedule = () => {
59
+ if (frame === 0) frame = requestAnimationFrame(apply);
60
+ };
61
+ window.addEventListener("scroll", schedule, { capture: true, passive: true });
62
+ window.addEventListener("resize", schedule);
63
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(schedule);
64
+ observer?.observe(wrapper);
65
+ const mutations = typeof MutationObserver === "undefined" ? null : new MutationObserver(schedule);
66
+ mutations?.observe(wrapper, { childList: true, subtree: true });
67
+ schedule();
68
+ return () => {
69
+ window.removeEventListener("scroll", schedule, { capture: true });
70
+ window.removeEventListener("resize", schedule);
71
+ observer?.disconnect();
72
+ mutations?.disconnect();
73
+ if (frame !== 0) cancelAnimationFrame(frame);
74
+ const head = wrapper.querySelector("thead");
75
+ if (head) paint(head, 0);
76
+ };
77
+ }, [ref, enabled]);
78
+ }
79
+
80
+ export {
81
+ SHELL_ATTR,
82
+ STICKY_BAR_ATTR,
83
+ SHELL_PROPS,
84
+ headShift,
85
+ useStickyBarTop,
86
+ paint,
87
+ useStickyTableHead
88
+ };
89
+ //# sourceMappingURL=chunk-4IE66GY2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/DataViews/data-views-sticky-head.ts"],"sourcesContent":["\"use client\";\n\n/**\n * THE TABLE HEADER THAT FOLLOWS THE PAGE — for `stickyToolbar`.\n *\n * `position: sticky` cannot do this job. A sticky cell sticks inside its\n * nearest scroll container, and the table's is its own wrapper: it scrolls\n * SIDEWAYS (`overflow-x: auto`, so a wide table is never squeezed), which\n * makes it a scroll container on both axes, and it never scrolls vertically —\n * the page does. So the header would stick to a box that never moves. Taking\n * the sideways scroll away to let it stick would trade one defect for another:\n * columns clipped or crushed on every narrow screen.\n *\n * Instead the header cells are TRANSLATED down by however far the page has\n * scrolled the table's top past the sticky toolbar's bottom edge, clamped so\n * the header never leaves its own table. The translation stays inside the\n * table's box, so the wrapper's overflow clips nothing.\n *\n * Driven by the page's scroll (any scroller: a capturing listener on `window`\n * hears every element's scroll event) and by resizes, one frame at a time.\n */\nimport { useEffect, type RefObject } from \"react\";\n\n/** The attribute the shell root carries, so the head can find its own toolbar. */\nexport const SHELL_ATTR = \"data-dv-shell\";\n/** The attribute the sticky toolbar carries. */\nexport const STICKY_BAR_ATTR = \"data-dv-sticky-bar\";\n/** Spread on the shell root. */\nexport const SHELL_PROPS = { [SHELL_ATTR]: \"\" };\n\n/** How far the header must move down to sit under `edge` (px), inside its table. */\nexport function headShift(tableTop: number, tableHeight: number, headHeight: number, edge: number): number {\n return Math.max(0, Math.min(edge - tableTop, tableHeight - headHeight));\n}\n\n/** The top edge the header slides under: the sticky toolbar's bottom, else the viewport's top. */\nfunction stickyEdge(wrapper: HTMLElement): number {\n const bar = wrapper.closest(`[${SHELL_ATTR}]`)?.querySelector<HTMLElement>(`[${STICKY_BAR_ATTR}]`);\n return bar ? bar.getBoundingClientRect().bottom : 0;\n}\n\n/** The element whose scrolling moves the page under the bar: the nearest scrolling ancestor. */\nfunction scrollParent(element: HTMLElement): HTMLElement | null {\n for (let node = element.parentElement; node; node = node.parentElement) {\n const { overflowY } = getComputedStyle(node);\n if (overflowY === \"auto\" || overflowY === \"scroll\") return node;\n }\n return null;\n}\n\n/**\n * Stick the toolbar to the VISIBLE top of its scroll area.\n *\n * `top: 0` sticks to the scroll container's content edge, which sits inside\n * its padding: a main pane padded 24px held the bar 24px below the app bar,\n * with rows showing through the gap above it. The bar's `top` is therefore\n * the negative of that padding, read from the live layout (the shell does not\n * know which pane it is in, nor what padding the host gave it).\n */\nexport function useStickyBarTop(ref: RefObject<HTMLElement | null>, enabled: boolean): void {\n useEffect(() => {\n const shell = ref.current;\n const bar = shell?.querySelector<HTMLElement>(`[${STICKY_BAR_ATTR}]`);\n if (!enabled || !shell || !bar) return undefined;\n const apply = (): void => {\n const parent = scrollParent(bar);\n // The host's own computed length, passed through — never one of ours.\n bar.style.top = parent ? `calc(-1 * ${getComputedStyle(parent).paddingTop})` : \"\";\n };\n apply();\n window.addEventListener(\"resize\", apply);\n return () => {\n window.removeEventListener(\"resize\", apply);\n bar.style.top = \"\";\n };\n }, [ref, enabled]);\n}\n\n/** Move every header cell down by `shift` px (0 puts them back), above the rows they cover. */\nexport function paint(head: HTMLElement, shift: number): void {\n // A measured offset, so a matrix rather than a design length. No DOMMatrix\n // (jsdom), no translation: the header simply stays in the table.\n const transform =\n shift > 0 && typeof DOMMatrixReadOnly !== \"undefined\"\n ? new DOMMatrixReadOnly().translate(0, shift).toString()\n : \"\";\n head.querySelectorAll<HTMLElement>(\"th\").forEach((cell) => {\n cell.style.transform = transform;\n // Above the rows it now covers, below the toolbar (z-index 3).\n cell.style.zIndex = transform ? \"2\" : \"\";\n });\n}\n\n/** Translate the header cells of the table inside `ref` so they follow the page. */\nexport function useStickyTableHead(ref: RefObject<HTMLElement | null>, enabled: boolean): void {\n useEffect(() => {\n const wrapper = ref.current;\n if (!enabled || !wrapper) return undefined;\n let frame = 0;\n const apply = (): void => {\n frame = 0;\n const table = wrapper.querySelector(\"table\");\n const head = table?.querySelector(\"thead\");\n if (!table || !head) return;\n const box = table.getBoundingClientRect();\n const shift = headShift(box.top, box.height, head.getBoundingClientRect().height, stickyEdge(wrapper));\n paint(head, shift);\n };\n const schedule = (): void => {\n if (frame === 0) frame = requestAnimationFrame(apply);\n };\n window.addEventListener(\"scroll\", schedule, { capture: true, passive: true });\n window.addEventListener(\"resize\", schedule);\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(schedule);\n observer?.observe(wrapper);\n // A header cell added while scrolled (a column shown from \"Exibir\") must\n // follow too, not wait for the next scroll.\n const mutations = typeof MutationObserver === \"undefined\" ? null : new MutationObserver(schedule);\n mutations?.observe(wrapper, { childList: true, subtree: true });\n schedule();\n return () => {\n window.removeEventListener(\"scroll\", schedule, { capture: true });\n window.removeEventListener(\"resize\", schedule);\n observer?.disconnect();\n mutations?.disconnect();\n if (frame !== 0) cancelAnimationFrame(frame);\n // Turned off mid-scroll: the header goes back where it belongs.\n const head = wrapper.querySelector(\"thead\");\n if (head) paint(head, 0);\n };\n }, [ref, enabled]);\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  DATA_VIEWS_LAYOUTS
3
- } from "./chunk-O2P2KTKN.js";
3
+ } from "./chunk-HLYYB4O5.js";
4
4
  import {
5
5
  useDataViewsCopy
6
6
  } from "./chunk-KHG57NAE.js";
@@ -187,4 +187,4 @@ export {
187
187
  useDataViewsLayout,
188
188
  DataViewsZoomSlider
189
189
  };
190
- //# sourceMappingURL=chunk-JYMXYSDP.js.map
190
+ //# sourceMappingURL=chunk-5CAWRMDX.js.map
@@ -1,43 +1,50 @@
1
1
  import {
2
- GridMain
3
- } from "./chunk-JY5YINUH.js";
4
- import {
5
- FilterDialog,
6
- GridFilterPanel
7
- } from "./chunk-TKLPPAS5.js";
8
- import {
9
- DataViewsEmpty
10
- } from "./chunk-375HTCF2.js";
2
+ ShellEmpty
3
+ } from "./chunk-Y2CCXB7R.js";
11
4
  import {
12
5
  InlineFilterControls
13
- } from "./chunk-Y7YKIIYS.js";
6
+ } from "./chunk-TQXB2OHP.js";
14
7
  import {
15
8
  GridHeaderRow
16
9
  } from "./chunk-X3AFXHY5.js";
10
+ import {
11
+ GridMain
12
+ } from "./chunk-WQ32YFM5.js";
13
+ import {
14
+ FilterDialog,
15
+ GridFilterPanel
16
+ } from "./chunk-AHNEEFK6.js";
17
17
  import {
18
18
  DataViewsPagination
19
19
  } from "./chunk-XZFTRGRW.js";
20
20
  import {
21
- toOverflowFields,
22
21
  useFilterOverflow
23
- } from "./chunk-6QYKZMEE.js";
22
+ } from "./chunk-CSLBRJ7N.js";
23
+ import {
24
+ toOverflowFields,
25
+ toggleQuick
26
+ } from "./chunk-GCYGVWOI.js";
24
27
  import {
25
28
  allOnPageSelected,
26
29
  resolveSelectionExtra
27
30
  } from "./chunk-5YDS6HO3.js";
28
31
  import {
29
32
  ScopeTabsSlot
30
- } from "./chunk-VJB63DUM.js";
33
+ } from "./chunk-K3PMMW23.js";
31
34
  import {
32
35
  ShellToolbar
33
- } from "./chunk-L6MGAPBX.js";
36
+ } from "./chunk-RCZ4KL2H.js";
37
+ import {
38
+ SHELL_PROPS,
39
+ useStickyBarTop
40
+ } from "./chunk-4IE66GY2.js";
34
41
  import {
35
42
  togglePillValues
36
43
  } from "./chunk-XZE5FIRB.js";
37
44
  import {
38
45
  DataViewsLayoutProvider,
39
46
  useDataViewsLayout
40
- } from "./chunk-JYMXYSDP.js";
47
+ } from "./chunk-5CAWRMDX.js";
41
48
  import {
42
49
  useDataViewsCopy
43
50
  } from "./chunk-KHG57NAE.js";
@@ -49,7 +56,7 @@ import {
49
56
  } from "./chunk-WEBEOBN5.js";
50
57
 
51
58
  // src/components/data-display/DataViews/data-views-grid-parts.tsx
52
- import { useEffect, useState } from "react";
59
+ import { useEffect, useRef, useState } from "react";
53
60
  import { jsx, jsxs } from "react/jsx-runtime";
54
61
  function LayoutStateSync({
55
62
  c
@@ -68,12 +75,13 @@ function useGridShellFilters({
68
75
  rangeFields,
69
76
  testIdPrefix,
70
77
  alwaysShowSearch,
71
- hasExport
78
+ hasExport,
79
+ quickFilters
72
80
  }) {
73
81
  const { state } = c;
74
82
  const [openControls, setOpenControls] = useState(0);
75
83
  const split = useFilterOverflow(
76
- toOverflowFields(fields, rangeFields),
84
+ toOverflowFields(fields, rangeFields, quickFilters),
77
85
  state.pills,
78
86
  c.ranges,
79
87
  openControls > 0,
@@ -81,7 +89,7 @@ function useGridShellFilters({
81
89
  );
82
90
  const showInline = inlineFilters;
83
91
  const useModal = false;
84
- const inlineVisible = showInline && (alwaysShowSearch || fields.length > 0 || rangeFields.length > 0 || state.search !== "");
92
+ const inlineVisible = showInline && (alwaysShowSearch || fields.length > 0 || rangeFields.length > 0 || quickFilters.length > 0 || state.search !== "");
85
93
  const filterProps = {
86
94
  testIdPrefix,
87
95
  search: state.search,
@@ -94,7 +102,8 @@ function useGridShellFilters({
94
102
  onTogglePill: (fieldId, value, checked) => c.patch(({ pills }) => ({ pills: { ...pills, [fieldId]: togglePillValues(pills[fieldId], value, checked) } })),
95
103
  onChangeRange: (fieldId, range) => c.patch({ ranges: { ...c.ranges, [fieldId]: range } }),
96
104
  onClearField: (fieldId) => c.patch({ pills: { ...state.pills, [fieldId]: [] } }),
97
- onClearAll: () => c.patch({ search: "", pills: {}, ranges: {} })
105
+ onClearAll: () => c.patch({ search: "", pills: {}, ranges: {} }),
106
+ onToggleQuick: (quick) => c.patch(({ pills }) => ({ pills: toggleQuick(pills, quick) }))
98
107
  };
99
108
  return {
100
109
  showInline,
@@ -112,15 +121,9 @@ function ShellStack({
112
121
  const copy = useDataViewsCopy();
113
122
  const { c, testIdPrefix, dataTestId, scopes = [], emptyState, inlineFilters = false } = props;
114
123
  const { showInline, useModal, inlineVisible, filterProps, split, onControlOpenChange } = filters;
115
- const body = /* @__PURE__ */ jsx(
116
- DataViewsEmpty,
117
- {
118
- filtered: c.activeFilterCount > 0 || c.state.search !== "",
119
- onClearFilters: () => c.patch({ search: "", pills: {}, ranges: {} }),
120
- emptyState,
121
- testIdPrefix
122
- }
123
- );
124
+ const shellRef = useRef(null);
125
+ useStickyBarTop(shellRef, props.stickyToolbar === true);
126
+ const body = /* @__PURE__ */ jsx(ShellEmpty, { c, emptyState, testIdPrefix });
124
127
  return /* @__PURE__ */ jsx(
125
128
  TableFilter,
126
129
  {
@@ -128,7 +131,7 @@ function ShellStack({
128
131
  open: c.filterOpen,
129
132
  onOpenChange: c.setFilterOpen,
130
133
  hasActiveFilters: c.activeFilterCount > 0,
131
- children: /* @__PURE__ */ jsxs(default2, { spacing: 0, "data-testid": dataTestId ? `${dataTestId}-container` : void 0, children: [
134
+ children: /* @__PURE__ */ jsxs(default2, { ref: shellRef, spacing: 0, "data-testid": dataTestId ? `${dataTestId}-container` : void 0, ...props.stickyToolbar ? SHELL_PROPS : {}, children: [
132
135
  /* @__PURE__ */ jsx(GridHeaderRow, { title: props.title, headerActions: props.headerActions, testIdPrefix }),
133
136
  /* @__PURE__ */ jsx(
134
137
  ShellToolbar,
@@ -156,7 +159,8 @@ function ShellStack({
156
159
  toolbarRightSlot: props.toolbarRightSlot,
157
160
  compactControls: showInline && split.compactControls,
158
161
  counterHidden: showInline && split.counterHidden,
159
- showInline
162
+ showInline,
163
+ sticky: props.stickyToolbar === true
160
164
  }
161
165
  ),
162
166
  /* @__PURE__ */ jsx(
@@ -186,7 +190,8 @@ function ShellStack({
186
190
  selectable: props.selectable !== false,
187
191
  dataTestId,
188
192
  testIdPrefix,
189
- emptyState: body
193
+ emptyState: body,
194
+ stickyHead: props.stickyToolbar === true
190
195
  }
191
196
  ),
192
197
  /* @__PURE__ */ jsx(DataViewsPagination, { c, testIdPrefix })
@@ -219,7 +224,8 @@ function GridShell(props) {
219
224
  rangeFields,
220
225
  testIdPrefix,
221
226
  alwaysShowSearch,
222
- hasExport: props.exportConfig !== void 0
227
+ hasExport: props.exportConfig !== void 0,
228
+ quickFilters: props.quickFilters ?? []
223
229
  });
224
230
  return /* @__PURE__ */ jsxs(
225
231
  DataViewsLayoutProvider,
@@ -241,4 +247,4 @@ function GridShell(props) {
241
247
  export {
242
248
  GridShell
243
249
  };
244
- //# sourceMappingURL=chunk-L7OWFJUU.js.map
250
+ //# sourceMappingURL=chunk-5RC7WAHH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/DataViews/data-views-grid-parts.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nimport { TableFilter } from \"../../layout/TableFilter\";\nimport { Stack } from \"../../../mui/Stack\";\n\nimport {\n DataViewsLayoutProvider,\n useDataViewsLayout,\n type DataViewsLayout,\n} from \"./data-views-layout-context\";\nimport { FilterDialog, GridFilterPanel } from \"./data-views-filter-panel\";\nimport { GridMain } from \"./data-views-grid-bodies\";\nimport type { ListGroupConfig } from \"./list-card-rails\";\nimport { InlineFilterControls } from \"./data-views-inline-bar\";\nimport { toOverflowFields, useFilterOverflow, type OverflowSplit } from \"./data-views-overflow\";\nimport { GridHeaderRow } from \"./data-views-header-row\";\nimport { allOnPageSelected, resolveSelectionExtra, type SelectionExtraRender } from \"./data-views-selection-extra\";\nimport { ShellToolbar } from \"./data-views-shell-toolbar\";\nimport type { DisplayPanelView } from \"./data-views-display-panel\";\nimport type { DataViewExport } from \"./data-views-export\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { ShellEmpty } from \"./data-views-empty\";\nimport { DataViewsPagination } from \"./data-views-pagination\";\nimport type { BoardConfig } from \"./DataViewsBoard\";\nimport { type ScopeConfig } from \"./data-views-scopes\";\nimport { ScopeTabsSlot } from \"./data-views-scope-tabs\";\nimport { SHELL_PROPS, useStickyBarTop } from \"./data-views-sticky-head\";\nimport { togglePillValues } from \"./data-views-grid-helpers\";\nimport { toggleQuick } from \"./data-views-overflow-fields\";\nimport type {\n DataViewCardSelection,\n FilterFieldConfig,\n QuickFilterConfig,\n RangeFieldConfig,\n RangeValue,\n RowAction,\n} from \"./data-views-types\";\nimport type { DataViewRowDetail } from \"./data-views-row-detail\";\nimport type { DataViewsController } from \"./use-data-views-state\";\n\n/* ── Layout ⇄ view-state mirror ──────────────────────────────────────────── */\n\n/**\n * Mirrors the LIVE layout back into the view state, so saving a view captures\n * the layout the user is actually looking at.\n *\n * A component rather than a callback prop because only something INSIDE the\n * provider can read the layout, and only the controller can write the state.\n * The `stored !== layout` guard is what makes it idempotent: `c` is rebuilt on\n * every render, so an unguarded effect here would patch → re-render → patch.\n *\n * It re-fires when `stored` changes too, which is the case that matters after\n * applying a saved view: `appliedState` REPLACES the state, so a view saved\n * before layouts were captured clears `state.layout`, and the mirror puts the\n * current one back rather than leaving the next save with nothing to store.\n */\nfunction LayoutStateSync<T extends Record<string, unknown>>({\n c,\n}: {\n c: DataViewsController<T>;\n}): null {\n const { layout } = useDataViewsLayout();\n const stored = c.state.layout;\n useEffect(() => {\n if (stored !== layout) c.patch({ layout });\n // `c` is intentionally out of the deps — see the guard above.\n }, [layout, stored]);\n return null;\n}\n\n/* ── Shell (composes toolbar + body + panel) ─────────────────────────────── */\n\n/** The shared filter-surface props consumed by the inline bar, panel, and modal. */\ninterface FilterSurfaceProps<T extends Record<string, unknown>> {\n testIdPrefix: string;\n search: string;\n fields: FilterFieldConfig<T>[];\n rangeFields: RangeFieldConfig<T>[];\n pills: Record<string, string[]>;\n ranges: Record<string, RangeValue>;\n onSearchChange: (value: string) => void;\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void;\n onChangeRange: (fieldId: string, range: RangeValue) => void;\n onClearField: (fieldId: string) => void;\n onClearAll: () => void;\n /** Press a quick chip (its field becomes `[value]`), or release the pressed one. */\n onToggleQuick: (quick: QuickFilterConfig) => void;\n}\n\n/**\n * Derives the responsive filter state (which surface to show at this width) and\n * the filter-mutation handlers from the controller — pulled out of `GridShell`\n * so the component body stays under the size/complexity budget.\n */\n/** Grouped rather than positional: the list had grown past readability. */\ninterface GridShellFiltersArgs<T extends Record<string, unknown>> {\n c: DataViewsController<T>;\n inlineFilters: boolean;\n fields: FilterFieldConfig<T>[];\n rangeFields: RangeFieldConfig<T>[];\n testIdPrefix: string;\n alwaysShowSearch: boolean;\n /** Is \"Exportar\" on the bar? Half the right cluster's cost when it is not. */\n hasExport: boolean;\n quickFilters: QuickFilterConfig[];\n}\n\nfunction useGridShellFilters<T extends Record<string, unknown>>({\n c,\n inlineFilters,\n fields,\n rangeFields,\n testIdPrefix,\n alwaysShowSearch,\n hasExport,\n quickFilters,\n}: GridShellFiltersArgs<T>): {\n showInline: boolean;\n useModal: boolean;\n inlineVisible: boolean;\n filterProps: FilterSurfaceProps<T>;\n split: OverflowSplit<T>;\n onControlOpenChange: (open: boolean) => void;\n} {\n const { state } = c;\n // How many filter controls are open. A COUNT, not a flag: closing one popover\n // by opening another overlaps, and a boolean would unfreeze mid-handover.\n const [openControls, setOpenControls] = useState(0);\n // ONE measurement for the whole shell: the filter row decides which controls\n // it can keep, and the TOOLBAR needs the same answer to drop its labels.\n // Measuring twice would let the two disagree at the crossover width.\n const split = useFilterOverflow(\n toOverflowFields(fields, rangeFields, quickFilters),\n state.pills,\n c.ranges,\n openControls > 0,\n hasExport,\n );\n // THE BAR RENDERS AT EVERY WIDTH. It used to be swapped for a full-screen\n // filter MODAL below `lg`, which was the responsive strategy before the\n // measured ladder existed — and the two now do the same job, badly together:\n // the modal took the bar away at 1199px, and with it the very degradation\n // (labels off, search collapsed, filters into \"Mais\") that exists to make a\n // narrow bar work. So a 900px window got no bar and no ladder, and the\n // operator lost the search entirely rather than gaining a compact one.\n //\n // The ladder is measured, so it already covers every width the modal did.\n const showInline = inlineFilters;\n const useModal = false;\n const inlineVisible =\n showInline &&\n (alwaysShowSearch ||\n fields.length > 0 ||\n rangeFields.length > 0 ||\n quickFilters.length > 0 ||\n state.search !== \"\");\n const filterProps: FilterSurfaceProps<T> = {\n testIdPrefix,\n search: state.search,\n fields,\n rangeFields,\n pills: state.pills,\n ranges: c.ranges,\n onSearchChange: (value) => c.patch({ search: value }),\n // Updater, never the render's `state` — see {@link DataViewStatePatch}.\n onTogglePill: (fieldId, value, checked) =>\n c.patch(({ pills }) => ({ pills: { ...pills, [fieldId]: togglePillValues(pills[fieldId], value, checked) } })),\n onChangeRange: (fieldId, range) => c.patch({ ranges: { ...c.ranges, [fieldId]: range } }),\n onClearField: (fieldId) => c.patch({ pills: { ...state.pills, [fieldId]: [] } }),\n onClearAll: () => c.patch({ search: \"\", pills: {}, ranges: {} }),\n onToggleQuick: (quick) => c.patch(({ pills }) => ({ pills: toggleQuick(pills, quick) })),\n };\n return {\n showInline,\n useModal,\n inlineVisible,\n filterProps,\n split,\n onControlOpenChange: (open) =>\n setOpenControls((count) => Math.max(0, count + (open ? 1 : -1))),\n };\n}\n\ninterface GridShellProps<T extends Record<string, unknown>> {\n c: DataViewsController<T>;\n rows: T[];\n fields: FilterFieldConfig<T>[];\n rangeFields: RangeFieldConfig<T>[];\n getRowId: (row: T) => string | number;\n testIdPrefix: string;\n dataTestId?: string;\n emptyState?: React.ReactNode;\n toolbarRightSlot?: React.ReactNode;\n rowActions?: RowAction<T>[];\n bulkActions?: (selectedRows: T[], clearSelection: () => void) => React.ReactNode;\n /** A widening control beside the selection count — see `resolveSelectionExtra`. */\n selectionExtra?: SelectionExtraRender<T>;\n /** Opt-in \"Grade\" (cards) layout: renders each row as an entity-supplied card.\n * Omit ⇒ table only (no layout toggle). */\n renderCard?: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n /**\n * Opt-in \"Quadro\" (board) layout. Needs `renderCard` too — the board reuses\n * the entity's card, so a board config without one simply offers no board\n * rather than failing: that is a config gap, not a runtime error.\n */\n board?: BoardConfig<T>;\n /** Opt-in \"Lista\" layout: one full-width, entity-rendered row per record. */\n renderListRow?: (row: T, selection: DataViewCardSelection) => React.ReactNode;\n /** The Lista's shared columns, so its rows line up by construction. */\n listGroup?: ListGroupConfig<T>;\n /** Opt-in expandable rows, drawn by the table layout only. */\n rowDetail?: DataViewRowDetail<T>;\n /** Row selection, on by default. False ⇒ no checkboxes in any layout, no select-all. */\n selectable?: boolean;\n /** The page-level partition rendered as tabs under the toolbar. */\n scopes?: ScopeConfig[];\n /**\n * The row field the scopes partition by. Compared against the board's\n * `groupBy` so the two are not shown as the same partition twice.\n */\n scopeFieldId?: string;\n /** Per-sort-field value kind, so directions read in the column's own terms. */\n sortKinds?: Record<string, string>;\n /** The saved-view chrome bracketing the Exibir panel. */\n displayView?: DisplayPanelView;\n /** Injected export — the host re-queries; the grid never fetches. */\n exportConfig?: DataViewExport;\n /** Page title in the grid's own header row, above the scopes + toolbar. */\n title?: string;\n /** Primary page actions rendered at the header row's right. */\n headerActions?: React.ReactNode;\n /** Which layout to show first when the user has expressed no preference (default \"table\"). */\n defaultLayout?: DataViewsLayout;\n /** Pin to `defaultLayout`, ignoring the remembered preference (stories/docs). */\n ignoreStoredLayout?: boolean;\n /**\n * Opt into the responsive inline filter UX: a collapsible filter row below the\n * toolbar on wide screens and a modal on narrow ones. When false (default),\n * keep the classic slide-in filter panel opened by the \"Filtros\" button.\n */\n inlineFilters?: boolean;\n /**\n * Keep the inline search box on screen even with no filter fields and no\n * active search. Without it a grid whose only filter IS the search (`fields`\n * empty) can never OFFER one: the row renders only once a search exists, so\n * the operator would have to hand-edit the URL to start one. Default false —\n * every grid that ships filter fields already shows the row.\n */\n alwaysShowSearch?: boolean;\n /** One-click toggle chips at the head of the bar — see `QuickFilterConfig`. */\n quickFilters?: QuickFilterConfig[];\n /** Pin the toolbar and the table header while the page scrolls. */\n stickyToolbar?: boolean;\n}\n\n/** The scrollable content region: scope tabs, toolbar, filter bar, body, pager. */\nfunction ShellStack<T extends Record<string, unknown>>({\n props,\n filters,\n}: {\n props: GridShellProps<T>;\n filters: ReturnType<typeof useGridShellFilters<T>>;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { c, testIdPrefix, dataTestId, scopes = [], emptyState, inlineFilters = false } = props;\n const { showInline, useModal, inlineVisible, filterProps, split, onControlOpenChange } = filters;\n const shellRef = useRef<HTMLDivElement>(null);\n useStickyBarTop(shellRef, props.stickyToolbar === true);\n const body = <ShellEmpty c={c} emptyState={emptyState} testIdPrefix={testIdPrefix} />;\n return (\n <TableFilter\n copy={copy.tableFilter} open={c.filterOpen} onOpenChange={c.setFilterOpen}\n hasActiveFilters={c.activeFilterCount > 0}\n >\n <Stack ref={shellRef} spacing={0} data-testid={dataTestId ? `${dataTestId}-container` : undefined} {...(props.stickyToolbar ? SHELL_PROPS : {})}>\n <GridHeaderRow title={props.title} headerActions={props.headerActions} testIdPrefix={testIdPrefix} />\n <ShellToolbar\n c={c}\n rows={props.rows}\n sortKinds={props.sortKinds}\n displayView={props.displayView}\n exportConfig={props.exportConfig}\n filterControls={\n inlineVisible ? (\n <InlineFilterControls\n {...filterProps} split={split} activeFilterCount={c.activeFilterCount}\n onControlOpenChange={onControlOpenChange}\n />\n ) : undefined\n }\n barRef={split.barRef}\n testIdPrefix={testIdPrefix}\n rowActions={props.rowActions}\n bulkActions={props.bulkActions}\n selectionExtra={resolveSelectionExtra(props)}\n allOnPageSelected={allOnPageSelected(c, props.getRowId)}\n toolbarRightSlot={props.toolbarRightSlot}\n compactControls={showInline && split.compactControls}\n counterHidden={showInline && split.counterHidden}\n showInline={showInline}\n sticky={props.stickyToolbar === true}\n />\n <ScopeTabsSlot\n scopes={scopes} scopeFieldId={props.scopeFieldId} board={props.board}\n value={c.scope} onChange={c.setScope} counts={c.scopeCounts}\n testIdPrefix={testIdPrefix}\n />\n <TableFilter.Layout>\n <TableFilter.Main>\n <GridMain\n c={c}\n getRowId={props.getRowId}\n renderCard={props.renderCard}\n renderListRow={props.renderListRow}\n listGroup={props.listGroup}\n board={props.board}\n rowDetail={props.rowDetail} selectable={props.selectable !== false}\n dataTestId={dataTestId}\n testIdPrefix={testIdPrefix}\n emptyState={body}\n stickyHead={props.stickyToolbar === true}\n />\n <DataViewsPagination c={c} testIdPrefix={testIdPrefix} />\n </TableFilter.Main>\n {inlineFilters ? null : <GridFilterPanel {...filterProps} />}\n </TableFilter.Layout>\n {useModal && <FilterDialog open={c.filterOpen} onClose={() => c.setFilterOpen(false)} {...filterProps} />}\n </Stack>\n </TableFilter>\n );\n}\n\nexport function GridShell<T extends Record<string, unknown>>(props: GridShellProps<T>): React.JSX.Element {\n const {\n c,\n fields,\n rangeFields,\n testIdPrefix,\n renderCard,\n renderListRow,\n board,\n defaultLayout,\n ignoreStoredLayout,\n inlineFilters = false,\n alwaysShowSearch = false,\n } = props;\n const filters = useGridShellFilters({\n c,\n inlineFilters,\n fields,\n rangeFields,\n testIdPrefix,\n alwaysShowSearch,\n hasExport: props.exportConfig !== undefined,\n quickFilters: props.quickFilters ?? [],\n });\n return (\n <DataViewsLayoutProvider\n canUseCards={Boolean(renderCard)}\n canUseList={Boolean(renderListRow)}\n // The board reuses the entity's card, so it needs BOTH — a `board` with no\n // `renderCard` offers no board rather than throwing.\n canUseBoard={Boolean(board && renderCard)}\n defaultLayout={defaultLayout}\n ignoreStoredLayout={ignoreStoredLayout}\n viewLayout={c.state.layout}\n >\n <LayoutStateSync c={c} />\n <ShellStack props={props} filters={filters} />\n </DataViewsLayoutProvider>\n );\n}\n"],"mappings":"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","names":["default"]}
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  NumberBoundInput
3
3
  } from "./chunk-FJ3UZ4RC.js";
4
- import {
5
- RangePresets
6
- } from "./chunk-7D7CJRL7.js";
7
- import {
8
- presetsFor
9
- } from "./chunk-CBOB5AV6.js";
10
4
  import {
11
5
  isRangeInverted,
12
6
  isRangeSet,
13
7
  numericRange,
14
8
  rangeChipLabel
15
9
  } from "./chunk-GCZJH4XL.js";
10
+ import {
11
+ RangePresets
12
+ } from "./chunk-7D7CJRL7.js";
13
+ import {
14
+ presetsFor
15
+ } from "./chunk-CBOB5AV6.js";
16
16
  import {
17
17
  useDataViewsCopy
18
18
  } from "./chunk-KHG57NAE.js";
@@ -291,4 +291,4 @@ export {
291
291
  RangePill,
292
292
  PanelRangeField
293
293
  };
294
- //# sourceMappingURL=chunk-647DEGIU.js.map
294
+ //# sourceMappingURL=chunk-5WJFCQFN.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  DisplayTab,
6
6
  SortTab
7
- } from "./chunk-33XGC4YU.js";
7
+ } from "./chunk-YEGZIYVM.js";
8
8
  import {
9
9
  ViewActions,
10
10
  ViewFooter,
@@ -265,4 +265,4 @@ function DataViewsDisplayPanel({
265
265
  export {
266
266
  DataViewsDisplayPanel
267
267
  };
268
- //# sourceMappingURL=chunk-K6KBASL2.js.map
268
+ //# sourceMappingURL=chunk-72L5C74V.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-RQF4NXDC.js";
4
4
  import {
5
5
  PanelRangeField
6
- } from "./chunk-647DEGIU.js";
6
+ } from "./chunk-5WJFCQFN.js";
7
7
  import {
8
8
  useDataViewsCopy
9
9
  } from "./chunk-KHG57NAE.js";
@@ -157,4 +157,4 @@ export {
157
157
  GridFilterPanel,
158
158
  FilterDialog
159
159
  };
160
- //# sourceMappingURL=chunk-TKLPPAS5.js.map
160
+ //# sourceMappingURL=chunk-AHNEEFK6.js.map
@@ -0,0 +1,129 @@
1
+ import {
2
+ default as default2
3
+ } from "./chunk-6DPAWXZ3.js";
4
+ import {
5
+ fieldHeight
6
+ } from "./chunk-RGVNXES5.js";
7
+ import {
8
+ fieldEdge
9
+ } from "./chunk-7ZADLRLP.js";
10
+ import {
11
+ sxRem
12
+ } from "./chunk-YKCAJ2TN.js";
13
+
14
+ // src/components/data-display/DataViews/data-views-quick-chip.tsx
15
+ import Checkbox from "@mui/material/Checkbox/index.js";
16
+ import { jsx, jsxs } from "react/jsx-runtime";
17
+ function toneColor(theme, tone) {
18
+ return tone ? theme.palette[tone].main : theme.palette.text.secondary;
19
+ }
20
+ function QuickChip({
21
+ quick,
22
+ active,
23
+ onToggle,
24
+ testIdPrefix
25
+ }) {
26
+ return /* @__PURE__ */ jsxs(
27
+ default2,
28
+ {
29
+ component: "button",
30
+ type: "button",
31
+ onClick: onToggle,
32
+ "aria-pressed": active,
33
+ "data-testid": `${testIdPrefix}-quick-${quick.id}`,
34
+ sx: {
35
+ display: "inline-flex",
36
+ alignItems: "center",
37
+ gap: 0.75,
38
+ minHeight: fieldHeight,
39
+ px: 1.5,
40
+ border: 1,
41
+ borderStyle: "solid",
42
+ borderColor: (theme) => active ? theme.palette.text.primary : fieldEdge(theme),
43
+ borderRadius: 999,
44
+ bgcolor: active ? "text.primary" : "background.paper",
45
+ color: active ? "background.paper" : "text.primary",
46
+ cursor: "pointer",
47
+ font: "inherit",
48
+ fontSize: sxRem(13),
49
+ fontWeight: 500,
50
+ whiteSpace: "nowrap",
51
+ "&:hover": { borderColor: "text.primary" },
52
+ "&:focus-visible": {
53
+ outlineWidth: sxRem(2),
54
+ outlineStyle: "solid",
55
+ outlineColor: "primary.main",
56
+ // Inset, as the scope tabs draw theirs: the chip is the bar's full
57
+ // field height, and an outset ring is clipped above and below.
58
+ outlineOffset: sxRem(-2)
59
+ }
60
+ },
61
+ children: [
62
+ quick.label,
63
+ quick.count !== void 0 && /* @__PURE__ */ jsx(
64
+ default2,
65
+ {
66
+ component: "span",
67
+ sx: {
68
+ fontWeight: 400,
69
+ fontVariantNumeric: "tabular-nums",
70
+ color: (theme) => active ? "inherit" : toneColor(theme, quick.tone),
71
+ opacity: active ? 0.75 : 1
72
+ },
73
+ children: quick.count
74
+ }
75
+ )
76
+ ]
77
+ }
78
+ );
79
+ }
80
+ function QuickRow({
81
+ quick,
82
+ active,
83
+ onToggle,
84
+ testIdPrefix
85
+ }) {
86
+ return /* @__PURE__ */ jsxs(
87
+ default2,
88
+ {
89
+ component: "label",
90
+ "data-testid": `${testIdPrefix}-more-quick-${quick.id}`,
91
+ sx: {
92
+ display: "flex",
93
+ alignItems: "center",
94
+ gap: 0.25,
95
+ pr: 1,
96
+ minHeight: fieldHeight,
97
+ cursor: "pointer",
98
+ fontSize: sxRem(13),
99
+ color: active ? "primary.main" : "text.primary"
100
+ },
101
+ children: [
102
+ /* @__PURE__ */ jsx(
103
+ Checkbox,
104
+ {
105
+ size: "small",
106
+ checked: active,
107
+ onChange: onToggle,
108
+ inputProps: { "aria-label": quick.label }
109
+ }
110
+ ),
111
+ /* @__PURE__ */ jsx(default2, { component: "span", sx: { flex: 1 }, children: quick.label }),
112
+ quick.count !== void 0 && /* @__PURE__ */ jsx(
113
+ default2,
114
+ {
115
+ component: "span",
116
+ sx: { fontVariantNumeric: "tabular-nums", color: (theme) => toneColor(theme, quick.tone) },
117
+ children: quick.count
118
+ }
119
+ )
120
+ ]
121
+ }
122
+ );
123
+ }
124
+
125
+ export {
126
+ QuickChip,
127
+ QuickRow
128
+ };
129
+ //# sourceMappingURL=chunk-AT6UKTH4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/DataViews/data-views-quick-chip.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * A QUICK CHIP — the toolbar's one-click filter (see `QuickFilterConfig`).\n *\n * Its own module because it is drawn in two places: on the bar, as a\n * pill-shaped toggle with its count, and inside \"Mais\" when the ladder had no\n * room for it, as a toggle row with the same label and count. Both write the\n * same state through `onToggleQuick`, so where the chip sits never changes what\n * it does.\n *\n * Hand-drawn rather than `Toggle` (MUI ToggleButton), as the range preset chips\n * beside it are: a ToggleButton is a squared group member with its own\n * selected tint, and this is a standalone pill whose pressed state INVERTS —\n * the approved Estoque prototype's chip, pill radius included.\n */\nimport Checkbox from \"@mui/material/Checkbox/index.js\";\nimport type { Theme } from \"@mui/material/styles/index.js\";\n\nimport { Box } from \"../../../mui/Box\";\nimport { fieldHeight } from \"../../../tokens/field-height\";\nimport { fieldEdge } from \"../../../tokens/field-edge\";\nimport { sxRem } from \"../../../tokens/relative\";\n\nimport type { QuickFilterConfig } from \"./data-views-types\";\n\n/** The count's colour: the attention the rows need, or neutral. */\nfunction toneColor(theme: Theme, tone: QuickFilterConfig[\"tone\"]): string {\n return tone ? theme.palette[tone].main : theme.palette.text.secondary;\n}\n\n/** The chip on the toolbar: pressed reads as a filled, inverted pill. */\nexport function QuickChip({\n quick,\n active,\n onToggle,\n testIdPrefix,\n}: {\n quick: QuickFilterConfig;\n active: boolean;\n onToggle: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n return (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onToggle}\n aria-pressed={active}\n data-testid={`${testIdPrefix}-quick-${quick.id}`}\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0.75,\n minHeight: fieldHeight,\n px: 1.5,\n border: 1,\n borderStyle: \"solid\",\n borderColor: (theme: Theme) => (active ? theme.palette.text.primary : fieldEdge(theme)),\n borderRadius: 999,\n bgcolor: active ? \"text.primary\" : \"background.paper\",\n color: active ? \"background.paper\" : \"text.primary\",\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: sxRem(13),\n fontWeight: 500,\n whiteSpace: \"nowrap\",\n \"&:hover\": { borderColor: \"text.primary\" },\n \"&:focus-visible\": {\n outlineWidth: sxRem(2),\n outlineStyle: \"solid\",\n outlineColor: \"primary.main\",\n // Inset, as the scope tabs draw theirs: the chip is the bar's full\n // field height, and an outset ring is clipped above and below.\n outlineOffset: sxRem(-2),\n },\n }}\n >\n {quick.label}\n {quick.count !== undefined && (\n <Box\n component=\"span\"\n sx={{\n fontWeight: 400,\n fontVariantNumeric: \"tabular-nums\",\n color: (theme: Theme) => (active ? \"inherit\" : toneColor(theme, quick.tone)),\n opacity: active ? 0.75 : 1,\n }}\n >\n {quick.count}\n </Box>\n )}\n </Box>\n );\n}\n\n/** The same chip inside \"Mais\": a toggle row, label and count. */\nexport function QuickRow({\n quick,\n active,\n onToggle,\n testIdPrefix,\n}: {\n quick: QuickFilterConfig;\n active: boolean;\n onToggle: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n return (\n <Box\n component=\"label\"\n data-testid={`${testIdPrefix}-more-quick-${quick.id}`}\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 0.25,\n pr: 1,\n minHeight: fieldHeight,\n cursor: \"pointer\",\n fontSize: sxRem(13),\n color: active ? \"primary.main\" : \"text.primary\",\n }}\n >\n <Checkbox\n size=\"small\"\n checked={active}\n onChange={onToggle}\n inputProps={{ \"aria-label\": quick.label }}\n />\n <Box component=\"span\" sx={{ flex: 1 }}>\n {quick.label}\n </Box>\n {quick.count !== undefined && (\n <Box\n component=\"span\"\n sx={{ fontVariantNumeric: \"tabular-nums\", color: (theme: Theme) => toneColor(theme, quick.tone) }}\n >\n {quick.count}\n </Box>\n )}\n </Box>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,OAAO,cAAc;AA4BjB,SAoCI,KApCJ;AAjBJ,SAAS,UAAU,OAAc,MAAyC;AACxE,SAAO,OAAO,MAAM,QAAQ,IAAI,EAAE,OAAO,MAAM,QAAQ,KAAK;AAC9D;AAGO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKsB;AACpB,SACE;AAAA,IAACA;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,MAAK;AAAA,MACL,SAAS;AAAA,MACT,gBAAc;AAAA,MACd,eAAa,GAAG,YAAY,UAAU,MAAM,EAAE;AAAA,MAC9C,IAAI;AAAA,QACF,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,WAAW;AAAA,QACX,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,aAAa,CAAC,UAAkB,SAAS,MAAM,QAAQ,KAAK,UAAU,UAAU,KAAK;AAAA,QACrF,cAAc;AAAA,QACd,SAAS,SAAS,iBAAiB;AAAA,QACnC,OAAO,SAAS,qBAAqB;AAAA,QACrC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU,MAAM,EAAE;AAAA,QAClB,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW,EAAE,aAAa,eAAe;AAAA,QACzC,mBAAmB;AAAA,UACjB,cAAc,MAAM,CAAC;AAAA,UACrB,cAAc;AAAA,UACd,cAAc;AAAA;AAAA;AAAA,UAGd,eAAe,MAAM,EAAE;AAAA,QACzB;AAAA,MACF;AAAA,MAEC;AAAA,cAAM;AAAA,QACN,MAAM,UAAU,UACf;AAAA,UAACA;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI;AAAA,cACF,YAAY;AAAA,cACZ,oBAAoB;AAAA,cACpB,OAAO,CAAC,UAAkB,SAAS,YAAY,UAAU,OAAO,MAAM,IAAI;AAAA,cAC1E,SAAS,SAAS,OAAO;AAAA,YAC3B;AAAA,YAEC,gBAAM;AAAA;AAAA,QACT;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAGO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKsB;AACpB,SACE;AAAA,IAACA;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAa,GAAG,YAAY,eAAe,MAAM,EAAE;AAAA,MACnD,IAAI;AAAA,QACF,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,UAAU,MAAM,EAAE;AAAA,QAClB,OAAO,SAAS,iBAAiB;AAAA,MACnC;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU;AAAA,YACV,YAAY,EAAE,cAAc,MAAM,MAAM;AAAA;AAAA,QAC1C;AAAA,QACA,oBAACA,UAAA,EAAI,WAAU,QAAO,IAAI,EAAE,MAAM,EAAE,GACjC,gBAAM,OACT;AAAA,QACC,MAAM,UAAU,UACf;AAAA,UAACA;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI,EAAE,oBAAoB,gBAAgB,OAAO,CAAC,UAAiB,UAAU,OAAO,MAAM,IAAI,EAAE;AAAA,YAE/F,gBAAM;AAAA;AAAA,QACT;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":["default"]}
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  coerceViewState,
6
6
  emptyViewState
7
- } from "./chunk-O2P2KTKN.js";
7
+ } from "./chunk-HLYYB4O5.js";
8
8
  import {
9
9
  useDataViewsCopy
10
10
  } from "./chunk-KHG57NAE.js";
@@ -96,4 +96,4 @@ function useSavedViewsController(persistence, router, columnIds, views, initialV
96
96
  export {
97
97
  useSavedViewsController
98
98
  };
99
- //# sourceMappingURL=chunk-BI7YMVKZ.js.map
99
+ //# sourceMappingURL=chunk-B2JSUFDX.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  DENSITY_ROW_PADDING
3
- } from "./chunk-JYMXYSDP.js";
3
+ } from "./chunk-5CAWRMDX.js";
4
4
  import {
5
5
  GroupGrid
6
6
  } from "./chunk-U3HEYECF.js";
@@ -133,4 +133,4 @@ export {
133
133
  cellRailCount,
134
134
  ListCardGroup
135
135
  };
136
- //# sourceMappingURL=chunk-7J5JR33K.js.map
136
+ //# sourceMappingURL=chunk-BBBHPK2Q.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  RAIL_GAP_PX
3
- } from "./chunk-7J5JR33K.js";
3
+ } from "./chunk-BBBHPK2Q.js";
4
4
  import {
5
5
  COMPACT_BREAK,
6
6
  META_BREAK
@@ -257,4 +257,4 @@ export {
257
257
  ListCardActions,
258
258
  ListCardTail
259
259
  };
260
- //# sourceMappingURL=chunk-UZ2CEJOO.js.map
260
+ //# sourceMappingURL=chunk-CSJ7WNXU.js.map