@ni/nimble-components 29.5.0 → 29.7.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 (67) hide show
  1. package/dist/all-components-bundle.js +1332 -41
  2. package/dist/all-components-bundle.js.map +1 -1
  3. package/dist/all-components-bundle.min.js +4059 -3816
  4. package/dist/all-components-bundle.min.js.map +1 -1
  5. package/dist/esm/table/components/cell/index.d.ts +9 -0
  6. package/dist/esm/table/components/cell/index.js +20 -0
  7. package/dist/esm/table/components/cell/index.js.map +1 -1
  8. package/dist/esm/table/components/cell/styles.js +17 -1
  9. package/dist/esm/table/components/cell/styles.js.map +1 -1
  10. package/dist/esm/table/components/cell/template.js +10 -2
  11. package/dist/esm/table/components/cell/template.js.map +1 -1
  12. package/dist/esm/table/components/group-row/index.d.ts +11 -3
  13. package/dist/esm/table/components/group-row/index.js +13 -1
  14. package/dist/esm/table/components/group-row/index.js.map +1 -1
  15. package/dist/esm/table/components/group-row/styles.js +7 -1
  16. package/dist/esm/table/components/group-row/styles.js.map +1 -1
  17. package/dist/esm/table/components/group-row/template.js +1 -1
  18. package/dist/esm/table/components/group-row/template.js.map +1 -1
  19. package/dist/esm/table/components/header/styles.js +7 -1
  20. package/dist/esm/table/components/header/styles.js.map +1 -1
  21. package/dist/esm/table/components/row/index.d.ts +16 -4
  22. package/dist/esm/table/components/row/index.js +34 -6
  23. package/dist/esm/table/components/row/index.js.map +1 -1
  24. package/dist/esm/table/components/row/styles.js +39 -1
  25. package/dist/esm/table/components/row/styles.js.map +1 -1
  26. package/dist/esm/table/components/row/template.js +4 -2
  27. package/dist/esm/table/components/row/template.js.map +1 -1
  28. package/dist/esm/table/index.d.ts +22 -2
  29. package/dist/esm/table/index.js +58 -1
  30. package/dist/esm/table/index.js.map +1 -1
  31. package/dist/esm/table/models/keyboard-navigation-manager.d.ts +96 -0
  32. package/dist/esm/table/models/keyboard-navigation-manager.js +1015 -0
  33. package/dist/esm/table/models/keyboard-navigation-manager.js.map +1 -0
  34. package/dist/esm/table/models/table-update-tracker.d.ts +2 -1
  35. package/dist/esm/table/models/table-update-tracker.js +20 -3
  36. package/dist/esm/table/models/table-update-tracker.js.map +1 -1
  37. package/dist/esm/table/models/virtualizer.d.ts +6 -2
  38. package/dist/esm/table/models/virtualizer.js +16 -22
  39. package/dist/esm/table/models/virtualizer.js.map +1 -1
  40. package/dist/esm/table/styles.js +21 -0
  41. package/dist/esm/table/styles.js.map +1 -1
  42. package/dist/esm/table/template.js +21 -3
  43. package/dist/esm/table/template.js.map +1 -1
  44. package/dist/esm/table/testing/table.pageobject.d.ts +7 -2
  45. package/dist/esm/table/testing/table.pageobject.js +16 -9
  46. package/dist/esm/table/testing/table.pageobject.js.map +1 -1
  47. package/dist/esm/table/types.d.ts +38 -0
  48. package/dist/esm/table/types.js +14 -0
  49. package/dist/esm/table/types.js.map +1 -1
  50. package/dist/esm/table-column/anchor/cell-view/index.d.ts +3 -0
  51. package/dist/esm/table-column/anchor/cell-view/index.js +13 -0
  52. package/dist/esm/table-column/anchor/cell-view/index.js.map +1 -1
  53. package/dist/esm/table-column/anchor/cell-view/template.js +4 -2
  54. package/dist/esm/table-column/anchor/cell-view/template.js.map +1 -1
  55. package/dist/esm/table-column/base/cell-view/index.d.ts +5 -0
  56. package/dist/esm/table-column/base/cell-view/index.js +7 -0
  57. package/dist/esm/table-column/base/cell-view/index.js.map +1 -1
  58. package/dist/esm/theme-provider/design-token-comments.js +8 -0
  59. package/dist/esm/theme-provider/design-token-comments.js.map +1 -1
  60. package/dist/esm/theme-provider/design-token-names.js +8 -0
  61. package/dist/esm/theme-provider/design-token-names.js.map +1 -1
  62. package/dist/esm/theme-provider/design-tokens.d.ts +8 -0
  63. package/dist/esm/theme-provider/design-tokens.js +9 -1
  64. package/dist/esm/theme-provider/design-tokens.js.map +1 -1
  65. package/dist/tokens-internal.scss +48 -0
  66. package/dist/tokens.scss +24 -0
  67. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard-navigation-manager.js","sourceRoot":"","sources":["../../../../src/table/models/keyboard-navigation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,EACV,MAAM,EACN,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,OAAO,EACP,WAAW,EACX,SAAS,EACT,QAAQ,EACR,MAAM,EACT,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAG/D,OAAO,EAEH,cAAc,EAIjB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAUlE;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IAYlC,IAAY,gBAAgB;QACxB,OAAO,CACH,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,cAAc;eAC7C,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,WAAW,CACnD,CAAC;IACN,CAAC;IAED,YACqB,KAAmB,EACnB,WAA+B;QAD/B,UAAK,GAAL,KAAK,CAAc;QACnB,gBAAW,GAAX,WAAW,CAAoB;QAnB5C,cAAS,GAAmB,cAAc,CAAC,IAAI,CAAC;QAChD,sBAAiB,GAAG,CAAC,CAAC,CAAC;QACvB,aAAQ,GAAG,CAAC,CAAC,CAAC;QACd,qBAAgB,GAAG,CAAC,CAAC,CAAC;QACtB,gBAAW,GAAG,CAAC,CAAC,CAAC;QACjB,qBAAgB,GAAG,KAAK,CAAC;QACzB,+BAA0B,GAAG,KAAK,CAAC;QAGnC,wBAAmB,GAAe,EAAE,CAAC;QA4M5B,mBAAc,GAAG,CAAC,KAAiB,EAAQ,EAAE;YAC1D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC;YAE9C,sDAAsD;YACtD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,KAAK,SAAS,CAAC;YACvE,IACI,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK;mBACrB,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI,CAAC;mBAC3C,CAAC,cAAc,EACpB;gBACE,IAAI,WAAW,GAAG,IAAI,CAAC;gBACvB,IACI,IAAI,CAAC,qBAAqB,EAAE;uBACzB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAC5C;oBACE,WAAW,GAAG,KAAK,CAAC;iBACvB;gBACD,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE;oBACzC,mBAAmB;oBACnB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;iBACrB;aACJ;QACL,CAAC,CAAC;QAEe,oBAAe,GAAG,GAAS,EAAE;YAC1C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAClC,CAAC,CAAC;QAEe,yBAAoB,GAAG,CACpC,KAA6B,EACzB,EAAE;YACN,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBACvB,oEAAoE;gBACpE,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;aACjE;QACL,CAAC,CAAC;QAEe,sBAAiB,GAAG,CACjC,KAA6B,EACzB,EAAE;YACN,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,IAAI,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC,CAAC;QAEe,kBAAa,GAAG,CAAC,KAA6B,EAAQ,EAAE;YACrE,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC;YAC7C,0FAA0F;YAC1F,kGAAkG;YAClG,iGAAiG;YACjG,kBAAkB;YAClB,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG;mBAClC,IAAI,CAAC,gBAAgB,EAAE,KAAK,IAAI,EACrC;gBACE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;aAC/B;QACL,CAAC,CAAC;QAEe,eAAU,GAAG,CAAC,KAA6B,EAAQ,EAAE;YAClE,KAAK,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;YAC1B,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC;QAEe,qBAAgB,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAC/D,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE;gBACtB,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;aAC/C;iBAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBAC9B,QAAQ,KAAK,CAAC,GAAG,EAAE;oBACf,KAAK,YAAY;wBACb,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBACpC,MAAM;oBACV,KAAK,aAAa;wBACd,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;wBACrC,MAAM;oBACV,KAAK,UAAU;wBACX,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBAClC,MAAM;oBACV,KAAK,YAAY;wBACb,OAAO,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBACpC,MAAM;oBACV,KAAK,SAAS;wBACV,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;wBACjC,MAAM;oBACV,KAAK,WAAW;wBACZ,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBACnC,MAAM;oBACV,KAAK,OAAO;wBACR,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAC5C,MAAM;oBACV,KAAK,MAAM;wBACP,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAC3C,MAAM;oBACV,KAAK,QAAQ;wBACT,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAC7C,MAAM;oBACV,KAAK,QAAQ;wBACT,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;wBAC9C,MAAM;oBACV,KAAK,YAAY;wBACb,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;wBAC7B,MAAM;oBACV;wBACI,MAAM;iBACb;aACJ;YACD,IAAI,OAAO,EAAE;gBACT,KAAK,CAAC,cAAc,EAAE,CAAC;aAC1B;QACL,CAAC,CAAC;QAEe,cAAS,GAAG,CAAC,KAAoB,EAAQ,EAAE;YACxD,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE;gBACnD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,EAAE;oBACvD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;oBACjC,IAAI,GAAG,EAAE;wBACL,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC,CAAC;qBACpD;iBACJ;aACJ;QACL,CAAC,CAAC;QAEe,sBAAiB,GAAG,CAAC,KAAoB,EAAQ,EAAE;YAChE,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,gBAAgB;mBACjC,CAAC,KAAK,CAAC,GAAG,KAAK,UAAU,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC;YAChE,QAAQ,KAAK,CAAC,GAAG,EAAE;gBACf,KAAK,SAAS,CAAC;gBACf,KAAK,WAAW,CAAC;gBACjB,KAAK,OAAO,CAAC;gBACb,KAAK,MAAM;oBACP,WAAW,GAAG,IAAI,CAAC;oBACnB,MAAM;gBACV;oBACI,MAAM;aACb;YACD,IAAI,WAAW,EAAE;gBACb,6FAA6F;gBAC7F,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,KAAK,CAAC,wBAAwB,EAAE,CAAC;aACpC;QACL,CAAC,CAAC;QAlVE,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpE,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC7D,CAAC;IAEM,eAAe;QAClB,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,IAAI,aAAa,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE;YAChD,IAAI,CAAC,eAAe,EAAE,CAAC;SAC1B;IACL,CAAC;IAED,IAAW,uBAAuB;QAC9B,OAAO,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACjE,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,KAAK,CAAC,gBAAgB,CACvB,SAAS,EACT,IAAI,CAAC,gBAAiC,EACtC,EAAE,OAAO,EAAE,IAAI,EAAE,CACpB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAA0B,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,CAAC,gBAAgB,CACvB,SAAS,EACT,IAAI,CAAC,cAA+B,CACvC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,gBAAgB,CACvB,UAAU,EACV,IAAI,CAAC,eAAgC,CACxC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACxE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAChC,uBAAuB,EACvB,IAAI,CAAC,oBAAqC,CAC7C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAChC,oBAAoB,EACpB,IAAI,CAAC,iBAAkC,CAC1C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAChC,eAAe,EACf,IAAI,CAAC,aAA8B,CACtC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAChC,WAAW,EACX,IAAI,CAAC,UAA2B,CACnC,CAAC;IACN,CAAC;IAEM,UAAU;QACb,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAC1B,SAAS,EACT,IAAI,CAAC,gBAAiC,EACtC,EAAE,OAAO,EAAE,IAAI,EAAE,CACpB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAC1B,SAAS,EACT,IAAI,CAAC,SAA0B,CAClC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAC1B,SAAS,EACT,IAAI,CAAC,cAA+B,CACvC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAC1B,UAAU,EACV,IAAI,CAAC,eAAgC,CACxC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CACnC,SAAS,EACT,IAAI,CAAC,iBAAiB,CACzB,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CACnC,uBAAuB,EACvB,IAAI,CAAC,oBAAqC,CAC7C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CACnC,oBAAoB,EACpB,IAAI,CAAC,iBAAkC,CAC1C,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CACnC,eAAe,EACf,IAAI,CAAC,aAA8B,CACtC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CACnC,WAAW,EACX,IAAI,CAAC,UAA2B,CACnC,CAAC;IACN,CAAC;IAEM,YAAY,CAAC,MAAe,EAAE,IAAa;QAC9C,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,MAAM,KAAK,IAAI,CAAC,WAAW,IAAI,IAAI,KAAK,cAAc,EAAE;YACxD,eAAe,GAAG,IAAI,CAAC;SAC1B;aAAM,IAAI,MAAM,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,aAAa,EAAE;YACxD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,mBAAmB,EAAE;gBAC7C,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;aAC9B;YACD,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;YAC9B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAC7C,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;gBACvD,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;gBAChD,IAAI,UAAU,CAAC,gBAAgB,KAAK,IAAI,CAAC,QAAQ,EAAE;oBAC/C,eAAe,GAAG,IAAI,CAAC;iBAC1B;aACJ;SACJ;aAAM,IACH,IAAI,KAAK,kBAAkB;eACxB,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EACnC;YACE,IAAI,MAAM,CAAC,gBAAgB,KAAK,IAAI,CAAC,QAAQ,EAAE;gBAC3C,eAAe,GAAG,IAAI,CAAC;aAC1B;SACJ;QAED,IAAI,eAAe,EAAE;YACjB,mHAAmH;YACnH,uHAAuH;YACvH,eAAe;YACf,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,cAAc;mBAC7C,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,WAAW,EAClD;gBACE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;aAClE;YACD,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;gBACvD,IAAI,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjD,mEAAmE;oBACnE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;wBACjC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;qBACrB;yBAAM;wBACH,IAAI,IAAI,CAAC,gBAAgB,EAAE;4BACvB,IAAI,CAAC,eAAe,EAAE,CAAC;yBAC1B;6BAAM;4BACH,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC;yBACxC;wBACD,OAAO;qBACV;iBACJ;gBACD,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBACvB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;iBAC/B;aACJ;SACJ;IACL,CAAC;IAEM,0BAA0B,CAAC,iBAA0B;QACxD,IAAI,iBAAiB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC7C,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;SAC/B;IACL,CAAC;IAEM,YAAY,CAAC,KAAiB;QACjC,IAAI,IAAI,CAAC,0BAA0B,EAAE;YACjC,OAAO;SACV;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QACzB,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE;YAC7B,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,gBAAgB,EAAE;gBACxC,mGAAmG;gBACnG,2BAA2B;gBAC3B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;aAC/C;SACJ;IACL,CAAC;IAEM,SAAS,CAAC,KAAiB;QAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;QACzB,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE;YAC7B,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SACxC;IACL,CAAC;IAEM,qBAAqB,CACxB,KAAoD;QAEpD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QACrC,IAAI,MAAM,EAAE;YACR,MAAM,GAAG,GAAG,KAAK,CAAC,MAAkB,CAAC;YACrC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CACnD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,QAAQ,CACtD,CAAC;YACF,IAAI,CAAC,2BAA2B,CAC5B,GAAG,CAAC,gBAAiB,EACrB,WAAW,EACX,KAAK,CACR,CAAC;SACL;IACL,CAAC;IAsJO,cAAc,CAAC,OAAgB;QACnC,IAAI,GAAyC,CAAC;QAC9C,IAAI,WAAkD,CAAC;QACvD,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;YAC9B,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3B,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;SAC7C;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG,EAAE;YACvC,IAAI,GAAG,YAAY,aAAa,EAAE;gBAC9B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC;aACf;SACJ;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI,EAAE;YACxC,IAAI,OAAO,EAAE;gBACT,MAAM,IAAI,GAAG,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClD,IAAI,IAAI,EAAE,gBAAgB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;oBACvD,IAAI,CAAC,gBAAgB,CAAC,YAAa,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBACpD,OAAO,IAAI,CAAC;iBACf;aACJ;YACD,OAAO,IAAI,CAAC,yCAAyC,CAAC,WAAW,CAAC,CAAC;SACtE;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,WAAW;QACf,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI,EAAE;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,yCAAyC,CAAC,WAAW,CAAC,CAAC;SACtE;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,cAAc,CAAC,QAAiB;QACpC,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG;eAClC,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI,EAC3C;YACE,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG,IAAI,QAAQ,EAAE;gBACnD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjC,IAAI,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,UAAU,EAAE;oBAC3C,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;iBACtD;qBAAM,IAAI,GAAG,YAAY,aAAa,EAAE;oBACrC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;iBAC/B;aACJ;YACD,iIAAiI;YACjI,2HAA2H;YAC3H,6BAA6B;YAC7B,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,kBAAkB;QACtB,IAAI,GAAyC,CAAC;QAC9C,IAAI,WAAkD,CAAC;QACvD,IAAI,cAA6C,CAAC;QAClD,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;YAC9B,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3B,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;SAC7C;aAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAClC,cAAc,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;SAC3D;QAED,QAAQ,IAAI,CAAC,SAAS,EAAE;YACpB,KAAK,cAAc,CAAC,aAAa;gBAC7B,OAAO,IAAI,CAAC,uBAAuB,CAC/B,cAAc,EACd,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAC7B,CAAC;YACN,KAAK,cAAc,CAAC,YAAY;gBAC5B,OAAO,CACH,IAAI,CAAC,uBAAuB,CACxB,cAAc,EACd,IAAI,CAAC,WAAW,GAAG,CAAC,CACvB;uBACE,IAAI,CAAC,uBAAuB,CAC3B,cAAc,EACd,cAAc,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAC1C,CACJ,CAAC;YACN,KAAK,cAAc,CAAC,GAAG;gBACnB,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;oBAClC,IAAI,CAAC,iBAAiB,CAAC,GAAI,CAAC,CAAC;oBAC7B,OAAO,IAAI,CAAC;iBACf;gBACD,OAAO,KAAK,CAAC;YACjB,KAAK,cAAc,CAAC,oBAAoB;gBACpC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtC,KAAK,cAAc,CAAC,IAAI;gBACpB,IACI,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;uBACrD,CAAC,IAAI,CAAC,+BAA+B,CAAC,WAAW,CAAC,EACvD;oBACE,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACxB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;iBAC9B;gBACD,OAAO,IAAI,CAAC;YAChB;gBACI,MAAM;SACb;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,mBAAmB;QACvB,IAAI,GAAyC,CAAC;QAC9C,IAAI,WAAkD,CAAC;QACvD,IAAI,cAA6C,CAAC;QAClD,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;YAC9B,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3B,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;SAC7C;aAAM,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAClC,cAAc,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;SAC3D;QAED,QAAQ,IAAI,CAAC,SAAS,EAAE;YACpB,KAAK,cAAc,CAAC,aAAa;gBAC7B,OAAO,CACH,IAAI,CAAC,uBAAuB,CACxB,cAAc,EACd,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAC7B,IAAI,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC,CACvD,CAAC;YACN,KAAK,cAAc,CAAC,YAAY;gBAC5B,OAAO,IAAI,CAAC,uBAAuB,CAC/B,cAAc,EACd,IAAI,CAAC,WAAW,GAAG,CAAC,CACvB,CAAC;YACN,KAAK,cAAc,CAAC,GAAG;gBACnB,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE;oBACnC,IAAI,CAAC,iBAAiB,CAAC,GAAI,CAAC,CAAC;oBAC7B,OAAO,IAAI,CAAC;iBACf;gBACD,OAAO,CACH,IAAI,CAAC,+BAA+B,CAAC,WAAW,CAAC;uBAC9C,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC,CAC1C,CAAC;YACN,KAAK,cAAc,CAAC,oBAAoB;gBACpC,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAChD,KAAK,cAAc,CAAC,IAAI;gBACpB,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YACnE;gBACI,MAAM;SACb;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,gBAAgB;QACpB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjB,yGAAyG;QACzG,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,eAAe;QACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAEO,aAAa,CAAC,OAAgB;QAClC,IAAI,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;YAChD,OAAO,CACH,IAAI,CAAC,+BAA+B,CAAC,WAAW,CAAC;mBAC9C,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC,CAC1C,CAAC;SACL;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC;IAEO,kBAAkB;QACtB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACnB,yGAAyG;QACzG,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,iBAAiB;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IAEO,YAAY,CAAC,OAAgB;QACjC,IAAI,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,GAAG,EAAE,oBAAoB,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,eAAe,CACvB,WAAW,EACX,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CACvC,CAAC;SACL;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,sBAAsB,CAAC,OAAgB;QAC3C,OAAO,CACH,CAAC,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI;eAChC,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,oBAAoB,CAAC;eAC3D,CAAC,OAAO,CACd,CAAC;IACN,CAAC;IAEO,YAAY,CAAC,eAAwB;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,IAAI,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE;YACxD,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,EAAE;YAC/C,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;QACjD,IAAI,cAAc,EAAE;YAChB,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC;YAC1C,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;YACzD,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;YAClE,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,iBAAiB,IAAI,IAAI,CAAC,iBAAiB,CAAC;YACpF,IAAI,CAAC,gBAAgB,GAAG,cAAc,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC;YACjF,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;gBAC9B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;aAC/B;iBAAM;gBACH,IAAI,CAAC,kBAAkB,EAAE,CAAC;aAC7B;YACD,OAAO,IAAI,CAAC;SACf;QACD,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,iBAAiB,CACrB,eAAwB;QAExB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,IAAI,GAAG,KAAK,SAAS,EAAE;YACnB,OAAO,SAAS,CAAC;SACpB;QACD,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QACpB,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,GAAG,CAAC,oBAAoB,EAAE,CAAC;QAC/C,IAAI,WAAW,CAAC,iBAAiB,EAAE;YAC/B,WAAW,CAAC,IAAI,CAAC;gBACb,SAAS,EAAE,cAAc,CAAC,oBAAoB;aACjD,CAAC,CAAC;YACH,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,oBAAoB,EAAE;gBACxD,UAAU,GAAG,CAAC,CAAC;aAClB;SACJ;QACD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,OAAO,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE;YACzC,MAAM,sBAAsB,GAAG,WAAW,CAAC,MAAM,CAAC;YAClD,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC;YAC/C,MAAM,wBAAwB,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,wBAAwB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtD,WAAW,CAAC,IAAI,CAAC;oBACb,SAAS,EAAE,cAAc,CAAC,WAAW;oBACrC,WAAW,EAAE,SAAS;oBACtB,gBAAgB,EAAE,CAAC;iBACtB,CAAC,CAAC;gBACH,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,WAAW;uBAC1C,IAAI,CAAC,WAAW,KAAK,SAAS;uBAC9B,IAAI,CAAC,gBAAgB,KAAK,CAAC,EAChC;oBACE,UAAU,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;iBACvC;aACJ;YACD,IAAI,QAAQ,CAAC,gBAAgB,EAAE;gBAC3B,WAAW,CAAC,IAAI,CAAC;oBACb,SAAS,EAAE,cAAc,CAAC,cAAc;oBACxC,WAAW,EAAE,SAAS;iBACzB,CAAC,CAAC;gBACH,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,cAAc;uBAC7C,IAAI,CAAC,WAAW,KAAK,SAAS,EACnC;oBACE,UAAU,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;iBACvC;aACJ;YACD,MAAM,qBAAqB,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;YACrD,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI;mBACnC,IAAI,CAAC,WAAW,KAAK,SAAS,EACnC;gBACE,UAAU,GAAG,eAAe;oBACxB,CAAC,CAAC,qBAAqB,GAAG,CAAC;oBAC3B,CAAC,CAAC,sBAAsB,GAAG,CAAC,CAAC;aACpC;YACD,SAAS,IAAI,CAAC,CAAC;SAClB;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG,EAAE;YACvC,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC1D;QACD,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,WAAW,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAC/C,CAAC;IAEO,oBAAoB,CACxB,eAAwB;QAExB,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;QACpB,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,MAAM,sBAAsB,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC,aAAa,CAAC;QACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpD,WAAW,CAAC,IAAI,CAAC;gBACb,SAAS,EAAE,cAAc,CAAC,aAAa;gBACvC,iBAAiB,EAAE,CAAC;aACvB,CAAC,CAAC;SACN;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,aAAa,EAAE;YACjD,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC;SACvC;aAAM;YACH,8BAA8B;YAC9B,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;SACnC;QACD,MAAM,SAAS,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,WAAW,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAC/C,CAAC;IAEO,gBAAgB,CAAC,aAA0B;QAC/C,sFAAsF;QACtF,sFAAsF;QACtF,8FAA8F;QAC9F,yDAAyD;QACzD,qGAAqG;QACrG,uBAAuB;QACvB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE;YAC9B,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,qGAAqG;QACrG,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAEO,QAAQ,CAAC,QAAgB,EAAE,WAAoB;QACnD,MAAM,cAAc,GAAG,QAAQ,GAAG,CAAC,CAAC;QACpC,QAAQ,IAAI,CAAC,SAAS,EAAE;YACpB,KAAK,cAAc,CAAC,GAAG,CAAC;YACxB,KAAK,cAAc,CAAC,oBAAoB,CAAC;YACzC,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC;gBACtB,MAAM,aAAa,GAAoB,EAAE,CAAC;gBAC1C,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC7B,IAAI,WAAW,KAAK,SAAS,EAAE;oBAC3B,QAAQ,GAAG,WAAW,CAAC;iBAC1B;gBACD,QAAQ,IAAI,QAAQ,CAAC;gBACrB,IAAI,cAAc,IAAI,QAAQ,GAAG,CAAC,EAAE;oBAChC,QAAQ,GAAG,CAAC,CAAC;iBAChB;gBACD,IAAI,QAAQ,GAAG,CAAC,EAAE;oBACd,aAAa,CAAC,KAAK,GAAG,OAAO,CAAC;iBACjC;gBAED,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,IAAI,CAAC,EAAE;oBAC3C,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;iBAC5D;gBACD,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE;oBACjB,MAAM,cAAc,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;oBAC9D,IACI,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,GAAG;2BAClC,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,oBAAoB,EAC3D;wBACE,OAAO,CACH,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC;+BAC5C,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC,CACrD,CAAC;qBACL;oBACD,OAAO,IAAI,CAAC,uBAAuB,CAC/B,cAAc,EACd,IAAI,CAAC,WAAW,CACnB,CAAC;iBACL;gBACD,OAAO,KAAK,CAAC;aAChB;YACD;gBACI,MAAM;SACb;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,UAAU,CAAC,QAAgB,EAAE,WAAoB;QACrD,MAAM,cAAc,GAAG,QAAQ,GAAG,CAAC,CAAC;QACpC,QAAQ,IAAI,CAAC,SAAS,EAAE;YACpB,KAAK,cAAc,CAAC,aAAa,CAAC,CAAC;gBAC/B,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;aACtC;YACD,KAAK,cAAc,CAAC,YAAY,CAAC,CAAC;gBAC9B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;aACtC;YACD,KAAK,cAAc,CAAC,GAAG,CAAC;YACxB,KAAK,cAAc,CAAC,oBAAoB,CAAC;YACzC,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC;gBACtB,MAAM,aAAa,GAAoB,EAAE,CAAC;gBAC1C,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC7B,IAAI,WAAW,KAAK,SAAS,EAAE;oBAC3B,QAAQ,GAAG,WAAW,CAAC;iBAC1B;gBACD,QAAQ,IAAI,QAAQ,CAAC;gBACrB,IAAI,cAAc,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE;oBAC3D,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC9C;gBACD,IAAI,QAAQ,GAAG,CAAC,EAAE;oBACd,aAAa,CAAC,KAAK,GAAG,KAAK,CAAC;iBAC/B;gBACD,IACI,QAAQ,GAAG,IAAI,CAAC,QAAQ;uBACrB,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAC3C;oBACE,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;iBAC5D;gBACD,OAAO,KAAK,CAAC;aAChB;YACD;gBACI,MAAM;SACb;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,iCAAiC,CAAC,WAAoB;QAC1D,+FAA+F;QAC/F,qEAAqE;QACrE,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,IAAI,aAAa,EAAE;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;YACjD,IAAI,GAAG,EAAE;gBACL,IAAI,CAAC,CAAC,GAAG,YAAY,aAAa,CAAC,EAAE;oBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;oBACnD,IAAI,IAAI,EAAE;wBACN,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CACjD,IAAI,CAAC,MAAO,CACf,CAAC;wBACF,IAAI,IAAI,CAAC,gBAAgB,KAAK,aAAa,EAAE;4BACzC,IAAI,CAAC,2BAA2B,CAC5B,GAAG,CAAC,gBAAiB,EACrB,WAAW,EACX,KAAK,CACR,CAAC;4BACF,OAAO;yBACV;wBACD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,CACvD,aAAa,CAChB,CAAC;wBACF,IAAI,YAAY,GAAG,CAAC,CAAC,EAAE;4BACnB,IAAI,CAAC,wBAAwB,CACzB,YAAY,EACZ,GAAG,CAAC,gBAAiB,EACrB,WAAW,EACX,KAAK,CACR,CAAC;4BACF,OAAO;yBACV;qBACJ;iBACJ;gBACD,IACI,WAAW;uBACR,IAAI,CAAC,qBAAqB,EAAE;uBAC5B,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,gBAAgB,EAC3C;oBACE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;iBAC/C;aACJ;SACJ;IACL,CAAC;IAEO,YAAY,CAChB,OAAoB,EACpB,YAA2B;QAE3B,MAAM,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtD,IAAI,qBAAqB,KAAK,OAAO,EAAE;YACnC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACxC,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;YACvC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAC5B,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;YACxC,IACI,qBAAqB;mBAClB,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,EAC1C;gBACE,IAAI,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;aAC1D;SACJ;IACL,CAAC;IAEO,mBAAmB,CACvB,OAAoB,EACpB,SAAkB;QAElB,IAAI,OAAO,KAAK,IAAI,CAAC,KAAK,EAAE;YACxB,OAAO;SACV;QAED,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEO,0BAA0B,CAC9B,UAAsB,EACtB,OAAgB;QAEhB,8FAA8F;QAC9F,qCAAqC;QACrC,IAAI,OAAO,EAAE;YACT,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;SACxD;aAAM;YACH,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC;SAC3D;IACL,CAAC;IAEO,gBAAgB;QACpB,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC3B,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;SACpC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC,IAAI,CAAC;IAClD,CAAC;IAEO,eAAe;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;QAC9D,IACI,CAAC,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC;eAC7C,CAAC,IAAI,CAAC,uBAAuB,CAAC,cAAc,EAAE,CAAC,CAAC;eAChD,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,EACjC;YACE,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC;SACxC;IACL,CAAC;IAEO,mBAAmB,CACvB,aAAqB,EACrB,aAA+B;QAE/B,IAAI,aAAa,IAAI,CAAC,IAAI,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE;YACnE,QAAQ,IAAI,CAAC,SAAS,EAAE;gBACpB,KAAK,cAAc,CAAC,IAAI,CAAC;gBACzB,KAAK,cAAc,CAAC,aAAa,CAAC;gBAClC,KAAK,cAAc,CAAC,YAAY;oBAC5B,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;oBACrC,MAAM;gBACV;oBACI,MAAM;aACb;YACD,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC;YAC9B,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;YAC7D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,eAAe,CAAC,WAAoB;QACxC,MAAM,eAAe,GAAG,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACzD,IAAI,eAAe,GAAG,CAAC,EAAE;YACrB,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,CAAE,CAAC;QAE5D,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,QAAQ,IAAI,CAAC,SAAS,EAAE;YACpB,KAAK,cAAc,CAAC,GAAG;gBACnB,YAAY,GAAG,IAAI,CAAC;gBACpB,MAAM;YACV,KAAK,cAAc,CAAC,IAAI,CAAC;YACzB,KAAK,cAAc,CAAC,cAAc,CAAC;YACnC,KAAK,cAAc,CAAC,WAAW;gBAC3B,YAAY,GAAG,UAAU,YAAY,aAAa,CAAC;gBACnD,MAAM;YACV;gBACI,MAAM;SACb;QACD,MAAM,YAAY,GAAG,EAAE,aAAa,EAAE,CAAC,WAAW,EAAE,CAAC;QACrD,IAAI,YAAY,EAAE;YACd,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;YAC5C,OAAO,IAAI,CAAC;SACf;QACD,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,eAAe,CACnB,GAA6B,EAC7B,YAA2B;QAE3B,MAAM,WAAW,GAAG,GAAG,CAAC,oBAAoB,EAAE,CAAC;QAC/C,IAAI,gBAAyC,CAAC;QAC9C,QAAQ,IAAI,CAAC,SAAS,EAAE;YACpB,KAAK,cAAc,CAAC,oBAAoB;gBACpC,gBAAgB,GAAG,WAAW,CAAC,iBAAiB,CAAC;gBACjD,MAAM;YACV,KAAK,cAAc,CAAC,IAAI,CAAC,CAAC;gBACtB,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAE,CAAC,IAAI,CAAC;gBAC7D,MAAM;aACT;YACD,KAAK,cAAc,CAAC,cAAc,CAAC,CAAC;gBAChC,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC;gBACpF,IAAI,gBAAgB,EAAE;oBAClB,gBAAgB,GAAG,gBAAgB,CAAC;oBACpC,IAAI,CAAC,0BAA0B,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;iBAC3D;gBACD,MAAM;aACT;YACD,KAAK,cAAc,CAAC,WAAW,CAAC,CAAC;gBAC7B,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,QAAQ;qBAChE,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBAC7C,MAAM;aACT;YACD;gBACI,MAAM;SACb;QACD,IAAI,gBAAgB,EAAE;YAClB,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;SACrD;IACL,CAAC;IAEO,kBAAkB;QACtB,MAAM,cAAc,GAAG,IAAI,CAAC,+BAA+B,EAAE,CAAC;QAC9D,IAAI,gBAAyC,CAAC;QAC9C,QAAQ,IAAI,CAAC,SAAS,EAAE;YACpB,KAAK,cAAc,CAAC,aAAa;gBAC7B,gBAAgB,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACxE,MAAM;YACV,KAAK,cAAc,CAAC,YAAY;gBAC5B,gBAAgB,GAAG,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClE,MAAM;YACV;gBACI,MAAM;SACb;QACD,IAAI,gBAAgB,EAAE;YAClB,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,yBAAyB;QAC7B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CACnC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,gBAAgB,KAAK,IAAI,CAAC,QAAQ,CAChD,CAAC;IACN,CAAC;IAEO,+BAA+B;QACnC,MAAM,aAAa,GAAkB,EAAE,CAAC;QACxC,IACI,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,WAAW,EAAE;gBACvC,IAAI,CAAC,KAAK,CAAC,UAAU,EAC3B;YACE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;SACpD;QAED,IACI,IAAI,CAAC,KAAK,CAAC,eAAe;eACvB,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,WAAW,EAAE;oBACtC,IAAI,CAAC,KAAK,CAAC,UAAU,EAC/B;YACE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;SACpD;QAED,MAAM,aAAa,GAAkB,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,qBAAqB,EAAE,EAAE;YAC9B,IAAI,CAAC,KAAK,CAAC,sBAAsB;iBAC5B,gBAAgB,CAAC,cAAc,CAAC;iBAChC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;SACtD;QAED,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;IAC5C,CAAC;IAEO,qBAAqB;QACzB,OAAO,CACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,eAAe,CAAC;gBAC5D,SAAS,CAChB,CAAC;IACN,CAAC;IAEO,aAAa;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;IACpE,CAAC;IAEO,aAAa,CACjB,GAAyC;QAEzC,IACI,CAAC,GAAG,YAAY,QAAQ,IAAI,GAAG,CAAC,WAAW,CAAC;eACzC,GAAG,YAAY,aAAa,EACjC;YACE,OAAO,GAAG,CAAC,QAAQ,CAAC;SACvB;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,iBAAiB,CAAC,GAA6B;QACnD,IAAI,GAAG,YAAY,aAAa,EAAE;YAC9B,GAAG,CAAC,mBAAmB,EAAE,CAAC;SAC7B;aAAM;YACH,GAAG,CAAC,iBAAiB,EAAE,CAAC;SAC3B;QACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAEO,gBAAgB,CACpB,KAAiC;QAEjC,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAEO,iBAAiB,CACrB,KAAiC;QAEjC,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,SAAS,CAAC,CAAC;IACzE,CAAC;IAEO,oBAAoB,CACxB,KAAiC,EACjC,cAA6C;QAE7C,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,OAAO,aAAa,IAAI,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE;YAClD,IAAI,cAAc,CAAC,aAAa,CAAC,EAAE;gBAC/B,OAAO,aAAyB,CAAC;aACpC;YACD,aAAa,GAAG,aAAa,CAAC,aAAa;mBACnC,aAAa,CAAC,UAAyB,EAAE,IAAI,CAAC;SACzD;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAEO,SAAS,CAAC,KAAc;QAC5B,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,OAAO,aAAa,IAAI,aAAa,KAAK,IAAI,CAAC,KAAK,EAAE;YAClD,aAAa,GAAG,aAAa,CAAC,aAAa;mBACnC,aAAa,CAAC,UAAyB,EAAE,IAAI,CAAC;SACzD;QAED,OAAO,aAAa,KAAK,IAAI,CAAC,KAAK,CAAC;IACxC,CAAC;IAEO,gBAAgB;QACpB,IAAI,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;QAC3C,OAAO,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE;YAC7C,aAAa,GAAG,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC;YACvD,+KAA+K;YAC/K,4HAA4H;YAC5H,kHAAkH;YAClH,IACI,aAAa,YAAY,iBAAiB;mBACvC,CAAC,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC;mBACtC,CAAC,CAAC,aAAa,YAAY,SAAS,CAAC;mBACrC,CAAC,CAAC,aAAa,YAAY,aAAa,CAAC,EAC9C;gBACE,MAAM;aACT;SACJ;QAED,OAAO,aAA4B,CAAC;IACxC,CAAC;IAEO,yCAAyC,CAC7C,WAAuC;QAEvC,IAAI,CAAC,WAAW,EAAE;YACd,OAAO,KAAK,CAAC;SAChB;QACD,OAAO,CACH,IAAI,CAAC,sBAAsB,CAAC,WAAW,EAAE,CAAC,CAAC;eACxC,IAAI,CAAC,yBAAyB,CAAC,WAAW,CAAC,CACjD,CAAC;IACN,CAAC;IAEO,qBAAqB;QACzB,QAAQ,IAAI,CAAC,SAAS,EAAE;YACpB,KAAK,cAAc,CAAC,IAAI,CAAC;YACzB,KAAK,cAAc,CAAC,cAAc,CAAC;YACnC,KAAK,cAAc,CAAC,WAAW,CAAC;YAChC,KAAK,cAAc,CAAC,GAAG,CAAC;YACxB,KAAK,cAAc,CAAC,oBAAoB;gBACpC,OAAO,IAAI,CAAC;YAChB;gBACI,OAAO,KAAK,CAAC;SACpB;IACL,CAAC;IAEO,kBAAkB;QACtB,QAAQ,IAAI,CAAC,SAAS,EAAE;YACpB,KAAK,cAAc,CAAC,aAAa,CAAC;YAClC,KAAK,cAAc,CAAC,YAAY;gBAC5B,OAAO,IAAI,CAAC;YAChB;gBACI,OAAO,KAAK,CAAC;SACpB;IACL,CAAC;IAEO,+BAA+B,CACnC,WAAkD;QAElD,IAAI,WAAW,EAAE,iBAAiB,EAAE;YAChC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,oBAAoB,CAAC;YACrD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,uBAAuB,CAC3B,cAA4C,EAC5C,WAAmB;QAEnB,IACI,WAAW,IAAI,CAAC;eACb,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC,MAAM,EACtD;YACE,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,YAAY,CAAC;YAC7C,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAC/B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,uBAAuB,CAC3B,cAA4C,EAC5C,iBAAyB;QAEzB,IACI,iBAAiB,IAAI,CAAC;eACnB,iBAAiB,GAAG,cAAc,CAAC,aAAa,CAAC,MAAM,EAC5D;YACE,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,aAAa,CAAC;YAC9C,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;YAC3C,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;SACf;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,eAAe,CACnB,WAAkD,EAClD,WAAoB,EACpB,QAAiB;QAEjB,IAAI,CAAC,WAAW,EAAE;YACd,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,cAAc,GAAG,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;QACvD,MAAM,WAAW,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAE9C,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE;YAClE,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC;YACrC,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;SACf;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,sBAAsB,CAC1B,WAAkD,EAClD,gBAAwB,EACxB,WAAoB,EACpB,QAAiB;QAEjB,IAAI,CAAC,WAAW,EAAE;YACd,OAAO,KAAK,CAAC;SAChB;QACD,MAAM,cAAc,GAAG,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;QACvD,MAAM,WAAW,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAE9C,IACI,cAAc,IAAI,CAAC;eAChB,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM;eACzC,gBAAgB,IAAI,CAAC;eACrB,gBAAgB;kBACb,WAAW,CAAC,KAAK,CAAC,cAAc,CAAE,CAAC,IAAI,CAAC,QAAQ;qBAC7C,gBAAgB,CAAC,MAAM,EAClC;YACE,IAAI,CAAC,wBAAwB,CACzB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,IAAI,CACP,CAAC;YACF,OAAO,IAAI,CAAC;SACf;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,yBAAyB,CAC7B,WAAsC,EACtC,WAAoB,EACpB,QAAiB;QAEjB,MAAM,cAAc,GAAG,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;QACvD,MAAM,WAAW,GAAG,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAE9C,IACI,cAAc,IAAI,CAAC;eAChB,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM;eACzC,WAAW,CAAC,KAAK,CAAC,cAAc,CAAE,CAAC,gBAAgB,EACxD;YACE,IAAI,CAAC,2BAA2B,CAAC,WAAW,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;YACpE,OAAO,IAAI,CAAC;SACf;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,2BAA2B,CAC/B,QAAgB,EAChB,WAAmB,EACnB,YAAqB;QAErB,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,cAAc,CAAC;QAC/C,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IAEO,wBAAwB,CAC5B,gBAAwB,EACxB,QAAgB,EAChB,WAAmB,EACnB,YAAqB;QAErB,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC;QAC5C,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IAEO,gBAAgB,CAAC,QAAiB;QACtC,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC;QACpC,IAAI,QAAQ,KAAK,SAAS,EAAE;YACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;SAC5B;IACL,CAAC;IAEO,iBAAiB,CACrB,WAAmB,EACnB,QAAgB,EAChB,YAAqB;QAErB,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC;QACrC,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC;IAEO,oBAAoB,CACxB,WAAmB,EACnB,QAAgB,EAChB,YAAqB;QAErB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,YAAY,EAAE;YACd,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SAC9B;IACL,CAAC;IAEO,iBAAiB,CAAC,GAAY;QAClC,OAAO,GAAG,YAAY,QAAQ,IAAI,GAAG,YAAY,aAAa,CAAC;IACnE,CAAC;CACJ","sourcesContent":["import { Notifier, Subscriber, Observable } from '@microsoft/fast-element';\nimport {\n keyArrowDown,\n keyArrowLeft,\n keyArrowRight,\n keyArrowUp,\n keyEnd,\n keyEnter,\n keyEscape,\n keyFunction2,\n keyHome,\n keyPageDown,\n keyPageUp,\n keySpace,\n keyTab\n} from '@microsoft/fast-web-utilities';\nimport { FoundationElement } from '@microsoft/fast-foundation';\nimport type { ScrollToOptions } from '@tanstack/virtual-core';\nimport type { Table } from '..';\nimport {\n TableActionMenuToggleEventDetail,\n TableFocusType,\n TableHeaderFocusableElements,\n TableRowFocusableElements,\n type TableRecord\n} from '../types';\nimport type { Virtualizer } from './virtualizer';\nimport { TableGroupRow } from '../components/group-row';\nimport { TableRow } from '../components/row';\nimport { TableCell } from '../components/cell';\nimport type { MenuButton } from '../../menu-button';\nimport { tableHeaderTag } from '../components/header';\nimport { TableCellView } from '../../table-column/base/cell-view';\n\ninterface TableFocusState {\n focusType: TableFocusType;\n headerActionIndex?: number;\n rowIndex?: number;\n columnIndex?: number;\n cellContentIndex?: number;\n}\n\n/**\n * Manages the keyboard navigation and focus within the table.\n * @internal\n */\nexport class KeyboardNavigationManager<TData extends TableRecord>\nimplements Subscriber {\n private focusType: TableFocusType = TableFocusType.none;\n private headerActionIndex = -1;\n private rowIndex = -1;\n private cellContentIndex = -1;\n private columnIndex = -1;\n private focusWithinTable = false;\n private isCurrentlyFocusingElement = false;\n private readonly tableNotifier: Notifier;\n private readonly virtualizerNotifier: Notifier;\n private visibleRowNotifiers: Notifier[] = [];\n private get inNavigationMode(): boolean {\n return (\n this.focusType !== TableFocusType.cellActionMenu\n && this.focusType !== TableFocusType.cellContent\n );\n }\n\n public constructor(\n private readonly table: Table<TData>,\n private readonly virtualizer: Virtualizer<TData>\n ) {\n this.tableNotifier = Observable.getNotifier(this.table);\n this.tableNotifier.subscribe(this, 'rowElements');\n this.virtualizerNotifier = Observable.getNotifier(this.virtualizer);\n this.virtualizerNotifier.subscribe(this, 'visibleItems');\n }\n\n public resetFocusState(): void {\n this.focusType = TableFocusType.none;\n const activeElement = this.getActiveElement();\n if (activeElement && this.isInTable(activeElement)) {\n this.setDefaultFocus();\n }\n }\n\n public get hasActiveRowOrCellFocus(): boolean {\n return this.focusWithinTable && this.hasRowOrCellFocusType();\n }\n\n public connect(): void {\n this.table.addEventListener(\n 'keydown',\n this.onCaptureKeyDown as EventListener,\n { capture: true }\n );\n this.table.addEventListener('keydown', this.onKeyDown as EventListener);\n this.table.addEventListener(\n 'focusin',\n this.onTableFocusIn as EventListener\n );\n this.table.addEventListener(\n 'focusout',\n this.onTableFocusOut as EventListener\n );\n this.table.viewport.addEventListener('keydown', this.onViewportKeyDown);\n this.table.viewport.addEventListener(\n 'cell-action-menu-blur',\n this.onCellActionMenuBlur as EventListener\n );\n this.table.viewport.addEventListener(\n 'cell-view-focus-in',\n this.onCellViewFocusIn as EventListener\n );\n this.table.viewport.addEventListener(\n 'cell-focus-in',\n this.onCellFocusIn as EventListener\n );\n this.table.viewport.addEventListener(\n 'cell-blur',\n this.onCellBlur as EventListener\n );\n }\n\n public disconnect(): void {\n this.table.removeEventListener(\n 'keydown',\n this.onCaptureKeyDown as EventListener,\n { capture: true }\n );\n this.table.removeEventListener(\n 'keydown',\n this.onKeyDown as EventListener\n );\n this.table.removeEventListener(\n 'focusin',\n this.onTableFocusIn as EventListener\n );\n this.table.removeEventListener(\n 'focusout',\n this.onTableFocusOut as EventListener\n );\n this.table.viewport.removeEventListener(\n 'keydown',\n this.onViewportKeyDown\n );\n this.table.viewport.removeEventListener(\n 'cell-action-menu-blur',\n this.onCellActionMenuBlur as EventListener\n );\n this.table.viewport.removeEventListener(\n 'cell-view-focus-in',\n this.onCellViewFocusIn as EventListener\n );\n this.table.viewport.removeEventListener(\n 'cell-focus-in',\n this.onCellFocusIn as EventListener\n );\n this.table.viewport.removeEventListener(\n 'cell-blur',\n this.onCellBlur as EventListener\n );\n }\n\n public handleChange(source: unknown, args: unknown): void {\n let focusRowAndCell = false;\n if (source === this.virtualizer && args === 'visibleItems') {\n focusRowAndCell = true;\n } else if (source === this.table && args === 'rowElements') {\n for (const notifier of this.visibleRowNotifiers) {\n notifier.unsubscribe(this);\n }\n this.visibleRowNotifiers = [];\n for (const visibleRow of this.table.rowElements) {\n const rowNotifier = Observable.getNotifier(visibleRow);\n rowNotifier.subscribe(this, 'resolvedRowIndex');\n if (visibleRow.resolvedRowIndex === this.rowIndex) {\n focusRowAndCell = true;\n }\n }\n } else if (\n args === 'resolvedRowIndex'\n && this.isResolvedRowType(source)\n ) {\n if (source.resolvedRowIndex === this.rowIndex) {\n focusRowAndCell = true;\n }\n }\n\n if (focusRowAndCell) {\n // Focusable elements in cells, and action menus, are both blurred on scroll. To maintain our row/cell focus state,\n // we focus the cell instead here. (We also don't want to refocus the cell content when the focusedRecycleCallback just\n // blurred it.)\n if (\n this.focusType === TableFocusType.cellActionMenu\n || this.focusType === TableFocusType.cellContent\n ) {\n this.setCellFocusState(this.columnIndex, this.rowIndex, false);\n }\n if (this.inNavigationMode && this.hasRowOrCellFocusType()) {\n if (this.rowIndex > this.table.tableData.length - 1) {\n // Focused row index no longer valid, coerce to 1st row if possible\n if (this.table.tableData.length > 0) {\n this.rowIndex = 0;\n } else {\n if (this.focusWithinTable) {\n this.setDefaultFocus();\n } else {\n this.focusType = TableFocusType.none;\n }\n return;\n }\n }\n if (this.focusWithinTable) {\n this.focusCurrentRow(false);\n }\n }\n }\n }\n\n public handleFocusedCellRecycling(hadRowOrCellFocus: boolean): void {\n if (hadRowOrCellFocus && !this.focusWithinTable) {\n this.focusCurrentRow(false);\n }\n }\n\n public onRowFocusIn(event: FocusEvent): void {\n if (this.isCurrentlyFocusingElement) {\n return;\n }\n const row = event.target;\n if (this.isResolvedRowType(row)) {\n if (this.rowIndex !== row.resolvedRowIndex) {\n // If user focuses a row some other way (e.g. mouse), update our focus state so future keyboard nav\n // will start from that row\n this.setRowFocusState(row.resolvedRowIndex);\n }\n }\n }\n\n public onRowBlur(event: FocusEvent): void {\n const row = event.target;\n if (this.isResolvedRowType(row)) {\n this.setElementFocusable(row, false);\n }\n }\n\n public onRowActionMenuToggle(\n event: CustomEvent<TableActionMenuToggleEventDetail>\n ): void {\n const isOpen = event.detail.newState;\n if (isOpen) {\n const row = event.target as TableRow;\n const columnIndex = this.table.visibleColumns.findIndex(\n column => column.columnId === event.detail.columnId\n );\n this.setCellActionMenuFocusState(\n row.resolvedRowIndex!,\n columnIndex,\n false\n );\n }\n }\n\n private readonly onTableFocusIn = (event: FocusEvent): void => {\n this.focusWithinTable = true;\n this.updateFocusStateFromActiveElement(false);\n\n // Sets initial focus on the appropriate table content\n const actionMenuOpen = this.table.openActionMenuRecordId !== undefined;\n if (\n (event.target === this.table\n || this.focusType === TableFocusType.none)\n && !actionMenuOpen\n ) {\n let focusHeader = true;\n if (\n this.hasRowOrCellFocusType()\n && this.scrollToAndFocusRow(this.rowIndex)\n ) {\n focusHeader = false;\n }\n if (focusHeader && !this.setFocusOnHeader()) {\n // nothing to focus\n this.table.blur();\n }\n }\n };\n\n private readonly onTableFocusOut = (): void => {\n this.focusWithinTable = false;\n };\n\n private readonly onCellActionMenuBlur = (\n event: CustomEvent<TableCell>\n ): void => {\n event.stopPropagation();\n const cell = event.detail;\n if (cell.actionMenuButton) {\n // Ensure that action menu buttons get hidden when no longer focused\n this.setActionMenuButtonFocused(cell.actionMenuButton, false);\n }\n };\n\n private readonly onCellViewFocusIn = (\n event: CustomEvent<TableCell>\n ): void => {\n event.stopPropagation();\n this.updateFocusStateFromActiveElement(false);\n };\n\n private readonly onCellFocusIn = (event: CustomEvent<TableCell>): void => {\n event.stopPropagation();\n const cell = event.detail;\n this.updateFocusStateFromActiveElement(true);\n // Currently, clicking a non-interactive cell only updates the focus state to that row, it\n // doesn't focus the cell. If we revisit this, we most likely need to set the cells to tabindex=-1\n // upfront too, so their focusing behavior is consistent whether they've been previously keyboard\n // focused or not.\n if (\n this.focusType === TableFocusType.row\n && this.getActiveElement() === cell\n ) {\n this.focusCurrentRow(false);\n }\n };\n\n private readonly onCellBlur = (event: CustomEvent<TableCell>): void => {\n event.stopPropagation();\n const cell = event.detail;\n this.setElementFocusable(cell, false);\n };\n\n private readonly onCaptureKeyDown = (event: KeyboardEvent): void => {\n let handled = false;\n if (event.key === keyTab) {\n handled = this.onTabPressed(event.shiftKey);\n } else if (this.inNavigationMode) {\n switch (event.key) {\n case keyArrowLeft:\n handled = this.onLeftArrowPressed();\n break;\n case keyArrowRight:\n handled = this.onRightArrowPressed();\n break;\n case keyArrowUp:\n handled = this.onUpArrowPressed();\n break;\n case keyArrowDown:\n handled = this.onDownArrowPressed();\n break;\n case keyPageUp:\n handled = this.onPageUpPressed();\n break;\n case keyPageDown:\n handled = this.onPageDownPressed();\n break;\n case keyHome:\n handled = this.onHomePressed(event.ctrlKey);\n break;\n case keyEnd:\n handled = this.onEndPressed(event.ctrlKey);\n break;\n case keyEnter:\n handled = this.onEnterPressed(event.ctrlKey);\n break;\n case keySpace:\n handled = this.onSpacePressed(event.shiftKey);\n break;\n case keyFunction2:\n handled = this.onF2Pressed();\n break;\n default:\n break;\n }\n }\n if (handled) {\n event.preventDefault();\n }\n };\n\n private readonly onKeyDown = (event: KeyboardEvent): void => {\n if (!this.inNavigationMode && !event.defaultPrevented) {\n if (event.key === keyEscape || event.key === keyFunction2) {\n const row = this.getCurrentRow();\n if (row) {\n this.trySetCellFocus(row.getFocusableElements());\n }\n }\n }\n };\n\n private readonly onViewportKeyDown = (event: KeyboardEvent): void => {\n let handleEvent = !this.inNavigationMode\n && (event.key === keyArrowUp || event.key === keyArrowDown);\n switch (event.key) {\n case keyPageUp:\n case keyPageDown:\n case keyHome:\n case keyEnd:\n handleEvent = true;\n break;\n default:\n break;\n }\n if (handleEvent) {\n // Swallow key presses that would cause table scrolling, independently of keyboard navigation\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n };\n\n private onEnterPressed(ctrlKey: boolean): boolean {\n let row: TableRow | TableGroupRow | undefined;\n let rowElements: TableRowFocusableElements | undefined;\n if (this.hasRowOrCellFocusType()) {\n row = this.getCurrentRow();\n rowElements = row?.getFocusableElements();\n }\n if (this.focusType === TableFocusType.row) {\n if (row instanceof TableGroupRow) {\n this.toggleRowExpanded(row);\n return true;\n }\n }\n if (this.focusType === TableFocusType.cell) {\n if (ctrlKey) {\n const cell = rowElements?.cells[this.columnIndex];\n if (cell?.actionMenuButton && !cell.actionMenuButton.open) {\n cell.actionMenuButton.toggleButton!.control.click();\n return true;\n }\n }\n return this.focusFirstInteractiveElementInCurrentCell(rowElements);\n }\n return false;\n }\n\n private onF2Pressed(): boolean {\n if (this.focusType === TableFocusType.cell) {\n const row = this.getCurrentRow();\n const rowElements = row?.getFocusableElements();\n return this.focusFirstInteractiveElementInCurrentCell(rowElements);\n }\n return false;\n }\n\n private onSpacePressed(shiftKey: boolean): boolean {\n if (\n this.focusType === TableFocusType.row\n || this.focusType === TableFocusType.cell\n ) {\n if (this.focusType === TableFocusType.row || shiftKey) {\n const row = this.getCurrentRow();\n if (row instanceof TableRow && row.selectable) {\n row.onSelectionChange(row.selected, !row.selected);\n } else if (row instanceof TableGroupRow) {\n this.toggleRowExpanded(row);\n }\n }\n // Default Space behavior scrolls down, which is redundant given the rest of our keyboard nav code, and we'd still try to focus a\n // row that you scrolled away from. So suppress default Space behavior if a row or cell is selected, regardless of if we're\n // toggling selection or not.\n return true;\n }\n return false;\n }\n\n private onLeftArrowPressed(): boolean {\n let row: TableRow | TableGroupRow | undefined;\n let rowElements: TableRowFocusableElements | undefined;\n let headerElements!: TableHeaderFocusableElements;\n if (this.hasRowOrCellFocusType()) {\n row = this.getCurrentRow();\n rowElements = row?.getFocusableElements();\n } else if (this.hasHeaderFocusType()) {\n headerElements = this.getTableHeaderFocusableElements();\n }\n\n switch (this.focusType) {\n case TableFocusType.headerActions:\n return this.trySetHeaderActionFocus(\n headerElements,\n this.headerActionIndex - 1\n );\n case TableFocusType.columnHeader:\n return (\n this.trySetColumnHeaderFocus(\n headerElements,\n this.columnIndex - 1\n )\n || this.trySetHeaderActionFocus(\n headerElements,\n headerElements.headerActions.length - 1\n )\n );\n case TableFocusType.row:\n if (this.isRowExpanded(row) === true) {\n this.toggleRowExpanded(row!);\n return true;\n }\n return false;\n case TableFocusType.rowSelectionCheckbox:\n this.setRowFocusState();\n return this.focusCurrentRow(true);\n case TableFocusType.cell:\n if (\n !this.trySetCellFocus(rowElements, this.columnIndex - 1)\n && !this.trySetRowSelectionCheckboxFocus(rowElements)\n ) {\n this.setRowFocusState();\n this.focusCurrentRow(true);\n }\n return true;\n default:\n break;\n }\n\n return false;\n }\n\n private onRightArrowPressed(): boolean {\n let row: TableRow | TableGroupRow | undefined;\n let rowElements: TableRowFocusableElements | undefined;\n let headerElements!: TableHeaderFocusableElements;\n if (this.hasRowOrCellFocusType()) {\n row = this.getCurrentRow();\n rowElements = row?.getFocusableElements();\n } else if (this.hasHeaderFocusType()) {\n headerElements = this.getTableHeaderFocusableElements();\n }\n\n switch (this.focusType) {\n case TableFocusType.headerActions:\n return (\n this.trySetHeaderActionFocus(\n headerElements,\n this.headerActionIndex + 1\n ) || this.trySetColumnHeaderFocus(headerElements, 0)\n );\n case TableFocusType.columnHeader:\n return this.trySetColumnHeaderFocus(\n headerElements,\n this.columnIndex + 1\n );\n case TableFocusType.row:\n if (this.isRowExpanded(row) === false) {\n this.toggleRowExpanded(row!);\n return true;\n }\n return (\n this.trySetRowSelectionCheckboxFocus(rowElements)\n || this.trySetCellFocus(rowElements, 0)\n );\n case TableFocusType.rowSelectionCheckbox:\n return this.trySetCellFocus(rowElements, 0);\n case TableFocusType.cell:\n return this.trySetCellFocus(rowElements, this.columnIndex + 1);\n default:\n break;\n }\n\n return false;\n }\n\n private onUpArrowPressed(): boolean {\n this.onMoveUp(1);\n // Always prevent default - prevents page scroll, and FireFox changing focus if focus is at table extents\n return true;\n }\n\n private onPageUpPressed(): boolean {\n return this.onMoveUp(this.virtualizer.pageSize);\n }\n\n private onHomePressed(ctrlKey: boolean): boolean {\n if (this.handleHomeEndWithinRow(ctrlKey)) {\n const row = this.getCurrentRow();\n const rowElements = row?.getFocusableElements();\n return (\n this.trySetRowSelectionCheckboxFocus(rowElements)\n || this.trySetCellFocus(rowElements, 0)\n );\n }\n\n return this.onMoveUp(0, 0);\n }\n\n private onDownArrowPressed(): boolean {\n this.onMoveDown(1);\n // Always prevent default - prevents page scroll, and FireFox changing focus if focus is at table extents\n return true;\n }\n\n private onPageDownPressed(): boolean {\n return this.onMoveDown(this.virtualizer.pageSize);\n }\n\n private onEndPressed(ctrlKey: boolean): boolean {\n if (this.handleHomeEndWithinRow(ctrlKey)) {\n const row = this.getCurrentRow();\n const rowElements = row?.getFocusableElements();\n return this.trySetCellFocus(\n rowElements,\n this.table.visibleColumns.length - 1\n );\n }\n\n return this.onMoveDown(0, this.table.tableData.length - 1);\n }\n\n private handleHomeEndWithinRow(ctrlKey: boolean): boolean {\n return (\n (this.focusType === TableFocusType.cell\n || this.focusType === TableFocusType.rowSelectionCheckbox)\n && !ctrlKey\n );\n }\n\n private onTabPressed(shiftKeyPressed: boolean): boolean {\n const activeElement = this.getActiveElement();\n if (activeElement === null || activeElement === this.table) {\n return false;\n }\n const nextFocusState = this.hasRowOrCellFocusType()\n ? this.getNextRowTabStop(shiftKeyPressed)\n : this.getNextHeaderTabStop(shiftKeyPressed);\n if (nextFocusState) {\n this.focusType = nextFocusState.focusType;\n this.rowIndex = nextFocusState.rowIndex ?? this.rowIndex;\n this.columnIndex = nextFocusState.columnIndex ?? this.columnIndex;\n this.headerActionIndex = nextFocusState.headerActionIndex ?? this.headerActionIndex;\n this.cellContentIndex = nextFocusState.cellContentIndex ?? this.cellContentIndex;\n if (this.hasRowOrCellFocusType()) {\n this.focusCurrentRow(false);\n } else {\n this.focusHeaderElement();\n }\n return true;\n }\n this.blurAfterLastTab(activeElement);\n return false;\n }\n\n private getNextRowTabStop(\n shiftKeyPressed: boolean\n ): TableFocusState | undefined {\n const row = this.getCurrentRow();\n if (row === undefined) {\n return undefined;\n }\n let startIndex = -1;\n const focusStates = [];\n const rowElements = row.getFocusableElements();\n if (rowElements.selectionCheckbox) {\n focusStates.push({\n focusType: TableFocusType.rowSelectionCheckbox\n });\n if (this.focusType === TableFocusType.rowSelectionCheckbox) {\n startIndex = 0;\n }\n }\n let cellIndex = 0;\n while (cellIndex < rowElements.cells.length) {\n const firstCellTabbableIndex = focusStates.length;\n const cellInfo = rowElements.cells[cellIndex]!;\n const cellViewTabbableChildren = cellInfo.cell.cellView.tabbableChildren;\n for (let i = 0; i < cellViewTabbableChildren.length; i++) {\n focusStates.push({\n focusType: TableFocusType.cellContent,\n columnIndex: cellIndex,\n cellContentIndex: i\n });\n if (\n this.focusType === TableFocusType.cellContent\n && this.columnIndex === cellIndex\n && this.cellContentIndex === i\n ) {\n startIndex = focusStates.length - 1;\n }\n }\n if (cellInfo.actionMenuButton) {\n focusStates.push({\n focusType: TableFocusType.cellActionMenu,\n columnIndex: cellIndex\n });\n if (\n this.focusType === TableFocusType.cellActionMenu\n && this.columnIndex === cellIndex\n ) {\n startIndex = focusStates.length - 1;\n }\n }\n const lastCellTabbableIndex = focusStates.length - 1;\n if (\n this.focusType === TableFocusType.cell\n && this.columnIndex === cellIndex\n ) {\n startIndex = shiftKeyPressed\n ? lastCellTabbableIndex + 1\n : firstCellTabbableIndex - 1;\n }\n cellIndex += 1;\n }\n if (this.focusType === TableFocusType.row) {\n startIndex = shiftKeyPressed ? focusStates.length : -1;\n }\n const direction = shiftKeyPressed ? -1 : 1;\n return focusStates[startIndex + direction];\n }\n\n private getNextHeaderTabStop(\n shiftKeyPressed: boolean\n ): TableFocusState | undefined {\n let startIndex = -1;\n const focusStates = [];\n const headerTabbableElements = this.getTableHeaderFocusableElements().headerActions;\n for (let i = 0; i < headerTabbableElements.length; i++) {\n focusStates.push({\n focusType: TableFocusType.headerActions,\n headerActionIndex: i\n });\n }\n if (this.focusType === TableFocusType.headerActions) {\n startIndex = this.headerActionIndex;\n } else {\n // TableFocusType.columnHeader\n startIndex = focusStates.length;\n }\n const direction = shiftKeyPressed ? -1 : 1;\n return focusStates[startIndex + direction];\n }\n\n private blurAfterLastTab(activeElement: HTMLElement): void {\n // In order to get the desired browser-provided Tab/Shift-Tab behavior of focusing the\n // element before/after the table, the table shouldn't have tabIndex=0 when this event\n // handling ends. However it needs to be tabIndex=0 so we can re-focus the table the next time\n // it's tabbed to, so set tabIndex back to 0 after a rAF.\n // Note: In Chrome this is only needed for Shift-Tab, but in Firefox both Tab and Shift-Tab need this\n // to work as expected.\n this.table.tabIndex = -1;\n window.requestAnimationFrame(() => {\n this.table.tabIndex = 0;\n });\n\n // Don't explicitly call blur() on activeElement (causes unexpected behavior on Safari / Mac Firefox)\n this.setElementFocusable(activeElement, false);\n }\n\n private onMoveUp(rowDelta: number, newRowIndex?: number): boolean {\n const coerceRowIndex = rowDelta > 1;\n switch (this.focusType) {\n case TableFocusType.row:\n case TableFocusType.rowSelectionCheckbox:\n case TableFocusType.cell: {\n const scrollOptions: ScrollToOptions = {};\n let rowIndex = this.rowIndex;\n if (newRowIndex !== undefined) {\n rowIndex = newRowIndex;\n }\n rowIndex -= rowDelta;\n if (coerceRowIndex && rowIndex < 0) {\n rowIndex = 0;\n }\n if (rowDelta > 1) {\n scrollOptions.align = 'start';\n }\n\n if (rowIndex < this.rowIndex && rowIndex >= 0) {\n return this.scrollToAndFocusRow(rowIndex, scrollOptions);\n }\n if (rowIndex === -1) {\n const headerElements = this.getTableHeaderFocusableElements();\n if (\n this.focusType === TableFocusType.row\n || this.focusType === TableFocusType.rowSelectionCheckbox\n ) {\n return (\n this.trySetHeaderActionFocus(headerElements, 0)\n || this.trySetColumnHeaderFocus(headerElements, 0)\n );\n }\n return this.trySetColumnHeaderFocus(\n headerElements,\n this.columnIndex\n );\n }\n return false;\n }\n default:\n break;\n }\n\n return false;\n }\n\n private onMoveDown(rowDelta: number, newRowIndex?: number): boolean {\n const coerceRowIndex = rowDelta > 1;\n switch (this.focusType) {\n case TableFocusType.headerActions: {\n this.setRowFocusState(0);\n return this.scrollToAndFocusRow(0);\n }\n case TableFocusType.columnHeader: {\n this.setCellFocusState(this.columnIndex, 0, false);\n return this.scrollToAndFocusRow(0);\n }\n case TableFocusType.row:\n case TableFocusType.rowSelectionCheckbox:\n case TableFocusType.cell: {\n const scrollOptions: ScrollToOptions = {};\n let rowIndex = this.rowIndex;\n if (newRowIndex !== undefined) {\n rowIndex = newRowIndex;\n }\n rowIndex += rowDelta;\n if (coerceRowIndex && rowIndex >= this.table.tableData.length) {\n rowIndex = this.table.tableData.length - 1;\n }\n if (rowDelta > 1) {\n scrollOptions.align = 'end';\n }\n if (\n rowIndex > this.rowIndex\n && rowIndex < this.table.tableData.length\n ) {\n return this.scrollToAndFocusRow(rowIndex, scrollOptions);\n }\n return false;\n }\n default:\n break;\n }\n\n return false;\n }\n\n private updateFocusStateFromActiveElement(setRowFocus: boolean): void {\n // If the user is interacting with the table with non-keyboard methods (like mouse), we need to\n // update our focus state based on the current active/focused element\n const activeElement = this.getActiveElement();\n if (activeElement) {\n const row = this.getContainingRow(activeElement);\n if (row) {\n if (!(row instanceof TableGroupRow)) {\n const cell = this.getContainingCell(activeElement);\n if (cell) {\n const columnIndex = this.table.visibleColumns.indexOf(\n cell.column!\n );\n if (cell.actionMenuButton === activeElement) {\n this.setCellActionMenuFocusState(\n row.resolvedRowIndex!,\n columnIndex,\n false\n );\n return;\n }\n const contentIndex = cell.cellView.tabbableChildren.indexOf(\n activeElement\n );\n if (contentIndex > -1) {\n this.setCellContentFocusState(\n contentIndex,\n row.resolvedRowIndex!,\n columnIndex,\n false\n );\n return;\n }\n }\n }\n if (\n setRowFocus\n && this.hasRowOrCellFocusType()\n && this.rowIndex !== row.resolvedRowIndex\n ) {\n this.setRowFocusState(row.resolvedRowIndex);\n }\n }\n }\n }\n\n private focusElement(\n element: HTMLElement,\n focusOptions?: FocusOptions\n ): void {\n const previousActiveElement = this.getActiveElement();\n if (previousActiveElement !== element) {\n this.setElementFocusable(element, true);\n this.isCurrentlyFocusingElement = true;\n element.focus(focusOptions);\n this.isCurrentlyFocusingElement = false;\n if (\n previousActiveElement\n && this.isInTable(previousActiveElement)\n ) {\n this.setElementFocusable(previousActiveElement, false);\n }\n }\n }\n\n private setElementFocusable(\n element: HTMLElement,\n focusable: boolean\n ): void {\n if (element === this.table) {\n return;\n }\n\n element.tabIndex = focusable ? 0 : -1;\n }\n\n private setActionMenuButtonFocused(\n menuButton: MenuButton,\n focused: boolean\n ): void {\n // The action MenuButton needs to be visible in order to be focused, so this CSS class styling\n // handles that (see cell/styles.ts).\n if (focused) {\n menuButton.classList.add('cell-action-menu-focused');\n } else {\n menuButton.classList.remove('cell-action-menu-focused');\n }\n }\n\n private setFocusOnHeader(): boolean {\n if (this.hasHeaderFocusType()) {\n return this.focusHeaderElement();\n }\n this.setDefaultFocus();\n return this.focusType !== TableFocusType.none;\n }\n\n private setDefaultFocus(): void {\n const headerElements = this.getTableHeaderFocusableElements();\n if (\n !this.trySetHeaderActionFocus(headerElements, 0)\n && !this.trySetColumnHeaderFocus(headerElements, 0)\n && !this.scrollToAndFocusRow(0)\n ) {\n this.focusType = TableFocusType.none;\n }\n }\n\n private scrollToAndFocusRow(\n totalRowIndex: number,\n scrollOptions?: ScrollToOptions\n ): boolean {\n if (totalRowIndex >= 0 && totalRowIndex < this.table.tableData.length) {\n switch (this.focusType) {\n case TableFocusType.none:\n case TableFocusType.headerActions:\n case TableFocusType.columnHeader:\n this.setRowFocusState(totalRowIndex);\n break;\n default:\n break;\n }\n this.rowIndex = totalRowIndex;\n this.virtualizer.scrollToIndex(totalRowIndex, scrollOptions);\n this.focusCurrentRow(true);\n return true;\n }\n return false;\n }\n\n private focusCurrentRow(allowScroll: boolean): boolean {\n const visibleRowIndex = this.getCurrentRowVisibleIndex();\n if (visibleRowIndex < 0) {\n return false;\n }\n const focusedRow = this.table.rowElements[visibleRowIndex]!;\n\n let focusRowOnly = false;\n switch (this.focusType) {\n case TableFocusType.row:\n focusRowOnly = true;\n break;\n case TableFocusType.cell:\n case TableFocusType.cellActionMenu:\n case TableFocusType.cellContent:\n focusRowOnly = focusedRow instanceof TableGroupRow;\n break;\n default:\n break;\n }\n const focusOptions = { preventScroll: !allowScroll };\n if (focusRowOnly) {\n this.focusElement(focusedRow, focusOptions);\n return true;\n }\n this.focusRowElement(focusedRow, focusOptions);\n return true;\n }\n\n private focusRowElement(\n row: TableRow | TableGroupRow,\n focusOptions?: FocusOptions\n ): void {\n const rowElements = row.getFocusableElements();\n let focusableElement: HTMLElement | undefined;\n switch (this.focusType) {\n case TableFocusType.rowSelectionCheckbox:\n focusableElement = rowElements.selectionCheckbox;\n break;\n case TableFocusType.cell: {\n focusableElement = rowElements.cells[this.columnIndex]!.cell;\n break;\n }\n case TableFocusType.cellActionMenu: {\n const actionMenuButton = rowElements.cells[this.columnIndex]?.cell.actionMenuButton;\n if (actionMenuButton) {\n focusableElement = actionMenuButton;\n this.setActionMenuButtonFocused(actionMenuButton, true);\n }\n break;\n }\n case TableFocusType.cellContent: {\n focusableElement = rowElements.cells[this.columnIndex]?.cell.cellView\n .tabbableChildren[this.cellContentIndex];\n break;\n }\n default:\n break;\n }\n if (focusableElement) {\n this.focusElement(focusableElement, focusOptions);\n }\n }\n\n private focusHeaderElement(): boolean {\n const headerElements = this.getTableHeaderFocusableElements();\n let focusableElement: HTMLElement | undefined;\n switch (this.focusType) {\n case TableFocusType.headerActions:\n focusableElement = headerElements.headerActions[this.headerActionIndex];\n break;\n case TableFocusType.columnHeader:\n focusableElement = headerElements.columnHeaders[this.columnIndex];\n break;\n default:\n break;\n }\n if (focusableElement) {\n this.focusElement(focusableElement);\n return true;\n }\n return false;\n }\n\n private getCurrentRowVisibleIndex(): number {\n return this.table.rowElements.findIndex(\n row => row.resolvedRowIndex === this.rowIndex\n );\n }\n\n private getTableHeaderFocusableElements(): TableHeaderFocusableElements {\n const headerActions: HTMLElement[] = [];\n if (\n this.table.selectionCheckbox?.getRootNode()\n === this.table.shadowRoot\n ) {\n headerActions.push(this.table.selectionCheckbox);\n }\n\n if (\n this.table.showCollapseAll\n && this.table.collapseAllButton?.getRootNode()\n === this.table.shadowRoot\n ) {\n headerActions.push(this.table.collapseAllButton);\n }\n\n const columnHeaders: HTMLElement[] = [];\n if (this.canFocusColumnHeaders()) {\n this.table.columnHeadersContainer\n .querySelectorAll(tableHeaderTag)\n .forEach(header => columnHeaders.push(header));\n }\n\n return { headerActions, columnHeaders };\n }\n\n private canFocusColumnHeaders(): boolean {\n return (\n this.table.columns.find(c => !c.columnInternals.sortingDisabled)\n !== undefined\n );\n }\n\n private getCurrentRow(): TableRow | TableGroupRow | undefined {\n return this.table.rowElements[this.getCurrentRowVisibleIndex()];\n }\n\n private isRowExpanded(\n row: TableRow | TableGroupRow | undefined\n ): boolean | undefined {\n if (\n (row instanceof TableRow && row.isParentRow)\n || row instanceof TableGroupRow\n ) {\n return row.expanded;\n }\n return undefined;\n }\n\n private toggleRowExpanded(row: TableRow | TableGroupRow): void {\n if (row instanceof TableGroupRow) {\n row.onGroupExpandToggle();\n } else {\n row.onRowExpandToggle();\n }\n this.focusRowElement(row);\n }\n\n private getContainingRow(\n start: Element | undefined | null\n ): TableRow | TableGroupRow | undefined {\n return this.getContainingElement(start, e => this.isResolvedRowType(e));\n }\n\n private getContainingCell(\n start: Element | undefined | null\n ): TableCell | undefined {\n return this.getContainingElement(start, e => e instanceof TableCell);\n }\n\n private getContainingElement<TElement>(\n start: Element | undefined | null,\n isElementMatch: (element: Element) => boolean\n ): TElement | undefined {\n let possibleMatch = start;\n while (possibleMatch && possibleMatch !== this.table) {\n if (isElementMatch(possibleMatch)) {\n return possibleMatch as TElement;\n }\n possibleMatch = possibleMatch.parentElement\n ?? (possibleMatch.parentNode as ShadowRoot)?.host;\n }\n\n return undefined;\n }\n\n private isInTable(start: Element): boolean {\n let possibleMatch = start;\n while (possibleMatch && possibleMatch !== this.table) {\n possibleMatch = possibleMatch.parentElement\n ?? (possibleMatch.parentNode as ShadowRoot)?.host;\n }\n\n return possibleMatch === this.table;\n }\n\n private getActiveElement(): HTMLElement | null {\n let activeElement = document.activeElement;\n while (activeElement?.shadowRoot?.activeElement) {\n activeElement = activeElement.shadowRoot.activeElement;\n // In some cases, the active element may be a sub-part of a control (example: MenuButton -> ToggleButton -> a div with tabindex=0). Stop at the outer control boundary, so that\n // we can more simply check equality against the elements of getTableHeaderFocusableElements() / row.getFocusableElements().\n // (For rows/cells/cell views, we do need to recurse into them, to get to the appropriate focused controls though)\n if (\n activeElement instanceof FoundationElement\n && !this.isResolvedRowType(activeElement)\n && !(activeElement instanceof TableCell)\n && !(activeElement instanceof TableCellView)\n ) {\n break;\n }\n }\n\n return activeElement as HTMLElement;\n }\n\n private focusFirstInteractiveElementInCurrentCell(\n rowElements?: TableRowFocusableElements\n ): boolean {\n if (!rowElements) {\n return false;\n }\n return (\n this.trySetCellContentFocus(rowElements, 0)\n || this.trySetCellActionMenuFocus(rowElements)\n );\n }\n\n private hasRowOrCellFocusType(): boolean {\n switch (this.focusType) {\n case TableFocusType.cell:\n case TableFocusType.cellActionMenu:\n case TableFocusType.cellContent:\n case TableFocusType.row:\n case TableFocusType.rowSelectionCheckbox:\n return true;\n default:\n return false;\n }\n }\n\n private hasHeaderFocusType(): boolean {\n switch (this.focusType) {\n case TableFocusType.headerActions:\n case TableFocusType.columnHeader:\n return true;\n default:\n return false;\n }\n }\n\n private trySetRowSelectionCheckboxFocus(\n rowElements: TableRowFocusableElements | undefined\n ): boolean {\n if (rowElements?.selectionCheckbox) {\n this.focusType = TableFocusType.rowSelectionCheckbox;\n this.focusCurrentRow(true);\n return true;\n }\n return false;\n }\n\n private trySetColumnHeaderFocus(\n headerElements: TableHeaderFocusableElements,\n columnIndex: number\n ): boolean {\n if (\n columnIndex >= 0\n && columnIndex < headerElements.columnHeaders.length\n ) {\n this.focusType = TableFocusType.columnHeader;\n this.columnIndex = columnIndex;\n this.focusHeaderElement();\n return true;\n }\n return false;\n }\n\n private trySetHeaderActionFocus(\n headerElements: TableHeaderFocusableElements,\n headerActionIndex: number\n ): boolean {\n if (\n headerActionIndex >= 0\n && headerActionIndex < headerElements.headerActions.length\n ) {\n this.focusType = TableFocusType.headerActions;\n this.headerActionIndex = headerActionIndex;\n this.focusHeaderElement();\n return true;\n }\n return false;\n }\n\n private trySetCellFocus(\n rowElements: TableRowFocusableElements | undefined,\n columnIndex?: number,\n rowIndex?: number\n ): boolean {\n if (!rowElements) {\n return false;\n }\n const newColumnIndex = columnIndex ?? this.columnIndex;\n const newRowIndex = rowIndex ?? this.rowIndex;\n\n if (newColumnIndex >= 0 && newColumnIndex < rowElements.cells.length) {\n this.focusType = TableFocusType.cell;\n this.setRowCellFocusState(newColumnIndex, newRowIndex, true);\n return true;\n }\n\n return false;\n }\n\n private trySetCellContentFocus(\n rowElements: TableRowFocusableElements | undefined,\n cellContentIndex: number,\n columnIndex?: number,\n rowIndex?: number\n ): boolean {\n if (!rowElements) {\n return false;\n }\n const newColumnIndex = columnIndex ?? this.columnIndex;\n const newRowIndex = rowIndex ?? this.rowIndex;\n\n if (\n newColumnIndex >= 0\n && newColumnIndex < rowElements.cells.length\n && cellContentIndex >= 0\n && cellContentIndex\n < rowElements.cells[newColumnIndex]!.cell.cellView\n .tabbableChildren.length\n ) {\n this.setCellContentFocusState(\n cellContentIndex,\n newRowIndex,\n newColumnIndex,\n true\n );\n return true;\n }\n\n return false;\n }\n\n private trySetCellActionMenuFocus(\n rowElements: TableRowFocusableElements,\n columnIndex?: number,\n rowIndex?: number\n ): boolean {\n const newColumnIndex = columnIndex ?? this.columnIndex;\n const newRowIndex = rowIndex ?? this.rowIndex;\n\n if (\n newColumnIndex >= 0\n && newColumnIndex < rowElements.cells.length\n && rowElements.cells[newColumnIndex]!.actionMenuButton\n ) {\n this.setCellActionMenuFocusState(newRowIndex, newColumnIndex, true);\n return true;\n }\n\n return false;\n }\n\n private setCellActionMenuFocusState(\n rowIndex: number,\n columnIndex: number,\n focusElement: boolean\n ): void {\n this.focusType = TableFocusType.cellActionMenu;\n this.setRowCellFocusState(columnIndex, rowIndex, focusElement);\n }\n\n private setCellContentFocusState(\n cellContentIndex: number,\n rowIndex: number,\n columnIndex: number,\n focusElement: boolean\n ): void {\n this.focusType = TableFocusType.cellContent;\n this.cellContentIndex = cellContentIndex;\n this.setRowCellFocusState(columnIndex, rowIndex, focusElement);\n }\n\n private setRowFocusState(rowIndex?: number): void {\n this.focusType = TableFocusType.row;\n if (rowIndex !== undefined) {\n this.rowIndex = rowIndex;\n }\n }\n\n private setCellFocusState(\n columnIndex: number,\n rowIndex: number,\n focusElement: boolean\n ): void {\n this.focusType = TableFocusType.cell;\n this.setRowCellFocusState(columnIndex, rowIndex, focusElement);\n }\n\n private setRowCellFocusState(\n columnIndex: number,\n rowIndex: number,\n focusElement: boolean\n ): void {\n this.rowIndex = rowIndex;\n this.columnIndex = columnIndex;\n if (focusElement) {\n this.focusCurrentRow(true);\n }\n }\n\n private isResolvedRowType(row: unknown): row is TableRow | TableGroupRow {\n return row instanceof TableRow || row instanceof TableGroupRow;\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import type { Table } from '..';
2
2
  import type { TableRecord } from '../types';
3
3
  import { UpdateTracker } from '../../utilities/models/update-tracker';
4
- declare const trackedItems: readonly ["rowIds", "rowParentIds", "groupRows", "columnIds", "columnSort", "columnWidths", "columnDefinition", "actionMenuSlots", "selectionMode"];
4
+ declare const trackedItems: readonly ["rowIds", "rowParentIds", "groupRows", "columnIds", "columnHidden", "columnSort", "columnSortDisabled", "columnWidths", "columnDefinition", "actionMenuSlots", "selectionMode"];
5
5
  /**
6
6
  * Helper class to track what updates are needed to the table based on configuration
7
7
  * changes.
@@ -21,6 +21,7 @@ export declare class TableUpdateTracker<TData extends TableRecord> extends Updat
21
21
  get updateSelectionMode(): boolean;
22
22
  get requiresTanStackUpdate(): boolean;
23
23
  get requiresTanStackDataReset(): boolean;
24
+ get requiresKeyboardFocusReset(): boolean;
24
25
  trackAllStateChanged(): void;
25
26
  get hasPendingUpdates(): boolean;
26
27
  trackColumnPropertyChanged(changedColumnProperty: string): void;
@@ -14,7 +14,9 @@ const trackedItems = [
14
14
  'rowParentIds',
15
15
  'groupRows',
16
16
  'columnIds',
17
+ 'columnHidden',
17
18
  'columnSort',
19
+ 'columnSortDisabled',
18
20
  'columnWidths',
19
21
  'columnDefinition',
20
22
  'actionMenuSlots',
@@ -70,6 +72,13 @@ export class TableUpdateTracker extends UpdateTracker {
70
72
  || this.isTracked('columnDefinition')
71
73
  || this.isTracked('rowParentIds'));
72
74
  }
75
+ get requiresKeyboardFocusReset() {
76
+ return (this.isTracked('columnSortDisabled')
77
+ || this.isTracked('columnDefinition')
78
+ || this.isTracked('columnHidden')
79
+ || this.isTracked('selectionMode')
80
+ || this.isTracked('actionMenuSlots'));
81
+ }
73
82
  trackAllStateChanged() {
74
83
  this.trackAll();
75
84
  this.queueUpdate();
@@ -84,12 +93,19 @@ export class TableUpdateTracker extends UpdateTracker {
84
93
  else if (isColumnInternalsProperty(changedColumnProperty, 'operandDataRecordFieldName', 'sortOperation')) {
85
94
  this.track('columnDefinition');
86
95
  }
87
- else if (isColumnInternalsProperty(changedColumnProperty, 'sortingDisabled', 'currentSortDirection', 'currentSortIndex')) {
96
+ else if (isColumnInternalsProperty(changedColumnProperty, 'sortingDisabled')) {
97
+ this.track('columnSort');
98
+ this.track('columnSortDisabled');
99
+ }
100
+ else if (isColumnInternalsProperty(changedColumnProperty, 'currentSortDirection', 'currentSortIndex')) {
88
101
  this.track('columnSort');
89
102
  }
90
- else if (isColumnProperty(changedColumnProperty, 'columnHidden')
91
- || isColumnInternalsProperty(changedColumnProperty, 'currentFractionalWidth', 'currentPixelWidth', 'minPixelWidth', 'resizingDisabled')) {
103
+ else if (isColumnInternalsProperty(changedColumnProperty, 'currentFractionalWidth', 'currentPixelWidth', 'minPixelWidth', 'resizingDisabled')) {
104
+ this.track('columnWidths');
105
+ }
106
+ else if (isColumnProperty(changedColumnProperty, 'columnHidden')) {
92
107
  this.track('columnWidths');
108
+ this.track('columnHidden');
93
109
  }
94
110
  else if (isColumnProperty(changedColumnProperty, 'actionMenuSlot')) {
95
111
  this.track('actionMenuSlots');
@@ -103,6 +119,7 @@ export class TableUpdateTracker extends UpdateTracker {
103
119
  this.track('columnIds');
104
120
  this.track('columnDefinition');
105
121
  this.track('columnSort');
122
+ this.track('columnSortDisabled');
106
123
  this.track('columnWidths');
107
124
  this.track('actionMenuSlots');
108
125
  this.track('groupRows');
@@ -1 +1 @@
1
- {"version":3,"file":"table-update-tracker.js","sourceRoot":"","sources":["../../../../src/table/models/table-update-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAI9C,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AAE5F,MAAM,gBAAgB,GAAG,CACrB,eAAuB,EACvB,GAAG,IAA2B,EACvB,EAAE;IACT,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACpB,IAAI,eAAe,KAAK,GAAG,EAAE;YACzB,OAAO,IAAI,CAAC;SACf;KACJ;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG;IACjB,QAAQ;IACR,cAAc;IACd,WAAW;IACX,WAAW;IACX,YAAY;IACZ,cAAc;IACd,kBAAkB;IAClB,iBAAiB;IACjB,eAAe;CACT,CAAC;AAEX;;;GAGG;AACH,MAAM,OAAO,kBAEX,SAAQ,aAAkC;IAGxC,YAAoC,KAAmB;QACnD,KAAK,CAAC,YAAY,CAAC,CAAC;QADY,UAAK,GAAL,KAAK,CAAc;QAF/C,iBAAY,GAAG,KAAK,CAAC;IAI7B,CAAC;IAED,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAED,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IAED,IAAW,kBAAkB;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC;IAED,IAAW,sBAAsB;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC9C,CAAC;IAED,IAAW,qBAAqB;QAC5B,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IAC7C,CAAC;IAED,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC3C,CAAC;IAED,IAAW,sBAAsB;QAC7B,OAAO,CACH,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;eACrB,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;eAC9B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;eAC5B,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;eAClC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;eAC3B,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CACrC,CAAC;IACN,CAAC;IAED,IAAW,yBAAyB;QAChC,OAAO,CACH,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;eACrB,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;eAClC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CACpC,CAAC;IACN,CAAC;IAEM,oBAAoB;QACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAEM,0BAA0B,CAAC,qBAA6B;QAC3D,IAAI,gBAAgB,CAAC,qBAAqB,EAAE,UAAU,CAAC,EAAE;YACrD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;SAC3B;aAAM,IACH,yBAAyB,CACrB,qBAAqB,EACrB,4BAA4B,EAC5B,eAAe,CAClB,EACH;YACE,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;SAClC;aAAM,IACH,yBAAyB,CACrB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,CACrB,EACH;YACE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;SAC5B;aAAM,IACH,gBAAgB,CAAC,qBAAqB,EAAE,cAAc,CAAC;eACpD,yBAAyB,CACxB,qBAAqB,EACrB,wBAAwB,EACxB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,CACrB,EACH;YACE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;SAC9B;aAAM,IAAI,gBAAgB,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,EAAE;YAClE,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;SACjC;aAAM,IACH,yBAAyB,CACrB,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,CACrB,EACH;YACE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;SAC3B;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,2BAA2B;QAC9B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAExB,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,uBAAuB;QAC1B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrB,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,6BAA6B;QAChC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC3B,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEM,yBAAyB;QAC5B,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC5B,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAEkB,WAAW;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,WAAW,EAAE;YACzC,OAAO;SACV;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE;gBACjB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACpB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC9B,CAAC,CAAC,CAAC;SACN;IACL,CAAC;CACJ","sourcesContent":["import { DOM } from '@microsoft/fast-element';\nimport type { Table } from '..';\nimport type { TableColumn } from '../../table-column/base';\nimport type { TableRecord } from '../types';\nimport { UpdateTracker } from '../../utilities/models/update-tracker';\nimport { isColumnInternalsProperty } from '../../table-column/base/models/column-internals';\n\nconst isColumnProperty = (\n changedProperty: string,\n ...args: (keyof TableColumn)[]\n): boolean => {\n for (const arg of args) {\n if (changedProperty === arg) {\n return true;\n }\n }\n return false;\n};\n\nconst trackedItems = [\n 'rowIds',\n 'rowParentIds',\n 'groupRows',\n 'columnIds',\n 'columnSort',\n 'columnWidths',\n 'columnDefinition',\n 'actionMenuSlots',\n 'selectionMode'\n] as const;\n\n/**\n * Helper class to track what updates are needed to the table based on configuration\n * changes.\n */\nexport class TableUpdateTracker<\n TData extends TableRecord\n> extends UpdateTracker<typeof trackedItems> {\n private updateQueued = false;\n\n public constructor(private readonly table: Table<TData>) {\n super(trackedItems);\n }\n\n public get updateRowIds(): boolean {\n return this.isTracked('rowIds');\n }\n\n public get updateRowParentIds(): boolean {\n return this.isTracked('rowParentIds');\n }\n\n public get updateGroupRows(): boolean {\n return this.isTracked('groupRows');\n }\n\n public get updateColumnIds(): boolean {\n return this.isTracked('columnIds');\n }\n\n public get updateColumnSort(): boolean {\n return this.isTracked('columnSort');\n }\n\n public get updateColumnWidths(): boolean {\n return this.isTracked('columnWidths');\n }\n\n public get updateColumnDefinition(): boolean {\n return this.isTracked('columnDefinition');\n }\n\n public get updateActionMenuSlots(): boolean {\n return this.isTracked('actionMenuSlots');\n }\n\n public get updateSelectionMode(): boolean {\n return this.isTracked('selectionMode');\n }\n\n public get requiresTanStackUpdate(): boolean {\n return (\n this.isTracked('rowIds')\n || this.isTracked('rowParentIds')\n || this.isTracked('columnSort')\n || this.isTracked('columnDefinition')\n || this.isTracked('groupRows')\n || this.isTracked('selectionMode')\n );\n }\n\n public get requiresTanStackDataReset(): boolean {\n return (\n this.isTracked('rowIds')\n || this.isTracked('columnDefinition')\n || this.isTracked('rowParentIds')\n );\n }\n\n public trackAllStateChanged(): void {\n this.trackAll();\n this.queueUpdate();\n }\n\n public get hasPendingUpdates(): boolean {\n return this.updateQueued;\n }\n\n public trackColumnPropertyChanged(changedColumnProperty: string): void {\n if (isColumnProperty(changedColumnProperty, 'columnId')) {\n this.track('columnIds');\n } else if (\n isColumnInternalsProperty(\n changedColumnProperty,\n 'operandDataRecordFieldName',\n 'sortOperation'\n )\n ) {\n this.track('columnDefinition');\n } else if (\n isColumnInternalsProperty(\n changedColumnProperty,\n 'sortingDisabled',\n 'currentSortDirection',\n 'currentSortIndex'\n )\n ) {\n this.track('columnSort');\n } else if (\n isColumnProperty(changedColumnProperty, 'columnHidden')\n || isColumnInternalsProperty(\n changedColumnProperty,\n 'currentFractionalWidth',\n 'currentPixelWidth',\n 'minPixelWidth',\n 'resizingDisabled'\n )\n ) {\n this.track('columnWidths');\n } else if (isColumnProperty(changedColumnProperty, 'actionMenuSlot')) {\n this.track('actionMenuSlots');\n } else if (\n isColumnInternalsProperty(\n changedColumnProperty,\n 'groupIndex',\n 'groupingDisabled'\n )\n ) {\n this.track('groupRows');\n }\n\n this.queueUpdate();\n }\n\n public trackColumnInstancesChanged(): void {\n this.track('columnIds');\n this.track('columnDefinition');\n this.track('columnSort');\n this.track('columnWidths');\n this.track('actionMenuSlots');\n this.track('groupRows');\n\n this.queueUpdate();\n }\n\n public trackIdFieldNameChanged(): void {\n this.track('rowIds');\n this.queueUpdate();\n }\n\n public trackParentIdFieldNameChanged(): void {\n this.track('rowParentIds');\n this.queueUpdate();\n }\n\n public trackSelectionModeChanged(): void {\n this.track('selectionMode');\n this.queueUpdate();\n }\n\n protected override queueUpdate(): void {\n if (!this.table.$fastController.isConnected) {\n return;\n }\n\n if (!this.updateQueued) {\n this.updateQueued = true;\n DOM.queueUpdate(() => {\n this.table.update();\n this.untrackAll();\n this.updateQueued = false;\n });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"table-update-tracker.js","sourceRoot":"","sources":["../../../../src/table/models/table-update-tracker.ts"],"names":[],"mappings":"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","sourcesContent":["import { DOM } from '@microsoft/fast-element';\nimport type { Table } from '..';\nimport type { TableColumn } from '../../table-column/base';\nimport type { TableRecord } from '../types';\nimport { UpdateTracker } from '../../utilities/models/update-tracker';\nimport { isColumnInternalsProperty } from '../../table-column/base/models/column-internals';\n\nconst isColumnProperty = (\n changedProperty: string,\n ...args: (keyof TableColumn)[]\n): boolean => {\n for (const arg of args) {\n if (changedProperty === arg) {\n return true;\n }\n }\n return false;\n};\n\nconst trackedItems = [\n 'rowIds',\n 'rowParentIds',\n 'groupRows',\n 'columnIds',\n 'columnHidden',\n 'columnSort',\n 'columnSortDisabled',\n 'columnWidths',\n 'columnDefinition',\n 'actionMenuSlots',\n 'selectionMode'\n] as const;\n\n/**\n * Helper class to track what updates are needed to the table based on configuration\n * changes.\n */\nexport class TableUpdateTracker<\n TData extends TableRecord\n> extends UpdateTracker<typeof trackedItems> {\n private updateQueued = false;\n\n public constructor(private readonly table: Table<TData>) {\n super(trackedItems);\n }\n\n public get updateRowIds(): boolean {\n return this.isTracked('rowIds');\n }\n\n public get updateRowParentIds(): boolean {\n return this.isTracked('rowParentIds');\n }\n\n public get updateGroupRows(): boolean {\n return this.isTracked('groupRows');\n }\n\n public get updateColumnIds(): boolean {\n return this.isTracked('columnIds');\n }\n\n public get updateColumnSort(): boolean {\n return this.isTracked('columnSort');\n }\n\n public get updateColumnWidths(): boolean {\n return this.isTracked('columnWidths');\n }\n\n public get updateColumnDefinition(): boolean {\n return this.isTracked('columnDefinition');\n }\n\n public get updateActionMenuSlots(): boolean {\n return this.isTracked('actionMenuSlots');\n }\n\n public get updateSelectionMode(): boolean {\n return this.isTracked('selectionMode');\n }\n\n public get requiresTanStackUpdate(): boolean {\n return (\n this.isTracked('rowIds')\n || this.isTracked('rowParentIds')\n || this.isTracked('columnSort')\n || this.isTracked('columnDefinition')\n || this.isTracked('groupRows')\n || this.isTracked('selectionMode')\n );\n }\n\n public get requiresTanStackDataReset(): boolean {\n return (\n this.isTracked('rowIds')\n || this.isTracked('columnDefinition')\n || this.isTracked('rowParentIds')\n );\n }\n\n public get requiresKeyboardFocusReset(): boolean {\n return (\n this.isTracked('columnSortDisabled')\n || this.isTracked('columnDefinition')\n || this.isTracked('columnHidden')\n || this.isTracked('selectionMode')\n || this.isTracked('actionMenuSlots')\n );\n }\n\n public trackAllStateChanged(): void {\n this.trackAll();\n this.queueUpdate();\n }\n\n public get hasPendingUpdates(): boolean {\n return this.updateQueued;\n }\n\n public trackColumnPropertyChanged(changedColumnProperty: string): void {\n if (isColumnProperty(changedColumnProperty, 'columnId')) {\n this.track('columnIds');\n } else if (\n isColumnInternalsProperty(\n changedColumnProperty,\n 'operandDataRecordFieldName',\n 'sortOperation'\n )\n ) {\n this.track('columnDefinition');\n } else if (\n isColumnInternalsProperty(changedColumnProperty, 'sortingDisabled')\n ) {\n this.track('columnSort');\n this.track('columnSortDisabled');\n } else if (\n isColumnInternalsProperty(\n changedColumnProperty,\n 'currentSortDirection',\n 'currentSortIndex'\n )\n ) {\n this.track('columnSort');\n } else if (\n isColumnInternalsProperty(\n changedColumnProperty,\n 'currentFractionalWidth',\n 'currentPixelWidth',\n 'minPixelWidth',\n 'resizingDisabled'\n )\n ) {\n this.track('columnWidths');\n } else if (isColumnProperty(changedColumnProperty, 'columnHidden')) {\n this.track('columnWidths');\n this.track('columnHidden');\n } else if (isColumnProperty(changedColumnProperty, 'actionMenuSlot')) {\n this.track('actionMenuSlots');\n } else if (\n isColumnInternalsProperty(\n changedColumnProperty,\n 'groupIndex',\n 'groupingDisabled'\n )\n ) {\n this.track('groupRows');\n }\n\n this.queueUpdate();\n }\n\n public trackColumnInstancesChanged(): void {\n this.track('columnIds');\n this.track('columnDefinition');\n this.track('columnSort');\n this.track('columnSortDisabled');\n this.track('columnWidths');\n this.track('actionMenuSlots');\n this.track('groupRows');\n\n this.queueUpdate();\n }\n\n public trackIdFieldNameChanged(): void {\n this.track('rowIds');\n this.queueUpdate();\n }\n\n public trackParentIdFieldNameChanged(): void {\n this.track('rowParentIds');\n this.queueUpdate();\n }\n\n public trackSelectionModeChanged(): void {\n this.track('selectionMode');\n this.queueUpdate();\n }\n\n protected override queueUpdate(): void {\n if (!this.table.$fastController.isConnected) {\n return;\n }\n\n if (!this.updateQueued) {\n this.updateQueued = true;\n DOM.queueUpdate(() => {\n this.table.update();\n this.untrackAll();\n this.updateQueued = false;\n });\n }\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { Table as TanStackTable } from '@tanstack/table-core';
2
- import { VirtualItem } from '@tanstack/virtual-core';
2
+ import { VirtualItem, ScrollToOptions } from '@tanstack/virtual-core';
3
3
  import type { Table } from '..';
4
4
  import type { TableNode, TableRecord } from '../types';
5
5
  /**
@@ -12,16 +12,20 @@ export declare class Virtualizer<TData extends TableRecord = TableRecord> {
12
12
  scrollHeight: number;
13
13
  headerContainerMarginRight: number;
14
14
  rowContainerYOffset: number;
15
+ get pageSize(): number;
16
+ private get rowHeight();
15
17
  private readonly table;
16
18
  private readonly tanStackTable;
17
19
  private readonly viewportResizeObserver;
18
20
  private virtualizer?;
21
+ private _pageSize;
19
22
  constructor(table: Table<TData>, tanStackTable: TanStackTable<TableNode<TData>>);
20
23
  connect(): void;
21
24
  disconnect(): void;
22
25
  dataChanged(): void;
26
+ scrollToIndex(index: number, options?: ScrollToOptions): void;
23
27
  private updateVirtualizer;
24
28
  private createVirtualizerOptions;
25
29
  private handleVirtualizerChange;
26
- private notifyFocusedCellRecycling;
30
+ private updatePageSize;
27
31
  }
@@ -2,23 +2,31 @@ import { __decorate } from "tslib";
2
2
  import { observable } from '@microsoft/fast-element';
3
3
  import { Virtualizer as TanStackVirtualizer, elementScroll, observeElementOffset, observeElementRect } from '@tanstack/virtual-core';
4
4
  import { borderWidth, controlHeight } from '../../theme-provider/design-tokens';
5
- import { TableCellView } from '../../table-column/base/cell-view';
6
5
  /**
7
6
  * Helper class for the nimble-table for row virtualization.
8
7
  *
9
8
  * @internal
10
9
  */
11
10
  export class Virtualizer {
11
+ get pageSize() {
12
+ return this._pageSize;
13
+ }
14
+ get rowHeight() {
15
+ return (parseFloat(controlHeight.getValueFor(this.table))
16
+ + 2 * parseFloat(borderWidth.getValueFor(this.table)));
17
+ }
12
18
  constructor(table, tanStackTable) {
13
19
  this.visibleItems = [];
14
20
  this.scrollHeight = 0;
15
21
  this.headerContainerMarginRight = 0;
16
22
  this.rowContainerYOffset = 0;
23
+ this._pageSize = 0;
17
24
  this.table = table;
18
25
  this.tanStackTable = tanStackTable;
19
26
  this.viewportResizeObserver = new ResizeObserver(entries => {
20
27
  const borderBoxSize = entries[0]?.borderBoxSize[0];
21
28
  if (borderBoxSize) {
29
+ this.updatePageSize();
22
30
  // If we have enough rows that a vertical scrollbar is shown, we need to offset the header widths
23
31
  // by the same margin so the column headers align with the corresponding rendered cells
24
32
  const viewportBoundingWidth = borderBoxSize.inlineSize;
@@ -39,6 +47,9 @@ export class Virtualizer {
39
47
  this.updateVirtualizer();
40
48
  }
41
49
  }
50
+ scrollToIndex(index, options) {
51
+ this.virtualizer?.scrollToIndex(index, options);
52
+ }
42
53
  updateVirtualizer() {
43
54
  const options = this.createVirtualizerOptions();
44
55
  if (this.virtualizer) {
@@ -51,8 +62,7 @@ export class Virtualizer {
51
62
  this.handleVirtualizerChange();
52
63
  }
53
64
  createVirtualizerOptions() {
54
- const rowHeight = parseFloat(controlHeight.getValueFor(this.table))
55
- + 2 * parseFloat(borderWidth.getValueFor(this.table));
65
+ const rowHeight = this.rowHeight;
56
66
  return {
57
67
  count: this.tanStackTable.getRowModel().rows.length,
58
68
  getScrollElement: () => {
@@ -69,7 +79,7 @@ export class Virtualizer {
69
79
  };
70
80
  }
71
81
  handleVirtualizerChange() {
72
- this.notifyFocusedCellRecycling();
82
+ this.table.handleFocusedCellRecycling();
73
83
  const virtualizer = this.virtualizer;
74
84
  this.visibleItems = virtualizer.getVirtualItems();
75
85
  this.scrollHeight = virtualizer.getTotalSize();
@@ -84,24 +94,8 @@ export class Virtualizer {
84
94
  }
85
95
  this.rowContainerYOffset = rowContainerYOffset;
86
96
  }
87
- notifyFocusedCellRecycling() {
88
- let tableFocusedElement = this.table.shadowRoot.activeElement;
89
- while (tableFocusedElement !== null
90
- && !(tableFocusedElement instanceof TableCellView)) {
91
- if (tableFocusedElement.shadowRoot) {
92
- tableFocusedElement = tableFocusedElement.shadowRoot.activeElement;
93
- }
94
- else {
95
- break;
96
- }
97
- }
98
- if (tableFocusedElement instanceof TableCellView) {
99
- tableFocusedElement.focusedRecycleCallback();
100
- }
101
- if (this.table.openActionMenuRecordId !== undefined) {
102
- const activeRow = this.table.rowElements.find(row => row.recordId === this.table.openActionMenuRecordId);
103
- activeRow?.closeOpenActionMenus();
104
- }
97
+ updatePageSize() {
98
+ this._pageSize = Math.round(this.table.viewport.clientHeight / this.rowHeight);
105
99
  }
106
100
  }
107
101
  __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"virtualizer.js","sourceRoot":"","sources":["../../../../src/table/models/virtualizer.ts"],"names":[],"mappings":"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","sourcesContent":["import { observable } from '@microsoft/fast-element';\nimport type { Table as TanStackTable } from '@tanstack/table-core';\nimport {\n Virtualizer as TanStackVirtualizer,\n VirtualizerOptions,\n elementScroll,\n observeElementOffset,\n observeElementRect,\n VirtualItem\n} from '@tanstack/virtual-core';\nimport { borderWidth, controlHeight } from '../../theme-provider/design-tokens';\nimport type { Table } from '..';\nimport type { TableNode, TableRecord } from '../types';\nimport { TableCellView } from '../../table-column/base/cell-view';\n\n/**\n * Helper class for the nimble-table for row virtualization.\n *\n * @internal\n */\nexport class Virtualizer<TData extends TableRecord = TableRecord> {\n @observable\n public visibleItems: VirtualItem[] = [];\n\n @observable\n public scrollHeight = 0;\n\n @observable\n public headerContainerMarginRight = 0;\n\n @observable\n public rowContainerYOffset = 0;\n\n private readonly table: Table<TData>;\n private readonly tanStackTable: TanStackTable<TableNode<TData>>;\n private readonly viewportResizeObserver: ResizeObserver;\n private virtualizer?: TanStackVirtualizer<HTMLElement, HTMLElement>;\n\n public constructor(\n table: Table<TData>,\n tanStackTable: TanStackTable<TableNode<TData>>\n ) {\n this.table = table;\n this.tanStackTable = tanStackTable;\n this.viewportResizeObserver = new ResizeObserver(entries => {\n const borderBoxSize = entries[0]?.borderBoxSize[0];\n if (borderBoxSize) {\n // If we have enough rows that a vertical scrollbar is shown, we need to offset the header widths\n // by the same margin so the column headers align with the corresponding rendered cells\n const viewportBoundingWidth = borderBoxSize.inlineSize;\n this.headerContainerMarginRight = viewportBoundingWidth - this.table.viewport.clientWidth;\n }\n });\n }\n\n public connect(): void {\n this.viewportResizeObserver.observe(this.table.viewport);\n this.updateVirtualizer();\n this.table.viewport.scrollTo({ top: this.virtualizer!.scrollOffset });\n }\n\n public disconnect(): void {\n this.viewportResizeObserver.disconnect();\n }\n\n public dataChanged(): void {\n if (this.table.$fastController.isConnected) {\n this.updateVirtualizer();\n }\n }\n\n private updateVirtualizer(): void {\n const options = this.createVirtualizerOptions();\n if (this.virtualizer) {\n this.virtualizer.setOptions(options);\n } else {\n this.virtualizer = new TanStackVirtualizer(options);\n }\n this.virtualizer._willUpdate();\n this.handleVirtualizerChange();\n }\n\n private createVirtualizerOptions(): VirtualizerOptions<\n HTMLElement,\n HTMLElement\n > {\n const rowHeight = parseFloat(controlHeight.getValueFor(this.table))\n + 2 * parseFloat(borderWidth.getValueFor(this.table));\n return {\n count: this.tanStackTable.getRowModel().rows.length,\n getScrollElement: () => {\n return this.table.viewport;\n },\n estimateSize: (_: number) => rowHeight,\n enableSmoothScroll: true,\n overscan: 3,\n scrollingDelay: 5,\n scrollToFn: elementScroll,\n observeElementOffset,\n observeElementRect,\n onChange: () => this.handleVirtualizerChange()\n } as VirtualizerOptions<HTMLElement, HTMLElement>;\n }\n\n private handleVirtualizerChange(): void {\n this.notifyFocusedCellRecycling();\n const virtualizer = this.virtualizer!;\n this.visibleItems = virtualizer.getVirtualItems();\n this.scrollHeight = virtualizer.getTotalSize();\n // We're using a separate div ('table-scroll') to represent the full height of all rows, and\n // the row container's height is only big enough to hold the virtualized rows. So we don't\n // use the TanStackVirtual-provided 'start' offset (which is in terms of the full height)\n // to translate every individual row, we just translate the row container.\n let rowContainerYOffset = 0;\n if (this.visibleItems.length > 0) {\n const firstItem = this.visibleItems[0]!;\n rowContainerYOffset = firstItem.start;\n }\n\n this.rowContainerYOffset = rowContainerYOffset;\n }\n\n private notifyFocusedCellRecycling(): void {\n let tableFocusedElement = this.table.shadowRoot!.activeElement;\n while (\n tableFocusedElement !== null\n && !(tableFocusedElement instanceof TableCellView)\n ) {\n if (tableFocusedElement.shadowRoot) {\n tableFocusedElement = tableFocusedElement.shadowRoot.activeElement;\n } else {\n break;\n }\n }\n if (tableFocusedElement instanceof TableCellView) {\n tableFocusedElement.focusedRecycleCallback();\n }\n if (this.table.openActionMenuRecordId !== undefined) {\n const activeRow = this.table.rowElements.find(\n row => row.recordId === this.table.openActionMenuRecordId\n );\n activeRow?.closeOpenActionMenus();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"virtualizer.js","sourceRoot":"","sources":["../../../../src/table/models/virtualizer.ts"],"names":[],"mappings":"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","sourcesContent":["import { observable } from '@microsoft/fast-element';\nimport type { Table as TanStackTable } from '@tanstack/table-core';\nimport {\n Virtualizer as TanStackVirtualizer,\n VirtualizerOptions,\n elementScroll,\n observeElementOffset,\n observeElementRect,\n VirtualItem,\n ScrollToOptions\n} from '@tanstack/virtual-core';\nimport { borderWidth, controlHeight } from '../../theme-provider/design-tokens';\nimport type { Table } from '..';\nimport type { TableNode, TableRecord } from '../types';\n\n/**\n * Helper class for the nimble-table for row virtualization.\n *\n * @internal\n */\nexport class Virtualizer<TData extends TableRecord = TableRecord> {\n @observable\n public visibleItems: VirtualItem[] = [];\n\n @observable\n public scrollHeight = 0;\n\n @observable\n public headerContainerMarginRight = 0;\n\n @observable\n public rowContainerYOffset = 0;\n\n public get pageSize(): number {\n return this._pageSize;\n }\n\n private get rowHeight(): number {\n return (\n parseFloat(controlHeight.getValueFor(this.table))\n + 2 * parseFloat(borderWidth.getValueFor(this.table))\n );\n }\n\n private readonly table: Table<TData>;\n private readonly tanStackTable: TanStackTable<TableNode<TData>>;\n private readonly viewportResizeObserver: ResizeObserver;\n private virtualizer?: TanStackVirtualizer<HTMLElement, HTMLElement>;\n private _pageSize = 0;\n\n public constructor(\n table: Table<TData>,\n tanStackTable: TanStackTable<TableNode<TData>>\n ) {\n this.table = table;\n this.tanStackTable = tanStackTable;\n this.viewportResizeObserver = new ResizeObserver(entries => {\n const borderBoxSize = entries[0]?.borderBoxSize[0];\n if (borderBoxSize) {\n this.updatePageSize();\n // If we have enough rows that a vertical scrollbar is shown, we need to offset the header widths\n // by the same margin so the column headers align with the corresponding rendered cells\n const viewportBoundingWidth = borderBoxSize.inlineSize;\n this.headerContainerMarginRight = viewportBoundingWidth - this.table.viewport.clientWidth;\n }\n });\n }\n\n public connect(): void {\n this.viewportResizeObserver.observe(this.table.viewport);\n this.updateVirtualizer();\n this.table.viewport.scrollTo({ top: this.virtualizer!.scrollOffset });\n }\n\n public disconnect(): void {\n this.viewportResizeObserver.disconnect();\n }\n\n public dataChanged(): void {\n if (this.table.$fastController.isConnected) {\n this.updateVirtualizer();\n }\n }\n\n public scrollToIndex(index: number, options?: ScrollToOptions): void {\n this.virtualizer?.scrollToIndex(index, options);\n }\n\n private updateVirtualizer(): void {\n const options = this.createVirtualizerOptions();\n if (this.virtualizer) {\n this.virtualizer.setOptions(options);\n } else {\n this.virtualizer = new TanStackVirtualizer(options);\n }\n this.virtualizer._willUpdate();\n this.handleVirtualizerChange();\n }\n\n private createVirtualizerOptions(): VirtualizerOptions<\n HTMLElement,\n HTMLElement\n > {\n const rowHeight = this.rowHeight;\n return {\n count: this.tanStackTable.getRowModel().rows.length,\n getScrollElement: () => {\n return this.table.viewport;\n },\n estimateSize: (_: number) => rowHeight,\n enableSmoothScroll: true,\n overscan: 3,\n scrollingDelay: 5,\n scrollToFn: elementScroll,\n observeElementOffset,\n observeElementRect,\n onChange: () => this.handleVirtualizerChange()\n } as VirtualizerOptions<HTMLElement, HTMLElement>;\n }\n\n private handleVirtualizerChange(): void {\n this.table.handleFocusedCellRecycling();\n const virtualizer = this.virtualizer!;\n this.visibleItems = virtualizer.getVirtualItems();\n this.scrollHeight = virtualizer.getTotalSize();\n // We're using a separate div ('table-scroll') to represent the full height of all rows, and\n // the row container's height is only big enough to hold the virtualized rows. So we don't\n // use the TanStackVirtual-provided 'start' offset (which is in terms of the full height)\n // to translate every individual row, we just translate the row container.\n let rowContainerYOffset = 0;\n if (this.visibleItems.length > 0) {\n const firstItem = this.visibleItems[0]!;\n rowContainerYOffset = firstItem.start;\n }\n\n this.rowContainerYOffset = rowContainerYOffset;\n }\n\n private updatePageSize(): void {\n this._pageSize = Math.round(\n this.table.viewport.clientHeight / this.rowHeight\n );\n }\n}\n"]}
@@ -8,6 +8,7 @@ import { themeBehavior } from '../utilities/style/theme';
8
8
  import { userSelectNone } from '../utilities/style/user-select';
9
9
  import { accessiblyHidden } from '../utilities/style/accessibly-hidden';
10
10
  import { ZIndexLevels } from '../utilities/style/types';
11
+ import { focusVisible } from '../utilities/style/focus';
11
12
  export const styles = css `
12
13
  ${display('flex')}
13
14
 
@@ -17,6 +18,15 @@ export const styles = css `
17
18
  --ni-private-column-divider-padding: 3px;
18
19
  }
19
20
 
21
+ :host(${focusVisible}) {
22
+ ${
23
+ /* The table can briefly be focused in some keyboard nav cases (e.g. regaining focus and we
24
+ need to scroll to the previously focused row first). Ensure that we don't get the browser-default
25
+ focus outline in that case.
26
+ ) */ ''}
27
+ outline: none;
28
+ }
29
+
20
30
  .disable-select {
21
31
  ${userSelectNone}
22
32
  }
@@ -147,6 +157,10 @@ export const styles = css `
147
157
  position: relative;
148
158
  }
149
159
 
160
+ .table-viewport${focusVisible} {
161
+ outline: none;
162
+ }
163
+
150
164
  .table-scroll {
151
165
  pointer-events: none;
152
166
  position: absolute;
@@ -173,10 +187,17 @@ export const styles = css `
173
187
 
174
188
  .group-row {
175
189
  position: relative;
190
+ --ni-private-table-cell-focus-offset-multiplier: 0;
176
191
  }
177
192
 
178
193
  .row {
179
194
  position: relative;
195
+ --ni-private-table-cell-focus-offset-multiplier: 0;
196
+ }
197
+
198
+ .collapse-all-visible .row,
199
+ .collapse-all-visible .group-row {
200
+ --ni-private-table-cell-focus-offset-multiplier: 1;
180
201
  }
181
202
 
182
203
  .accessibly-hidden {
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/table/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,kDAAkD,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EACH,0BAA0B,EAC1B,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,OAAO,CAAC,MAAM,CAAC;;;;;;;;;UASX,cAAc;;;;;;;;gBAQR,QAAQ;iBACP,aAAa;;;;;;;;;;;;;;;;;;sBAkBR,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6B9B,iBAAiB;uBACZ,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;cAyBtB,gBAAgB;;kBAEZ,iBAAiB;;;mBAGhB,YAAY,CAAC,OAAO;;;;;wBAKf,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAkDZ,mBAAmB;;;;uBAIxB,eAAe;;;;;;;;;;;;;;;;UAgB5B,gBAAgB;;CAEzB,CAAC,aAAa,CACX,aAAa,CACT,KAAK,CAAC,KAAK,EACX,GAAG,CAAA;;;;;oCAKyB,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC;;;SAGxD,CACJ,CACJ,CAAC","sourcesContent":["import { css } from '@microsoft/fast-element';\nimport { White } from '@ni/nimble-tokens/dist/styledictionary/js/tokens';\nimport { display } from '../utilities/style/display';\nimport {\n applicationBackgroundColor,\n bodyFont,\n bodyFontColor,\n popupBorderColor,\n controlSlimHeight,\n mediumPadding,\n standardPadding,\n tableRowBorderColor,\n borderHoverColor\n} from '../theme-provider/design-tokens';\nimport { Theme } from '../theme-provider/types';\nimport { hexToRgbaCssColor } from '../utilities/style/colors';\nimport { themeBehavior } from '../utilities/style/theme';\nimport { userSelectNone } from '../utilities/style/user-select';\nimport { accessiblyHidden } from '../utilities/style/accessibly-hidden';\nimport { ZIndexLevels } from '../utilities/style/types';\n\nexport const styles = css`\n ${display('flex')}\n\n :host {\n height: 480px;\n --ni-private-column-divider-width: 2px;\n --ni-private-column-divider-padding: 3px;\n }\n\n .disable-select {\n ${userSelectNone}\n }\n\n .table-container {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n width: 100%;\n font: ${bodyFont};\n color: ${bodyFontColor};\n cursor: var(--ni-private-table-cursor-override);\n }\n\n .glass-overlay {\n width: 100%;\n height: 100%;\n display: contents;\n pointer-events: var(--ni-private-glass-overlay-pointer-events);\n }\n\n .header-row-container {\n position: sticky;\n top: 0;\n }\n\n .header-row {\n display: flex;\n background: ${applicationBackgroundColor};\n position: relative;\n width: fit-content;\n min-width: max(\n 100%,\n calc(\n var(--ni-private-table-scrollable-min-width) +\n var(--ni-private-table-header-container-margin-right)\n )\n );\n left: var(--ni-private-table-scroll-x);\n align-items: center;\n }\n\n .header-row-action-container {\n display: flex;\n }\n\n .checkbox-container {\n display: flex;\n }\n\n .column-headers-container {\n display: grid;\n width: 100%;\n grid-template-columns: var(--ni-private-table-row-grid-columns) auto;\n }\n\n .collapse-all-button {\n height: ${controlSlimHeight};\n margin-left: ${mediumPadding};\n visibility: hidden;\n }\n\n .collapse-all-button.visible {\n visibility: visible;\n }\n\n .header-container {\n display: flex;\n align-items: center;\n position: relative;\n }\n\n .header-scrollbar-spacer {\n width: var(--ni-private-table-header-container-margin-right);\n }\n\n .header {\n flex: 1;\n overflow: hidden;\n }\n\n .column-divider {\n border-left: var(--ni-private-column-divider-width) solid\n ${popupBorderColor};\n display: none;\n height: ${controlSlimHeight};\n cursor: col-resize;\n position: absolute;\n z-index: ${ZIndexLevels.zIndex1};\n }\n\n .column-divider:hover,\n .column-divider.divider-active {\n border-color: ${borderHoverColor};\n }\n\n .column-divider.column-active.draggable,\n .header-container:hover .column-divider.draggable {\n display: block;\n }\n\n .column-divider::before {\n content: '';\n position: absolute;\n width: calc(\n var(--ni-private-column-divider-width) +\n (2 * var(--ni-private-column-divider-padding))\n );\n height: 100%;\n left: calc(\n -1 * (var(--ni-private-column-divider-width) +\n var(--ni-private-column-divider-padding))\n );\n }\n\n .column-divider.left {\n left: -1px;\n }\n\n .column-divider.right {\n left: calc(100% - 1px);\n }\n\n .table-viewport {\n overflow: auto;\n display: block;\n height: 100%;\n position: relative;\n }\n\n .table-scroll {\n pointer-events: none;\n position: absolute;\n top: 0px;\n width: 100%;\n height: var(--ni-private-table-scroll-height);\n }\n\n .table-row-container {\n width: fit-content;\n min-width: max(100%, var(--ni-private-table-scrollable-min-width));\n position: relative;\n top: var(--ni-private-table-row-container-top);\n background-color: ${tableRowBorderColor};\n }\n\n .selection-checkbox {\n margin-left: ${standardPadding};\n }\n\n .selection-checkbox::part(label) {\n padding-left: 0px;\n }\n\n .group-row {\n position: relative;\n }\n\n .row {\n position: relative;\n }\n\n .accessibly-hidden {\n ${accessiblyHidden}\n }\n`.withBehaviors(\n themeBehavior(\n Theme.color,\n css`\n .table-row-container::before {\n content: '';\n width: 100%;\n height: 100%;\n background-color: ${hexToRgbaCssColor(White, 0.1)};\n position: absolute;\n }\n `\n )\n);\n"]}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/table/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,kDAAkD,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EACH,0BAA0B,EAC1B,QAAQ,EACR,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;MACnB,OAAO,CAAC,MAAM,CAAC;;;;;;;;YAQT,YAAY;UACd;AACE;;;IAGA,CAAC,EACL;;;;;UAKE,cAAc;;;;;;;;gBAQR,QAAQ;iBACP,aAAa;;;;;;;;;;;;;;;;;;sBAkBR,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6B9B,iBAAiB;uBACZ,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;cAyBtB,gBAAgB;;kBAEZ,iBAAiB;;;mBAGhB,YAAY,CAAC,OAAO;;;;;wBAKf,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAqCnB,YAAY;;;;;;;;;;;;;;;;;4BAiBL,mBAAmB;;;;uBAIxB,eAAe;;;;;;;;;;;;;;;;;;;;;;;UAuB5B,gBAAgB;;CAEzB,CAAC,aAAa,CACX,aAAa,CACT,KAAK,CAAC,KAAK,EACX,GAAG,CAAA;;;;;oCAKyB,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC;;;SAGxD,CACJ,CACJ,CAAC","sourcesContent":["import { css } from '@microsoft/fast-element';\nimport { White } from '@ni/nimble-tokens/dist/styledictionary/js/tokens';\nimport { display } from '../utilities/style/display';\nimport {\n applicationBackgroundColor,\n bodyFont,\n bodyFontColor,\n popupBorderColor,\n controlSlimHeight,\n mediumPadding,\n standardPadding,\n tableRowBorderColor,\n borderHoverColor\n} from '../theme-provider/design-tokens';\nimport { Theme } from '../theme-provider/types';\nimport { hexToRgbaCssColor } from '../utilities/style/colors';\nimport { themeBehavior } from '../utilities/style/theme';\nimport { userSelectNone } from '../utilities/style/user-select';\nimport { accessiblyHidden } from '../utilities/style/accessibly-hidden';\nimport { ZIndexLevels } from '../utilities/style/types';\nimport { focusVisible } from '../utilities/style/focus';\n\nexport const styles = css`\n ${display('flex')}\n\n :host {\n height: 480px;\n --ni-private-column-divider-width: 2px;\n --ni-private-column-divider-padding: 3px;\n }\n\n :host(${focusVisible}) {\n ${\n /* The table can briefly be focused in some keyboard nav cases (e.g. regaining focus and we\n need to scroll to the previously focused row first). Ensure that we don't get the browser-default\n focus outline in that case.\n ) */ ''\n }\n outline: none;\n }\n\n .disable-select {\n ${userSelectNone}\n }\n\n .table-container {\n overflow: hidden;\n display: flex;\n flex-direction: column;\n width: 100%;\n font: ${bodyFont};\n color: ${bodyFontColor};\n cursor: var(--ni-private-table-cursor-override);\n }\n\n .glass-overlay {\n width: 100%;\n height: 100%;\n display: contents;\n pointer-events: var(--ni-private-glass-overlay-pointer-events);\n }\n\n .header-row-container {\n position: sticky;\n top: 0;\n }\n\n .header-row {\n display: flex;\n background: ${applicationBackgroundColor};\n position: relative;\n width: fit-content;\n min-width: max(\n 100%,\n calc(\n var(--ni-private-table-scrollable-min-width) +\n var(--ni-private-table-header-container-margin-right)\n )\n );\n left: var(--ni-private-table-scroll-x);\n align-items: center;\n }\n\n .header-row-action-container {\n display: flex;\n }\n\n .checkbox-container {\n display: flex;\n }\n\n .column-headers-container {\n display: grid;\n width: 100%;\n grid-template-columns: var(--ni-private-table-row-grid-columns) auto;\n }\n\n .collapse-all-button {\n height: ${controlSlimHeight};\n margin-left: ${mediumPadding};\n visibility: hidden;\n }\n\n .collapse-all-button.visible {\n visibility: visible;\n }\n\n .header-container {\n display: flex;\n align-items: center;\n position: relative;\n }\n\n .header-scrollbar-spacer {\n width: var(--ni-private-table-header-container-margin-right);\n }\n\n .header {\n flex: 1;\n overflow: hidden;\n }\n\n .column-divider {\n border-left: var(--ni-private-column-divider-width) solid\n ${popupBorderColor};\n display: none;\n height: ${controlSlimHeight};\n cursor: col-resize;\n position: absolute;\n z-index: ${ZIndexLevels.zIndex1};\n }\n\n .column-divider:hover,\n .column-divider.divider-active {\n border-color: ${borderHoverColor};\n }\n\n .column-divider.column-active.draggable,\n .header-container:hover .column-divider.draggable {\n display: block;\n }\n\n .column-divider::before {\n content: '';\n position: absolute;\n width: calc(\n var(--ni-private-column-divider-width) +\n (2 * var(--ni-private-column-divider-padding))\n );\n height: 100%;\n left: calc(\n -1 * (var(--ni-private-column-divider-width) +\n var(--ni-private-column-divider-padding))\n );\n }\n\n .column-divider.left {\n left: -1px;\n }\n\n .column-divider.right {\n left: calc(100% - 1px);\n }\n\n .table-viewport {\n overflow: auto;\n display: block;\n height: 100%;\n position: relative;\n }\n\n .table-viewport${focusVisible} {\n outline: none;\n }\n\n .table-scroll {\n pointer-events: none;\n position: absolute;\n top: 0px;\n width: 100%;\n height: var(--ni-private-table-scroll-height);\n }\n\n .table-row-container {\n width: fit-content;\n min-width: max(100%, var(--ni-private-table-scrollable-min-width));\n position: relative;\n top: var(--ni-private-table-row-container-top);\n background-color: ${tableRowBorderColor};\n }\n\n .selection-checkbox {\n margin-left: ${standardPadding};\n }\n\n .selection-checkbox::part(label) {\n padding-left: 0px;\n }\n\n .group-row {\n position: relative;\n --ni-private-table-cell-focus-offset-multiplier: 0;\n }\n\n .row {\n position: relative;\n --ni-private-table-cell-focus-offset-multiplier: 0;\n }\n\n .collapse-all-visible .row,\n .collapse-all-visible .group-row {\n --ni-private-table-cell-focus-offset-multiplier: 1;\n }\n\n .accessibly-hidden {\n ${accessiblyHidden}\n }\n`.withBehaviors(\n themeBehavior(\n Theme.color,\n css`\n .table-row-container::before {\n content: '';\n width: 100%;\n height: 100%;\n background-color: ${hexToRgbaCssColor(White, 0.1)};\n position: absolute;\n }\n `\n )\n);\n"]}