@lifesg/react-design-system 3.5.0-canary.1 → 3.5.0-canary.3

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 (114) hide show
  1. package/cjs/data-table/data-table.js +1 -1
  2. package/cjs/data-table/data-table.js.map +1 -1
  3. package/cjs/data-table/data-table.styles.js +61 -52
  4. package/cjs/data-table/data-table.styles.js.map +1 -1
  5. package/cjs/external/dompurify/dist/purify.es.js +2 -2
  6. package/cjs/external/dompurify/dist/purify.es.js.map +1 -1
  7. package/cjs/footer/footer-helper.js +1 -1
  8. package/cjs/footer/footer-helper.js.map +1 -1
  9. package/cjs/index.js +1 -1
  10. package/cjs/navbar/drawer.js +1 -1
  11. package/cjs/navbar/drawer.js.map +1 -1
  12. package/cjs/navbar/navbar-logo-data.js +1 -1
  13. package/cjs/navbar/navbar-logo-data.js.map +1 -1
  14. package/cjs/navbar/navbar.js +1 -1
  15. package/cjs/navbar/navbar.js.map +1 -1
  16. package/cjs/predictive-text-input/predictive-text-input.js +1 -1
  17. package/cjs/predictive-text-input/predictive-text-input.js.map +1 -1
  18. package/cjs/shared/dropdown-wrapper/element-with-dropdown.js +1 -1
  19. package/cjs/shared/dropdown-wrapper/element-with-dropdown.js.map +1 -1
  20. package/cjs/shared/internal-calendar/calendar-manager.style.js +18 -17
  21. package/cjs/shared/internal-calendar/calendar-manager.style.js.map +1 -1
  22. package/cjs/table/table.styles.js +4 -6
  23. package/cjs/table/table.styles.js.map +1 -1
  24. package/cjs/theme/colour-primitive/specs/toteboard-colour-set.js +2 -0
  25. package/cjs/theme/colour-primitive/specs/toteboard-colour-set.js.map +1 -0
  26. package/cjs/theme/colour-primitive/theme-helper.js +1 -1
  27. package/cjs/theme/colour-primitive/theme-helper.js.map +1 -1
  28. package/cjs/theme/colour-semantic/theme-helper.js +1 -1
  29. package/cjs/theme/colour-semantic/theme-helper.js.map +1 -1
  30. package/cjs/theme/font/specs/toteboard-font-set.js +2 -0
  31. package/cjs/theme/font/specs/toteboard-font-set.js.map +1 -0
  32. package/cjs/theme/font/theme-helper.js +1 -1
  33. package/cjs/theme/font/theme-helper.js.map +1 -1
  34. package/cjs/theme/font-spec/specs/toteboard-font-spec-set.js +2 -0
  35. package/cjs/theme/font-spec/specs/toteboard-font-spec-set.js.map +1 -0
  36. package/cjs/theme/font-spec/theme-helper.js +1 -1
  37. package/cjs/theme/font-spec/theme-helper.js.map +1 -1
  38. package/cjs/theme/index.js +1 -1
  39. package/cjs/theme/index.js.map +1 -1
  40. package/cjs/time-range-picker/combobox-picker/combobox-picker.js +1 -1
  41. package/cjs/time-range-picker/combobox-picker/combobox-picker.js.map +1 -1
  42. package/cjs/time-range-picker/common.styles.js +7 -3
  43. package/cjs/time-range-picker/common.styles.js.map +1 -1
  44. package/cjs/time-range-picker/dial-picker/dial-picker.js +1 -1
  45. package/cjs/time-range-picker/dial-picker/dial-picker.js.map +1 -1
  46. package/cjs/timepicker/timepicker.styles.js +7 -3
  47. package/cjs/timepicker/timepicker.styles.js.map +1 -1
  48. package/cjs/util/merge-refs.js +1 -1
  49. package/cjs/util/merge-refs.js.map +1 -1
  50. package/cjs/util/use-throttle.js +2 -0
  51. package/cjs/util/use-throttle.js.map +1 -0
  52. package/data-table/data-table.js +1 -1
  53. package/data-table/data-table.js.map +1 -1
  54. package/data-table/data-table.styles.d.ts +11 -11
  55. package/data-table/data-table.styles.js +73 -64
  56. package/data-table/data-table.styles.js.map +1 -1
  57. package/external/dompurify/dist/purify.es.js +2 -2
  58. package/external/dompurify/dist/purify.es.js.map +1 -1
  59. package/footer/footer-helper.js +1 -1
  60. package/footer/footer-helper.js.map +1 -1
  61. package/index.js +1 -1
  62. package/navbar/drawer.js +1 -1
  63. package/navbar/drawer.js.map +1 -1
  64. package/navbar/navbar-logo-data.js +1 -1
  65. package/navbar/navbar-logo-data.js.map +1 -1
  66. package/navbar/navbar.js +1 -1
  67. package/navbar/navbar.js.map +1 -1
  68. package/package.json +1 -1
  69. package/predictive-text-input/predictive-text-input.js +1 -1
  70. package/predictive-text-input/predictive-text-input.js.map +1 -1
  71. package/shared/dropdown-wrapper/element-with-dropdown.d.ts +5 -4
  72. package/shared/dropdown-wrapper/element-with-dropdown.js +1 -1
  73. package/shared/dropdown-wrapper/element-with-dropdown.js.map +1 -1
  74. package/shared/internal-calendar/calendar-manager.style.js +18 -17
  75. package/shared/internal-calendar/calendar-manager.style.js.map +1 -1
  76. package/table/table.styles.js +10 -12
  77. package/table/table.styles.js.map +1 -1
  78. package/theme/colour-primitive/specs/toteboard-colour-set.d.ts +2 -0
  79. package/theme/colour-primitive/specs/toteboard-colour-set.js +2 -0
  80. package/theme/colour-primitive/specs/toteboard-colour-set.js.map +1 -0
  81. package/theme/colour-primitive/theme-helper.js +1 -1
  82. package/theme/colour-primitive/theme-helper.js.map +1 -1
  83. package/theme/colour-semantic/theme-helper.js +1 -1
  84. package/theme/colour-semantic/theme-helper.js.map +1 -1
  85. package/theme/font/specs/toteboard-font-set.d.ts +2 -0
  86. package/theme/font/specs/toteboard-font-set.js +2 -0
  87. package/theme/font/specs/toteboard-font-set.js.map +1 -0
  88. package/theme/font/theme-helper.js +1 -1
  89. package/theme/font/theme-helper.js.map +1 -1
  90. package/theme/font-spec/specs/toteboard-font-spec-set.d.ts +2 -0
  91. package/theme/font-spec/specs/toteboard-font-spec-set.js +2 -0
  92. package/theme/font-spec/specs/toteboard-font-spec-set.js.map +1 -0
  93. package/theme/font-spec/theme-helper.js +1 -1
  94. package/theme/font-spec/theme-helper.js.map +1 -1
  95. package/theme/index.d.ts +19 -0
  96. package/theme/index.js +1 -1
  97. package/theme/index.js.map +1 -1
  98. package/theme/types.d.ts +3 -3
  99. package/time-range-picker/combobox-picker/combobox-picker.js +1 -1
  100. package/time-range-picker/combobox-picker/combobox-picker.js.map +1 -1
  101. package/time-range-picker/common.styles.d.ts +6 -2
  102. package/time-range-picker/common.styles.js +9 -5
  103. package/time-range-picker/common.styles.js.map +1 -1
  104. package/time-range-picker/dial-picker/dial-picker.js +1 -1
  105. package/time-range-picker/dial-picker/dial-picker.js.map +1 -1
  106. package/timepicker/timepicker.styles.js +7 -3
  107. package/timepicker/timepicker.styles.js.map +1 -1
  108. package/util/index.d.ts +1 -0
  109. package/util/merge-refs.d.ts +1 -1
  110. package/util/merge-refs.js +1 -1
  111. package/util/merge-refs.js.map +1 -1
  112. package/util/use-throttle.d.ts +1 -0
  113. package/util/use-throttle.js +2 -0
  114. package/util/use-throttle.js.map +1 -0
