@aquera/nile-elements 1.2.1 → 1.2.2

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 (239) hide show
  1. package/README.md +4 -0
  2. package/demo/variables.css +4 -2
  3. package/dist/index.cjs.js +1 -1
  4. package/dist/index.esm.js +1 -1
  5. package/dist/index.js +167 -88
  6. package/dist/nile-grid/index.cjs.js +1 -1
  7. package/dist/nile-grid/index.esm.js +1 -1
  8. package/dist/nile-grid/nile-grid-body/index.cjs.js +2 -0
  9. package/dist/{nile-grid-body → nile-grid/nile-grid-body}/index.esm.js +1 -1
  10. package/dist/{nile-grid-cell-item/nile-grid-cell-item.cjs.js → nile-grid/nile-grid-body/nile-grid-body.cjs.js} +2 -2
  11. package/dist/nile-grid/nile-grid-body/nile-grid-body.cjs.js.map +1 -0
  12. package/dist/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.css.cjs.js +1 -1
  13. package/dist/nile-grid/nile-grid-body/nile-grid-body.css.cjs.js.map +1 -0
  14. package/dist/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.css.esm.js +0 -4
  15. package/dist/nile-grid/nile-grid-body/nile-grid-body.esm.js +5 -0
  16. package/dist/nile-grid/nile-grid-cell-item/index.cjs.js +2 -0
  17. package/dist/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/index.esm.js +1 -1
  18. package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.cjs.js +2 -0
  19. package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.cjs.js.map +1 -0
  20. package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js +2 -0
  21. package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js.map +1 -0
  22. package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.esm.js +67 -0
  23. package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.esm.js +12 -0
  24. package/dist/nile-grid/nile-grid-cell-item/nile-grid-cell-item.utils.cjs.js.map +1 -0
  25. package/dist/nile-grid/nile-grid-head/index.cjs.js +2 -0
  26. package/dist/{nile-grid-head → nile-grid/nile-grid-head}/index.esm.js +1 -1
  27. package/dist/nile-grid/nile-grid-head/nile-grid-head.cjs.js +2 -0
  28. package/dist/nile-grid/nile-grid-head/nile-grid-head.cjs.js.map +1 -0
  29. package/dist/nile-grid/nile-grid-head/nile-grid-head.css.cjs.js.map +1 -0
  30. package/dist/nile-grid/nile-grid-head/nile-grid-head.esm.js +5 -0
  31. package/dist/nile-grid/nile-grid-head-item/index.cjs.js +2 -0
  32. package/dist/{nile-grid-head-item → nile-grid/nile-grid-head-item}/index.esm.js +1 -1
  33. package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.cjs.js +2 -0
  34. package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.cjs.js.map +1 -0
  35. package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.css.cjs.js +2 -0
  36. package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.css.cjs.js.map +1 -0
  37. package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.css.esm.js +59 -0
  38. package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.esm.js +13 -0
  39. package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.cjs.js +2 -0
  40. package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.cjs.js.map +1 -0
  41. package/dist/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.esm.js +1 -0
  42. package/dist/nile-grid/nile-grid-row/index.cjs.js +2 -0
  43. package/dist/{nile-grid-row → nile-grid/nile-grid-row}/index.esm.js +1 -1
  44. package/dist/nile-grid/nile-grid-row/nile-grid-row.cjs.js +2 -0
  45. package/dist/nile-grid/nile-grid-row/nile-grid-row.cjs.js.map +1 -0
  46. package/dist/nile-grid/nile-grid-row/nile-grid-row.css.cjs.js +2 -0
  47. package/dist/nile-grid/nile-grid-row/nile-grid-row.css.cjs.js.map +1 -0
  48. package/dist/nile-grid/nile-grid-row/nile-grid-row.css.esm.js +36 -0
  49. package/dist/nile-grid/nile-grid-row/nile-grid-row.esm.js +8 -0
  50. package/dist/nile-grid/nile-grid.cjs.js +1 -1
  51. package/dist/nile-grid/nile-grid.cjs.js.map +1 -1
  52. package/dist/nile-grid/nile-grid.css.cjs.js +1 -1
  53. package/dist/nile-grid/nile-grid.css.cjs.js.map +1 -1
  54. package/dist/nile-grid/nile-grid.css.esm.js +9 -6
  55. package/dist/nile-grid/nile-grid.esm.js +6 -6
  56. package/dist/nile-grid/nile-grid.layout.cjs.js +2 -0
  57. package/dist/nile-grid/nile-grid.layout.cjs.js.map +1 -0
  58. package/dist/nile-grid/nile-grid.layout.esm.js +1 -0
  59. package/dist/nile-grid/nile-grid.resize.cjs.js +2 -0
  60. package/dist/nile-grid/nile-grid.resize.cjs.js.map +1 -0
  61. package/dist/nile-grid/nile-grid.resize.esm.js +1 -0
  62. package/dist/nile-grid/nile-grid.types.cjs.js +2 -0
  63. package/dist/nile-grid/nile-grid.types.cjs.js.map +1 -0
  64. package/dist/nile-grid/nile-grid.types.esm.js +1 -0
  65. package/dist/nile-grid/nile-grid.utils.cjs.js +1 -1
  66. package/dist/nile-grid/nile-grid.utils.cjs.js.map +1 -1
  67. package/dist/nile-grid/nile-grid.utils.esm.js +1 -1
  68. package/dist/nile-grid/nile-grid.width.cjs.js +2 -0
  69. package/dist/nile-grid/nile-grid.width.cjs.js.map +1 -0
  70. package/dist/nile-grid/nile-grid.width.esm.js +1 -0
  71. package/dist/src/index.d.ts +5 -5
  72. package/dist/src/index.js +5 -5
  73. package/dist/src/index.js.map +1 -1
  74. package/dist/src/nile-grid/nile-grid-body/index.js.map +1 -0
  75. package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.css.js +0 -4
  76. package/dist/src/nile-grid/nile-grid-body/nile-grid-body.css.js.map +1 -0
  77. package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.d.ts +1 -1
  78. package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.js +2 -2
  79. package/dist/src/nile-grid/nile-grid-body/nile-grid-body.js.map +1 -0
  80. package/dist/src/nile-grid/nile-grid-cell-item/index.js.map +1 -0
  81. package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.js +79 -0
  82. package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.js.map +1 -0
  83. package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.d.ts +1 -4
  84. package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.js +2 -12
  85. package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.js.map +1 -0
  86. package/dist/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.utils.js.map +1 -0
  87. package/dist/src/nile-grid/nile-grid-head/index.js.map +1 -0
  88. package/dist/src/nile-grid/nile-grid-head/nile-grid-head.css.js.map +1 -0
  89. package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.d.ts +2 -1
  90. package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.js +11 -3
  91. package/dist/src/nile-grid/nile-grid-head/nile-grid-head.js.map +1 -0
  92. package/dist/src/nile-grid/nile-grid-head-item/index.js.map +1 -0
  93. package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.css.js +30 -5
  94. package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.css.js.map +1 -0
  95. package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.d.ts +3 -4
  96. package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.js +12 -15
  97. package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.js.map +1 -0
  98. package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.d.ts +34 -0
  99. package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.utils.js +27 -4
  100. package/dist/src/nile-grid/nile-grid-head-item/nile-grid-head-item.utils.js.map +1 -0
  101. package/dist/src/nile-grid/nile-grid-row/index.js.map +1 -0
  102. package/dist/src/nile-grid/nile-grid-row/nile-grid-row.css.js +48 -0
  103. package/dist/src/nile-grid/nile-grid-row/nile-grid-row.css.js.map +1 -0
  104. package/dist/src/{nile-grid-row → nile-grid/nile-grid-row}/nile-grid-row.d.ts +5 -2
  105. package/dist/src/{nile-grid-row → nile-grid/nile-grid-row}/nile-grid-row.js +23 -6
  106. package/dist/src/nile-grid/nile-grid-row/nile-grid-row.js.map +1 -0
  107. package/dist/src/nile-grid/nile-grid.css.js +7 -4
  108. package/dist/src/nile-grid/nile-grid.css.js.map +1 -1
  109. package/dist/src/nile-grid/nile-grid.d.ts +19 -4
  110. package/dist/src/nile-grid/nile-grid.js +76 -23
  111. package/dist/src/nile-grid/nile-grid.js.map +1 -1
  112. package/dist/src/nile-grid/nile-grid.layout.d.ts +28 -0
  113. package/dist/src/nile-grid/nile-grid.layout.js +346 -0
  114. package/dist/src/nile-grid/nile-grid.layout.js.map +1 -0
  115. package/dist/src/nile-grid/nile-grid.resize.d.ts +58 -0
  116. package/dist/src/nile-grid/nile-grid.resize.js +100 -0
  117. package/dist/src/nile-grid/nile-grid.resize.js.map +1 -0
  118. package/dist/src/nile-grid/nile-grid.types.d.ts +3 -0
  119. package/dist/src/nile-grid/nile-grid.types.js +2 -0
  120. package/dist/src/nile-grid/nile-grid.types.js.map +1 -0
  121. package/dist/src/nile-grid/nile-grid.utils.d.ts +22 -4
  122. package/dist/src/nile-grid/nile-grid.utils.js +24 -141
  123. package/dist/src/nile-grid/nile-grid.utils.js.map +1 -1
  124. package/dist/src/nile-grid/nile-grid.width.d.ts +25 -0
  125. package/dist/src/nile-grid/nile-grid.width.js +301 -0
  126. package/dist/src/nile-grid/nile-grid.width.js.map +1 -0
  127. package/dist/src/version.js +2 -2
  128. package/dist/src/version.js.map +1 -1
  129. package/dist/tsconfig.tsbuildinfo +1 -1
  130. package/package.json +1 -1
  131. package/src/index.ts +5 -5
  132. package/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.css.ts +0 -4
  133. package/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.ts +3 -3
  134. package/src/nile-grid/nile-grid-cell-item/nile-grid-cell-item.css.ts +81 -0
  135. package/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.ts +5 -15
  136. package/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.ts +6 -4
  137. package/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.css.ts +30 -5
  138. package/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.ts +10 -25
  139. package/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.utils.ts +30 -4
  140. package/src/nile-grid/nile-grid-row/nile-grid-row.css.ts +50 -0
  141. package/src/{nile-grid-row → nile-grid/nile-grid-row}/nile-grid-row.ts +13 -8
  142. package/src/nile-grid/nile-grid.css.ts +7 -4
  143. package/src/nile-grid/nile-grid.layout.ts +514 -0
  144. package/src/nile-grid/nile-grid.resize.ts +143 -0
  145. package/src/nile-grid/nile-grid.ts +79 -53
  146. package/src/nile-grid/nile-grid.types.ts +1 -0
  147. package/src/nile-grid/nile-grid.utils.ts +27 -203
  148. package/src/nile-grid/nile-grid.width.ts +397 -0
  149. package/vscode-html-custom-data.json +48 -65
  150. package/dist/nile-grid-body/index.cjs.js +0 -2
  151. package/dist/nile-grid-body/nile-grid-body.cjs.js +0 -2
  152. package/dist/nile-grid-body/nile-grid-body.cjs.js.map +0 -1
  153. package/dist/nile-grid-body/nile-grid-body.css.cjs.js.map +0 -1
  154. package/dist/nile-grid-body/nile-grid-body.esm.js +0 -5
  155. package/dist/nile-grid-cell-item/index.cjs.js +0 -2
  156. package/dist/nile-grid-cell-item/nile-grid-cell-item.cjs.js.map +0 -1
  157. package/dist/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js +0 -2
  158. package/dist/nile-grid-cell-item/nile-grid-cell-item.css.cjs.js.map +0 -1
  159. package/dist/nile-grid-cell-item/nile-grid-cell-item.css.esm.js +0 -35
  160. package/dist/nile-grid-cell-item/nile-grid-cell-item.esm.js +0 -12
  161. package/dist/nile-grid-cell-item/nile-grid-cell-item.utils.cjs.js.map +0 -1
  162. package/dist/nile-grid-head/index.cjs.js +0 -2
  163. package/dist/nile-grid-head/nile-grid-head.cjs.js +0 -2
  164. package/dist/nile-grid-head/nile-grid-head.cjs.js.map +0 -1
  165. package/dist/nile-grid-head/nile-grid-head.css.cjs.js.map +0 -1
  166. package/dist/nile-grid-head/nile-grid-head.esm.js +0 -5
  167. package/dist/nile-grid-head-item/index.cjs.js +0 -2
  168. package/dist/nile-grid-head-item/nile-grid-head-item.cjs.js +0 -2
  169. package/dist/nile-grid-head-item/nile-grid-head-item.cjs.js.map +0 -1
  170. package/dist/nile-grid-head-item/nile-grid-head-item.css.cjs.js +0 -2
  171. package/dist/nile-grid-head-item/nile-grid-head-item.css.cjs.js.map +0 -1
  172. package/dist/nile-grid-head-item/nile-grid-head-item.css.esm.js +0 -34
  173. package/dist/nile-grid-head-item/nile-grid-head-item.esm.js +0 -12
  174. package/dist/nile-grid-head-item/nile-grid-head-item.utils.cjs.js +0 -2
  175. package/dist/nile-grid-head-item/nile-grid-head-item.utils.cjs.js.map +0 -1
  176. package/dist/nile-grid-head-item/nile-grid-head-item.utils.esm.js +0 -1
  177. package/dist/nile-grid-row/index.cjs.js +0 -2
  178. package/dist/nile-grid-row/nile-grid-row.cjs.js +0 -2
  179. package/dist/nile-grid-row/nile-grid-row.cjs.js.map +0 -1
  180. package/dist/nile-grid-row/nile-grid-row.css.cjs.js +0 -2
  181. package/dist/nile-grid-row/nile-grid-row.css.cjs.js.map +0 -1
  182. package/dist/nile-grid-row/nile-grid-row.css.esm.js +0 -15
  183. package/dist/nile-grid-row/nile-grid-row.esm.js +0 -7
  184. package/dist/src/nile-grid-body/index.js.map +0 -1
  185. package/dist/src/nile-grid-body/nile-grid-body.css.js.map +0 -1
  186. package/dist/src/nile-grid-body/nile-grid-body.js.map +0 -1
  187. package/dist/src/nile-grid-cell-item/index.js.map +0 -1
  188. package/dist/src/nile-grid-cell-item/nile-grid-cell-item.css.js +0 -47
  189. package/dist/src/nile-grid-cell-item/nile-grid-cell-item.css.js.map +0 -1
  190. package/dist/src/nile-grid-cell-item/nile-grid-cell-item.js.map +0 -1
  191. package/dist/src/nile-grid-cell-item/nile-grid-cell-item.utils.js.map +0 -1
  192. package/dist/src/nile-grid-head/index.js.map +0 -1
  193. package/dist/src/nile-grid-head/nile-grid-head.css.js.map +0 -1
  194. package/dist/src/nile-grid-head/nile-grid-head.js.map +0 -1
  195. package/dist/src/nile-grid-head-item/index.js.map +0 -1
  196. package/dist/src/nile-grid-head-item/nile-grid-head-item.css.js.map +0 -1
  197. package/dist/src/nile-grid-head-item/nile-grid-head-item.js.map +0 -1
  198. package/dist/src/nile-grid-head-item/nile-grid-head-item.utils.d.ts +0 -10
  199. package/dist/src/nile-grid-head-item/nile-grid-head-item.utils.js.map +0 -1
  200. package/dist/src/nile-grid-row/index.js.map +0 -1
  201. package/dist/src/nile-grid-row/nile-grid-row.css.js +0 -27
  202. package/dist/src/nile-grid-row/nile-grid-row.css.js.map +0 -1
  203. package/dist/src/nile-grid-row/nile-grid-row.js.map +0 -1
  204. package/src/nile-grid-cell-item/nile-grid-cell-item.css.ts +0 -49
  205. package/src/nile-grid-row/nile-grid-row.css.ts +0 -29
  206. /package/dist/{nile-grid-body → nile-grid/nile-grid-body}/index.cjs.js.map +0 -0
  207. /package/dist/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/index.cjs.js.map +0 -0
  208. /package/dist/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.utils.cjs.js +0 -0
  209. /package/dist/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.utils.esm.js +0 -0
  210. /package/dist/{nile-grid-head → nile-grid/nile-grid-head}/index.cjs.js.map +0 -0
  211. /package/dist/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.css.cjs.js +0 -0
  212. /package/dist/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.css.esm.js +0 -0
  213. /package/dist/{nile-grid-head-item → nile-grid/nile-grid-head-item}/index.cjs.js.map +0 -0
  214. /package/dist/{nile-grid-row → nile-grid/nile-grid-row}/index.cjs.js.map +0 -0
  215. /package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/index.d.ts +0 -0
  216. /package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/index.js +0 -0
  217. /package/dist/src/{nile-grid-body → nile-grid/nile-grid-body}/nile-grid-body.css.d.ts +0 -0
  218. /package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/index.d.ts +0 -0
  219. /package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/index.js +0 -0
  220. /package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.css.d.ts +0 -0
  221. /package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.utils.d.ts +0 -0
  222. /package/dist/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.utils.js +0 -0
  223. /package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/index.d.ts +0 -0
  224. /package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/index.js +0 -0
  225. /package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.css.d.ts +0 -0
  226. /package/dist/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.css.js +0 -0
  227. /package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/index.d.ts +0 -0
  228. /package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/index.js +0 -0
  229. /package/dist/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/nile-grid-head-item.css.d.ts +0 -0
  230. /package/dist/src/{nile-grid-row → nile-grid/nile-grid-row}/index.d.ts +0 -0
  231. /package/dist/src/{nile-grid-row → nile-grid/nile-grid-row}/index.js +0 -0
  232. /package/dist/src/{nile-grid-row → nile-grid/nile-grid-row}/nile-grid-row.css.d.ts +0 -0
  233. /package/src/{nile-grid-body → nile-grid/nile-grid-body}/index.ts +0 -0
  234. /package/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/index.ts +0 -0
  235. /package/src/{nile-grid-cell-item → nile-grid/nile-grid-cell-item}/nile-grid-cell-item.utils.ts +0 -0
  236. /package/src/{nile-grid-head → nile-grid/nile-grid-head}/index.ts +0 -0
  237. /package/src/{nile-grid-head → nile-grid/nile-grid-head}/nile-grid-head.css.ts +0 -0
  238. /package/src/{nile-grid-head-item → nile-grid/nile-grid-head-item}/index.ts +0 -0
  239. /package/src/{nile-grid-row → nile-grid/nile-grid-row}/index.ts +0 -0
