@toclocoinc/lattice-grid 1.66.0 → 1.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +1 -1
  2. package/angular/package.json +1 -1
  3. package/docs/API.html +70 -17
  4. package/docs/api-detail.html +4 -4
  5. package/lattice-grid.d.ts +9 -6
  6. package/lattice-grid.esm.min.js +12 -8
  7. package/lattice-grid.min.cjs +12 -8
  8. package/lattice-grid.min.js +12 -8
  9. package/modules/ai.d.ts +1 -1
  10. package/modules/ai.esm.min.js +3 -3
  11. package/modules/ai.min.cjs +3 -3
  12. package/modules/ai.min.js +3 -3
  13. package/modules/angular.d.ts +1 -1
  14. package/modules/angular.esm.min.js +3 -3
  15. package/modules/angular.min.cjs +3 -3
  16. package/modules/angular.min.js +3 -3
  17. package/modules/chart-alluvial.d.ts +1 -1
  18. package/modules/chart-alluvial.esm.min.js +1 -1
  19. package/modules/chart-alluvial.min.cjs +1 -1
  20. package/modules/chart-alluvial.min.js +1 -1
  21. package/modules/chart-arc.d.ts +1 -1
  22. package/modules/chart-arc.esm.min.js +1 -1
  23. package/modules/chart-arc.min.cjs +1 -1
  24. package/modules/chart-arc.min.js +1 -1
  25. package/modules/chart-bubblemap.d.ts +1 -1
  26. package/modules/chart-bubblemap.esm.min.js +1 -1
  27. package/modules/chart-bubblemap.min.cjs +1 -1
  28. package/modules/chart-bubblemap.min.js +1 -1
  29. package/modules/chart-bump.d.ts +1 -1
  30. package/modules/chart-bump.esm.min.js +1 -1
  31. package/modules/chart-bump.min.cjs +1 -1
  32. package/modules/chart-bump.min.js +1 -1
  33. package/modules/chart-calendar.d.ts +1 -1
  34. package/modules/chart-calendar.esm.min.js +1 -1
  35. package/modules/chart-calendar.min.cjs +1 -1
  36. package/modules/chart-calendar.min.js +1 -1
  37. package/modules/chart-decomposition.d.ts +1 -1
  38. package/modules/chart-decomposition.esm.min.js +1 -1
  39. package/modules/chart-decomposition.min.cjs +1 -1
  40. package/modules/chart-decomposition.min.js +1 -1
  41. package/modules/chart-diverging.d.ts +1 -1
  42. package/modules/chart-diverging.esm.min.js +1 -1
  43. package/modules/chart-diverging.min.cjs +1 -1
  44. package/modules/chart-diverging.min.js +1 -1
  45. package/modules/chart-dumbbell.d.ts +1 -1
  46. package/modules/chart-dumbbell.esm.min.js +1 -1
  47. package/modules/chart-dumbbell.min.cjs +1 -1
  48. package/modules/chart-dumbbell.min.js +1 -1
  49. package/modules/chart-fan.d.ts +1 -1
  50. package/modules/chart-fan.esm.min.js +1 -1
  51. package/modules/chart-fan.min.cjs +1 -1
  52. package/modules/chart-fan.min.js +1 -1
  53. package/modules/chart-hexbin.d.ts +1 -1
  54. package/modules/chart-hexbin.esm.min.js +1 -1
  55. package/modules/chart-hexbin.min.cjs +1 -1
  56. package/modules/chart-hexbin.min.js +1 -1
  57. package/modules/chart-hexmap.d.ts +1 -1
  58. package/modules/chart-hexmap.esm.min.js +1 -1
  59. package/modules/chart-hexmap.min.cjs +1 -1
  60. package/modules/chart-hexmap.min.js +1 -1
  61. package/modules/chart-icicle.d.ts +1 -1
  62. package/modules/chart-icicle.esm.min.js +1 -1
  63. package/modules/chart-icicle.min.cjs +1 -1
  64. package/modules/chart-icicle.min.js +1 -1
  65. package/modules/chart-markermap.d.ts +1 -1
  66. package/modules/chart-markermap.esm.min.js +1 -1
  67. package/modules/chart-markermap.min.cjs +1 -1
  68. package/modules/chart-markermap.min.js +1 -1
  69. package/modules/chart-parallel.d.ts +1 -1
  70. package/modules/chart-parallel.esm.min.js +1 -1
  71. package/modules/chart-parallel.min.cjs +1 -1
  72. package/modules/chart-parallel.min.js +1 -1
  73. package/modules/chart-ridgeline.d.ts +1 -1
  74. package/modules/chart-ridgeline.esm.min.js +1 -1
  75. package/modules/chart-ridgeline.min.cjs +1 -1
  76. package/modules/chart-ridgeline.min.js +1 -1
  77. package/modules/chart-roc.d.ts +1 -1
  78. package/modules/chart-roc.esm.min.js +1 -1
  79. package/modules/chart-roc.min.cjs +1 -1
  80. package/modules/chart-roc.min.js +1 -1
  81. package/modules/chart-slope.d.ts +1 -1
  82. package/modules/chart-slope.esm.min.js +1 -1
  83. package/modules/chart-slope.min.cjs +1 -1
  84. package/modules/chart-slope.min.js +1 -1
  85. package/modules/chart-splom.d.ts +1 -1
  86. package/modules/chart-splom.esm.min.js +1 -1
  87. package/modules/chart-splom.min.cjs +1 -1
  88. package/modules/chart-splom.min.js +1 -1
  89. package/modules/chart-waffle.d.ts +1 -1
  90. package/modules/chart-waffle.esm.min.js +1 -1
  91. package/modules/chart-waffle.min.cjs +1 -1
  92. package/modules/chart-waffle.min.js +1 -1
  93. package/modules/charts.d.ts +1 -1
  94. package/modules/charts.esm.min.js +3 -3
  95. package/modules/charts.min.cjs +3 -3
  96. package/modules/charts.min.js +3 -3
  97. package/modules/data-router.d.ts +8 -3
  98. package/modules/data-router.esm.min.js +28 -6
  99. package/modules/data-router.min.cjs +28 -6
  100. package/modules/data-router.min.js +28 -6
  101. package/modules/devtools.d.ts +1 -1
  102. package/modules/devtools.esm.min.js +1 -1
  103. package/modules/devtools.min.cjs +1 -1
  104. package/modules/devtools.min.js +1 -1
  105. package/modules/dhtmlx-compat.d.ts +1 -1
  106. package/modules/dhtmlx-compat.esm.min.js +3 -3
  107. package/modules/dhtmlx-compat.min.cjs +3 -3
  108. package/modules/dhtmlx-compat.min.js +3 -3
  109. package/modules/gantt.d.ts +8 -3
  110. package/modules/gantt.esm.min.js +27 -4
  111. package/modules/gantt.min.cjs +27 -4
  112. package/modules/gantt.min.js +27 -4
  113. package/modules/geo-europe-nuts.d.ts +1 -1
  114. package/modules/geo-europe-nuts.esm.min.js +1 -1
  115. package/modules/geo-uk.d.ts +1 -1
  116. package/modules/geo-uk.esm.min.js +1 -1
  117. package/modules/geo-us-states.d.ts +1 -1
  118. package/modules/geo-us-states.esm.min.js +1 -1
  119. package/modules/geo-world-110m.d.ts +1 -1
  120. package/modules/geo-world-110m.esm.min.js +1 -1
  121. package/modules/geo-world-50m.d.ts +1 -1
  122. package/modules/geo-world-50m.esm.min.js +1 -1
  123. package/modules/htmx.d.ts +1 -1
  124. package/modules/htmx.esm.min.js +12 -8
  125. package/modules/htmx.min.cjs +12 -8
  126. package/modules/htmx.min.js +12 -8
  127. package/modules/kanban.d.ts +10 -3
  128. package/modules/kanban.esm.min.js +24 -4
  129. package/modules/kanban.min.cjs +24 -4
  130. package/modules/kanban.min.js +24 -4
  131. package/modules/kpi.d.ts +10 -3
  132. package/modules/kpi.esm.min.js +27 -4
  133. package/modules/kpi.min.cjs +27 -4
  134. package/modules/kpi.min.js +27 -4
  135. package/modules/layout.d.ts +1 -1
  136. package/modules/layout.esm.min.js +3 -3
  137. package/modules/layout.min.cjs +3 -3
  138. package/modules/layout.min.js +3 -3
  139. package/modules/mock-socket.d.ts +1 -1
  140. package/modules/mock-socket.esm.min.js +1 -1
  141. package/modules/mock-socket.min.cjs +1 -1
  142. package/modules/mock-socket.min.js +1 -1
  143. package/modules/react.d.ts +1 -1
  144. package/modules/react.esm.min.js +3 -3
  145. package/modules/react.min.cjs +3 -3
  146. package/modules/react.min.js +3 -3
  147. package/modules/svelte.d.ts +1 -1
  148. package/modules/svelte.esm.min.js +3 -3
  149. package/modules/svelte.min.cjs +3 -3
  150. package/modules/svelte.min.js +3 -3
  151. package/modules/tabs.d.ts +1 -1
  152. package/modules/tabs.esm.min.js +3 -3
  153. package/modules/tabs.min.cjs +3 -3
  154. package/modules/tabs.min.js +3 -3
  155. package/modules/vue.d.ts +1 -1
  156. package/modules/vue.esm.min.js +3 -3
  157. package/modules/vue.min.cjs +3 -3
  158. package/modules/vue.min.js +3 -3
  159. package/modules/webcomponent.d.ts +1 -1
  160. package/modules/webcomponent.esm.min.js +12 -8
  161. package/modules/webcomponent.min.cjs +12 -8
  162. package/modules/webcomponent.min.js +12 -8
  163. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, gantt module