@@ -1,2 +1,2 @@
1
- import{__rest as e}from"../_virtual/_tslib.js";import{jsxs as t,jsx as i,Fragment as r}from"react/jsx-runtime";import{ArrowUpIcon as n,ArrowDownIcon as l}from"@lifesg/react-icons";import{useRef as o,useState as d,useCallback as a,useEffect as c}from"react";import{useInView as s}from"../external/react-intersection-observer/index.js";import{useResizeDetector as u}from"../external/react-resize-detector/build/index.esm.js";import"../animations/loading-spinner/loading-spinner.js";import"../animations/loading-dots/loading-dots.js";import{LoadingDotsSpinner as h}from"../animations/loading-dots-spinner/loading-dots-spinner.js";import"styled-components";import{Checkbox as p}from"../checkbox/checkbox.js";import{ErrorDisplay as m}from"../error-display/error-display.js";import"../error-display/helper.js";import{VisuallyHidden as g,concatIds as b}from"../shared/accessibility/index.js";import{Typography as f}from"../typography/typography.js";import"../util/calendar-helper.js";import"../util/date-helper.js";import"../util/date-input-helper.js";import{useId as y}from"../util/simple-id-generator.js";import"../util/string-helper.js";import"@react-aria/live-announcer";import{useEventListener as $}from"../util/use-event-listener.js";import{TableWrapper as w,TableContainer as v,Table as C,TableBody as S,HeaderRow as k,BodyRow as j,EmptyViewCell as H,LoaderWrapper as x,ActionBarWrapper as B,ActionBar as R,TextButton as A,HeaderCell as I,CheckBoxWrapper as N,HeaderCellWrapper as V,ErrorDisplayTitle as K,BodyCell as M,BodyCellContent as L}from"./data-table.styles.js";const Y=Y=>{var{id:z,headers:D,rows:E,className:W,sortIndicators:_,alternatingRows:q,loadState:F="success",enableMultiSelect:O,selectedIds:P,disabledIds:T,enableActionBar:G,enableSelectAll:J,enableStickyHeader:Q,emptyView:U,actionBarContent:X,renderCustomEmptyView:Z,onHeaderClick:ee,onSelect:te,onSelectAll:ie,onClearSelectionClick:re}=Y,ne=e(Y,["id","headers","rows","className","sortIndicators","alternatingRows","loadState","enableMultiSelect","selectedIds","disabledIds","enableActionBar","enableSelectAll","enableStickyHeader","emptyView","actionBarContent","renderCustomEmptyView","onHeaderClick","onSelect","onSelectAll","onClearSelectionClick"]);const le=o(null),oe=o(null),de=o(null),ae=o(null),ce=o(null),se=y(),ue=D.filter((e=>"string"!=typeof e&&!!e.keyColumn)),[he,pe]=d(!1),[me,ge]=d(!1),[be,fe]=d(!1),[ye,$e]=d(!1),[we,ve]=d(!1),{ref:Ce,inView:Se}=s(),ke=a((()=>{if(!ce.current||!ae.current)return;const e=ce.current.scrollHeight>ce.current.clientHeight;pe(e),e?ae.current.style.transform="translateY(0)":Ye()}),[]);c((()=>{ke()}),[]),u({onResize:ke});$("scroll",(()=>{requestAnimationFrame((()=>{he?Le():Ye()})),ce.current&&fe(ce.current.getBoundingClientRect().bottom<=window.innerHeight)}),"window"),c((()=>{ze()}),[E]);const je=()=>!!(E&&E.length&&P)&&P.length===E.length,He=e=>!!(null==P?void 0:P.includes(e)),xe=e=>!!q&&e%2==1,Be=e=>!!(null==T?void 0:T.includes(e)),Re=e=>{if(ne["data-testid"])return`${ne["data-testid"]}-${e}`},Ae=()=>D.length+(O?1:0),Ie=e=>null==_?void 0:_[e],Ne=e=>{const t=Ie(e);if(t)return"asc"===t?"ascending":"descending"},Ve=e=>` by ${"asc"===Ie(e)?"descending":"ascending"} order`,Ke=(e,t)=>`${se}-row-${e}-${t}-key-column`,Me=e=>{const t=ue.map((t=>Ke(e,t.fieldKey)));return b(...t)},Le=()=>{if(!ce.current)return;const e=ce.current.getBoundingClientRect();$e(e.bottom>window.innerHeight+30&&e.top<window.innerHeight-200)},Ye=()=>{if(!(le.current&&oe.current&&ce.current&&ae.current&&de.current))return;const e=oe.current.getBoundingClientRect();if(e.top>window.innerHeight){const t=e.bottom-window.innerHeight,i=le.current.getBoundingClientRect().height-de.current.clientHeight-32,r=Math.min(t,i);ae.current.style.transform=`translateY(-${r}px)`}else ae.current.style.transform="translateY(0)"},ze=()=>{le.current&&ce.current&&ve(le.current.clientHeight+(G?56:0)<ce.current.clientHeight)},De=e=>{const{fieldKey:r,label:n,clickable:l=!1,style:o}="string"==typeof e?{fieldKey:e,label:e,style:void 0}:e,d=!!Ie(r),a=(e=>`${se}-header-${e}`)(r);return t(I,{"data-testid":Re(`header-${r}`),$clickable:l,scope:"col","aria-sort":Ne(r),style:o,$isCheckbox:!1,onClick:()=>(e=>{null==ee||ee(e)})(r),children:[t(V,{id:a,children:["string"==typeof n?i(f.BodyBL,{weight:"bold",children:n}):n,Ee(r)]}),(l||d)&&i(g,{children:t("button",{onClick:e=>((e,t)=>{e.stopPropagation(),null==ee||ee(t)})(e,r),children:[d&&"Sort ",i("span",{"aria-labelledby":a}),d&&Ve(r)]})})]},r)},Ee=e=>{const t=null==_?void 0:_[e];return t?"asc"===t?i(n,{"aria-hidden":!0,"data-testid":Re(`header-${e}-arrowup`)}):i(l,{"aria-hidden":!0,"data-testid":Re(`header-${e}-arrowdown`)}):i(r,{})},We=()=>i(I,{"data-testid":Re("header-selection"),$clickable:!1,$isCheckbox:!0,scope:"col",children:t(N,{children:[i(g,{children:"Row selection"}),J&&i(p,{checked:je(),indeterminate:!!P&&0!==P.length&&!je(),disabled:!E||!E.length||!P,"aria-label":"Select all rows",onClick:()=>{ie&&ie(je())}})]})}),_e=(e,t)=>{const r="string"!=typeof e?e.style:void 0,n="string"==typeof e?e:e.fieldKey,l=t.id.toString(),o=t[n],d=`${l}-${n}`;return i(M,{"data-testid":Re(`row-${d}`),id:Ke(l,n),style:r,$isCheckbox:!1,children:"string"==typeof o||"number"==typeof o?i(L,{children:o}):"function"==typeof o?o(t,{isSelected:He(l)}):o},d)},qe=e=>{const t=e.id.toString();return i(M,{"data-testid":Re(`row-${t}-selection`),$isCheckbox:!0,children:i(N,{children:i(p,{checked:He(t),"aria-labelledby":Me(t),onClick:()=>{te&&te(t,!He(t))},disabled:Be(t),focusableWhenDisabled:Be(t)})})})},Fe=()=>i(m,Object.assign({type:"no-item-found"},U,{title:(null==U?void 0:U.title)?"string"==typeof U.title?i(K,{weight:"bold",children:U.title}):U.title:i(K,{weight:"bold",children:"No <items> found"}),description:(null==U?void 0:U.description)?U.description:"No matching rows"}));return t(w,{id:z||"table-wrapper","data-testid":ne["data-testid"]||"table",className:W,ref:ce,onScroll:()=>{he&&ce.current&&ge(ce.current.scrollTop+ce.current.clientHeight>=ce.current.scrollHeight)},tabIndex:0,children:[i(v,{children:t(C,{$end:be,$scrollable:he,ref:le,$stickyHeader:Q,children:[i("thead",{ref:de,children:t(k,{children:[O&&We(),D.map(De)]})}),i(S,{$showLastRowBottomBorder:we,children:"success"===F?!E||E.length<1?i(j,{$alternating:!1,children:i(H,{colSpan:Ae(),children:Z?Z():Fe()})}):i(r,{children:null==E?void 0:E.map(((e,i)=>t(j,{"data-testid":Re(`row-${e.id.toString()}`),$alternating:xe(i),$isSelectable:O,$isSelected:He(e.id.toString()),children:[O&&qe(e),D.map((t=>_e(t,e)))]},e.id.toString())))}):i(j,{$alternating:!1,children:i("td",{colSpan:Ae(),children:i(x,{role:"status","aria-live":"polite","aria-label":"Loading table",children:"loading"===F&&i(h,{})})})})})]})}),G&&P&&P.length>0&&(()=>{var e,r,n,l;const o=null!==(e=null==P?void 0:P.length)&&void 0!==e?e:0;return i(B,{ref:ae,$fixed:ye,$left:null===(n=null===(r=null==le?void 0:le.current)||void 0===r?void 0:r.getBoundingClientRect())||void 0===n?void 0:n.left,$width:null===(l=null==le?void 0:le.current)||void 0===l?void 0:l.clientWidth,children:t(R,{$float:(he?!me:!Se)||ye,$scrollable:he,children:[i(f.BodyMD,{weight:"semibold",children:`${o} item${o>1?"s":""} selected`}),i(A,{type:"button","aria-label":`Clear selection of ${o} item${1===o?"":"s"}`,onClick:re,children:"Clear selection"}),X]})})})(),i("div",{ref:e=>{oe.current=e,Ce(e)}})]})};export{Y as DataTable};
1
+ import{__rest as e}from"../_virtual/_tslib.js";import{jsxs as t,jsx as i,Fragment as n}from"react/jsx-runtime";import{ArrowUpIcon as l,ArrowDownIcon as r}from"@lifesg/react-icons";import{useRef as o,useState as d,useEffect as a}from"react";import{useResizeDetector as s}from"../external/react-resize-detector/build/index.esm.js";import"../animations/loading-spinner/loading-spinner.js";import"../animations/loading-dots/loading-dots.js";import{LoadingDotsSpinner as c}from"../animations/loading-dots-spinner/loading-dots-spinner.js";import"styled-components";import{Checkbox as h}from"../checkbox/checkbox.js";import{ErrorDisplay as p}from"../error-display/error-display.js";import"../error-display/helper.js";import{VisuallyHidden as u,concatIds as m}from"../shared/accessibility/index.js";import{Typography as g}from"../typography/typography.js";import"../util/calendar-helper.js";import"../util/date-helper.js";import"../util/date-input-helper.js";import{useId as b}from"../util/simple-id-generator.js";import"../util/string-helper.js";import"@react-aria/live-announcer";import{useEvent as f}from"../util/use-event.js";import{useEventListener as y}from"../util/use-event-listener.js";import{useThrottle as w}from"../util/use-throttle.js";import{TableWrapper as $,TableContainer as k,Table as v,TableBody as S,TableHead as C,HeaderRow as j,BodyRow as H,EmptyViewCell as x,LoaderWrapper as B,ActionBarWrapper as R,ActionBar as I,TextButton as A,ActionBarSpacer as N,HeaderCell as K,CheckBoxWrapper as M,HeaderCellWrapper as V,ErrorDisplayTitle as L,BodyCell as z,BodyCellContent as D}from"./data-table.styles.js";const E=E=>{var{id:W,headers:_,rows:O,className:P,sortIndicators:T,alternatingRows:q,loadState:F="success",enableMultiSelect:G,selectedIds:J,disabledIds:Q,enableActionBar:U,enableSelectAll:X,enableStickyHeader:Y,emptyView:Z,actionBarContent:ee,renderCustomEmptyView:te,onHeaderClick:ie,onSelect:ne,onSelectAll:le,onClearSelectionClick:re}=E,oe=e(E,["id","headers","rows","className","sortIndicators","alternatingRows","loadState","enableMultiSelect","selectedIds","disabledIds","enableActionBar","enableSelectAll","enableStickyHeader","emptyView","actionBarContent","renderCustomEmptyView","onHeaderClick","onSelect","onSelectAll","onClearSelectionClick"]);const de=o(null),ae=o(null),se=o(null),ce=o(null),he=b(),pe=_.filter((e=>"string"!=typeof e&&!!e.keyColumn)),[ue,me]=d("inline"),[ge,be]=d(!1),[fe,ye]=d(!1),we=f((()=>{Ne()}));a((()=>{we()}),[we]);const $e=w((()=>Ne()),100);s({targetRef:ce,onResize:()=>$e()}),y("scroll",$e),y("scroll",$e,ce.current);const ke=()=>!!(O&&O.length&&J)&&J.length===O.length,ve=e=>!!(null==J?void 0:J.includes(e)),Se=e=>!!q&&e%2==1,Ce=e=>!!(null==Q?void 0:Q.includes(e)),je=e=>{if(oe["data-testid"])return`${oe["data-testid"]}-${e}`},He=()=>_.length+(G?1:0),xe=e=>null==T?void 0:T[e],Be=e=>{const t=xe(e);if(t)return"asc"===t?"ascending":"descending"},Re=e=>` by ${"asc"===xe(e)?"descending":"ascending"} order`,Ie=(e,t)=>`${he}-row-${e}-${t}-key-column`,Ae=e=>{const t=pe.map((t=>Ie(e,t.fieldKey)));return m(...t)},Ne=()=>{if(!ce.current||!ae.current||!se.current)return;const e=ce.current.getBoundingClientRect(),t=ae.current.getBoundingClientRect();let i="inline";const n=ce.current.scrollHeight>ce.current.clientHeight;if(e.top>window.innerHeight||e.bottom<0?i="inline":n?e.top>0&&e.top<window.innerHeight&&e.bottom>0&&e.bottom<window.innerHeight||e.top<0&&e.bottom>0&&e.bottom<window.innerHeight?i="sticky":e.bottom>window.innerHeight&&Math.max(e.top,t.bottom)+t.height<window.innerHeight&&(i="fixed"):e.bottom>window.innerHeight&&t.bottom+t.height<window.innerHeight&&(i="fixed"),be(n),me(i),"fixed"===i)ye(!0);else if("sticky"===i){const e=ce.current.scrollTop+ce.current.clientHeight<ce.current.scrollHeight;ye(e)}else ye(!1)},Ke=e=>{const{fieldKey:n,label:l,clickable:r=!1,style:o}="string"==typeof e?{fieldKey:e,label:e,style:void 0}:e,d=!!xe(n),a=(e=>`${he}-header-${e}`)(n);return t(K,{"data-testid":je(`header-${n}`),$clickable:r,scope:"col","aria-sort":Be(n),style:o,$isCheckbox:!1,onClick:()=>(e=>{null==ie||ie(e)})(n),children:[t(V,{id:a,children:["string"==typeof l?i(g.BodyBL,{weight:"bold",children:l}):l,Me(n)]}),(r||d)&&i(u,{children:t("button",{onClick:e=>((e,t)=>{e.stopPropagation(),null==ie||ie(t)})(e,n),children:[d&&"Sort ",i("span",{"aria-labelledby":a}),d&&Re(n)]})})]},n)},Me=e=>{const t=null==T?void 0:T[e];return t?"asc"===t?i(l,{"aria-hidden":!0,"data-testid":je(`header-${e}-arrowup`)}):i(r,{"aria-hidden":!0,"data-testid":je(`header-${e}-arrowdown`)}):i(n,{})},Ve=()=>i(K,{"data-testid":je("header-selection"),$clickable:!1,$isCheckbox:!0,scope:"col",children:t(M,{children:[i(u,{children:"Row selection"}),X&&i(h,{checked:ke(),indeterminate:!!J&&0!==J.length&&!ke(),disabled:!O||!O.length||!J,"aria-label":"Select all rows",onClick:()=>{le&&le(ke())}})]})}),Le=(e,t)=>{const n="string"!=typeof e?e.style:void 0,l="string"==typeof e?e:e.fieldKey,r=t.id.toString(),o=t[l],d=`${r}-${l}`;return i(z,{"data-testid":je(`row-${d}`),id:Ie(r,l),style:n,$isCheckbox:!1,children:"string"==typeof o||"number"==typeof o?i(D,{children:o}):"function"==typeof o?o(t,{isSelected:ve(r)}):o},d)},ze=e=>{const t=e.id.toString();return i(z,{"data-testid":je(`row-${t}-selection`),$isCheckbox:!0,children:i(M,{children:i(h,{checked:ve(t),"aria-labelledby":Ae(t),onClick:()=>{ne&&ne(t,!ve(t))},disabled:Ce(t),focusableWhenDisabled:Ce(t)})})})},De=()=>i(p,Object.assign({type:"no-item-found"},Z,{title:(null==Z?void 0:Z.title)?"string"==typeof Z.title?i(L,{weight:"bold",children:Z.title}):Z.title:i(L,{weight:"bold",children:"No <items> found"}),description:(null==Z?void 0:Z.description)?Z.description:"No matching rows"}));return t($,{id:W||"table-wrapper","data-testid":oe["data-testid"]||"table",className:P,ref:ce,tabIndex:0,$scrollable:ge,children:[i(k,{children:t(v,{ref:de,children:[i(C,{ref:ae,$stickyHeader:Y,children:t(j,{children:[G&&Ve(),_.map(Ke)]})}),i(S,{children:"success"===F?!O||O.length<1?i(H,{$alternating:!1,children:i(x,{colSpan:He(),children:te?te():De()})}):i(n,{children:null==O?void 0:O.map(((e,i)=>t(H,{"data-testid":je(`row-${e.id.toString()}`),$showLastRowBottomBorder:fe,$alternating:Se(i),$isSelectable:G,$isSelected:ve(e.id.toString()),children:[G&&ze(e),_.map((t=>Le(t,e)))]},e.id.toString())))}):i(H,{$alternating:!1,children:i("td",{colSpan:He(),children:i(B,{role:"status","aria-live":"polite","aria-label":"Loading table",children:"loading"===F&&i(c,{})})})})})]})}),U&&J&&J.length>0&&(()=>{var e,l,r,o;const d=null!==(e=null==J?void 0:J.length)&&void 0!==e?e:0,a="item"+(d>1?"s":"");return t(n,{children:[i(R,{ref:se,$strategy:ue,$left:fe?null===(r=null===(l=null==de?void 0:de.current)||void 0===l?void 0:l.getBoundingClientRect())||void 0===r?void 0:r.left:0,$width:null===(o=null==de?void 0:de.current)||void 0===o?void 0:o.clientWidth,children:t(I,{$float:fe,children:[i(g.BodyMD,{weight:"semibold",children:`${d} ${a} selected`}),i(A,{type:"button","aria-label":`Clear selection of ${d} ${a}`,onClick:re,children:"Clear selection"}),ee]})}),"sticky"!==ue&&i(N,{})]})})()]})};export{E as DataTable};
2
2
  //# sourceMappingURL=data-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.js","sources":["../../src/data-table/data-table.tsx"],"sourcesContent":["import { ArrowDownIcon, ArrowUpIcon } from \"@lifesg/react-icons\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useInView } from \"react-intersection-observer\";\nimport { useResizeDetector } from \"react-resize-detector\";\nimport { LoadingDotsSpinner } from \"../animations\";\nimport { Checkbox } from \"../checkbox\";\nimport { ErrorDisplay } from \"../error-display\";\nimport { VisuallyHidden, concatIds } from \"../shared/accessibility\";\nimport { Typography } from \"../typography\";\nimport { useId } from \"../util\";\nimport { useEventListener } from \"../util/use-event-listener\";\nimport {\n ActionBar,\n ActionBarWrapper,\n BodyCell,\n BodyCellContent,\n BodyRow,\n CheckBoxWrapper,\n EmptyViewCell,\n ErrorDisplayTitle,\n HeaderCell,\n HeaderCellWrapper,\n HeaderRow,\n LoaderWrapper,\n Table,\n TableBody,\n TableContainer,\n TableWrapper,\n TextButton,\n} from \"./data-table.styles\";\nimport { DataTableProps, HeaderProps, RowProps } from \"./types\";\n\nexport const DataTable = ({\n id,\n headers,\n rows,\n className,\n sortIndicators,\n alternatingRows,\n loadState = \"success\",\n enableMultiSelect,\n selectedIds,\n disabledIds,\n enableActionBar,\n enableSelectAll,\n enableStickyHeader,\n emptyView,\n actionBarContent,\n renderCustomEmptyView,\n onHeaderClick,\n onSelect,\n onSelectAll,\n onClearSelectionClick,\n ...otherProps\n}: DataTableProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const tableRef = useRef<HTMLTableElement>(null);\n const tableEndRef = useRef<HTMLDivElement | null>(null);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n const actionBarRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const internalId = useId();\n const keyColumns = headers.filter(\n (header): header is Exclude<HeaderProps, string> => {\n return typeof header !== \"string\" && !!header.keyColumn;\n }\n );\n\n const [scrollable, setScrollable] = useState(false);\n const [scrollEnd, setScrollEnd] = useState(false);\n const [tableEnd, setTableEnd] = useState(false);\n const [isFloatingActionBar, setIsFloatingActionBar] = useState(false);\n const [showLastBorder, setShowLastBorder] = useState(false);\n\n const { ref: endRef, inView: end } = useInView();\n\n // =============================================================================\n // EFFECTS, EVENT LISTENERS\n // ============================================================================\n const onResize = useCallback(() => {\n if (!wrapperRef.current || !actionBarRef.current) {\n return;\n }\n const scrollable =\n wrapperRef.current.scrollHeight > wrapperRef.current.clientHeight;\n setScrollable(scrollable);\n\n if (scrollable) {\n actionBarRef.current.style.transform = `translateY(0)`;\n } else {\n calculateStickyInViewport();\n }\n }, []);\n\n useEffect(() => {\n onResize();\n }, []);\n\n useResizeDetector({ onResize });\n\n const scrollHandler = () => {\n requestAnimationFrame(() => {\n if (scrollable) {\n calculateFixedInViewport();\n } else {\n calculateStickyInViewport();\n }\n });\n\n if (wrapperRef.current) {\n setTableEnd(\n wrapperRef.current.getBoundingClientRect().bottom <=\n window.innerHeight\n );\n }\n };\n\n useEventListener(\"scroll\", scrollHandler, \"window\");\n\n useEffect(() => {\n checkLastBorder();\n }, [rows]);\n\n // ===========================================================================\n // HELPER FUNCTIONS\n // ===========================================================================\n const isAllCheckboxSelected = (): boolean => {\n if (!rows || !rows.length || !selectedIds) {\n return false;\n }\n\n return selectedIds.length === rows.length;\n };\n\n const isIndeterminateCheckbox = (): boolean => {\n return (\n !!selectedIds &&\n selectedIds.length !== 0 &&\n !isAllCheckboxSelected()\n );\n };\n\n const isHeaderCheckboxDisabled = (): boolean => {\n return !rows || !rows.length || !selectedIds;\n };\n\n const isRowSelected = (rowId: string): boolean => {\n return !!selectedIds?.includes(rowId);\n };\n\n const isAlternatingRow = (index: number): boolean => {\n return !!alternatingRows && index % 2 === 1;\n };\n\n const isDisabledRow = (rowId: string): boolean => {\n return !!disabledIds?.includes(rowId);\n };\n\n const getDataTestId = (subStr: string) => {\n if (!otherProps[\"data-testid\"]) return undefined;\n return `${otherProps[\"data-testid\"]}-${subStr}`;\n };\n\n const getTotalColumns = (): number => {\n return headers.length + (enableMultiSelect ? 1 : 0);\n };\n\n const getSortDirection = (fieldKey: string) => {\n return sortIndicators?.[fieldKey];\n };\n\n const getHeaderAriaSort = (fieldKey: string) => {\n const sortDirection = getSortDirection(fieldKey);\n\n if (!sortDirection) {\n return undefined;\n }\n\n return sortDirection === \"asc\" ? \"ascending\" : \"descending\";\n };\n\n const getSortButtonAriaLabel = (fieldKey: string) => {\n const nextSortDirection =\n getSortDirection(fieldKey) === \"asc\" ? \"descending\" : \"ascending\";\n\n return ` by ${nextSortDirection} order`;\n };\n\n const getHeaderWrapperId = (fieldKey: string) => {\n return `${internalId}-header-${fieldKey}`;\n };\n const getCellId = (rowId: string, fieldKey: string) => {\n return `${internalId}-row-${rowId}-${fieldKey}-key-column`;\n };\n\n const getRowCheckboxAriaLabelledBy = (rowId: string) => {\n const keyColumnIds = keyColumns.map((header) =>\n getCellId(rowId, header.fieldKey)\n );\n\n return concatIds(...keyColumnIds);\n };\n\n const calculateFixedInViewport = () => {\n if (!wrapperRef.current) {\n return;\n }\n const wrapperBounds = wrapperRef.current.getBoundingClientRect();\n setIsFloatingActionBar(\n wrapperBounds.bottom > window.innerHeight + 30 &&\n wrapperBounds.top < window.innerHeight - 200\n );\n };\n\n const calculateStickyInViewport = () => {\n if (\n !tableRef.current ||\n !tableEndRef.current ||\n !wrapperRef.current ||\n !actionBarRef.current ||\n !headerRef.current\n ) {\n return;\n }\n\n const endBounds = tableEndRef.current.getBoundingClientRect();\n\n if (endBounds.top > window.innerHeight) {\n const bottomOffset = endBounds.bottom - window.innerHeight;\n const bottomToHeaderOffset =\n tableRef.current.getBoundingClientRect().height -\n headerRef.current.clientHeight -\n 32;\n const maxBottomOffset = Math.min(\n bottomOffset,\n bottomToHeaderOffset\n );\n\n actionBarRef.current.style.transform = `translateY(-${maxBottomOffset}px)`;\n } else {\n actionBarRef.current.style.transform = `translateY(0)`;\n }\n };\n\n const checkLastBorder = () => {\n if (!tableRef.current || !wrapperRef.current) {\n return;\n }\n // 56 pixels added due to the behavior of action bar\n setShowLastBorder(\n tableRef.current.clientHeight + (enableActionBar ? 56 : 0) <\n wrapperRef.current.clientHeight\n );\n };\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleHeaderClick = (fieldKey: string) => {\n onHeaderClick?.(fieldKey);\n };\n\n const handleHeaderButtonClick = (\n event: React.MouseEvent<HTMLButtonElement>,\n fieldKey: string\n ) => {\n event.stopPropagation();\n onHeaderClick?.(fieldKey);\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderHeaders = () => (\n <thead ref={headerRef}>\n <HeaderRow>\n {enableMultiSelect && renderHeaderCheckBox()}\n {headers.map(renderHeaderCell)}\n </HeaderRow>\n </thead>\n );\n\n const renderHeaderCell = (header: HeaderProps) => {\n const {\n fieldKey,\n label,\n clickable = false,\n style,\n } = typeof header === \"string\"\n ? {\n fieldKey: header,\n label: header,\n style: undefined,\n }\n : header;\n\n const isSortable = !!getSortDirection(fieldKey);\n const headerCellWrapperId = getHeaderWrapperId(fieldKey);\n\n return (\n <HeaderCell\n data-testid={getDataTestId(`header-${fieldKey}`)}\n key={fieldKey}\n $clickable={clickable}\n scope=\"col\"\n aria-sort={getHeaderAriaSort(fieldKey)}\n style={style}\n $isCheckbox={false}\n onClick={() => handleHeaderClick(fieldKey)}\n >\n <HeaderCellWrapper id={headerCellWrapperId}>\n {typeof label === \"string\" ? (\n <Typography.BodyBL weight=\"bold\">\n {label}\n </Typography.BodyBL>\n ) : (\n label\n )}\n {renderSortedArrow(fieldKey)}\n </HeaderCellWrapper>\n {(clickable || isSortable) && (\n <VisuallyHidden>\n <button\n onClick={(event) =>\n handleHeaderButtonClick(event, fieldKey)\n }\n >\n {isSortable && \"Sort \"}\n <span aria-labelledby={headerCellWrapperId} />\n {isSortable && getSortButtonAriaLabel(fieldKey)}\n </button>\n </VisuallyHidden>\n )}\n </HeaderCell>\n );\n };\n\n const renderSortedArrow = (fieldKey: string) => {\n const isSorted = sortIndicators?.[fieldKey];\n\n if (!isSorted) {\n return <></>;\n }\n if (isSorted === \"asc\") {\n return (\n <ArrowUpIcon\n aria-hidden\n data-testid={getDataTestId(`header-${fieldKey}-arrowup`)}\n />\n );\n }\n return (\n <ArrowDownIcon\n aria-hidden\n data-testid={getDataTestId(`header-${fieldKey}-arrowdown`)}\n />\n );\n };\n\n const renderHeaderCheckBox = () => {\n return (\n <HeaderCell\n data-testid={getDataTestId(\"header-selection\")}\n $clickable={false}\n $isCheckbox={true}\n scope=\"col\"\n >\n <CheckBoxWrapper>\n <VisuallyHidden>Row selection</VisuallyHidden>\n {enableSelectAll && (\n <Checkbox\n checked={isAllCheckboxSelected()}\n indeterminate={isIndeterminateCheckbox()}\n disabled={isHeaderCheckboxDisabled()}\n aria-label=\"Select all rows\"\n onClick={() => {\n if (onSelectAll) {\n onSelectAll(isAllCheckboxSelected());\n }\n }}\n />\n )}\n </CheckBoxWrapper>\n </HeaderCell>\n );\n };\n\n const renderRows = () => {\n return !rows || rows.length < 1 ? (\n <BodyRow $alternating={false}>\n <EmptyViewCell colSpan={getTotalColumns()}>\n {renderCustomEmptyView\n ? renderCustomEmptyView()\n : renderBasicEmptyView()}\n </EmptyViewCell>\n </BodyRow>\n ) : (\n <>\n {rows?.map((row: RowProps, index: number) => (\n <BodyRow\n data-testid={getDataTestId(`row-${row.id.toString()}`)}\n key={row.id.toString()}\n $alternating={isAlternatingRow(index)}\n $isSelectable={enableMultiSelect}\n $isSelected={isRowSelected(row.id.toString())}\n >\n {enableMultiSelect && renderRowCheckBox(row)}\n\n {headers.map((header) => renderRowCell(header, row))}\n </BodyRow>\n ))}\n </>\n );\n };\n\n const renderRowCell = (header: HeaderProps, row: RowProps) => {\n const style = typeof header !== \"string\" ? header.style : undefined;\n const fieldKey = typeof header === \"string\" ? header : header.fieldKey;\n const rowId = row.id.toString();\n const cellData = row[fieldKey];\n const cellId = `${rowId}-${fieldKey}`;\n\n return (\n <BodyCell\n data-testid={getDataTestId(`row-${cellId}`)}\n key={cellId}\n id={getCellId(rowId, fieldKey)}\n style={style}\n $isCheckbox={false}\n >\n {typeof cellData === \"string\" ||\n typeof cellData === \"number\" ? (\n <BodyCellContent>{cellData}</BodyCellContent>\n ) : typeof cellData === \"function\" ? (\n cellData(row, { isSelected: isRowSelected(rowId) })\n ) : (\n cellData\n )}\n </BodyCell>\n );\n };\n\n const renderRowCheckBox = (row: RowProps) => {\n const rowId = row.id.toString();\n\n return (\n <BodyCell\n data-testid={getDataTestId(`row-${rowId}-selection`)}\n $isCheckbox={true}\n >\n <CheckBoxWrapper>\n <Checkbox\n checked={isRowSelected(rowId)}\n aria-labelledby={getRowCheckboxAriaLabelledBy(rowId)}\n onClick={() => {\n if (onSelect) {\n onSelect(rowId, !isRowSelected(rowId));\n }\n }}\n disabled={isDisabledRow(rowId)}\n focusableWhenDisabled={isDisabledRow(rowId)}\n />\n </CheckBoxWrapper>\n </BodyCell>\n );\n };\n\n const renderBasicEmptyView = () => {\n return (\n <ErrorDisplay\n type={\"no-item-found\"}\n {...emptyView}\n title={\n emptyView?.title ? (\n typeof emptyView.title === \"string\" ? (\n <ErrorDisplayTitle weight=\"bold\">\n {emptyView.title}\n </ErrorDisplayTitle>\n ) : (\n emptyView.title\n )\n ) : (\n <ErrorDisplayTitle weight=\"bold\">\n {\"No <items> found\"}\n </ErrorDisplayTitle>\n )\n }\n description={\n emptyView?.description\n ? emptyView.description\n : \"No matching rows\"\n }\n />\n );\n };\n\n const renderLoader = () => {\n return (\n <BodyRow $alternating={false}>\n <td colSpan={getTotalColumns()}>\n <LoaderWrapper\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Loading table\"\n >\n {loadState === \"loading\" && <LoadingDotsSpinner />}\n </LoaderWrapper>\n </td>\n </BodyRow>\n );\n };\n\n const renderSelectionBar = () => {\n const count = selectedIds?.length ?? 0;\n\n return (\n <ActionBarWrapper\n ref={actionBarRef}\n $fixed={isFloatingActionBar}\n $left={tableRef?.current?.getBoundingClientRect()?.left}\n $width={tableRef?.current?.clientWidth}\n >\n <ActionBar\n $float={\n (scrollable ? !scrollEnd : !end) || isFloatingActionBar\n }\n $scrollable={scrollable}\n >\n <Typography.BodyMD weight=\"semibold\">{`${count} item${\n count > 1 ? \"s\" : \"\"\n } selected`}</Typography.BodyMD>\n <TextButton\n type=\"button\"\n aria-label={`Clear selection of ${count} item${\n count === 1 ? \"\" : \"s\"\n }`}\n onClick={onClearSelectionClick}\n >\n Clear selection\n </TextButton>\n {actionBarContent}\n </ActionBar>\n </ActionBarWrapper>\n );\n };\n\n return (\n <TableWrapper\n id={id || \"table-wrapper\"}\n data-testid={otherProps[\"data-testid\"] || \"table\"}\n className={className}\n ref={wrapperRef}\n onScroll={() => {\n if (scrollable && wrapperRef.current) {\n setScrollEnd(\n wrapperRef.current.scrollTop +\n wrapperRef.current.clientHeight >=\n wrapperRef.current.scrollHeight\n );\n }\n }}\n tabIndex={0} // scrollable container must be focusable to support keyboard users\n >\n <TableContainer>\n <Table\n $end={tableEnd}\n $scrollable={scrollable}\n ref={tableRef}\n $stickyHeader={enableStickyHeader}\n >\n {renderHeaders()}\n <TableBody $showLastRowBottomBorder={showLastBorder}>\n {loadState === \"success\"\n ? renderRows()\n : renderLoader()}\n </TableBody>\n </Table>\n </TableContainer>\n {enableActionBar &&\n selectedIds &&\n selectedIds.length > 0 &&\n renderSelectionBar()}\n <div\n ref={(r) => {\n tableEndRef.current = r;\n endRef(r);\n }}\n />\n </TableWrapper>\n );\n};\n"],"names":["DataTable","_a","id","headers","rows","className","sortIndicators","alternatingRows","loadState","enableMultiSelect","selectedIds","disabledIds","enableActionBar","enableSelectAll","enableStickyHeader","emptyView","actionBarContent","renderCustomEmptyView","onHeaderClick","onSelect","onSelectAll","onClearSelectionClick","otherProps","__rest","tableRef","useRef","tableEndRef","headerRef","actionBarRef","wrapperRef","internalId","useId","keyColumns","filter","header","keyColumn","scrollable","setScrollable","useState","scrollEnd","setScrollEnd","tableEnd","setTableEnd","isFloatingActionBar","setIsFloatingActionBar","showLastBorder","setShowLastBorder","ref","endRef","inView","end","useInView","onResize","useCallback","current","scrollHeight","clientHeight","style","transform","calculateStickyInViewport","useEffect","useResizeDetector","useEventListener","requestAnimationFrame","calculateFixedInViewport","getBoundingClientRect","bottom","window","innerHeight","checkLastBorder","isAllCheckboxSelected","length","isRowSelected","rowId","includes","isAlternatingRow","index","isDisabledRow","getDataTestId","subStr","getTotalColumns","getSortDirection","fieldKey","getHeaderAriaSort","sortDirection","getSortButtonAriaLabel","getCellId","getRowCheckboxAriaLabelledBy","keyColumnIds","map","concatIds","wrapperBounds","top","endBounds","bottomOffset","bottomToHeaderOffset","height","maxBottomOffset","Math","min","renderHeaderCell","label","clickable","undefined","isSortable","headerCellWrapperId","getHeaderWrapperId","_jsxs","HeaderCell","$clickable","scope","$isCheckbox","onClick","handleHeaderClick","children","HeaderCellWrapper","_jsx","Typography","BodyBL","weight","renderSortedArrow","VisuallyHidden","event","stopPropagation","handleHeaderButtonClick","isSorted","ArrowUpIcon","ArrowDownIcon","renderHeaderCheckBox","CheckBoxWrapper","Checkbox","checked","indeterminate","disabled","renderRowCell","row","toString","cellData","cellId","BodyCell","BodyCellContent","isSelected","renderRowCheckBox","focusableWhenDisabled","renderBasicEmptyView","ErrorDisplay","Object","assign","type","title","ErrorDisplayTitle","description","TableWrapper","onScroll","scrollTop","tabIndex","TableContainer","Table","$end","$stickyHeader","HeaderRow","TableBody","$showLastRowBottomBorder","BodyRow","$alternating","EmptyViewCell","colSpan","$isSelectable","$isSelected","LoaderWrapper","role","LoadingDotsSpinner","count","ActionBarWrapper","$fixed","$left","_c","_b","left","$width","_d","clientWidth","ActionBar","$float","$scrollable","BodyMD","TextButton","renderSelectionBar","r"],"mappings":"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"}