@@ -0,0 +1,514 @@
1
+ import { NileGrid } from './nile-grid';
2
+ import { HeadItemEl } from './nile-grid.types';
3
+ import { getHead, getBody } from './nile-grid.utils';
4
+ import { getScrollbarComp } from './nile-grid.resize';
5
+ import { computeColumnWidths } from './nile-grid.width';
6
+
7
+ /**
8
+ * @param nileGrid Parent NileGrid instance
9
+ * @param slotEl <slot> element hosting head/body
10
+ * @param ensureWidths Function to ensure columnWidths length matches colCount
11
+ * @param rebuildTemplate Function(colCount, widths) -> grid-template string
12
+ * @param stickyLeftIndexes Mutable list of left-sticky column indexes
13
+ * @param stickyRightIndexes Mutable list of right-sticky column indexes
14
+ * @returns void
15
+ */
16
+ export const layout = (
17
+ nileGrid: NileGrid,
18
+ slotEl: any,
19
+ ensureWidths: any,
20
+ rebuildTemplate: any,
21
+ stickyLeftIndexes: number[],
22
+ stickyRightIndexes: number[]
23
+ ) => {
24
+ const head = getHead(slotEl);
25
+ const body = getBody(slotEl);
26
+ if (!body) return;
27
+
28
+ const headRows = head
29
+ ? (Array.from(head.querySelectorAll('nile-grid-row')) as HTMLElement[])
30
+ : [];
31
+ const bodyRows = Array.from(
32
+ body.querySelectorAll('nile-grid-row')
33
+ ) as HTMLElement[];
34
+
35
+ let colCount = 0;
36
+ colCount = computeHeadLayout(nileGrid, headRows, [], colCount, stickyLeftIndexes, stickyRightIndexes, nileGrid.columnWidths);
37
+ if (colCount) {
38
+ computeBodyLayout(nileGrid, bodyRows, [], colCount, stickyLeftIndexes, stickyRightIndexes, nileGrid.columnWidths);
39
+ } else {
40
+ colCount = computeBodyLayout(nileGrid, bodyRows, [], colCount, stickyLeftIndexes, stickyRightIndexes, nileGrid.columnWidths);
41
+ }
42
+
43
+ setTimeout(() => {
44
+ computeColumnWidths(nileGrid, colCount, nileGrid.columnWidths, slotEl);
45
+ });
46
+ ensureWidths(colCount);
47
+ nileGrid.colTemplate = rebuildTemplate(colCount, nileGrid.columnWidths);
48
+ };
49
+
50
+ /**
51
+ * @param nileGrid The parent NileGrid instance
52
+ * @param rows Array of grid row elements
53
+ * @param carry Array tracking rowspan, colspan continuation
54
+ * @param colCount Total column count
55
+ * @param stickyLeftIndexes List of sticky-left column indexes
56
+ * @param stickyRightIndexes List of sticky-right column indexes
57
+ * @param columnWidths Computed column widths
58
+ * @param opts Options controlling layout behavior
59
+ * @returns Final computed column count
60
+ */
61
+ function layoutRows(
62
+ nileGrid: NileGrid,
63
+ rows: HTMLElement[],
64
+ carry: number[],
65
+ colCount: number,
66
+ stickyLeftIndexes: number[],
67
+ stickyRightIndexes: number[],
68
+ columnWidths: number[],
69
+ opts: { itemSelector: string; useStickyAttr?: boolean; handleRowBg?: boolean }
70
+ ): number {
71
+ rows.forEach((row, rIdx) => {
72
+ if (nileGrid.hoverable) row.setAttribute('hover', 'true');
73
+ colCount = layoutSingleRow(
74
+ nileGrid,
75
+ row,
76
+ rIdx,
77
+ carry,
78
+ colCount,
79
+ stickyLeftIndexes,
80
+ stickyRightIndexes,
81
+ columnWidths,
82
+ opts
83
+ );
84
+ });
85
+ return colCount;
86
+ }
87
+
88
+ /**
89
+ * @param nileGrid The grid element being processed
90
+ * @param row Single row element to layout
91
+ * @param rIdx Row index in the grid
92
+ * @param carry Rowspan tracking array
93
+ * @param colCount Current column count
94
+ * @param stickyLeftIndexes Sticky-left indexes
95
+ * @param stickyRightIndexes Sticky-right indexes
96
+ * @param columnWidths Column widths array
97
+ * @param opts Layout options
98
+ * @returns Updated column count
99
+ */
100
+ function layoutSingleRow(
101
+ nileGrid: NileGrid,
102
+ row: HTMLElement,
103
+ rIdx: number,
104
+ carry: number[],
105
+ colCount: number,
106
+ stickyLeftIndexes: number[],
107
+ stickyRightIndexes: number[],
108
+ columnWidths: number[],
109
+ opts: { itemSelector: string; useStickyAttr?: boolean }
110
+ ): number {
111
+ let c = 1;
112
+ const rStart = rIdx + 1;
113
+ const items = [...row.querySelectorAll(opts.itemSelector)] as HTMLElement[];
114
+
115
+ for (const el of items) {
116
+ while ((carry[c - 1] || 0) > 0) c++;
117
+ ({ c, colCount } = layoutCell(
118
+ nileGrid,
119
+ el,
120
+ c,
121
+ rStart,
122
+ carry,
123
+ colCount,
124
+ stickyLeftIndexes,
125
+ stickyRightIndexes,
126
+ columnWidths,
127
+ opts
128
+ ));
129
+ }
130
+ decrementCarry(carry);
131
+ return colCount;
132
+ }
133
+
134
+ /**
135
+ * @param nileGrid The parent grid
136
+ * @param el Cell element being laid out
137
+ * @param c Current column index
138
+ * @param rStart Row start index
139
+ * @param carry Rowspan carry array
140
+ * @param colCount Current max column count
141
+ * @param stickyLeftIndexes Left sticky indexes
142
+ * @param stickyRightIndexes Right sticky indexes
143
+ * @param columnWidths Column widths
144
+ * @param opts Sticky and layout options
145
+ * @returns Updated column index and column count
146
+ */
147
+ function layoutCell(
148
+ nileGrid: NileGrid,
149
+ el: HTMLElement,
150
+ c: number,
151
+ rStart: number,
152
+ carry: number[],
153
+ colCount: number,
154
+ stickyLeftIndexes: number[],
155
+ stickyRightIndexes: number[],
156
+ columnWidths: number[],
157
+ opts: { useStickyAttr?: boolean }
158
+ ) {
159
+ const colspan = Math.max(1, +el.getAttribute('colspan')! || 1);
160
+ const rowspan = Math.max(1, +el.getAttribute('rowspan')! || 1);
161
+ handleRowspan(nileGrid, el, rowspan);
162
+
163
+ const cStart = c;
164
+ const cEnd = c + colspan;
165
+ setGridPosition(el, cStart, cEnd, rStart, rowspan);
166
+ handleSticky(
167
+ el,
168
+ cStart,
169
+ opts,
170
+ stickyLeftIndexes,
171
+ stickyRightIndexes,
172
+ columnWidths
173
+ );
174
+
175
+ for (let k = 0; k < colspan; k++) {
176
+ carry[c - 1 + k] = Math.max(carry[c - 1 + k] || 0, rowspan);
177
+ }
178
+ return {
179
+ c: cEnd,
180
+ colCount: Math.max(colCount, cEnd - 1),
181
+ };
182
+ }
183
+
184
+ /**
185
+ * @param nileGrid The grid container
186
+ * @param el Element that spans multiple rows
187
+ * @param rowspan Number of rows to span
188
+ */
189
+ function handleRowspan(nileGrid: NileGrid, el: HTMLElement, rowspan: number) {
190
+ if (rowspan <= 1) return;
191
+ nileGrid.cellHeight ||= el.getBoundingClientRect().height;
192
+ el.style.position = 'absolute';
193
+ el.style.height = `${nileGrid.cellHeight * rowspan}px`;
194
+ el.style.zIndex = '2';
195
+ }
196
+
197
+ /**
198
+ * @param el Grid item element
199
+ * @param cStart Starting column index
200
+ * @param cEnd Ending column index
201
+ * @param rStart Starting row index
202
+ * @param rowspan Row span value
203
+ */
204
+ function setGridPosition(
205
+ el: HTMLElement,
206
+ cStart: number,
207
+ cEnd: number,
208
+ rStart: number,
209
+ rowspan: number
210
+ ) {
211
+ const rEnd = rStart + rowspan;
212
+ el.style.gridColumn = `${cStart} / ${cEnd}`;
213
+ el.style.gridRow = `${rStart} / ${rEnd}`;
214
+ (el as any).dataset.cStart = String(cStart);
215
+ }
216
+
217
+ /**
218
+ * @param el Grid item element
219
+ * @param cStart Column start index
220
+ * @param opts Sticky configuration options
221
+ * @param stickyLeftIndexes Left sticky indexes
222
+ * @param stickyRightIndexes Right sticky indexes
223
+ * @param columnWidths Array of column widths
224
+ */
225
+ function handleSticky(
226
+ el: HTMLElement,
227
+ cStart: number,
228
+ opts: { useStickyAttr?: boolean },
229
+ stickyLeftIndexes: number[],
230
+ stickyRightIndexes: number[],
231
+ columnWidths: number[]
232
+ ) {
233
+ if (opts.useStickyAttr && el.getAttribute('sticky') === "left" && !stickyLeftIndexes.includes(cStart - 1)) {
234
+ stickyLeftIndexes.push(cStart - 1);
235
+ }
236
+ if (opts.useStickyAttr && el.getAttribute('sticky') === "right" && !stickyRightIndexes.includes(cStart - 1)) {
237
+ stickyRightIndexes.push(cStart - 1);
238
+ }
239
+ applySticky(el, cStart - 1, stickyLeftIndexes, stickyRightIndexes, columnWidths);
240
+ }
241
+
242
+ /**
243
+ * @param carry Rowspan tracking array
244
+ */
245
+ function decrementCarry(carry: number[]) {
246
+ for (let i = 0; i < carry.length; i++) {
247
+ if (carry[i] > 0) {
248
+ carry[i]--;
249
+ }
250
+ }
251
+ }
252
+
253
+ /**
254
+ * @param el Target grid cell element
255
+ * @param colIndex Column index
256
+ * @param stickyLeftIndexes Sticky-left indexes
257
+ * @param stickyRightIndexes Sticky-right indexes
258
+ * @param columnWidths Column widths array
259
+ */
260
+ function applySticky(
261
+ el: HTMLElement,
262
+ colIndex: number,
263
+ stickyLeftIndexes: number[],
264
+ stickyRightIndexes: number[],
265
+ columnWidths: number[]
266
+ ) {
267
+ const onLeft = stickyLeftIndexes.includes(colIndex);
268
+ const onRight = stickyRightIndexes.includes(colIndex);
269
+ if (!onLeft && !onRight) return;
270
+
271
+ prepareStickyElement(el);
272
+ if (onLeft && !onRight) {
273
+ applyLeftSticky(el, colIndex, stickyLeftIndexes, columnWidths);
274
+ } else {
275
+ applyRightSticky(el, colIndex, stickyRightIndexes, columnWidths);
276
+ }
277
+ }
278
+
279
+ /**
280
+ * @param el Grid item element to prepare for sticky positioning
281
+ */
282
+ function prepareStickyElement(el: HTMLElement) {
283
+ el.style.position = 'sticky';
284
+ el.style.zIndex = '2';
285
+ el.style.left = '';
286
+ el.style.right = '';
287
+ el.removeAttribute('data-sticky');
288
+ }
289
+
290
+ /**
291
+ * @param el Target element
292
+ * @param colIndex Column index
293
+ * @param stickyLeftIndexes Sticky-left column indexes
294
+ * @param columnWidths Column width array
295
+ */
296
+ function applyLeftSticky(
297
+ el: HTMLElement,
298
+ colIndex: number,
299
+ stickyLeftIndexes: number[],
300
+ columnWidths: number[]
301
+ ) {
302
+ el.setAttribute('data-sticky', 'left');
303
+ const leftOrder = [...stickyLeftIndexes].sort((a, b) => a - b);
304
+ const pos = leftOrder.indexOf(colIndex);
305
+ const left = computeOffset(leftOrder, pos, columnWidths);
306
+ el.style.left = `${Math.max(0, Math.round(left))}px`;
307
+ }
308
+
309
+ /**
310
+ * @param el Target element
311
+ * @param colIndex Column index
312
+ * @param stickyRightIndexes Sticky-right indexes
313
+ * @param columnWidths Column widths array
314
+ */
315
+ function applyRightSticky(
316
+ el: HTMLElement,
317
+ colIndex: number,
318
+ stickyRightIndexes: number[],
319
+ columnWidths: number[]
320
+ ) {
321
+ el.setAttribute('data-sticky', 'right');
322
+ const rightOrder = [...stickyRightIndexes].sort((a, b) => b - a);
323
+ const pos = rightOrder.indexOf(colIndex);
324
+ const scrollbarComp = getScrollbarComp(el);
325
+ const right = computeOffset(rightOrder, pos, columnWidths, scrollbarComp);
326
+ el.style.right = `${Math.max(0, Math.round(right - 2))}px`;
327
+ }
328
+
329
+ /**
330
+ * @param nileGrid Grid instance to sync shadows for
331
+ */
332
+ export function syncStickyShadows(nileGrid: NileGrid) {
333
+ const { showRightOnLeftStickies, showLeftOnRightStickies } = getShadowStates(nileGrid);
334
+ const { head, body } = getHeadAndBody(nileGrid);
335
+
336
+ toggleStickyShadow(head, 'nile-grid-head-item', 'left', 'shadow-right', showRightOnLeftStickies);
337
+ toggleStickyShadow(body, 'nile-grid-cell-item', 'left', 'shadow-right', showRightOnLeftStickies);
338
+ toggleStickyShadow(head, 'nile-grid-head-item', 'right', 'shadow-left', showLeftOnRightStickies);
339
+ toggleStickyShadow(body, 'nile-grid-cell-item', 'right', 'shadow-left', showLeftOnRightStickies);
340
+ }
341
+
342
+ /**
343
+ * @param nileGrid Grid instance
344
+ * @returns Object containing booleans for left/right shadow visibility
345
+ */
346
+ function getShadowStates(nileGrid: NileGrid) {
347
+ const max = Math.max(0, nileGrid.scrollWidth - nileGrid.clientWidth);
348
+ return {
349
+ showRightOnLeftStickies: nileGrid.scrollLeft > 0,
350
+ showLeftOnRightStickies: nileGrid.scrollLeft < max
351
+ };
352
+ }
353
+
354
+ /**
355
+ * @param root Root element (head or body)
356
+ * @param tag Target tag selector
357
+ * @param side Sticky side ('left' or 'right')
358
+ * @param cls Shadow CSS class to toggle
359
+ * @param on Whether to apply or remove the shadow
360
+ */
361
+ function toggleStickyShadow(
362
+ root: HTMLElement | undefined,
363
+ tag: string,
364
+ side: 'left' | 'right',
365
+ cls: string,
366
+ on: boolean
367
+ ) {
368
+ if (!root) return;
369
+ const sel = `${tag}[data-sticky="${side}"]`;
370
+ root.querySelectorAll<HTMLElement>(sel).forEach(el => el.classList.toggle(cls, on));
371
+ }
372
+
373
+ /** rebuildTemplate
374
+ * @param colCount Number of columns
375
+ * @param columnWidths Array of explicit column widths (px)
376
+ * @returns CSS grid-template-columns string
377
+ */
378
+ export const rebuildTemplate = (
379
+ colCount: number,
380
+ columnWidths: number[]
381
+ ): string => {
382
+ const parts: string[] = [];
383
+
384
+ for (let i = 0; i < colCount; i++) {
385
+ const explicit = columnWidths[i];
386
+ if (i === colCount - 1) {
387
+ parts.push(`minmax(${explicit}px, auto)`);
388
+ } else {
389
+ parts.push(`${explicit}px`);
390
+ }
391
+ }
392
+ return parts.join(' ');
393
+ };
394
+
395
+ /** computeHeadLayout
396
+ * @param nileGrid Grid instance
397
+ * @param headRows Header rows (<nile-grid-row>[])
398
+ * @param carryHead Rowspan carry tracking array
399
+ * @param colCount Current column count
400
+ * @param stickyLeftIndexes Left-sticky indexes
401
+ * @param stickyRightIndexes Right-sticky indexes
402
+ * @param columnWidths Column widths array
403
+ * @returns Final column count after header layout
404
+ */
405
+ function computeHeadLayout(
406
+ nileGrid: NileGrid,
407
+ headRows: HTMLElement[],
408
+ carryHead: number[],
409
+ colCount: number,
410
+ stickyLeftIndexes: number[],
411
+ stickyRightIndexes: number[],
412
+ columnWidths: number[]
413
+ ): number {
414
+ return layoutRows(
415
+ nileGrid,
416
+ headRows,
417
+ carryHead,
418
+ colCount,
419
+ stickyLeftIndexes,
420
+ stickyRightIndexes,
421
+ columnWidths,
422
+ {
423
+ itemSelector: 'nile-grid-head-item',
424
+ useStickyAttr: true,
425
+ handleRowBg: false,
426
+ }
427
+ );
428
+ }
429
+
430
+ /** computeBodyLayout
431
+ * @param nileGrid Grid instance
432
+ * @param bodyRows Body rows (<nile-grid-row>[])
433
+ * @param carryBody Rowspan carry tracking array
434
+ * @param colCount Current column count
435
+ * @param stickyLeftIndexes Left-sticky indexes
436
+ * @param stickyRightIndexes Right-sticky indexes
437
+ * @param columnWidths Column widths array
438
+ * @returns Final column count after body layout
439
+ */
440
+ function computeBodyLayout(
441
+ nileGrid: NileGrid,
442
+ bodyRows: HTMLElement[],
443
+ carryBody: number[],
444
+ colCount: number,
445
+ stickyLeftIndexes: number[],
446
+ stickyRightIndexes: number[],
447
+ columnWidths: number[]
448
+ ): number {
449
+ return layoutRows(
450
+ nileGrid,
451
+ bodyRows,
452
+ carryBody,
453
+ colCount,
454
+ stickyLeftIndexes,
455
+ stickyRightIndexes,
456
+ columnWidths,
457
+ {
458
+ itemSelector: 'nile-grid-cell-item',
459
+ useStickyAttr: false,
460
+ handleRowBg: true,
461
+ }
462
+ );
463
+ }
464
+
465
+ /**
466
+ * @param nileGrid Grid container element
467
+ * @param colCount Total number of columns
468
+ * @param columnWidths Column width array
469
+ * @param headElement Header element for template update
470
+ */
471
+ export function applyColumnsTemplate(
472
+ nileGrid: NileGrid,
473
+ columnWidths: number[]
474
+ ) {
475
+ const cols = columnWidths
476
+ .map((w, idx) => {
477
+ if (idx === columnWidths.length - 1) {
478
+ return `minmax(${Math.round(w)}px, auto)`;
479
+ }
480
+ return `${Math.max(0, Math.round(w))}px`;
481
+ })
482
+ .join(' ');
483
+ nileGrid.style.setProperty('--nile-grid-columns', cols);
484
+ }
485
+
486
+ /**
487
+ * @param order Array of sticky column indexes
488
+ * @param pos Current position within order
489
+ * @param widths Column widths
490
+ * @param base Base offset value
491
+ * @returns Computed pixel offset
492
+ */
493
+ function computeOffset(
494
+ order: number[],
495
+ pos: number,
496
+ widths: number[],
497
+ base = 0
498
+ ) {
499
+ let total = base;
500
+ for (let i = 0; i < pos; i++) total += widths[order[i]] ?? 0;
501
+ return total;
502
+ }
503
+
504
+ /**
505
+ * @param nileGrid Grid instance
506
+ * @returns Head and body elements from the grid slot
507
+ */
508
+ function getHeadAndBody(nileGrid: NileGrid) {
509
+ if (!nileGrid.shadowRoot) return { head: undefined, body: undefined };
510
+ const assigned = nileGrid.slotEl.assignedElements();
511
+ const find = (tag: string) =>
512
+ assigned.find(n => n.tagName.toLowerCase() === tag) as HTMLElement | undefined;
513
+ return { head: find('nile-grid-head'), body: find('nile-grid-body') };
514
+ }
@@ -0,0 +1,143 @@
1
+ import { NileGrid } from './nile-grid';
2
+ import { HeadItemEl } from './nile-grid.types';
3
+ import { totalReducible, takeFromRight, giveToRight } from './nile-grid.width';
4
+ import { rebuildTemplate, syncStickyShadows, applyColumnsTemplate } from './nile-grid.layout';
5
+
6
+ /**
7
+ * @param minColumnWidth Minimum allowed column width
8
+ * @param resizeStart Guide line element (start)
9
+ * @param resizeEnd Guide line element (end)
10
+ * @param col Active column index
11
+ * @param scrollHeight Height to apply to guides
12
+ * @param columnWidths Current column widths
13
+ * @returns void
14
+ */
15
+ export const resizeLinesHandler = (
16
+ minColumnWidth: number,
17
+ resizeStart: HTMLElement,
18
+ resizeEnd: HTMLElement,
19
+ col: number,
20
+ scrollHeight: number,
21
+ columnWidths: number[],
22
+ ) => {
23
+ resizeStart.style.display = 'block';
24
+ resizeEnd.style.display = 'block';
25
+ resizeStart.style.height = scrollHeight + 'px';
26
+ resizeEnd.style.height = scrollHeight + 'px';
27
+ const floor = minColumnWidth;
28
+ const safe = (n: number) => Math.max(0, Math.round(n || 0));
29
+ const sum = (arr: number[], endExclusive: number) => safe(arr.slice(0, Math.max(0, endExclusive)).reduce((a, b) => a + (b || 0), 0));
30
+
31
+ const totalGridWidth = safe(columnWidths.reduce((a, b) => a + (b || 0), 0));
32
+ const baseLeft = sum(columnWidths, col);
33
+ const appliedColWidth = safe(Math.max(floor, columnWidths[col] ?? floor));
34
+ let handleLeft = baseLeft + appliedColWidth;
35
+
36
+ const minEdge = baseLeft + floor;
37
+ const maxEdge = totalGridWidth;
38
+ handleLeft = Math.min(Math.max(handleLeft, minEdge), maxEdge);
39
+ handleLeft = Math.max(handleLeft, 20);
40
+
41
+ resizeStart.style.left = `${handleLeft - 6}px`;
42
+ resizeEnd.style.left = `${handleLeft - 2}px`;
43
+ };
44
+
45
+ /**
46
+ * @param targetWidth New computed width in pixels
47
+ * @param min Minimum allowed width
48
+ * @param max Maximum allowed width
49
+ * @returns Adjusted column width
50
+ */
51
+ export function computeNewWidth(opts: {
52
+ target: HTMLElement;
53
+ col: number;
54
+ widthPx: number;
55
+ floor: number;
56
+ columnWidths: number[];
57
+ }) {
58
+ const { target, col, widthPx, floor, columnWidths } = opts;
59
+ const hasSpan =
60
+ !!target.getAttribute('colspan') &&
61
+ parseInt(target.getAttribute('colspan')!, 10) > 1;
62
+ const prevW = columnWidths[col] ?? floor;
63
+ const newWraw = hasSpan ? widthPx - (columnWidths[col - 1] ?? 0) : widthPx;
64
+ const newW = Math.max(
65
+ floor,
66
+ Math.round(Number.isFinite(newWraw) ? newWraw : prevW)
67
+ );
68
+ return { prevW, newW, delta0: newW - prevW };
69
+ }
70
+
71
+ /**
72
+ * @param columnWidths Current widths array
73
+ * @param containerWidth Container total width
74
+ */
75
+ export function resizeNoScroll(opts: {
76
+ grid: NileGrid;
77
+ col: number;
78
+ prevW: number;
79
+ newW: number;
80
+ floor: number;
81
+ }) {
82
+ const { grid, col, prevW, newW, floor } = opts;
83
+ let delta = newW - prevW;
84
+
85
+ if (delta > 0) {
86
+ const rightReducible = totalReducible(grid.columnWidths, col + 1, floor);
87
+ if (rightReducible <= 0) return;
88
+ delta = Math.min(delta, rightReducible);
89
+ grid.columnWidths[col] = prevW + delta;
90
+ if (delta > 0) takeFromRight(grid.columnWidths, col + 1, delta, floor);
91
+ } else {
92
+ if (col === grid.columnWidths.length - 1) return;
93
+ const shrink = -delta;
94
+ const newColW = Math.max(floor, prevW - shrink);
95
+ const actualShrink = prevW - newColW;
96
+ grid.columnWidths[col] = newColW;
97
+ const remaining = giveToRight(grid.columnWidths, col + 1, actualShrink);
98
+ if (remaining > 0) grid.columnWidths[col] = prevW;
99
+ }
100
+ }
101
+
102
+ /**
103
+ * @param columnWidths Current widths
104
+ * @param containerWidth Container width
105
+ */
106
+ export function resizeWithScroll(opts: {
107
+ grid: NileGrid;
108
+ col: number;
109
+ newW: number;
110
+ }) {
111
+ const { grid, col, newW } = opts;
112
+ grid.columnWidths[col] = newW;
113
+ }
114
+
115
+ /**
116
+ * @param el Target element within grid
117
+ * @returns Scrollbar width compensation value
118
+ */
119
+ export function getScrollbarComp(el: HTMLElement) {
120
+ const scroller = el.closest('nile-grid') as HTMLElement | null;
121
+ return scroller ? scroller.offsetWidth - scroller.clientWidth : 0;
122
+ }
123
+
124
+ /**
125
+ * @param nileGrid The parent grid
126
+ * @param columnWidths New column width array
127
+ */
128
+ export function applyAfterResize(grid: any, col: number) {
129
+ resizeLinesHandler(
130
+ grid.minColumnWidth,
131
+ grid.resizeStart,
132
+ grid.resizeEnd,
133
+ col,
134
+ grid.scrollHeight,
135
+ grid.columnWidths
136
+ );
137
+ grid.colTemplate = rebuildTemplate(
138
+ grid.columnWidths.length,
139
+ grid.columnWidths
140
+ );
141
+ syncStickyShadows(grid);
142
+ applyColumnsTemplate(grid, grid.columnWidths);
143
+ }