2
+ * Lattice Grid 1.67.0, gantt module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -52,12 +52,12 @@ Object.defineProperty(__exports,"frameBatched",{enumerable:true,get:function(){r
52
52
  Object.defineProperty(__exports,"settleDebounce",{enumerable:true,get:function(){return settleDebounce;}});
53
53
  Object.defineProperty(__exports,"whenIdle",{enumerable:true,get:function(){return whenIdle;}});
54
54
  Object.defineProperty(__exports,"uid",{enumerable:true,get:function(){return uid;}});
55
- const STAMPED_VERSION="1.66.0";
55
+ const STAMPED_VERSION="1.67.0";
56
56
  async function resolveVersion(){
57
57
  if(STAMPED_VERSION!=='0.0.0-source')return STAMPED_VERSION;
58
58
  return STAMPED_VERSION;
59
59
  }
60
- const VERSION="1.66.0";
60
+ const VERSION="1.67.0";
61
61
  const warned=new Set();
62
62
  const WARNED_LIMIT=2000;
63
63
  function rememberWarned(key){
@@ -4837,6 +4837,21 @@ Object.defineProperty(__exports,"importMSPDI",{enumerable:true,get:function(){re
4837
4837
  Object.defineProperty(__exports,"exportMSPDI",{enumerable:true,get:function(){return __m4["exportMSPDI"];}});
4838
4838
  Object.defineProperty(__exports,"computeEarnedValue",{enumerable:true,get:function(){return __m3["computeEarnedValue"];}});
4839
4839
  const GANTT_STATE_VERSION=1;
4840
+ function rowKeyTypeName(v){
4841
+ if(Array.isArray(v))return'array';
4842
+ if(v===null)return'null';
4843
+ return typeof v;
4844
+ }
4845
+ function assertGanttRowKeyFn(fn){
4846
+ return(row)=>{
4847
+ const key=fn(row);
4848
+ if(typeof key==='string')return key;
4849
+ if(typeof key==='number'&&Number.isFinite(key))return key;
4850
+ throw new Error(
4851
+ `lattice-gantt: rowKey function must return a string or number; got ${rowKeyTypeName(key)}.`,
4852
+ );
4853
+ };
4854
+ }
4840
4855
  function emitter(){
4841
4856
  const map=new Map();
4842
4857
  return{
@@ -4909,7 +4924,15 @@ const autoSchedule=!!opts.autoSchedule;
4909
4924
  const grid=opts.grid??null;
4910
4925
  const columns=opts.columns&&typeof opts.columns==='object'?{...opts.columns}:null;
4911
4926
  const fields=isObject(opts.fields)?{...opts.fields}:{};
4912
- const rowKeySpec=opts.rowKey??(typeof fields.id==='string'?fields.id:'id');
4927
+ if(opts.rowKey!==undefined&&typeof opts.rowKey!=='function'
4928
+ &&!(typeof opts.rowKey==='string'&&opts.rowKey.length>0)){
4929
+ throw new Error(
4930
+ 'lattice-gantt: rowKey must be a property name or a function; composite keys are not supported on tasks.',
4931
+ );
4932
+ }
4933
+ const rowKeySpec=typeof opts.rowKey==='function'
4934
+ ?assertGanttRowKeyFn(opts.rowKey)
4935
+ :(opts.rowKey??(typeof fields.id==='string'?fields.id:'id'));
4913
4936
  const keyOf=(row)=>String(typeof rowKeySpec==='function'?rowKeySpec(row):row[rowKeySpec]);
4914
4937
  if(fields.id===undefined){
4915
4938
  fields.id=(raw)=>{
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, gantt module
2
+ * Lattice Grid 1.67.0, gantt module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -54,12 +54,12 @@ Object.defineProperty(__exports,"frameBatched",{enumerable:true,get:function(){r
54
54
  Object.defineProperty(__exports,"settleDebounce",{enumerable:true,get:function(){return settleDebounce;}});
55
55
  Object.defineProperty(__exports,"whenIdle",{enumerable:true,get:function(){return whenIdle;}});
56
56
  Object.defineProperty(__exports,"uid",{enumerable:true,get:function(){return uid;}});
57
- const STAMPED_VERSION="1.66.0";
57
+ const STAMPED_VERSION="1.67.0";
58
58
  async function resolveVersion(){
59
59
  if(STAMPED_VERSION!=='0.0.0-source')return STAMPED_VERSION;
60
60
  return STAMPED_VERSION;
61
61
  }
62
- const VERSION="1.66.0";
62
+ const VERSION="1.67.0";
63
63
  const warned=new Set();
64
64
  const WARNED_LIMIT=2000;
65
65
  function rememberWarned(key){
@@ -4839,6 +4839,21 @@ Object.defineProperty(__exports,"importMSPDI",{enumerable:true,get:function(){re
4839
4839
  Object.defineProperty(__exports,"exportMSPDI",{enumerable:true,get:function(){return __m4["exportMSPDI"];}});
4840
4840
  Object.defineProperty(__exports,"computeEarnedValue",{enumerable:true,get:function(){return __m3["computeEarnedValue"];}});
4841
4841
  const GANTT_STATE_VERSION=1;
4842
+ function rowKeyTypeName(v){
4843
+ if(Array.isArray(v))return'array';
4844
+ if(v===null)return'null';
4845
+ return typeof v;
4846
+ }
4847
+ function assertGanttRowKeyFn(fn){
4848
+ return(row)=>{
4849
+ const key=fn(row);
4850
+ if(typeof key==='string')return key;
4851
+ if(typeof key==='number'&&Number.isFinite(key))return key;
4852
+ throw new Error(
4853
+ `lattice-gantt: rowKey function must return a string or number; got ${rowKeyTypeName(key)}.`,
4854
+ );
4855
+ };
4856
+ }
4842
4857
  function emitter(){
4843
4858
  const map=new Map();
4844
4859
  return{
@@ -4911,7 +4926,15 @@ const autoSchedule=!!opts.autoSchedule;
4911
4926
  const grid=opts.grid??null;
4912
4927
  const columns=opts.columns&&typeof opts.columns==='object'?{...opts.columns}:null;
4913
4928
  const fields=isObject(opts.fields)?{...opts.fields}:{};
4914
- const rowKeySpec=opts.rowKey??(typeof fields.id==='string'?fields.id:'id');
4929
+ if(opts.rowKey!==undefined&&typeof opts.rowKey!=='function'
4930
+ &&!(typeof opts.rowKey==='string'&&opts.rowKey.length>0)){
4931
+ throw new Error(
4932
+ 'lattice-gantt: rowKey must be a property name or a function; composite keys are not supported on tasks.',
4933
+ );
4934
+ }
4935
+ const rowKeySpec=typeof opts.rowKey==='function'
4936
+ ?assertGanttRowKeyFn(opts.rowKey)
4937
+ :(opts.rowKey??(typeof fields.id==='string'?fields.id:'id'));
4915
4938
  const keyOf=(row)=>String(typeof rowKeySpec==='function'?rowKeySpec(row):row[rowKeySpec]);
4916
4939
  if(fields.id===undefined){
4917
4940
  fields.id=(raw)=>{
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, gantt module
2
+ * Lattice Grid 1.67.0, gantt module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -54,12 +54,12 @@ Object.defineProperty(__exports,"frameBatched",{enumerable:true,get:function(){r
54
54
  Object.defineProperty(__exports,"settleDebounce",{enumerable:true,get:function(){return settleDebounce;}});
55
55
  Object.defineProperty(__exports,"whenIdle",{enumerable:true,get:function(){return whenIdle;}});
56
56
  Object.defineProperty(__exports,"uid",{enumerable:true,get:function(){return uid;}});
57
- const STAMPED_VERSION="1.66.0";
57
+ const STAMPED_VERSION="1.67.0";
58
58
  async function resolveVersion(){
59
59
  if(STAMPED_VERSION!=='0.0.0-source')return STAMPED_VERSION;
60
60
  return STAMPED_VERSION;
61
61
  }
62
- const VERSION="1.66.0";
62
+ const VERSION="1.67.0";
63
63
  const warned=new Set();
64
64
  const WARNED_LIMIT=2000;
65
65
  function rememberWarned(key){
@@ -4839,6 +4839,21 @@ Object.defineProperty(__exports,"importMSPDI",{enumerable:true,get:function(){re
4839
4839
  Object.defineProperty(__exports,"exportMSPDI",{enumerable:true,get:function(){return __m4["exportMSPDI"];}});
4840
4840
  Object.defineProperty(__exports,"computeEarnedValue",{enumerable:true,get:function(){return __m3["computeEarnedValue"];}});
4841
4841
  const GANTT_STATE_VERSION=1;
4842
+ function rowKeyTypeName(v){
4843
+ if(Array.isArray(v))return'array';
4844
+ if(v===null)return'null';
4845
+ return typeof v;
4846
+ }
4847
+ function assertGanttRowKeyFn(fn){
4848
+ return(row)=>{
4849
+ const key=fn(row);
4850
+ if(typeof key==='string')return key;
4851
+ if(typeof key==='number'&&Number.isFinite(key))return key;
4852
+ throw new Error(
4853
+ `lattice-gantt: rowKey function must return a string or number; got ${rowKeyTypeName(key)}.`,
4854
+ );
4855
+ };
4856
+ }
4842
4857
  function emitter(){
4843
4858
  const map=new Map();
4844
4859
  return{
@@ -4911,7 +4926,15 @@ const autoSchedule=!!opts.autoSchedule;
4911
4926
  const grid=opts.grid??null;
4912
4927
  const columns=opts.columns&&typeof opts.columns==='object'?{...opts.columns}:null;
4913
4928
  const fields=isObject(opts.fields)?{...opts.fields}:{};
4914
- const rowKeySpec=opts.rowKey??(typeof fields.id==='string'?fields.id:'id');
4929
+ if(opts.rowKey!==undefined&&typeof opts.rowKey!=='function'
4930
+ &&!(typeof opts.rowKey==='string'&&opts.rowKey.length>0)){
4931
+ throw new Error(
4932
+ 'lattice-gantt: rowKey must be a property name or a function; composite keys are not supported on tasks.',
4933
+ );
4934
+ }
4935
+ const rowKeySpec=typeof opts.rowKey==='function'
4936
+ ?assertGanttRowKeyFn(opts.rowKey)
4937
+ :(opts.rowKey??(typeof fields.id==='string'?fields.id:'id'));
4915
4938
  const keyOf=(row)=>String(typeof rowKeySpec==='function'?rowKeySpec(row):row[rowKeySpec]);
4916
4939
  if(fields.id===undefined){
4917
4940
  fields.id=(raw)=>{
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, geo-europe-nuts module type declarations
2
+ * Lattice Grid 1.67.0, geo-europe-nuts module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, geo-europe-nuts module
2
+ * Lattice Grid 1.67.0, geo-europe-nuts module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, geo-uk module type declarations
2
+ * Lattice Grid 1.67.0, geo-uk module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, geo-uk module
2
+ * Lattice Grid 1.67.0, geo-uk module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, geo-us-states module type declarations
2
+ * Lattice Grid 1.67.0, geo-us-states module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, geo-us-states module
2
+ * Lattice Grid 1.67.0, geo-us-states module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, geo-world-110m module type declarations
2
+ * Lattice Grid 1.67.0, geo-world-110m module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, geo-world-110m module
2
+ * Lattice Grid 1.67.0, geo-world-110m module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, geo-world-50m module type declarations
2
+ * Lattice Grid 1.67.0, geo-world-50m module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, geo-world-50m module
2
+ * Lattice Grid 1.67.0, geo-world-50m module
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */
package/modules/htmx.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Lattice Grid 1.66.0, htmx module type declarations
2
+ * Lattice Grid 1.67.0, htmx module type declarations
3
3
  * Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
4
4
  * https://latticegrid.dev
5
5
  */