1
+ {"version":3,"file":"data-table.js","sources":["../../src/data-table/data-table.tsx"],"sourcesContent":["import { ArrowDownIcon, ArrowUpIcon } from \"@lifesg/react-icons\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useResizeDetector } from \"react-resize-detector\";\nimport { LoadingDotsSpinner } from \"../animations\";\nimport { Checkbox } from \"../checkbox\";\nimport { ErrorDisplay } from \"../error-display\";\nimport { VisuallyHidden, concatIds } from \"../shared/accessibility\";\nimport { Typography } from \"../typography\";\nimport { useEvent, useEventListener, useId, useThrottle } from \"../util\";\nimport {\n ActionBar,\n ActionBarSpacer,\n ActionBarWrapper,\n BodyCell,\n BodyCellContent,\n BodyRow,\n CheckBoxWrapper,\n EmptyViewCell,\n ErrorDisplayTitle,\n HeaderCell,\n HeaderCellWrapper,\n HeaderRow,\n LoaderWrapper,\n Table,\n TableBody,\n TableContainer,\n TableHead,\n TableWrapper,\n TextButton,\n} from \"./data-table.styles\";\nimport { DataTableProps, HeaderProps, RowProps } from \"./types\";\n\nexport const DataTable = ({\n id,\n headers,\n rows,\n className,\n sortIndicators,\n alternatingRows,\n loadState = \"success\",\n enableMultiSelect,\n selectedIds,\n disabledIds,\n enableActionBar,\n enableSelectAll,\n enableStickyHeader,\n emptyView,\n actionBarContent,\n renderCustomEmptyView,\n onHeaderClick,\n onSelect,\n onSelectAll,\n onClearSelectionClick,\n ...otherProps\n}: DataTableProps) => {\n // =============================================================================\n // CONST, STATE, REF\n // =============================================================================\n const tableRef = useRef<HTMLTableElement>(null);\n const headerRef = useRef<HTMLTableSectionElement>(null);\n const actionBarWrapperRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const internalId = useId();\n const keyColumns = headers.filter(\n (header): header is Exclude<HeaderProps, string> => {\n return typeof header !== \"string\" && !!header.keyColumn;\n }\n );\n\n const [actionBarStrategy, setActionBarStrategy] = useState<\n \"sticky\" | \"fixed\" | \"inline\"\n >(\"inline\");\n const [scrollable, setScrollable] = useState(false);\n const [isFloatingActionBar, setIsFloatingActionBar] = useState(false);\n\n // =============================================================================\n // EFFECTS, EVENT LISTENERS\n // ============================================================================\n const useUpdateActionBarBehaviour = useEvent(() => {\n updateActionBarBehaviour();\n });\n\n useEffect(() => {\n useUpdateActionBarBehaviour();\n }, [useUpdateActionBarBehaviour]);\n\n const updateActionBarBehaviourThrottled = useThrottle(\n () => updateActionBarBehaviour(),\n 100\n );\n\n useResizeDetector({\n targetRef: wrapperRef,\n onResize: () => updateActionBarBehaviourThrottled(),\n });\n\n useEventListener(\"scroll\", updateActionBarBehaviourThrottled);\n useEventListener(\n \"scroll\",\n updateActionBarBehaviourThrottled,\n wrapperRef.current\n );\n\n // ===========================================================================\n // HELPER FUNCTIONS\n // ===========================================================================\n const isAllCheckboxSelected = (): boolean => {\n if (!rows || !rows.length || !selectedIds) {\n return false;\n }\n\n return selectedIds.length === rows.length;\n };\n\n const isIndeterminateCheckbox = (): boolean => {\n return (\n !!selectedIds &&\n selectedIds.length !== 0 &&\n !isAllCheckboxSelected()\n );\n };\n\n const isHeaderCheckboxDisabled = (): boolean => {\n return !rows || !rows.length || !selectedIds;\n };\n\n const isRowSelected = (rowId: string): boolean => {\n return !!selectedIds?.includes(rowId);\n };\n\n const isAlternatingRow = (index: number): boolean => {\n return !!alternatingRows && index % 2 === 1;\n };\n\n const isDisabledRow = (rowId: string): boolean => {\n return !!disabledIds?.includes(rowId);\n };\n\n const getDataTestId = (subStr: string) => {\n if (!otherProps[\"data-testid\"]) return undefined;\n return `${otherProps[\"data-testid\"]}-${subStr}`;\n };\n\n const getTotalColumns = (): number => {\n return headers.length + (enableMultiSelect ? 1 : 0);\n };\n\n const getSortDirection = (fieldKey: string) => {\n return sortIndicators?.[fieldKey];\n };\n\n const getHeaderAriaSort = (fieldKey: string) => {\n const sortDirection = getSortDirection(fieldKey);\n\n if (!sortDirection) {\n return undefined;\n }\n\n return sortDirection === \"asc\" ? \"ascending\" : \"descending\";\n };\n\n const getSortButtonAriaLabel = (fieldKey: string) => {\n const nextSortDirection =\n getSortDirection(fieldKey) === \"asc\" ? \"descending\" : \"ascending\";\n\n return ` by ${nextSortDirection} order`;\n };\n\n const getHeaderWrapperId = (fieldKey: string) => {\n return `${internalId}-header-${fieldKey}`;\n };\n const getCellId = (rowId: string, fieldKey: string) => {\n return `${internalId}-row-${rowId}-${fieldKey}-key-column`;\n };\n\n const getRowCheckboxAriaLabelledBy = (rowId: string) => {\n const keyColumnIds = keyColumns.map((header) =>\n getCellId(rowId, header.fieldKey)\n );\n\n return concatIds(...keyColumnIds);\n };\n\n const updateActionBarBehaviour = () => {\n if (\n !wrapperRef.current ||\n !headerRef.current ||\n !actionBarWrapperRef.current\n ) {\n return;\n }\n\n const wrapperBounds = wrapperRef.current.getBoundingClientRect();\n const headerBounds = headerRef.current.getBoundingClientRect();\n\n let strategy: typeof actionBarStrategy = \"inline\";\n\n const scrollable =\n wrapperRef.current.scrollHeight > wrapperRef.current.clientHeight;\n\n if (\n wrapperBounds.top > window.innerHeight ||\n wrapperBounds.bottom < 0\n ) {\n // if fully out of the viewport, disable floating\n strategy = \"inline\";\n } else if (scrollable) {\n if (\n wrapperBounds.top > 0 &&\n wrapperBounds.top < window.innerHeight &&\n wrapperBounds.bottom > 0 &&\n wrapperBounds.bottom < window.innerHeight\n ) {\n // if fully in the viewport, use the native sticky behaviour\n strategy = \"sticky\";\n } else if (\n wrapperBounds.top < 0 &&\n wrapperBounds.bottom > 0 &&\n wrapperBounds.bottom < window.innerHeight\n ) {\n // if partially offscreen at the top, use the native sticky behaviour\n strategy = \"sticky\";\n } else if (\n wrapperBounds.bottom > window.innerHeight &&\n Math.max(wrapperBounds.top, headerBounds.bottom) +\n headerBounds.height <\n window.innerHeight\n ) {\n // if offscreen at the bottom, pin to the viewport, up until the table/header\n strategy = \"fixed\";\n }\n } else if (\n wrapperBounds.bottom > window.innerHeight &&\n headerBounds.bottom + headerBounds.height < window.innerHeight\n ) {\n // if offscreen at the bottom, pin to the viewport, up until the header\n strategy = \"fixed\";\n }\n\n setScrollable(scrollable);\n setActionBarStrategy(strategy);\n\n if (strategy === \"fixed\") {\n setIsFloatingActionBar(true);\n } else if (strategy === \"sticky\") {\n const beforeScrollEnd =\n wrapperRef.current.scrollTop + wrapperRef.current.clientHeight <\n wrapperRef.current.scrollHeight;\n setIsFloatingActionBar(beforeScrollEnd);\n } else {\n setIsFloatingActionBar(false);\n }\n };\n\n // =============================================================================\n // EVENT HANDLERS\n // =============================================================================\n const handleHeaderClick = (fieldKey: string) => {\n onHeaderClick?.(fieldKey);\n };\n\n const handleHeaderButtonClick = (\n event: React.MouseEvent<HTMLButtonElement>,\n fieldKey: string\n ) => {\n event.stopPropagation();\n onHeaderClick?.(fieldKey);\n };\n\n // =============================================================================\n // RENDER FUNCTIONS\n // =============================================================================\n const renderHeaders = () => (\n <TableHead ref={headerRef} $stickyHeader={enableStickyHeader}>\n <HeaderRow>\n {enableMultiSelect && renderHeaderCheckBox()}\n {headers.map(renderHeaderCell)}\n </HeaderRow>\n </TableHead>\n );\n\n const renderHeaderCell = (header: HeaderProps) => {\n const {\n fieldKey,\n label,\n clickable = false,\n style,\n } = typeof header === \"string\"\n ? {\n fieldKey: header,\n label: header,\n style: undefined,\n }\n : header;\n\n const isSortable = !!getSortDirection(fieldKey);\n const headerCellWrapperId = getHeaderWrapperId(fieldKey);\n\n return (\n <HeaderCell\n data-testid={getDataTestId(`header-${fieldKey}`)}\n key={fieldKey}\n $clickable={clickable}\n scope=\"col\"\n aria-sort={getHeaderAriaSort(fieldKey)}\n style={style}\n $isCheckbox={false}\n onClick={() => handleHeaderClick(fieldKey)}\n >\n <HeaderCellWrapper id={headerCellWrapperId}>\n {typeof label === \"string\" ? (\n <Typography.BodyBL weight=\"bold\">\n {label}\n </Typography.BodyBL>\n ) : (\n label\n )}\n {renderSortedArrow(fieldKey)}\n </HeaderCellWrapper>\n {(clickable || isSortable) && (\n <VisuallyHidden>\n <button\n onClick={(event) =>\n handleHeaderButtonClick(event, fieldKey)\n }\n >\n {isSortable && \"Sort \"}\n <span aria-labelledby={headerCellWrapperId} />\n {isSortable && getSortButtonAriaLabel(fieldKey)}\n </button>\n </VisuallyHidden>\n )}\n </HeaderCell>\n );\n };\n\n const renderSortedArrow = (fieldKey: string) => {\n const isSorted = sortIndicators?.[fieldKey];\n\n if (!isSorted) {\n return <></>;\n }\n if (isSorted === \"asc\") {\n return (\n <ArrowUpIcon\n aria-hidden\n data-testid={getDataTestId(`header-${fieldKey}-arrowup`)}\n />\n );\n }\n return (\n <ArrowDownIcon\n aria-hidden\n data-testid={getDataTestId(`header-${fieldKey}-arrowdown`)}\n />\n );\n };\n\n const renderHeaderCheckBox = () => {\n return (\n <HeaderCell\n data-testid={getDataTestId(\"header-selection\")}\n $clickable={false}\n $isCheckbox={true}\n scope=\"col\"\n >\n <CheckBoxWrapper>\n <VisuallyHidden>Row selection</VisuallyHidden>\n {enableSelectAll && (\n <Checkbox\n checked={isAllCheckboxSelected()}\n indeterminate={isIndeterminateCheckbox()}\n disabled={isHeaderCheckboxDisabled()}\n aria-label=\"Select all rows\"\n onClick={() => {\n if (onSelectAll) {\n onSelectAll(isAllCheckboxSelected());\n }\n }}\n />\n )}\n </CheckBoxWrapper>\n </HeaderCell>\n );\n };\n\n const renderRows = () => {\n return !rows || rows.length < 1 ? (\n <BodyRow $alternating={false}>\n <EmptyViewCell colSpan={getTotalColumns()}>\n {renderCustomEmptyView\n ? renderCustomEmptyView()\n : renderBasicEmptyView()}\n </EmptyViewCell>\n </BodyRow>\n ) : (\n <>\n {rows?.map((row: RowProps, index: number) => (\n <BodyRow\n data-testid={getDataTestId(`row-${row.id.toString()}`)}\n key={row.id.toString()}\n $showLastRowBottomBorder={isFloatingActionBar}\n $alternating={isAlternatingRow(index)}\n $isSelectable={enableMultiSelect}\n $isSelected={isRowSelected(row.id.toString())}\n >\n {enableMultiSelect && renderRowCheckBox(row)}\n\n {headers.map((header) => renderRowCell(header, row))}\n </BodyRow>\n ))}\n </>\n );\n };\n\n const renderRowCell = (header: HeaderProps, row: RowProps) => {\n const style = typeof header !== \"string\" ? header.style : undefined;\n const fieldKey = typeof header === \"string\" ? header : header.fieldKey;\n const rowId = row.id.toString();\n const cellData = row[fieldKey];\n const cellId = `${rowId}-${fieldKey}`;\n\n return (\n <BodyCell\n data-testid={getDataTestId(`row-${cellId}`)}\n key={cellId}\n id={getCellId(rowId, fieldKey)}\n style={style}\n $isCheckbox={false}\n >\n {typeof cellData === \"string\" ||\n typeof cellData === \"number\" ? (\n <BodyCellContent>{cellData}</BodyCellContent>\n ) : typeof cellData === \"function\" ? (\n cellData(row, { isSelected: isRowSelected(rowId) })\n ) : (\n cellData\n )}\n </BodyCell>\n );\n };\n\n const renderRowCheckBox = (row: RowProps) => {\n const rowId = row.id.toString();\n\n return (\n <BodyCell\n data-testid={getDataTestId(`row-${rowId}-selection`)}\n $isCheckbox={true}\n >\n <CheckBoxWrapper>\n <Checkbox\n checked={isRowSelected(rowId)}\n aria-labelledby={getRowCheckboxAriaLabelledBy(rowId)}\n onClick={() => {\n if (onSelect) {\n onSelect(rowId, !isRowSelected(rowId));\n }\n }}\n disabled={isDisabledRow(rowId)}\n focusableWhenDisabled={isDisabledRow(rowId)}\n />\n </CheckBoxWrapper>\n </BodyCell>\n );\n };\n\n const renderBasicEmptyView = () => {\n return (\n <ErrorDisplay\n type={\"no-item-found\"}\n {...emptyView}\n title={\n emptyView?.title ? (\n typeof emptyView.title === \"string\" ? (\n <ErrorDisplayTitle weight=\"bold\">\n {emptyView.title}\n </ErrorDisplayTitle>\n ) : (\n emptyView.title\n )\n ) : (\n <ErrorDisplayTitle weight=\"bold\">\n {\"No <items> found\"}\n </ErrorDisplayTitle>\n )\n }\n description={\n emptyView?.description\n ? emptyView.description\n : \"No matching rows\"\n }\n />\n );\n };\n\n const renderLoader = () => {\n return (\n <BodyRow $alternating={false}>\n <td colSpan={getTotalColumns()}>\n <LoaderWrapper\n role=\"status\"\n aria-live=\"polite\"\n aria-label=\"Loading table\"\n >\n {loadState === \"loading\" && <LoadingDotsSpinner />}\n </LoaderWrapper>\n </td>\n </BodyRow>\n );\n };\n\n const renderSelectionBar = () => {\n const count = selectedIds?.length ?? 0;\n const counter = `item${count > 1 ? \"s\" : \"\"}`;\n\n return (\n <>\n <ActionBarWrapper\n ref={actionBarWrapperRef}\n $strategy={actionBarStrategy}\n $left={\n isFloatingActionBar\n ? tableRef?.current?.getBoundingClientRect()?.left\n : 0\n }\n $width={tableRef?.current?.clientWidth}\n >\n <ActionBar $float={isFloatingActionBar}>\n <Typography.BodyMD weight=\"semibold\">{`${count} ${counter} selected`}</Typography.BodyMD>\n <TextButton\n type=\"button\"\n aria-label={`Clear selection of ${count} ${counter}`}\n onClick={onClearSelectionClick}\n >\n Clear selection\n </TextButton>\n {actionBarContent}\n </ActionBar>\n </ActionBarWrapper>\n {/* leave a fixed space when action bar floats to avoid layout shift */}\n {actionBarStrategy !== \"sticky\" && <ActionBarSpacer />}\n </>\n );\n };\n\n return (\n <TableWrapper\n id={id || \"table-wrapper\"}\n data-testid={otherProps[\"data-testid\"] || \"table\"}\n className={className}\n ref={wrapperRef}\n tabIndex={0} // scrollable container must be focusable to support keyboard users\n $scrollable={scrollable}\n >\n <TableContainer>\n <Table ref={tableRef}>\n {renderHeaders()}\n <TableBody>\n {loadState === \"success\"\n ? renderRows()\n : renderLoader()}\n </TableBody>\n </Table>\n </TableContainer>\n {enableActionBar &&\n selectedIds &&\n selectedIds.length > 0 &&\n renderSelectionBar()}\n </TableWrapper>\n );\n};\n"],"names":["DataTable","_a","id","headers","rows","className","sortIndicators","alternatingRows","loadState","enableMultiSelect","selectedIds","disabledIds","enableActionBar","enableSelectAll","enableStickyHeader","emptyView","actionBarContent","renderCustomEmptyView","onHeaderClick","onSelect","onSelectAll","onClearSelectionClick","otherProps","__rest","tableRef","useRef","headerRef","actionBarWrapperRef","wrapperRef","internalId","useId","keyColumns","filter","header","keyColumn","actionBarStrategy","setActionBarStrategy","useState","scrollable","setScrollable","isFloatingActionBar","setIsFloatingActionBar","useUpdateActionBarBehaviour","useEvent","updateActionBarBehaviour","useEffect","updateActionBarBehaviourThrottled","useThrottle","useResizeDetector","targetRef","onResize","useEventListener","current","isAllCheckboxSelected","length","isRowSelected","rowId","includes","isAlternatingRow","index","isDisabledRow","getDataTestId","subStr","getTotalColumns","getSortDirection","fieldKey","getHeaderAriaSort","sortDirection","getSortButtonAriaLabel","getCellId","getRowCheckboxAriaLabelledBy","keyColumnIds","map","concatIds","wrapperBounds","getBoundingClientRect","headerBounds","strategy","scrollHeight","clientHeight","top","window","innerHeight","bottom","Math","max","height","beforeScrollEnd","scrollTop","renderHeaderCell","label","clickable","style","undefined","isSortable","headerCellWrapperId","getHeaderWrapperId","_jsxs","HeaderCell","$clickable","scope","$isCheckbox","onClick","handleHeaderClick","children","HeaderCellWrapper","_jsx","Typography","BodyBL","weight","renderSortedArrow","VisuallyHidden","event","stopPropagation","handleHeaderButtonClick","isSorted","ArrowUpIcon","ArrowDownIcon","renderHeaderCheckBox","CheckBoxWrapper","Checkbox","checked","indeterminate","disabled","renderRowCell","row","toString","cellData","cellId","BodyCell","BodyCellContent","isSelected","renderRowCheckBox","focusableWhenDisabled","renderBasicEmptyView","ErrorDisplay","Object","assign","type","title","ErrorDisplayTitle","description","TableWrapper","ref","tabIndex","$scrollable","TableContainer","Table","TableHead","$stickyHeader","HeaderRow","TableBody","BodyRow","$alternating","EmptyViewCell","colSpan","$isSelected","LoaderWrapper","role","LoadingDotsSpinner","count","counter","_Fragment","ActionBarWrapper","$strategy","$left","_c","_b","left","$width","_d","clientWidth","ActionBar","$float","BodyMD","TextButton","ActionBarSpacer","renderSelectionBar"],"mappings":"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"}
@@ -1,10 +1,8 @@
1
- interface TableProps {
2
- $end: boolean;
1
+ interface TableWrapperProps {
3
2
  $scrollable: boolean;
4
- $stickyHeader: boolean | undefined;
5
3
  }
6
- interface TableBodyProps {
7
- $showLastRowBottomBorder: boolean;
4
+ interface TableHeadProps {
5
+ $stickyHeader: boolean | undefined;
8
6
  }
9
7
  interface HeaderCellProps {
10
8
  $clickable: boolean;
@@ -14,23 +12,24 @@ interface BodyRowProps {
14
12
  $alternating: boolean;
15
13
  $isSelected?: boolean;
16
14
  $isSelectable?: boolean;
15
+ $showLastRowBottomBorder?: boolean;
17
16
  }
18
17
  interface BodyCellProps {
19
18
  $isCheckbox: boolean;
20
19
  }
21
20
  interface ActionBarWrapperProps {
22
- $fixed: boolean;
21
+ $strategy: "fixed" | "sticky" | "inline";
23
22
  $left?: number | undefined;
24
23
  $width?: number | undefined;
25
24
  }
26
25
  interface ActionBarProps {
27
26
  $float: boolean;
28
- $scrollable: boolean;
29
27
  }
30
- export declare const TableWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never> & Partial<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>>> & string;
28
+ export declare const TableWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "$scrollable"> & TableWrapperProps, never> & Partial<Pick<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "$scrollable"> & TableWrapperProps, never>>> & string;
31
29
  export declare const TableContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never> & Partial<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>>> & string;
32
- export declare const Table: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").TableHTMLAttributes<HTMLTableElement>, HTMLTableElement>, keyof TableProps> & TableProps, never> & Partial<Pick<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").TableHTMLAttributes<HTMLTableElement>, HTMLTableElement>, keyof TableProps> & TableProps, never>>> & string;
33
- export declare const TableBody: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "$showLastRowBottomBorder"> & TableBodyProps, never> & Partial<Pick<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "$showLastRowBottomBorder"> & TableBodyProps, never>>> & string;
30
+ export declare const Table: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").TableHTMLAttributes<HTMLTableElement>, HTMLTableElement>, never> & Partial<Pick<import("react").DetailedHTMLProps<import("react").TableHTMLAttributes<HTMLTableElement>, HTMLTableElement>, never>>> & string;
31
+ export declare const TableHead: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "$stickyHeader"> & TableHeadProps, never> & Partial<Pick<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "$stickyHeader"> & TableHeadProps, never>>> & string;
32
+ export declare const TableBody: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, never> & Partial<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, never>>> & string;
34
33
  export declare const ActionBarWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof ActionBarWrapperProps> & ActionBarWrapperProps, never> & Partial<Pick<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof ActionBarWrapperProps> & ActionBarWrapperProps, never>>> & string;
35
34
  export declare const TextButton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<Omit<import("styled-components").FastOmit<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "$variant"> & import("../shared/input-wrapper").InputStyleProps, never> & Partial<Pick<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "$variant"> & import("../shared/input-wrapper").InputStyleProps, never>> & {
36
35
  as?: import("styled-components").WebTarget | undefined;
@@ -43,7 +42,8 @@ export declare const TextButton: import("styled-components/dist/types").IStyledC
43
42
  }, "ref"> & {
44
43
  ref?: ((instance: HTMLButtonElement | null) => void) | import("react").RefObject<HTMLButtonElement> | null | undefined;
45
44
  }, never>>> & string;
46
- export declare const ActionBar: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof ActionBarProps> & ActionBarProps, never> & Partial<Pick<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof ActionBarProps> & ActionBarProps, never>>> & string;
45
+ export declare const ActionBar: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "$float"> & ActionBarProps, never> & Partial<Pick<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "$float"> & ActionBarProps, never>>> & string;
46
+ export declare const ActionBarSpacer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never> & Partial<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>>> & string;
47
47
  export declare const HeaderRow: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableRowElement>, HTMLTableRowElement>, never> & Partial<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLTableRowElement>, HTMLTableRowElement>, never>>> & string;
48
48
  export declare const HeaderCell: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").ThHTMLAttributes<HTMLTableHeaderCellElement>, HTMLTableHeaderCellElement>, keyof HeaderCellProps> & HeaderCellProps, never> & Partial<Pick<import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").ThHTMLAttributes<HTMLTableHeaderCellElement>, HTMLTableHeaderCellElement>, keyof HeaderCellProps> & HeaderCellProps, never>>> & string;
49
49
  export declare const HeaderCellWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never> & Partial<Pick<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>>> & string;
@@ -1,21 +1,24 @@
1
- import e,{css as r}from"styled-components";import{BasicButton as t}from"../shared/input-wrapper/input-wrapper.js";import{lineClampCss as o}from"../shared/styles/index.js";import{Colour as i,Border as d,Radius as l,Font as s,Motion as n,Spacing as a,Shadow as $}from"../theme/index.js";import{Typography as m}from"../typography/typography.js";const c=i.border,p=i.text,g=e.div`
2
- overflow: auto;
1
+ import e,{css as t}from"styled-components";import{BasicButton as r}from"../shared/input-wrapper/input-wrapper.js";import{lineClampCss as o}from"../shared/styles/index.js";import{Colour as i,Border as d,Radius as s,Font as l,Motion as n,Spacing as a,Shadow as $}from"../theme/index.js";import{Typography as c}from"../typography/typography.js";const m=i.border,p=i.text,h=e.div`
2
+ /* we separate the overflow styles so that sticky elements can still work
3
+ with horizontal scrolling on supported browsers
4
+ see: https://github.com/w3c/csswg-drafts/issues/12289 */
5
+ overflow-y: ${e=>e.$scrollable?"auto":"clip"};
6
+ overflow-x: auto;
7
+ position: relative;
3
8
  display: flex;
4
9
  flex-direction: column;
5
- border: ${d["width-010"]} ${d.solid} ${c};
6
- border-radius: ${l.md};
10
+ border: ${d["width-010"]} ${d.solid} ${m};
11
+ border-radius: ${s.md};
7
12
 
8
- // Hide scrollbar
13
+ /* Hide scrollbar */
14
+ scrollbar-width: none; /* Firefox */
15
+ -ms-overflow-style: none; /* IE 10+ */
9
16
  &::-webkit-scrollbar {
10
- display: none;
11
- }
12
- * {
13
- -ms-overflow-style: none; /* IE and Edge */
14
- scrollbar-width: none; /* Firefox */
17
+ display: none; /* Chrome/Safari/Webkit */
15
18
  }
16
19
  `,b=e.div`
17
20
  flex: 1;
18
- `,h=e.table`
21
+ `,g=e.table`
19
22
  th:last-child,
20
23
  td:last-child {
21
24
  padding-right: 1.5rem;
@@ -28,32 +31,30 @@ import e,{css as r}from"styled-components";import{BasicButton as t}from"../share
28
31
  border-collapse: separate;
29
32
  border-spacing: 0;
30
33
  width: 100%;
31
-
32
- ${e=>{if(e.$stickyHeader)return r`
33
- thead {
34
- position: sticky;
35
- top: 0;
36
- z-index: 20;
37
- }
38
- `}};
39
- `,f=e.tbody`
40
- tr:last-child {
41
- td {
42
- border-bottom: ${e=>e.$showLastRowBottomBorder?`${d["width-010"]} ${d.solid} ${c}`:"none"};
43
- }
44
- }
45
- `,x=e.div`
46
- bottom: 0;
47
- ${e=>{if(e.$fixed){const t=e.$left?`${e.$left}px`:"0",o=e.$width?`${e.$width}px`:"100%";return r`
48
- position: fixed;
49
- left: ${t};
50
- width: ${o};
51
- `}return r`
34
+ `,f=e.thead`
35
+ ${e=>{if(e.$stickyHeader)return t`
52
36
  position: sticky;
53
- left: 0;
37
+ top: 0;
38
+ z-index: 20;
54
39
  `}};
55
- `,u=e(t)`
56
- ${s["body-md-semibold"]}
40
+ `,w=e.tbody``,u=e.div`
41
+ ${e=>{const r=e.$left?`${e.$left}px`:"0",o=e.$width?`${e.$width}px`:"100%";switch(e.$strategy){case"inline":return t`
42
+ position: absolute;
43
+ bottom: 0;
44
+ left: 0;
45
+ width: ${o};
46
+ `;case"fixed":return t`
47
+ position: fixed;
48
+ bottom: 0;
49
+ left: ${r};
50
+ width: ${o};
51
+ `;case"sticky":return t`
52
+ position: sticky;
53
+ bottom: 0;
54
+ width: ${o};
55
+ `}}}
56
+ `,x=e(r)`
57
+ ${l["body-md-semibold"]}
57
58
  cursor: pointer;
58
59
  color: ${i["text-primary"]};
59
60
  transition: ${n["duration-150"]} ${n["ease-default"]};
@@ -63,44 +64,46 @@ import e,{css as r}from"styled-components";import{BasicButton as t}from"../share
63
64
  &:hover {
64
65
  color: ${i["text-hover"]};
65
66
  }
66
- `,w=e.div`
67
+ `,y=e.div`
67
68
  overflow: hidden;
68
69
  display: flex;
69
70
  align-items: center;
70
71
  height: 3.5rem;
71
72
  padding: ${a["spacing-16"]} ${a["spacing-24"]};
72
- border-top: ${d["width-010"]} ${d.solid} ${c};
73
+ border-top: ${d["width-010"]} ${d.solid} ${m};
73
74
  background-color: ${i["bg-selected"]};
74
- transition: all 300ms ease;
75
- ${e=>e.$float?r`
75
+ transition: transform ${n["duration-350"]} ${n["ease-default"]};
76
+ ${e=>e.$float?t`
76
77
  transform: translateX(0.5rem) translateY(-2rem);
77
- border-radius: ${l.sm};
78
+ border-radius: ${s.sm};
78
79
  box-shadow: ${$["xs-subtle"]};
79
80
  width: calc(100% - ${a["spacing-16"]});
80
- border: ${d["width-010"]} ${d.solid} ${c};
81
- `:r`
82
- border-radius: ${l.none} ${l.none}
83
- ${l.sm} ${l.sm};
81
+ border: ${d["width-010"]} ${d.solid} ${m};
82
+ `:t`
83
+ border-radius: ${s.none} ${s.none}
84
+ ${s.sm} ${s.sm};
84
85
  `}
85
- `,y=e.tr`
86
+ `,v=e.div`
87
+ height: 3.5rem;
88
+ `,k=e.tr`
86
89
  background-color: ${i["bg-stronger"]};
87
90
  height: 6rem;
88
- border-bottom: ${d["width-010"]} ${d.solid} ${c};
89
- `,v=e.th`
91
+ border-bottom: ${d["width-010"]} ${d.solid} ${m};
92
+ `,j=e.th`
90
93
  padding: ${e=>e.$isCheckbox?"1.25rem 0.5rem 1.25rem 1.5rem":"1.25rem 1rem"};
91
94
  text-align: left;
92
95
  cursor: ${e=>e.$clickable?"pointer":"default"};
93
96
  vertical-align: middle;
94
97
  color: ${p};
95
- border-bottom: ${d["width-010"]} ${d.solid} ${c};
96
- ${e=>{if(e.$isCheckbox)return r`
98
+ border-bottom: ${d["width-010"]} ${d.solid} ${m};
99
+ ${e=>{if(e.$isCheckbox)return t`
97
100
  width: 4rem;
98
101
  `}};
99
102
  &:focus-within {
100
103
  outline: 2px solid ${i["focus-ring"]};
101
104
  outline-offset: -3px;
102
105
  }
103
- `,k=e.div`
106
+ `,B=e.div`
104
107
  display: flex;
105
108
  flex-direction: row;
106
109
  align-items: center;
@@ -109,41 +112,47 @@ import e,{css as r}from"styled-components";import{BasicButton as t}from"../share
109
112
  color: ${p};
110
113
  margin-left: 0.5rem;
111
114
  }
112
- `,j=e.tr`
113
- background-color: ${e=>e.$isSelected?r`
115
+ `,C=e.tr`
116
+ background-color: ${e=>e.$isSelected?t`
114
117
  ${i["bg-selected"]};
115
- `:e.$alternating?r`
118
+ `:e.$alternating?t`
116
119
  ${i["bg-strong"]};
117
- `:r`
120
+ `:t`
118
121
  ${i.bg};
119
122
  `};
120
- border-top: ${d["width-010"]} ${d.solid} ${c};
123
+ border-top: ${d["width-010"]} ${d.solid} ${m};
121
124
  &:hover {
122
- ${e=>{if(e.$isSelectable)return r`
125
+ ${e=>{if(e.$isSelectable)return t`
123
126
  background-color: ${i["bg-hover-strong"]};
124
127
  `}};
125
128
  }
126
- `,B=e.td`
129
+
130
+ &:last-child {
131
+ td {
132
+ border-bottom: ${e=>e.$showLastRowBottomBorder?`${d["width-010"]} ${d.solid} ${m}`:"none"};
133
+ }
134
+ }
135
+ `,S=e.td`
127
136
  padding: ${e=>e.$isCheckbox?"1.25rem 0.5rem 1.25rem 1.5rem":"1.25rem 1rem"};
128
137
  vertical-align: middle;
129
138
  color: ${p};
130
- border-bottom: ${d["width-010"]} ${d.solid} ${c};
131
- `,C=e(m.BodyBL)`
139
+ border-bottom: ${d["width-010"]} ${d.solid} ${m};
140
+ `,H=e(c.BodyBL)`
132
141
  ${o(2)}
133
142
  text-overflow: ellipsis;
134
- `,H=e.div`
143
+ `,z=e.div`
135
144
  display: flex;
136
145
  align-items: center;
137
146
  justify-content: center;
138
- `,S=e.div`
147
+ `,L=e.div`
139
148
  display: flex;
140
149
  flex-direction: column;
141
150
  align-items: center;
142
151
  padding: 4rem 0;
143
- `,E=e(m.HeadingSM)`
152
+ `,E=e(c.HeadingSM)`
144
153
  margin-top: 2rem;
145
154
  margin-bottom: 1rem;
146
- `,L=e.td`
155
+ `,F=e.td`
147
156
  padding: 4rem 0;
148
- `;export{w as ActionBar,x as ActionBarWrapper,B as BodyCell,C as BodyCellContent,j as BodyRow,H as CheckBoxWrapper,L as EmptyViewCell,E as ErrorDisplayTitle,v as HeaderCell,k as HeaderCellWrapper,y as HeaderRow,S as LoaderWrapper,h as Table,f as TableBody,b as TableContainer,g as TableWrapper,u as TextButton};
157
+ `;export{y as ActionBar,v as ActionBarSpacer,u as ActionBarWrapper,S as BodyCell,H as BodyCellContent,C as BodyRow,z as CheckBoxWrapper,F as EmptyViewCell,E as ErrorDisplayTitle,j as HeaderCell,B as HeaderCellWrapper,k as HeaderRow,L as LoaderWrapper,g as Table,w as TableBody,b as TableContainer,f as TableHead,h as TableWrapper,x as TextButton};
149
158
  //# sourceMappingURL=data-table.styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.styles.js","sources":["../../src/data-table/data-table.styles.tsx"],"sourcesContent":["import styled, { css } from \"styled-components\";\nimport { BasicButton } from \"../shared/input-wrapper\";\nimport { lineClampCss } from \"../shared/styles\";\nimport {\n Border,\n Colour,\n Font,\n Motion,\n Radius,\n Shadow,\n Spacing,\n} from \"../theme\";\nimport { Typography } from \"../typography\";\n\n// =============================================================================\n// STYLE INTERFACE, transient props are denoted with $\n// See more https://styled-components.com/docs/api#transient-props\n// =============================================================================\ninterface TableProps {\n $end: boolean;\n $scrollable: boolean;\n $stickyHeader: boolean | undefined;\n}\ninterface TableBodyProps {\n $showLastRowBottomBorder: boolean;\n}\ninterface HeaderCellProps {\n $clickable: boolean;\n $isCheckbox: boolean;\n}\ninterface BodyRowProps {\n $alternating: boolean;\n $isSelected?: boolean;\n $isSelectable?: boolean;\n}\n\ninterface BodyCellProps {\n $isCheckbox: boolean;\n}\n\ninterface ActionBarWrapperProps {\n $fixed: boolean;\n $left?: number | undefined;\n $width?: number | undefined;\n}\n\ninterface ActionBarProps {\n $float: boolean;\n $scrollable: boolean;\n}\n\n// =============================================================================\n// STYLES CONSTANTS\n// =============================================================================\nconst borderColor = Colour[\"border\"];\nconst fontColor = Colour[\"text\"];\n\n// =============================================================================\n// STYLES\n// =============================================================================\nexport const TableWrapper = styled.div`\n overflow: auto;\n display: flex;\n flex-direction: column;\n border: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n border-radius: ${Radius[\"md\"]};\n\n // Hide scrollbar\n &::-webkit-scrollbar {\n display: none;\n }\n * {\n -ms-overflow-style: none; /* IE and Edge */\n scrollbar-width: none; /* Firefox */\n }\n`;\n\nexport const TableContainer = styled.div`\n flex: 1;\n`;\n\nexport const Table = styled.table<TableProps>`\n th:last-child,\n td:last-child {\n padding-right: 1.5rem;\n }\n th:first-child,\n td:first-child {\n padding-left: 1.5rem;\n }\n text-align: left;\n border-collapse: separate;\n border-spacing: 0;\n width: 100%;\n\n ${(props) => {\n if (props.$stickyHeader) {\n return css`\n thead {\n position: sticky;\n top: 0;\n z-index: 20;\n }\n `;\n }\n }};\n`;\n\nexport const TableBody = styled.tbody<TableBodyProps>`\n tr:last-child {\n td {\n border-bottom: ${(props) =>\n props.$showLastRowBottomBorder\n ? `${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor}`\n : \"none\"};\n }\n }\n`;\n\nexport const ActionBarWrapper = styled.div<ActionBarWrapperProps>`\n bottom: 0;\n ${(props) => {\n if (props.$fixed) {\n const left = props.$left ? `${props.$left}px` : \"0\";\n const width = props.$width ? `${props.$width}px` : \"100%\";\n return css`\n position: fixed;\n left: ${left};\n width: ${width};\n `;\n } else {\n return css`\n position: sticky;\n left: 0;\n `;\n }\n }};\n`;\n\nexport const TextButton = styled(BasicButton)`\n ${Font[\"body-md-semibold\"]}\n cursor: pointer;\n color: ${Colour[\"text-primary\"]};\n transition: ${Motion[\"duration-150\"]} ${Motion[\"ease-default\"]};\n padding: 0.75rem;\n margin: -0.75rem 0;\n\n &:hover {\n color: ${Colour[\"text-hover\"]};\n }\n`;\n\nexport const ActionBar = styled.div<ActionBarProps>`\n overflow: hidden;\n display: flex;\n align-items: center;\n height: 3.5rem;\n padding: ${Spacing[\"spacing-16\"]} ${Spacing[\"spacing-24\"]};\n border-top: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n background-color: ${Colour[\"bg-selected\"]};\n transition: all 300ms ease;\n ${(props) => {\n if (props.$float) {\n return css`\n transform: translateX(0.5rem) translateY(-2rem);\n border-radius: ${Radius[\"sm\"]};\n box-shadow: ${Shadow[\"xs-subtle\"]};\n width: calc(100% - ${Spacing[\"spacing-16\"]});\n border: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n `;\n } else {\n return css`\n border-radius: ${Radius[\"none\"]} ${Radius[\"none\"]}\n ${Radius[\"sm\"]} ${Radius[\"sm\"]};\n `;\n }\n }}\n`;\n\nexport const HeaderRow = styled.tr`\n background-color: ${Colour[\"bg-stronger\"]};\n height: 6rem;\n border-bottom: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n`;\n\nexport const HeaderCell = styled.th<HeaderCellProps>`\n padding: ${(props) =>\n props.$isCheckbox ? \"1.25rem 0.5rem 1.25rem 1.5rem\" : \"1.25rem 1rem\"};\n text-align: left;\n cursor: ${(props) => (props.$clickable ? \"pointer\" : \"default\")};\n vertical-align: middle;\n color: ${fontColor};\n border-bottom: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n ${(props) => {\n if (props.$isCheckbox) {\n return css`\n width: 4rem;\n `;\n }\n }};\n &:focus-within {\n outline: 2px solid ${Colour[\"focus-ring\"]};\n outline-offset: -3px;\n }\n`;\n\nexport const HeaderCellWrapper = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n\n svg {\n color: ${fontColor};\n margin-left: 0.5rem;\n }\n`;\n\nexport const BodyRow = styled.tr<BodyRowProps>`\n background-color: ${(props) => {\n if (props.$isSelected) {\n return css`\n ${Colour[\"bg-selected\"]};\n `;\n } else if (props.$alternating) {\n return css`\n ${Colour[\"bg-strong\"]};\n `;\n } else {\n return css`\n ${Colour[\"bg\"]};\n `;\n }\n }};\n border-top: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n &:hover {\n ${(props) => {\n if (props.$isSelectable) {\n return css`\n background-color: ${Colour[\"bg-hover-strong\"]};\n `;\n }\n }};\n }\n`;\n\nexport const BodyCell = styled.td<BodyCellProps>`\n padding: ${(props) =>\n props.$isCheckbox ? \"1.25rem 0.5rem 1.25rem 1.5rem\" : \"1.25rem 1rem\"};\n vertical-align: middle;\n color: ${fontColor};\n border-bottom: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n`;\n\nexport const BodyCellContent = styled(Typography.BodyBL)`\n ${lineClampCss(2)}\n text-overflow: ellipsis;\n`;\n\nexport const CheckBoxWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const LoaderWrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 4rem 0;\n`;\n\nexport const ErrorDisplayTitle = styled(Typography.HeadingSM)`\n margin-top: 2rem;\n margin-bottom: 1rem;\n`;\n\nexport const EmptyViewCell = styled.td`\n padding: 4rem 0;\n`;\n"],"names":["borderColor","Colour","fontColor","TableWrapper","styled","div","Border","Radius","TableContainer","Table","table","props","$stickyHeader","css","TableBody","tbody","$showLastRowBottomBorder","ActionBarWrapper","$fixed","left","$left","width","$width","TextButton","BasicButton","Font","Motion","ActionBar","Spacing","$float","Shadow","HeaderRow","tr","HeaderCell","th","$isCheckbox","$clickable","HeaderCellWrapper","BodyRow","$isSelected","$alternating","$isSelectable","BodyCell","td","BodyCellContent","Typography","BodyBL","lineClampCss","CheckBoxWrapper","LoaderWrapper","ErrorDisplayTitle","HeadingSM","EmptyViewCell"],"mappings":"sVAsDA,MAAMA,EAAcC,EAAe,OAC7BC,EAAYD,EAAa,KAKlBE,EAAeC,EAAOC,GAAG;;;;cAIxBC,EAAO,gBAAgBA,EAAc,SAAKN;qBACnCO,EAAW;;;;;;;;;;EAYnBC,EAAiBJ,EAAOC,GAAG;;EAI3BI,EAAQL,EAAOM,KAAiB;;;;;;;;;;;;;;MActCC,IACC,GAAIA,EAAMC,cACN,OAAOC,CAAG;;;;;;aAOd;EAIKC,EAAYV,EAAOW,KAAqB;;;6BAGvBJ,GACdA,EAAMK,yBACA,GAAGV,EAAO,gBAAgBA,EAAc,SAAKN,IAC7C;;;EAKTiB,EAAmBb,EAAOC,GAA0B;;MAE1DM,IACC,GAAIA,EAAMO,OAAQ,CACd,MAAMC,EAAOR,EAAMS,MAAQ,GAAGT,EAAMS,UAAY,IAC1CC,EAAQV,EAAMW,OAAS,GAAGX,EAAMW,WAAa,OACnD,OAAOT,CAAG;;wBAEEM;yBACCE;aAEjB,CACI,OAAOR,CAAG;;;aAId;EAIKU,EAAanB,EAAOoB,EAAY;MACvCC,EAAK;;aAEExB,EAAO;kBACFyB,EAAO,mBAAmBA,EAAO;;;;;iBAKlCzB,EAAO;;EAIX0B,EAAYvB,EAAOC,GAAmB;;;;;eAKpCuB,EAAQ,iBAAiBA,EAAQ;kBAC9BtB,EAAO,gBAAgBA,EAAc,SAAKN;wBACpCC,EAAO;;MAExBU,GACKA,EAAMkB,OACChB,CAAG;;iCAEWN,EAAW;8BACduB,EAAO;qCACAF,EAAQ;0BACnBtB,EAAO,gBAAgBA,EAAc,SAAKN;cAGjDa,CAAG;iCACWN,EAAa,QAAKA,EAAa;sBAC1CA,EAAW,MAAKA,EAAW;;EAMpCwB,EAAY3B,EAAO4B,EAAE;wBACV/B,EAAO;;qBAEVK,EAAO,gBAAgBA,EAAc,SAAKN;EAGlDiC,EAAa7B,EAAO8B,EAAmB;eACpCvB,GACRA,EAAMwB,YAAc,gCAAkC;;cAE/CxB,GAAWA,EAAMyB,WAAa,UAAY;;aAE5ClC;qBACQI,EAAO,gBAAgBA,EAAc,SAAKN;MACxDW,IACC,GAAIA,EAAMwB,YACN,OAAOtB,CAAG;;aAGd;;6BAGqBZ,EAAO;;;EAKvBoC,EAAoBjC,EAAOC,GAAG;;;;;;iBAM1BH;;;EAKJoC,EAAUlC,EAAO4B,EAAgB;wBACrBrB,GACbA,EAAM4B,YACC1B,CAAG;kBACJZ,EAAO;cAENU,EAAM6B,aACN3B,CAAG;kBACJZ,EAAO;cAGNY,CAAG;kBACJZ,EAAW;;kBAIXK,EAAO,gBAAgBA,EAAc,SAAKN;;UAEjDW,IACC,GAAIA,EAAM8B,cACN,OAAO5B,CAAG;wCACcZ,EAAO;iBAEnC;;EAKCyC,EAAWtC,EAAOuC,EAAiB;eAChChC,GACRA,EAAMwB,YAAc,gCAAkC;;aAEjDjC;qBACQI,EAAO,gBAAgBA,EAAc,SAAKN;EAGlD4C,EAAkBxC,EAAOyC,EAAWC,OAAO;MAClDC,EAAa;;EAINC,EAAkB5C,EAAOC,GAAG;;;;EAM5B4C,EAAgB7C,EAAOC,GAAG;;;;;EAO1B6C,EAAoB9C,EAAOyC,EAAWM,UAAU;;;EAKhDC,EAAgBhD,EAAOuC,EAAE;;"}
1
+ {"version":3,"file":"data-table.styles.js","sources":["../../src/data-table/data-table.styles.tsx"],"sourcesContent":["import styled, { css } from \"styled-components\";\nimport { BasicButton } from \"../shared/input-wrapper\";\nimport { lineClampCss } from \"../shared/styles\";\nimport {\n Border,\n Colour,\n Font,\n Motion,\n Radius,\n Shadow,\n Spacing,\n} from \"../theme\";\nimport { Typography } from \"../typography\";\n\n// =============================================================================\n// STYLE INTERFACE, transient props are denoted with $\n// See more https://styled-components.com/docs/api#transient-props\n// =============================================================================\ninterface TableWrapperProps {\n $scrollable: boolean;\n}\ninterface TableHeadProps {\n $stickyHeader: boolean | undefined;\n}\ninterface HeaderCellProps {\n $clickable: boolean;\n $isCheckbox: boolean;\n}\ninterface BodyRowProps {\n $alternating: boolean;\n $isSelected?: boolean;\n $isSelectable?: boolean;\n $showLastRowBottomBorder?: boolean;\n}\n\ninterface BodyCellProps {\n $isCheckbox: boolean;\n}\n\ninterface ActionBarWrapperProps {\n $strategy: \"fixed\" | \"sticky\" | \"inline\";\n $left?: number | undefined;\n $width?: number | undefined;\n}\n\ninterface ActionBarProps {\n $float: boolean;\n}\n\n// =============================================================================\n// STYLES CONSTANTS\n// =============================================================================\nconst borderColor = Colour[\"border\"];\nconst fontColor = Colour[\"text\"];\n\n// =============================================================================\n// STYLES\n// =============================================================================\nexport const TableWrapper = styled.div<TableWrapperProps>`\n /* we separate the overflow styles so that sticky elements can still work\n with horizontal scrolling on supported browsers\n see: https://github.com/w3c/csswg-drafts/issues/12289 */\n overflow-y: ${(props) => (props.$scrollable ? \"auto\" : \"clip\")};\n overflow-x: auto;\n position: relative;\n display: flex;\n flex-direction: column;\n border: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n border-radius: ${Radius[\"md\"]};\n\n /* Hide scrollbar */\n scrollbar-width: none; /* Firefox */\n -ms-overflow-style: none; /* IE 10+ */\n &::-webkit-scrollbar {\n display: none; /* Chrome/Safari/Webkit */\n }\n`;\n\nexport const TableContainer = styled.div`\n flex: 1;\n`;\n\nexport const Table = styled.table`\n th:last-child,\n td:last-child {\n padding-right: 1.5rem;\n }\n th:first-child,\n td:first-child {\n padding-left: 1.5rem;\n }\n text-align: left;\n border-collapse: separate;\n border-spacing: 0;\n width: 100%;\n`;\n\nexport const TableHead = styled.thead<TableHeadProps>`\n ${(props) => {\n if (props.$stickyHeader) {\n return css`\n position: sticky;\n top: 0;\n z-index: 20;\n `;\n }\n }};\n`;\n\nexport const TableBody = styled.tbody``;\n\nexport const ActionBarWrapper = styled.div<ActionBarWrapperProps>`\n ${(props) => {\n const left = props.$left ? `${props.$left}px` : \"0\";\n const width = props.$width ? `${props.$width}px` : \"100%\";\n\n switch (props.$strategy) {\n case \"inline\":\n return css`\n position: absolute;\n bottom: 0;\n left: 0;\n width: ${width};\n `;\n case \"fixed\":\n return css`\n position: fixed;\n bottom: 0;\n left: ${left};\n width: ${width};\n `;\n case \"sticky\":\n return css`\n position: sticky;\n bottom: 0;\n width: ${width};\n `;\n }\n }}\n`;\n\nexport const TextButton = styled(BasicButton)`\n ${Font[\"body-md-semibold\"]}\n cursor: pointer;\n color: ${Colour[\"text-primary\"]};\n transition: ${Motion[\"duration-150\"]} ${Motion[\"ease-default\"]};\n padding: 0.75rem;\n margin: -0.75rem 0;\n\n &:hover {\n color: ${Colour[\"text-hover\"]};\n }\n`;\n\nexport const ActionBar = styled.div<ActionBarProps>`\n overflow: hidden;\n display: flex;\n align-items: center;\n height: 3.5rem;\n padding: ${Spacing[\"spacing-16\"]} ${Spacing[\"spacing-24\"]};\n border-top: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n background-color: ${Colour[\"bg-selected\"]};\n transition: transform ${Motion[\"duration-350\"]} ${Motion[\"ease-default\"]};\n ${(props) => {\n if (props.$float) {\n return css`\n transform: translateX(0.5rem) translateY(-2rem);\n border-radius: ${Radius[\"sm\"]};\n box-shadow: ${Shadow[\"xs-subtle\"]};\n width: calc(100% - ${Spacing[\"spacing-16\"]});\n border: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n `;\n } else {\n return css`\n border-radius: ${Radius[\"none\"]} ${Radius[\"none\"]}\n ${Radius[\"sm\"]} ${Radius[\"sm\"]};\n `;\n }\n }}\n`;\n\nexport const ActionBarSpacer = styled.div`\n height: 3.5rem;\n`;\n\nexport const HeaderRow = styled.tr`\n background-color: ${Colour[\"bg-stronger\"]};\n height: 6rem;\n border-bottom: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n`;\n\nexport const HeaderCell = styled.th<HeaderCellProps>`\n padding: ${(props) =>\n props.$isCheckbox ? \"1.25rem 0.5rem 1.25rem 1.5rem\" : \"1.25rem 1rem\"};\n text-align: left;\n cursor: ${(props) => (props.$clickable ? \"pointer\" : \"default\")};\n vertical-align: middle;\n color: ${fontColor};\n border-bottom: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n ${(props) => {\n if (props.$isCheckbox) {\n return css`\n width: 4rem;\n `;\n }\n }};\n &:focus-within {\n outline: 2px solid ${Colour[\"focus-ring\"]};\n outline-offset: -3px;\n }\n`;\n\nexport const HeaderCellWrapper = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n\n svg {\n color: ${fontColor};\n margin-left: 0.5rem;\n }\n`;\n\nexport const BodyRow = styled.tr<BodyRowProps>`\n background-color: ${(props) => {\n if (props.$isSelected) {\n return css`\n ${Colour[\"bg-selected\"]};\n `;\n } else if (props.$alternating) {\n return css`\n ${Colour[\"bg-strong\"]};\n `;\n } else {\n return css`\n ${Colour[\"bg\"]};\n `;\n }\n }};\n border-top: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n &:hover {\n ${(props) => {\n if (props.$isSelectable) {\n return css`\n background-color: ${Colour[\"bg-hover-strong\"]};\n `;\n }\n }};\n }\n\n &:last-child {\n td {\n border-bottom: ${(props) =>\n props.$showLastRowBottomBorder\n ? `${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor}`\n : \"none\"};\n }\n }\n`;\n\nexport const BodyCell = styled.td<BodyCellProps>`\n padding: ${(props) =>\n props.$isCheckbox ? \"1.25rem 0.5rem 1.25rem 1.5rem\" : \"1.25rem 1rem\"};\n vertical-align: middle;\n color: ${fontColor};\n border-bottom: ${Border[\"width-010\"]} ${Border[\"solid\"]} ${borderColor};\n`;\n\nexport const BodyCellContent = styled(Typography.BodyBL)`\n ${lineClampCss(2)}\n text-overflow: ellipsis;\n`;\n\nexport const CheckBoxWrapper = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nexport const LoaderWrapper = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 4rem 0;\n`;\n\nexport const ErrorDisplayTitle = styled(Typography.HeadingSM)`\n margin-top: 2rem;\n margin-bottom: 1rem;\n`;\n\nexport const EmptyViewCell = styled.td`\n padding: 4rem 0;\n`;\n"],"names":["borderColor","Colour","fontColor","TableWrapper","styled","div","props","$scrollable","Border","Radius","TableContainer","Table","table","TableHead","thead","$stickyHeader","css","TableBody","tbody","ActionBarWrapper","left","$left","width","$width","$strategy","TextButton","BasicButton","Font","Motion","ActionBar","Spacing","$float","Shadow","ActionBarSpacer","HeaderRow","tr","HeaderCell","th","$isCheckbox","$clickable","HeaderCellWrapper","BodyRow","$isSelected","$alternating","$isSelectable","$showLastRowBottomBorder","BodyCell","td","BodyCellContent","Typography","BodyBL","lineClampCss","CheckBoxWrapper","LoaderWrapper","ErrorDisplayTitle","HeadingSM","EmptyViewCell"],"mappings":"sVAoDA,MAAMA,EAAcC,EAAe,OAC7BC,EAAYD,EAAa,KAKlBE,EAAeC,EAAOC,GAAsB;;;;kBAItCC,GAAWA,EAAMC,YAAc,OAAS;;;;;cAK7CC,EAAO,gBAAgBA,EAAc,SAAKR;qBACnCS,EAAW;;;;;;;;EAUnBC,EAAiBN,EAAOC,GAAG;;EAI3BM,EAAQP,EAAOQ,KAAK;;;;;;;;;;;;;EAepBC,EAAYT,EAAOU,KAAqB;MAC9CR,IACC,GAAIA,EAAMS,cACN,OAAOC,CAAG;;;;aAKd;EAIKC,EAAYb,EAAOc,KAAK,GAExBC,EAAmBf,EAAOC,GAA0B;MAC1DC,IACC,MAAMc,EAAOd,EAAMe,MAAQ,GAAGf,EAAMe,UAAY,IAC1CC,EAAQhB,EAAMiB,OAAS,GAAGjB,EAAMiB,WAAa,OAEnD,OAAQjB,EAAMkB,WACV,IAAK,SACD,OAAOR,CAAG;;;;6BAIGM;kBAEjB,IAAK,QACD,OAAON,CAAG;;;4BAGEI;6BACCE;kBAEjB,IAAK,SACD,OAAON,CAAG;;;6BAGGM;;EAMhBG,EAAarB,EAAOsB,EAAY;MACvCC,EAAK;;aAEE1B,EAAO;kBACF2B,EAAO,mBAAmBA,EAAO;;;;;iBAKlC3B,EAAO;;EAIX4B,EAAYzB,EAAOC,GAAmB;;;;;eAKpCyB,EAAQ,iBAAiBA,EAAQ;kBAC9BtB,EAAO,gBAAgBA,EAAc,SAAKR;wBACpCC,EAAO;4BACH2B,EAAO,mBAAmBA,EAAO;MACtDtB,GACKA,EAAMyB,OACCf,CAAG;;iCAEWP,EAAW;8BACduB,EAAO;qCACAF,EAAQ;0BACnBtB,EAAO,gBAAgBA,EAAc,SAAKR;cAGjDgB,CAAG;iCACWP,EAAa,QAAKA,EAAa;sBAC1CA,EAAW,MAAKA,EAAW;;EAMpCwB,EAAkB7B,EAAOC,GAAG;;EAI5B6B,EAAY9B,EAAO+B,EAAE;wBACVlC,EAAO;;qBAEVO,EAAO,gBAAgBA,EAAc,SAAKR;EAGlDoC,EAAahC,EAAOiC,EAAmB;eACpC/B,GACRA,EAAMgC,YAAc,gCAAkC;;cAE/ChC,GAAWA,EAAMiC,WAAa,UAAY;;aAE5CrC;qBACQM,EAAO,gBAAgBA,EAAc,SAAKR;MACxDM,IACC,GAAIA,EAAMgC,YACN,OAAOtB,CAAG;;aAGd;;6BAGqBf,EAAO;;;EAKvBuC,EAAoBpC,EAAOC,GAAG;;;;;;iBAM1BH;;;EAKJuC,EAAUrC,EAAO+B,EAAgB;wBACrB7B,GACbA,EAAMoC,YACC1B,CAAG;kBACJf,EAAO;cAENK,EAAMqC,aACN3B,CAAG;kBACJf,EAAO;cAGNe,CAAG;kBACJf,EAAW;;kBAIXO,EAAO,gBAAgBA,EAAc,SAAKR;;UAEjDM,IACC,GAAIA,EAAMsC,cACN,OAAO5B,CAAG;wCACcf,EAAO;iBAEnC;;;;;6BAMkBK,GACdA,EAAMuC,yBACA,GAAGrC,EAAO,gBAAgBA,EAAc,SAAKR,IAC7C;;;EAKT8C,EAAW1C,EAAO2C,EAAiB;eAChCzC,GACRA,EAAMgC,YAAc,gCAAkC;;aAEjDpC;qBACQM,EAAO,gBAAgBA,EAAc,SAAKR;EAGlDgD,EAAkB5C,EAAO6C,EAAWC,OAAO;MAClDC,EAAa;;EAINC,EAAkBhD,EAAOC,GAAG;;;;EAM5BgD,EAAgBjD,EAAOC,GAAG;;;;;EAO1BiD,EAAoBlD,EAAO6C,EAAWM,UAAU;;;EAKhDC,EAAgBpD,EAAO2C,EAAE;;"}