apex-grid 3.5.0 → 3.6.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 (197) hide show
  1. package/CHANGELOG.md +338 -0
  2. package/LICENSE.md +125 -0
  3. package/README.md +64 -10
  4. package/components/cell.d.ts +30 -4
  5. package/components/cell.js +199 -53
  6. package/components/cell.js.map +1 -1
  7. package/components/filter-row.d.ts +2 -0
  8. package/components/filter-row.js +82 -28
  9. package/components/filter-row.js.map +1 -1
  10. package/components/grid.d.ts +146 -36
  11. package/components/grid.js +442 -103
  12. package/components/grid.js.map +1 -1
  13. package/components/group-header-row.js +28 -25
  14. package/components/group-header-row.js.map +1 -1
  15. package/components/header-row.d.ts +7 -5
  16. package/components/header-row.js +11 -9
  17. package/components/header-row.js.map +1 -1
  18. package/components/header.js +32 -20
  19. package/components/header.js.map +1 -1
  20. package/components/row.d.ts +19 -3
  21. package/components/row.js +69 -23
  22. package/components/row.js.map +1 -1
  23. package/components/toolbar.js +2 -1
  24. package/components/toolbar.js.map +1 -1
  25. package/components/virtualizer.d.ts +40 -0
  26. package/components/virtualizer.js +116 -5
  27. package/components/virtualizer.js.map +1 -1
  28. package/controllers/dom.d.ts +4 -4
  29. package/controllers/dom.js +40 -22
  30. package/controllers/dom.js.map +1 -1
  31. package/controllers/editing.d.ts +104 -37
  32. package/controllers/editing.js +230 -78
  33. package/controllers/editing.js.map +1 -1
  34. package/controllers/expansion.d.ts +14 -5
  35. package/controllers/expansion.js +24 -1
  36. package/controllers/expansion.js.map +1 -1
  37. package/controllers/filter.d.ts +10 -2
  38. package/controllers/filter.js +62 -17
  39. package/controllers/filter.js.map +1 -1
  40. package/controllers/history.d.ts +45 -8
  41. package/controllers/history.js +58 -20
  42. package/controllers/history.js.map +1 -1
  43. package/controllers/navigation.d.ts +67 -13
  44. package/controllers/navigation.js +191 -51
  45. package/controllers/navigation.js.map +1 -1
  46. package/controllers/pagination.d.ts +6 -0
  47. package/controllers/pagination.js +10 -2
  48. package/controllers/pagination.js.map +1 -1
  49. package/controllers/reorder.js +38 -22
  50. package/controllers/reorder.js.map +1 -1
  51. package/controllers/resize.d.ts +17 -2
  52. package/controllers/resize.js +16 -6
  53. package/controllers/resize.js.map +1 -1
  54. package/controllers/row-pin.d.ts +20 -2
  55. package/controllers/row-pin.js +16 -9
  56. package/controllers/row-pin.js.map +1 -1
  57. package/controllers/row-reorder.d.ts +31 -11
  58. package/controllers/row-reorder.js +117 -37
  59. package/controllers/row-reorder.js.map +1 -1
  60. package/controllers/selection.d.ts +11 -4
  61. package/controllers/selection.js +26 -11
  62. package/controllers/selection.js.map +1 -1
  63. package/controllers/sort.d.ts +22 -2
  64. package/controllers/sort.js +29 -23
  65. package/controllers/sort.js.map +1 -1
  66. package/controllers/state.d.ts +56 -7
  67. package/controllers/state.js +76 -6
  68. package/controllers/state.js.map +1 -1
  69. package/controllers/tree.d.ts +15 -10
  70. package/controllers/tree.js +0 -0
  71. package/controllers/tree.js.map +1 -1
  72. package/custom-elements.json +3156 -277
  73. package/docs/assets/hierarchy.js +1 -1
  74. package/docs/assets/highlight.css +15 -8
  75. package/docs/assets/navigation.js +1 -1
  76. package/docs/assets/search.js +1 -1
  77. package/docs/classes/ApexGrid.html +155 -81
  78. package/docs/classes/ApexGridPaginator.html +1 -1
  79. package/docs/classes/ApexGridToolbar.html +3 -3
  80. package/docs/functions/localize.html +2 -2
  81. package/docs/hierarchy.html +1 -1
  82. package/docs/index.html +74 -11
  83. package/docs/interfaces/ApexCellValidationFailedEvent.html +3 -2
  84. package/docs/interfaces/ApexCellValueChangedEvent.html +4 -2
  85. package/docs/interfaces/ApexCellValueChangingEvent.html +3 -2
  86. package/docs/interfaces/ApexGridEventMap.html +5 -2
  87. package/docs/interfaces/ApexRowEditEndedEvent.html +2 -1
  88. package/docs/interfaces/ApexRowEditStartedEvent.html +2 -1
  89. package/docs/interfaces/ApexRowMovingEvent.html +9 -3
  90. package/docs/interfaces/ApexRowPinningEvent.html +1 -1
  91. package/docs/interfaces/ApexTreeRowExpandedEvent.html +4 -1
  92. package/docs/interfaces/ApexTreeRowExpandingEvent.html +4 -1
  93. package/docs/interfaces/BaseApexCellContext.html +1 -1
  94. package/docs/interfaces/BaseApexEditorContext.html +1 -1
  95. package/docs/interfaces/BaseFilterExpression.html +2 -2
  96. package/docs/interfaces/CSVExportOptions.html +12 -4
  97. package/docs/interfaces/DataPipelineConfiguration.html +1 -1
  98. package/docs/interfaces/ExportOptions.html +5 -3
  99. package/docs/interfaces/GridExpansionConfiguration.html +6 -2
  100. package/docs/interfaces/GridRowReorderingConfiguration.html +1 -1
  101. package/docs/interfaces/PaginationState.html +1 -1
  102. package/docs/interfaces/SetStateResult.html +3 -2
  103. package/docs/interfaces/ValidatorContext.html +7 -2
  104. package/docs/media/_token-values.scss +118 -0
  105. package/docs/media/package.json +3 -2
  106. package/docs/modules.html +1 -1
  107. package/docs/types/ExportSource.html +6 -4
  108. package/docs/types/OperandKeys.html +9 -0
  109. package/docs/variables/EN_LOCALE.html +2 -2
  110. package/i18n/en.d.ts +5 -0
  111. package/i18n/en.js +5 -0
  112. package/i18n/en.js.map +1 -1
  113. package/i18n/es.js +5 -0
  114. package/i18n/es.js.map +1 -1
  115. package/internal/column-types.d.ts +27 -1
  116. package/internal/column-types.js +75 -49
  117. package/internal/column-types.js.map +1 -1
  118. package/internal/constants.d.ts +1 -2
  119. package/internal/constants.js +0 -4
  120. package/internal/constants.js.map +1 -1
  121. package/internal/document-styles.d.ts +30 -0
  122. package/internal/document-styles.js +48 -0
  123. package/internal/document-styles.js.map +1 -0
  124. package/internal/export.d.ts +39 -7
  125. package/internal/export.js +35 -34
  126. package/internal/export.js.map +1 -1
  127. package/internal/feature-module.d.ts +60 -3
  128. package/internal/feature-module.js +6 -0
  129. package/internal/feature-module.js.map +1 -1
  130. package/internal/index.d.ts +6 -4
  131. package/internal/index.js +5 -3
  132. package/internal/index.js.map +1 -1
  133. package/internal/normalize-case.d.ts +8 -1
  134. package/internal/normalize-case.js +3 -2
  135. package/internal/normalize-case.js.map +1 -1
  136. package/internal/state-snapshot.d.ts +60 -8
  137. package/internal/state-snapshot.js +87 -19
  138. package/internal/state-snapshot.js.map +1 -1
  139. package/internal/types.d.ts +17 -2
  140. package/internal/types.js.map +1 -1
  141. package/internal/utils.d.ts +34 -6
  142. package/internal/utils.js +30 -21
  143. package/internal/utils.js.map +1 -1
  144. package/internal/validators.js +1 -0
  145. package/internal/validators.js.map +1 -1
  146. package/operations/filter/operands/number.js +9 -6
  147. package/operations/filter/operands/number.js.map +1 -1
  148. package/operations/filter/operands/string.js +2 -3
  149. package/operations/filter/operands/string.js.map +1 -1
  150. package/operations/filter/types.d.ts +13 -1
  151. package/operations/filter/types.js.map +1 -1
  152. package/operations/filter.d.ts +6 -0
  153. package/operations/filter.js +23 -7
  154. package/operations/filter.js.map +1 -1
  155. package/operations/quick-filter.js +2 -5
  156. package/operations/quick-filter.js.map +1 -1
  157. package/operations/sort.d.ts +21 -2
  158. package/operations/sort.js +41 -14
  159. package/operations/sort.js.map +1 -1
  160. package/package.json +8 -3
  161. package/setup.d.ts +11 -0
  162. package/setup.js +9 -19
  163. package/setup.js.map +1 -1
  164. package/styles/_token-values.css.d.ts +1 -0
  165. package/styles/_token-values.css.js +3 -0
  166. package/styles/_token-values.css.js.map +1 -0
  167. package/styles/_tokens.css.js +1 -1
  168. package/styles/_tokens.css.js.map +1 -1
  169. package/styles/body-cell/body-cell.css.js +1 -1
  170. package/styles/body-cell/body-cell.css.js.map +1 -1
  171. package/styles/body-cell/cell-renderers.css.js +1 -1
  172. package/styles/body-cell/cell-renderers.css.js.map +1 -1
  173. package/styles/body-row/body-row.css.js +1 -1
  174. package/styles/body-row/body-row.css.js.map +1 -1
  175. package/styles/document-tokens.css.d.ts +1 -0
  176. package/styles/document-tokens.css.js +3 -0
  177. package/styles/document-tokens.css.js.map +1 -0
  178. package/styles/filter-row/filter-row.css.js +1 -1
  179. package/styles/filter-row/filter-row.css.js.map +1 -1
  180. package/styles/grid/_grid.base.css.js +1 -1
  181. package/styles/grid/_grid.base.css.js.map +1 -1
  182. package/styles/grid/grid.css.js +1 -1
  183. package/styles/grid/grid.css.js.map +1 -1
  184. package/styles/group-header-row/group-header-row.css.js +1 -1
  185. package/styles/group-header-row/group-header-row.css.js.map +1 -1
  186. package/styles/header-cell/header-cell.css.js +1 -1
  187. package/styles/header-cell/header-cell.css.js.map +1 -1
  188. package/styles/header-row/header-row.base.css.js +1 -1
  189. package/styles/header-row/header-row.base.css.js.map +1 -1
  190. package/styles/paginator/paginator.css.js +1 -1
  191. package/styles/paginator/paginator.css.js.map +1 -1
  192. package/styles/toolbar/toolbar.css.js +1 -1
  193. package/styles/toolbar/toolbar.css.js.map +1 -1
  194. package/tokens.css +78 -0
  195. package/LICENSE +0 -80
  196. package/docs/media/LICENSE +0 -80
  197. package/docs/media/_tokens.scss +0 -214
@@ -1 +1 @@
1
- {"version":3,"file":"string.js","sourceRoot":"","sources":["../../../../src/operations/filter/operands/string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAapE,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAqC;IAC9E,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,aAAc,EAAE,EAAE,CACtC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;KACpF;IACD,cAAc,EAAE;QACd,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,kBAAkB;QACzB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,aAAc,EAAE,EAAE,CACtC,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;KACrF;IACD,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAc,EAAE,EAAE,CAC5C,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;KAC5F;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAc,EAAE,EAAE,CAC5C,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;KAC1F;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,CAC3C,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC;KACpF;IAED,YAAY,EAAE;QACZ,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,CAC3C,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC;KACpF;IAED,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;KAC3D;IAED,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;KAC1D;CACF,CAAC,CAAC","sourcesContent":["import { isDefined } from '../../../internal/is-defined.js';\nimport { normalizeCase } from '../../../internal/normalize-case.js';\nimport type { FilterOperands } from '../types.js';\n\nexport type StringKeys =\n | 'contains'\n | 'doesNotContain'\n | 'startsWith'\n | 'endsWith'\n | 'equals'\n | 'doesNotEqual'\n | 'empty'\n | 'notEmpty';\n\nexport const StringOperands = Object.freeze<FilterOperands<string, StringKeys>>({\n contains: {\n name: 'contains',\n label: 'Contains',\n unary: false,\n logic: (target, term, caseSensitive?) =>\n normalizeCase(target, caseSensitive).includes(normalizeCase(term, caseSensitive)),\n },\n doesNotContain: {\n name: 'doesNotContain',\n label: 'Does not contain',\n unary: false,\n logic: (target, term, caseSensitive?) =>\n !normalizeCase(target, caseSensitive).includes(normalizeCase(term, caseSensitive)),\n },\n startsWith: {\n name: 'startsWith',\n label: 'Starts with',\n unary: false,\n logic: (target, searchTerm, caseSensitive?) =>\n normalizeCase(target, caseSensitive).startsWith(normalizeCase(searchTerm, caseSensitive)),\n },\n endsWith: {\n name: 'endsWith',\n label: 'Ends with',\n unary: false,\n logic: (target, searchTerm, caseSensitive?) =>\n normalizeCase(target, caseSensitive).endsWith(normalizeCase(searchTerm, caseSensitive)),\n },\n equals: {\n name: 'equals',\n label: 'Equals',\n unary: false,\n logic: (target, searchTerm, caseSensitive) =>\n normalizeCase(target, caseSensitive) === normalizeCase(searchTerm, caseSensitive),\n },\n\n doesNotEqual: {\n name: 'doesNotEqual',\n label: 'Does not equal',\n unary: false,\n logic: (target, searchTerm, caseSensitive) =>\n normalizeCase(target, caseSensitive) !== normalizeCase(searchTerm, caseSensitive),\n },\n\n empty: {\n name: 'empty',\n label: 'Empty',\n unary: true,\n logic: (target) => !isDefined(target) || target.length < 1,\n },\n\n notEmpty: {\n name: 'notEmpty',\n label: 'Not empty',\n unary: true,\n logic: (target) => isDefined(target) && target.length > 0,\n },\n});\n"]}
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../../../src/operations/filter/operands/string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAapE,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAqC;IAC9E,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,UAAU;QACjB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,aAAc,EAAE,EAAE,CACtC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;KACpF;IACD,cAAc,EAAE;QACd,IAAI,EAAE,gBAAgB;QACtB,KAAK,EAAE,kBAAkB;QACzB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,aAAc,EAAE,EAAE,CACtC,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;KACrF;IACD,UAAU,EAAE;QACV,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAc,EAAE,EAAE,CAC5C,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;KAC5F;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAc,EAAE,EAAE,CAC5C,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;KAC1F;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,CAC3C,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC;KACpF;IAED,YAAY,EAAE;QACZ,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,CAC3C,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC;KACpF;IAED,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;KAC1D;IAED,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;KAC1D;CACF,CAAC,CAAC","sourcesContent":["import { normalizeCase } from '../../../internal/normalize-case.js';\nimport type { FilterOperands } from '../types.js';\n\nexport type StringKeys =\n | 'contains'\n | 'doesNotContain'\n | 'startsWith'\n | 'endsWith'\n | 'equals'\n | 'doesNotEqual'\n | 'empty'\n | 'notEmpty';\n\nexport const StringOperands = Object.freeze<FilterOperands<string, StringKeys>>({\n contains: {\n name: 'contains',\n label: 'Contains',\n unary: false,\n logic: (target, term, caseSensitive?) =>\n normalizeCase(target, caseSensitive).includes(normalizeCase(term, caseSensitive)),\n },\n doesNotContain: {\n name: 'doesNotContain',\n label: 'Does not contain',\n unary: false,\n logic: (target, term, caseSensitive?) =>\n !normalizeCase(target, caseSensitive).includes(normalizeCase(term, caseSensitive)),\n },\n startsWith: {\n name: 'startsWith',\n label: 'Starts with',\n unary: false,\n logic: (target, searchTerm, caseSensitive?) =>\n normalizeCase(target, caseSensitive).startsWith(normalizeCase(searchTerm, caseSensitive)),\n },\n endsWith: {\n name: 'endsWith',\n label: 'Ends with',\n unary: false,\n logic: (target, searchTerm, caseSensitive?) =>\n normalizeCase(target, caseSensitive).endsWith(normalizeCase(searchTerm, caseSensitive)),\n },\n equals: {\n name: 'equals',\n label: 'Equals',\n unary: false,\n logic: (target, searchTerm, caseSensitive) =>\n normalizeCase(target, caseSensitive) === normalizeCase(searchTerm, caseSensitive),\n },\n\n doesNotEqual: {\n name: 'doesNotEqual',\n label: 'Does not equal',\n unary: false,\n logic: (target, searchTerm, caseSensitive) =>\n normalizeCase(target, caseSensitive) !== normalizeCase(searchTerm, caseSensitive),\n },\n\n empty: {\n name: 'empty',\n label: 'Empty',\n unary: true,\n logic: (target) => normalizeCase(target, true).length < 1,\n },\n\n notEmpty: {\n name: 'notEmpty',\n label: 'Not empty',\n unary: true,\n logic: (target) => normalizeCase(target, true).length > 0,\n },\n});\n"]}
@@ -54,4 +54,16 @@ export interface BaseFilterExpression<T, K extends Keys<T> = Keys<T>> {
54
54
  * See {@link BaseFilterExpression} for the full documentation.
55
55
  */
56
56
  export type FilterExpression<T, K extends Keys<T> = Keys<T>> = K extends Keys<T> ? BaseFilterExpression<T, K> : never;
57
- export type OperandKeys<Type> = Type extends number ? keyof typeof NumberOperands : Type extends string ? keyof typeof StringOperands : Type extends boolean ? keyof typeof BooleanOperands : Type;
57
+ /**
58
+ * The operand names a filter `condition` may use for a value of `Type`.
59
+ *
60
+ * @remarks
61
+ * Any other value type (a `Date`, an array, an object) offers the string
62
+ * operand names, the set the grid applies to a column with no numeric or
63
+ * boolean type. `null` and `undefined` add no names, so a `number | null` or
64
+ * optional number field keeps the number operand names only. A field typed
65
+ * `unknown` (or `any`), such as every field of a `Record<string, unknown>`
66
+ * row, keeps every operand name: the grid picks the operands from the
67
+ * column type at runtime, which the value type does not tell.
68
+ */
69
+ export type OperandKeys<Type> = unknown extends Type ? keyof typeof NumberOperands | keyof typeof StringOperands | keyof typeof BooleanOperands : Type extends null | undefined ? never : Type extends number ? keyof typeof NumberOperands : Type extends string ? keyof typeof StringOperands : Type extends boolean ? keyof typeof BooleanOperands : keyof typeof StringOperands;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/operations/filter/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Keys } from '../../internal/types.js';\nimport type { BooleanOperands } from './operands/boolean.js';\nimport type { NumberOperands } from './operands/number.js';\nimport type { StringOperands } from './operands/string.js';\n\n/**\n * Controls how a data record should resolve in a filter operation:\n * - `'and'` - the record must pass all the conditions.\n * - `'or'` - the record must pass at least one condition.\n */\nexport type FilterCriteria = 'and' | 'or';\n\nexport type FilterOperationLogic<T> = (\n target: T,\n searchTerm: T,\n caseSensitive?: boolean\n) => boolean;\n\nexport interface FilterOperation<T> {\n name: string;\n label?: string;\n unary: boolean;\n logic: FilterOperationLogic<T>;\n}\n\nexport type FilterOperands<DataType, Operands extends string> = {\n [key in Operands]: FilterOperation<DataType>;\n};\n\n/**\n * Represents a filter operation for a given column.\n */\nexport interface BaseFilterExpression<T, K extends Keys<T> = Keys<T>> {\n /**\n * The target column for the filter operation.\n */\n key: K;\n /**\n * The filter function which will be executed against the data records.\n */\n condition: FilterOperation<T[K]> | OperandKeys<T[K]>;\n\n /**\n * The filtering value used in the filter condition function.\n *\n * @remarks\n * Optional for unary conditions.\n */\n searchTerm?: T[K];\n /**\n * Dictates how this expression should resolve in the filter operation in relation to\n * other expressions.\n */\n criteria?: FilterCriteria;\n /**\n * Whether the sort operation should be case sensitive.\n *\n * @remarks\n * If not provided, the value is resolved based on the column filter configuration (if any).\n */\n caseSensitive?: boolean;\n}\n\n/**\n * See {@link BaseFilterExpression} for the full documentation.\n */\nexport type FilterExpression<T, K extends Keys<T> = Keys<T>> =\n K extends Keys<T> ? BaseFilterExpression<T, K> : never;\n\nexport type OperandKeys<Type> = Type extends number\n ? keyof typeof NumberOperands\n : Type extends string\n ? keyof typeof StringOperands\n : Type extends boolean\n ? keyof typeof BooleanOperands\n : Type;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/operations/filter/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Keys } from '../../internal/types.js';\nimport type { BooleanOperands } from './operands/boolean.js';\nimport type { NumberOperands } from './operands/number.js';\nimport type { StringOperands } from './operands/string.js';\n\n/**\n * Controls how a data record should resolve in a filter operation:\n * - `'and'` - the record must pass all the conditions.\n * - `'or'` - the record must pass at least one condition.\n */\nexport type FilterCriteria = 'and' | 'or';\n\nexport type FilterOperationLogic<T> = (\n target: T,\n searchTerm: T,\n caseSensitive?: boolean\n) => boolean;\n\nexport interface FilterOperation<T> {\n name: string;\n label?: string;\n unary: boolean;\n logic: FilterOperationLogic<T>;\n}\n\nexport type FilterOperands<DataType, Operands extends string> = {\n [key in Operands]: FilterOperation<DataType>;\n};\n\n/**\n * Represents a filter operation for a given column.\n */\nexport interface BaseFilterExpression<T, K extends Keys<T> = Keys<T>> {\n /**\n * The target column for the filter operation.\n */\n key: K;\n /**\n * The filter function which will be executed against the data records.\n */\n condition: FilterOperation<T[K]> | OperandKeys<T[K]>;\n\n /**\n * The filtering value used in the filter condition function.\n *\n * @remarks\n * Optional for unary conditions.\n */\n searchTerm?: T[K];\n /**\n * Dictates how this expression should resolve in the filter operation in relation to\n * other expressions.\n */\n criteria?: FilterCriteria;\n /**\n * Whether the sort operation should be case sensitive.\n *\n * @remarks\n * If not provided, the value is resolved based on the column filter configuration (if any).\n */\n caseSensitive?: boolean;\n}\n\n/**\n * See {@link BaseFilterExpression} for the full documentation.\n */\nexport type FilterExpression<T, K extends Keys<T> = Keys<T>> =\n K extends Keys<T> ? BaseFilterExpression<T, K> : never;\n\n/**\n * The operand names a filter `condition` may use for a value of `Type`.\n *\n * @remarks\n * Any other value type (a `Date`, an array, an object) offers the string\n * operand names, the set the grid applies to a column with no numeric or\n * boolean type. `null` and `undefined` add no names, so a `number | null` or\n * optional number field keeps the number operand names only. A field typed\n * `unknown` (or `any`), such as every field of a `Record<string, unknown>`\n * row, keeps every operand name: the grid picks the operands from the\n * column type at runtime, which the value type does not tell.\n */\nexport type OperandKeys<Type> = unknown extends Type\n ? keyof typeof NumberOperands | keyof typeof StringOperands | keyof typeof BooleanOperands\n : Type extends null | undefined\n ? never\n : Type extends number\n ? keyof typeof NumberOperands\n : Type extends string\n ? keyof typeof StringOperands\n : Type extends boolean\n ? keyof typeof BooleanOperands\n : keyof typeof StringOperands;\n"]}
@@ -3,6 +3,12 @@ import type { FilterState } from './filter/state.js';
3
3
  import type { FilterExpression } from './filter/types.js';
4
4
  export default class FilterDataOperation<T extends object> extends DataOperation<T> {
5
5
  protected resolveFilter(record: T, expr: FilterExpression<T>): boolean;
6
+ /**
7
+ * Whether `record` passes one column's expressions: all of its `and`
8
+ * expressions (when it has any) or any one of its `or` expressions. Criteria
9
+ * never reach across columns, so each column is matched on its own.
10
+ */
6
11
  protected match(record: T, ands: FilterExpression<T>[], ors: FilterExpression<T>[]): boolean;
12
+ /** Keeps the records that pass every filtered column. */
7
13
  apply(data: T[], state: FilterState<T>): T[];
8
14
  }
@@ -5,18 +5,34 @@ export default class FilterDataOperation extends DataOperation {
5
5
  return condition.logic(this.resolveValue(record, expr.key), expr.searchTerm, expr.caseSensitive);
6
6
  }
7
7
  match(record, ands, ors) {
8
- for (const or of ors) {
9
- if (this.resolveFilter(record, or)) {
10
- return this.match(record, ands.filter((f) => f.key !== or.key), []);
11
- }
8
+ if (ands.length === 0 && ors.length === 0)
9
+ return true;
10
+ if (ands.length > 0) {
11
+ let all = true;
12
+ for (let i = 0; i < ands.length && all; i++)
13
+ all = this.resolveFilter(record, ands[i]);
14
+ if (all)
15
+ return true;
16
+ }
17
+ for (let i = 0; i < ors.length; i++) {
18
+ if (this.resolveFilter(record, ors[i]))
19
+ return true;
12
20
  }
13
- return ands.every((f) => this.resolveFilter(record, f));
21
+ return false;
14
22
  }
15
23
  apply(data, state) {
16
24
  if (state.empty)
17
25
  return data;
18
- const { ands, ors } = state;
19
- return data.filter((record) => this.match(record, ands, ors));
26
+ const trees = state.values;
27
+ const ands = trees.map((tree) => tree.ands);
28
+ const ors = trees.map((tree) => tree.ors);
29
+ return data.filter((record) => {
30
+ for (let i = 0; i < trees.length; i++) {
31
+ if (!this.match(record, ands[i], ors[i]))
32
+ return false;
33
+ }
34
+ return true;
35
+ });
20
36
  }
21
37
  }
22
38
  //# sourceMappingURL=filter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/operations/filter.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,WAAW,CAAC;AAItC,MAAM,CAAC,OAAO,OAAO,mBAAsC,SAAQ,aAAgB;IACvE,aAAa,CAAC,MAAS,EAAE,IAAyB;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,SAA+B,CAAC;QACvD,OAAO,SAAS,CAAC,KAAK,CAEpB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAM,EACxC,IAAI,CAAC,UAAe,EACpB,IAAI,CAAC,aAAa,CACnB,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,MAAS,EAAE,IAA2B,EAAE,GAA0B;QAChF,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC,KAAK,CACf,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,CAAC,EACpC,EAAE,CACH,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,IAAS,EAAE,KAAqB;QAC3C,IAAI,KAAK,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAE7B,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAChE,CAAC;CACF","sourcesContent":["import DataOperation from './base.js';\nimport type { FilterState } from './filter/state.js';\nimport type { FilterExpression, FilterOperation } from './filter/types.js';\n\nexport default class FilterDataOperation<T extends object> extends DataOperation<T> {\n protected resolveFilter(record: T, expr: FilterExpression<T>) {\n const condition = expr.condition as FilterOperation<T>;\n return condition.logic(\n // XXX: Types\n this.resolveValue(record, expr.key) as T,\n expr.searchTerm as T,\n expr.caseSensitive\n );\n }\n\n protected match(record: T, ands: FilterExpression<T>[], ors: FilterExpression<T>[]): boolean {\n for (const or of ors) {\n if (this.resolveFilter(record, or)) {\n return this.match(\n record,\n ands.filter((f) => f.key !== or.key),\n []\n );\n }\n }\n return ands.every((f) => this.resolveFilter(record, f));\n }\n\n public apply(data: T[], state: FilterState<T>): T[] {\n if (state.empty) return data;\n\n const { ands, ors } = state;\n return data.filter((record) => this.match(record, ands, ors));\n }\n}\n"]}
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/operations/filter.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,WAAW,CAAC;AAItC,MAAM,CAAC,OAAO,OAAO,mBAAsC,SAAQ,aAAgB;IACvE,aAAa,CAAC,MAAS,EAAE,IAAyB;QAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,SAA+B,CAAC;QACvD,OAAO,SAAS,CAAC,KAAK,CAEpB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAM,EACxC,IAAI,CAAC,UAAe,EACpB,IAAI,CAAC,aAAa,CACnB,CAAC;IACJ,CAAC;IAOS,KAAK,CAAC,MAAS,EAAE,IAA2B,EAAE,GAA0B;QAChF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACvD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,GAAG,GAAG,IAAI,CAAC;YACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,EAAE;gBAAE,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACvF,IAAI,GAAG;gBAAE,OAAO,IAAI,CAAC;QACvB,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;QACtD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAGM,KAAK,CAAC,IAAS,EAAE,KAAqB;QAC3C,IAAI,KAAK,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAG7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAC;YACzD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import DataOperation from './base.js';\nimport type { FilterState } from './filter/state.js';\nimport type { FilterExpression, FilterOperation } from './filter/types.js';\n\nexport default class FilterDataOperation<T extends object> extends DataOperation<T> {\n protected resolveFilter(record: T, expr: FilterExpression<T>) {\n const condition = expr.condition as FilterOperation<T>;\n return condition.logic(\n // XXX: Types\n this.resolveValue(record, expr.key) as T,\n expr.searchTerm as T,\n expr.caseSensitive\n );\n }\n\n /**\n * Whether `record` passes one column's expressions: all of its `and`\n * expressions (when it has any) or any one of its `or` expressions. Criteria\n * never reach across columns, so each column is matched on its own.\n */\n protected match(record: T, ands: FilterExpression<T>[], ors: FilterExpression<T>[]): boolean {\n if (ands.length === 0 && ors.length === 0) return true;\n if (ands.length > 0) {\n let all = true;\n for (let i = 0; i < ands.length && all; i++) all = this.resolveFilter(record, ands[i]);\n if (all) return true;\n }\n for (let i = 0; i < ors.length; i++) {\n if (this.resolveFilter(record, ors[i])) return true;\n }\n return false;\n }\n\n /** Keeps the records that pass every filtered column. */\n public apply(data: T[], state: FilterState<T>): T[] {\n if (state.empty) return data;\n\n // Split each column into its and / or lists once per apply, not per record.\n const trees = state.values;\n const ands = trees.map((tree) => tree.ands);\n const ors = trees.map((tree) => tree.ors);\n return data.filter((record) => {\n for (let i = 0; i < trees.length; i++) {\n if (!this.match(record, ands[i], ors[i])) return false;\n }\n return true;\n });\n }\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { normalizeCase } from '../internal/normalize-case.js';
1
2
  import DataOperation from './base.js';
2
3
  export default class QuickFilterDataOperation extends DataOperation {
3
4
  apply(data, searchTerm, columns) {
@@ -11,11 +12,7 @@ export default class QuickFilterDataOperation extends DataOperation {
11
12
  }
12
13
  return data.filter((record) => {
13
14
  for (const key of keys) {
14
- const value = record[key];
15
- if (value === null || value === undefined) {
16
- continue;
17
- }
18
- if (String(value).toLowerCase().includes(term)) {
15
+ if (normalizeCase(record[key]).includes(term)) {
19
16
  return true;
20
17
  }
21
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"quick-filter.js","sourceRoot":"","sources":["../../src/operations/quick-filter.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,WAAW,CAAC;AAWtC,MAAM,CAAC,OAAO,OAAO,wBAA2C,SAAQ,aAAgB;IAQ/E,KAAK,CAAC,IAAS,EAAE,UAAkB,EAAE,OAAsC;QAChF,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAc,CAAC,CAAC;QAE/F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC1B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC1C,SAAS;gBACX,CAAC;gBACD,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/C,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import type { ColumnConfiguration, Keys } from '../internal/types.js';\nimport DataOperation from './base.js';\n\n/**\n * Built-in quick-filter (global search) data operation.\n *\n * @remarks\n * Performs a case-insensitive substring match of the search term across every visible\n * column's stringified value. Returns the original dataset unchanged when the search\n * term is empty / whitespace-only. Used by the grid when `quickFilter` is set; the\n * search can be customised through {@link DataPipelineConfiguration.quickFilter}.\n */\nexport default class QuickFilterDataOperation<T extends object> extends DataOperation<T> {\n /**\n * Returns the records whose visible column values contain `searchTerm` (case-insensitive).\n *\n * @param data - The dataset to filter.\n * @param searchTerm - The trimmed search term (already normalised to lower-case is fine).\n * @param columns - The current column configuration; hidden columns are skipped.\n */\n public apply(data: T[], searchTerm: string, columns: Array<ColumnConfiguration<T>>): T[] {\n const term = searchTerm.trim().toLowerCase();\n if (!term) {\n return data;\n }\n\n const keys = columns.filter((column) => !column.hidden).map((column) => column.key as Keys<T>);\n\n if (keys.length === 0) {\n return data;\n }\n\n return data.filter((record) => {\n for (const key of keys) {\n const value = record[key];\n if (value === null || value === undefined) {\n continue;\n }\n if (String(value).toLowerCase().includes(term)) {\n return true;\n }\n }\n return false;\n });\n }\n}\n"]}
1
+ {"version":3,"file":"quick-filter.js","sourceRoot":"","sources":["../../src/operations/quick-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,OAAO,aAAa,MAAM,WAAW,CAAC;AAWtC,MAAM,CAAC,OAAO,OAAO,wBAA2C,SAAQ,aAAgB;IAQ/E,KAAK,CAAC,IAAS,EAAE,UAAkB,EAAE,OAAsC;QAChF,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAc,CAAC,CAAC;QAE/F,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9C,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import { normalizeCase } from '../internal/normalize-case.js';\nimport type { ColumnConfiguration, Keys } from '../internal/types.js';\nimport DataOperation from './base.js';\n\n/**\n * Built-in quick-filter (global search) data operation.\n *\n * @remarks\n * Performs a case-insensitive substring match of the search term across every visible\n * column's stringified value. Returns the original dataset unchanged when the search\n * term is empty / whitespace-only. Used by the grid when `quickFilter` is set; the\n * search can be customised through {@link DataPipelineConfiguration.quickFilter}.\n */\nexport default class QuickFilterDataOperation<T extends object> extends DataOperation<T> {\n /**\n * Returns the records whose visible column values contain `searchTerm` (case-insensitive).\n *\n * @param data - The dataset to filter.\n * @param searchTerm - The trimmed search term (already normalised to lower-case is fine).\n * @param columns - The current column configuration; hidden columns are skipped.\n */\n public apply(data: T[], searchTerm: string, columns: Array<ColumnConfiguration<T>>): T[] {\n const term = searchTerm.trim().toLowerCase();\n if (!term) {\n return data;\n }\n\n const keys = columns.filter((column) => !column.hidden).map((column) => column.key as Keys<T>);\n\n if (keys.length === 0) {\n return data;\n }\n\n return data.filter((record) => {\n for (const key of keys) {\n if (normalizeCase(record[key]).includes(term)) {\n return true;\n }\n }\n return false;\n });\n }\n}\n"]}
@@ -1,8 +1,27 @@
1
1
  import DataOperation from './base.js';
2
- import type { SortExpression, SortState } from './sort/types.js';
2
+ import type { SortState } from './sort/types.js';
3
+ /**
4
+ * Sorts rows by one or more sort expressions, in priority order.
5
+ *
6
+ * @remarks
7
+ * The built-in comparison (an expression without a `comparer`):
8
+ * - Empty cells, meaning `null`, `undefined`, `NaN` and invalid Dates, sort after every
9
+ * real value in both directions, and empties count as equal to each other.
10
+ * - Strings compare with `localeCompare`, case folded first unless `caseSensitive` is true.
11
+ * Other values compare with `<` and `>`.
12
+ *
13
+ * A custom `comparer` receives the raw cell values, empty ones and original casing
14
+ * included, and owns their order; a descending sort reverses its result.
15
+ *
16
+ * Rows that tie on every expression keep their incoming order, so the result is a stable
17
+ * total order. Each row's key is resolved once per expression before sorting, so case
18
+ * folding costs one call per row rather than one per comparison.
19
+ */
3
20
  export default class SortDataOperation<T> extends DataOperation<T> {
21
+ #private;
4
22
  protected orderBy: Map<string, number>;
5
23
  protected compareValues<U>(first: U, second: U): number;
6
- protected compareObjects(first: T, second: T, expression: SortExpression<T>): number;
24
+ /** The key the built-in comparison sorts by: case folded, Dates as time, empties as EMPTY. */
25
+ protected sortKey(value: unknown, caseSensitive?: boolean): {};
7
26
  apply(data: T[], state: SortState<T>): T[];
8
27
  }
@@ -1,4 +1,5 @@
1
1
  import DataOperation from './base.js';
2
+ const EMPTY = Symbol('empty');
2
3
  export default class SortDataOperation extends DataOperation {
3
4
  constructor() {
4
5
  super(...arguments);
@@ -13,24 +14,50 @@ export default class SortDataOperation extends DataOperation {
13
14
  }
14
15
  return first > second ? 1 : first < second ? -1 : 0;
15
16
  }
16
- compareObjects(first, second, expression) {
17
- const { direction, key, caseSensitive, comparer } = expression;
18
- const a = this.resolveCase(this.resolveValue(first, key), caseSensitive);
19
- const b = this.resolveCase(this.resolveValue(second, key), caseSensitive);
20
- return (this.orderBy.get(direction) * (comparer?.(a, b) ?? this.compareValues(a, b)));
17
+ sortKey(value, caseSensitive) {
18
+ const key = value instanceof Date ? value.getTime() : this.resolveCase(value, caseSensitive);
19
+ return key == null || Number.isNaN(key) ? EMPTY : key;
20
+ }
21
+ #rowCompare(data, expression, dir) {
22
+ const { key, caseSensitive, comparer } = expression;
23
+ const keys = data.map((row) => comparer
24
+ ? this.resolveValue(row, key)
25
+ : this.sortKey(this.resolveValue(row, key), caseSensitive));
26
+ if (comparer) {
27
+ return (x, y) => dir * comparer(keys[x], keys[y]);
28
+ }
29
+ return (x, y) => {
30
+ const a = keys[x];
31
+ const b = keys[y];
32
+ if (a === EMPTY || b === EMPTY) {
33
+ return a === b ? 0 : a === EMPTY ? 1 : -1;
34
+ }
35
+ return dir * this.compareValues(a, b);
36
+ };
21
37
  }
22
38
  apply(data, state) {
23
- const expressions = Array.from(state.values());
24
- const length = expressions.length;
25
- data.sort((a, b) => {
26
- let i = 0;
27
- let result = 0;
28
- while (i < length && !result) {
29
- result = this.compareObjects(a, b, expressions[i]);
30
- i++;
39
+ const compares = [];
40
+ for (const expression of state.values()) {
41
+ const dir = this.orderBy.get(expression.direction);
42
+ if (dir)
43
+ compares.push(this.#rowCompare(data, expression, dir));
44
+ }
45
+ if (!compares.length)
46
+ return data;
47
+ const length = compares.length;
48
+ const order = data.map((_, i) => i);
49
+ order.sort((x, y) => {
50
+ for (let i = 0; i < length; i++) {
51
+ const result = compares[i](x, y);
52
+ if (result)
53
+ return result;
31
54
  }
32
- return result;
55
+ return x - y;
33
56
  });
57
+ const rows = data.slice();
58
+ for (let i = 0; i < order.length; i++) {
59
+ data[i] = rows[order[i]];
60
+ }
34
61
  return data;
35
62
  }
36
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sort.js","sourceRoot":"","sources":["../../src/operations/sort.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,WAAW,CAAC;AAGtC,MAAM,CAAC,OAAO,OAAO,iBAAqB,SAAQ,aAAgB;IAAlE;;QACY,YAAO,GAAG,IAAI,GAAG,CACzB,MAAM,CAAC,OAAO,CAAC;YACb,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;IAuCJ,CAAC;IArCW,aAAa,CAAI,KAAQ,EAAE,MAAS;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAES,cAAc,CAAC,KAAQ,EAAE,MAAS,EAAE,UAA6B;QACzE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;QAE/D,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;QACzE,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;QAG1E,OAAO,CACL,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAQ,EAAE,CAAQ,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAC5F,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,IAAS,EAAE,KAAmB;QACzC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;QAElC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACjB,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,IAAI,MAAM,GAAG,CAAC,CAAC;YAEf,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC7B,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,CAAC,EAAE,CAAC;YACN,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import DataOperation from './base.js';\nimport type { SortExpression, SortState } from './sort/types.js';\n\nexport default class SortDataOperation<T> extends DataOperation<T> {\n protected orderBy = new Map(\n Object.entries({\n ascending: 1,\n descending: -1,\n })\n );\n\n protected compareValues<U>(first: U, second: U) {\n if (typeof first === 'string' && typeof second === 'string') {\n return first.localeCompare(second);\n }\n return first > second ? 1 : first < second ? -1 : 0;\n }\n\n protected compareObjects(first: T, second: T, expression: SortExpression<T>) {\n const { direction, key, caseSensitive, comparer } = expression;\n\n const a = this.resolveCase(this.resolveValue(first, key), caseSensitive);\n const b = this.resolveCase(this.resolveValue(second, key), caseSensitive);\n\n // TODO: Remove casting as any\n return (\n this.orderBy.get(direction)! * (comparer?.(a as any, b as any) ?? this.compareValues(a, b))\n );\n }\n\n public apply(data: T[], state: SortState<T>) {\n const expressions = Array.from(state.values());\n const length = expressions.length;\n\n data.sort((a, b) => {\n let i = 0;\n let result = 0;\n\n while (i < length && !result) {\n result = this.compareObjects(a, b, expressions[i]);\n i++;\n }\n\n return result;\n });\n\n return data;\n }\n}\n"]}
1
+ {"version":3,"file":"sort.js","sourceRoot":"","sources":["../../src/operations/sort.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,WAAW,CAAC;AAItC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;AAqB9B,MAAM,CAAC,OAAO,OAAO,iBAAqB,SAAQ,aAAgB;IAAlE;;QACY,YAAO,GAAG,IAAI,GAAG,CACzB,MAAM,CAAC,OAAO,CAAC;YACb,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC,CAAC;SACf,CAAC,CACH,CAAC;IA+DJ,CAAC;IA7DW,aAAa,CAAI,KAAQ,EAAE,MAAS;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC5D,OAAO,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IAGS,OAAO,CAAC,KAAc,EAAE,aAAuB;QACvD,MAAM,GAAG,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC7F,OAAO,GAAG,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,CAAC;IAED,WAAW,CAAC,IAAS,EAAE,UAA6B,EAAE,GAAW;QAC/D,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC5B,QAAQ;YACN,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC;YAC7B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,aAAa,CAAC,CAC7D,CAAC;QAEF,IAAI,QAAQ,EAAE,CAAC;YAEb,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAQ,EAAE,IAAI,CAAC,CAAC,CAAQ,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACd,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAElB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC/B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,CAAC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,IAAS,EAAE,KAAmB;QACzC,MAAM,QAAQ,GAAiB,EAAE,CAAC;QAClC,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,GAAG;gBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAElC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjC,IAAI,MAAM;oBAAE,OAAO,MAAM,CAAC;YAC5B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import DataOperation from './base.js';\nimport type { SortExpression, SortState } from './sort/types.js';\n\n/** Stands in for an empty cell (null, undefined, NaN, invalid Date) in a precomputed sort key. */\nconst EMPTY = Symbol('empty');\n\ntype RowCompare = (x: number, y: number) => number;\n\n/**\n * Sorts rows by one or more sort expressions, in priority order.\n *\n * @remarks\n * The built-in comparison (an expression without a `comparer`):\n * - Empty cells, meaning `null`, `undefined`, `NaN` and invalid Dates, sort after every\n * real value in both directions, and empties count as equal to each other.\n * - Strings compare with `localeCompare`, case folded first unless `caseSensitive` is true.\n * Other values compare with `<` and `>`.\n *\n * A custom `comparer` receives the raw cell values, empty ones and original casing\n * included, and owns their order; a descending sort reverses its result.\n *\n * Rows that tie on every expression keep their incoming order, so the result is a stable\n * total order. Each row's key is resolved once per expression before sorting, so case\n * folding costs one call per row rather than one per comparison.\n */\nexport default class SortDataOperation<T> extends DataOperation<T> {\n protected orderBy = new Map(\n Object.entries({\n ascending: 1,\n descending: -1,\n })\n );\n\n protected compareValues<U>(first: U, second: U) {\n if (typeof first === 'string' && typeof second === 'string') {\n return first.localeCompare(second);\n }\n return first > second ? 1 : first < second ? -1 : 0;\n }\n\n /** The key the built-in comparison sorts by: case folded, Dates as time, empties as EMPTY. */\n protected sortKey(value: unknown, caseSensitive?: boolean) {\n const key = value instanceof Date ? value.getTime() : this.resolveCase(value, caseSensitive);\n return key == null || Number.isNaN(key) ? EMPTY : key;\n }\n\n #rowCompare(data: T[], expression: SortExpression<T>, dir: number): RowCompare {\n const { key, caseSensitive, comparer } = expression;\n const keys = data.map((row) =>\n comparer\n ? this.resolveValue(row, key)\n : this.sortKey(this.resolveValue(row, key), caseSensitive)\n );\n\n if (comparer) {\n // TODO: Remove casting as any\n return (x, y) => dir * comparer(keys[x] as any, keys[y] as any);\n }\n\n return (x, y) => {\n const a = keys[x];\n const b = keys[y];\n // Empties sit after real values whatever the direction, so `dir` is not applied here.\n if (a === EMPTY || b === EMPTY) {\n return a === b ? 0 : a === EMPTY ? 1 : -1;\n }\n return dir * this.compareValues(a, b);\n };\n }\n\n public apply(data: T[], state: SortState<T>) {\n const compares: RowCompare[] = [];\n for (const expression of state.values()) {\n const dir = this.orderBy.get(expression.direction);\n if (dir) compares.push(this.#rowCompare(data, expression, dir));\n }\n if (!compares.length) return data;\n\n const length = compares.length;\n const order = data.map((_, i) => i);\n order.sort((x, y) => {\n for (let i = 0; i < length; i++) {\n const result = compares[i](x, y);\n if (result) return result;\n }\n return x - y;\n });\n\n const rows = data.slice();\n for (let i = 0; i < order.length; i++) {\n data[i] = rows[order[i]];\n }\n return data;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apex-grid",
3
- "version": "3.5.0",
3
+ "version": "3.6.0",
4
4
  "description": "Web component data grid following open-wc recommendations",
5
5
  "keywords": [
6
6
  "lit",
@@ -22,10 +22,15 @@
22
22
  "types": "./internal/index.d.ts",
23
23
  "default": "./internal/index.js"
24
24
  },
25
- "./styles.css": "./styles.css"
25
+ "./styles.css": "./styles.css",
26
+ "./tokens.css": "./tokens.css"
26
27
  },
27
28
  "type": "module",
28
- "sideEffects": false,
29
+ "sideEffects": [
30
+ "./define.js",
31
+ "./styles.css",
32
+ "./tokens.css"
33
+ ],
29
34
  "repository": {
30
35
  "type": "git",
31
36
  "url": "git+https://github.com/apexcharts/apex-grid.git"
package/setup.d.ts CHANGED
@@ -23,6 +23,17 @@ export interface ApexGridSetupOptions {
23
23
  * @defaultValue true
24
24
  */
25
25
  hostStyles?: boolean;
26
+ /**
27
+ * Whether the grid adopts its `--ag-*` token defaults into the document, on
28
+ * `:where(:root)` (zero specificity, so any value you set wins). They are what
29
+ * make `var(--ag-*)` readable from your own CSS. Set to `false` if you manage
30
+ * your own CSS, and load `apex-grid/tokens.css` (or your own values) instead.
31
+ * The grid renders the same either way: it carries the same defaults as
32
+ * fallbacks.
33
+ *
34
+ * @defaultValue true
35
+ */
36
+ tokenStyles?: boolean;
26
37
  }
27
38
  /**
28
39
  * One-call convenience: registers `<apex-grid>` and adopts a default host
package/setup.js CHANGED
@@ -1,21 +1,10 @@
1
1
  import { ApexGrid } from './components/grid.js';
2
- const HOST_CSS = 'apex-grid { height: 100%; min-height: 240px; }';
3
- let hostStylesInjected = false;
2
+ import { adoptOnce, documentStyleOptions, hostSizingCss } from './internal/document-styles.js';
4
3
  function adoptHostStyles() {
5
- if (hostStylesInjected || typeof document === 'undefined')
4
+ if (typeof document === 'undefined')
6
5
  return;
7
- if ('adoptedStyleSheets' in Document.prototype && 'replaceSync' in CSSStyleSheet.prototype) {
8
- const sheet = new CSSStyleSheet();
9
- sheet.replaceSync(HOST_CSS);
10
- document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];
11
- }
12
- else {
13
- const style = document.createElement('style');
14
- style.setAttribute('data-apex-grid', 'host-styles');
15
- style.textContent = HOST_CSS;
16
- document.head.appendChild(style);
17
- }
18
- hostStylesInjected = true;
6
+ documentStyleOptions.hostSizing = true;
7
+ adoptOnce(document, `host:${ApexGrid.tagName}`, hostSizingCss(ApexGrid.tagName));
19
8
  }
20
9
  let themeWarned = false;
21
10
  function warnThemeIsInert() {
@@ -28,12 +17,13 @@ function warnThemeIsInert() {
28
17
  'Call `configureTheme()` directly if you need it, and drop the option.');
29
18
  }
30
19
  export function setup(options = {}) {
31
- const { theme, hostStyles = true } = options;
32
- ApexGrid.register();
33
- if (theme !== undefined)
34
- warnThemeIsInert();
20
+ const { theme, hostStyles = true, tokenStyles = true } = options;
21
+ documentStyleOptions.tokens = tokenStyles;
35
22
  if (hostStyles) {
36
23
  adoptHostStyles();
37
24
  }
25
+ ApexGrid.register();
26
+ if (theme !== undefined)
27
+ warnThemeIsInert();
38
28
  }
39
29
  //# sourceMappingURL=setup.js.map
package/setup.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AA+BhD,MAAM,QAAQ,GAAG,gDAAgD,CAAC;AAClE,IAAI,kBAAkB,GAAG,KAAK,CAAC;AAE/B,SAAS,eAAe;IACtB,IAAI,kBAAkB,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAElE,IAAI,oBAAoB,IAAI,QAAQ,CAAC,SAAS,IAAI,aAAa,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;QAC3F,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;QAClC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5B,QAAQ,CAAC,kBAAkB,GAAG,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;QACpD,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,kBAAkB,GAAG,IAAI,CAAC;AAC5B,CAAC;AAED,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,SAAS,gBAAgB;IACvB,IAAI,WAAW;QAAE,OAAO;IACxB,WAAW,GAAG,IAAI,CAAC;IAEnB,OAAO,CAAC,IAAI,CACV,+EAA+E;QAC7E,iFAAiF;QACjF,kFAAkF;QAClF,uEAAuE,CAC1E,CAAC;AACJ,CAAC;AA0BD,MAAM,UAAU,KAAK,CAAC,UAAgC,EAAE;IACtD,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE7C,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAEpB,IAAI,KAAK,KAAK,SAAS;QAAE,gBAAgB,EAAE,CAAC;IAE5C,IAAI,UAAU,EAAE,CAAC;QACf,eAAe,EAAE,CAAC;IACpB,CAAC;AACH,CAAC","sourcesContent":["import { ApexGrid } from './components/grid.js';\n\ntype ApexGridTheme = 'bootstrap' | 'material' | 'fluent' | 'indigo';\n\nexport interface ApexGridSetupOptions {\n /**\n * @deprecated Inert, and accepted only so existing calls keep compiling.\n *\n * The grid never shipped its own per-framework themes — it styles itself\n * entirely through `--ag-*` CSS custom properties (see the README's theming\n * section), so this option never affected its appearance. It used to forward\n * to `configureTheme()` from `igniteui-webcomponents`, which made a whole\n * component library a runtime dependency of every consumer for one\n * pass-through call. The dependency is gone and so is the forwarding.\n *\n * If you were relying on that side effect to theme your own Ignite UI\n * components, call `configureTheme()` yourself. Passing this option now warns\n * once and does nothing else; it will be removed in the next major version.\n */\n theme?: ApexGridTheme;\n\n /**\n * Whether to adopt a default host stylesheet that sets `height: 100%`\n * with a `min-height: 240px` fallback. Set to `false` if you want to\n * provide your own host sizing.\n *\n * @defaultValue true\n */\n hostStyles?: boolean;\n}\n\nconst HOST_CSS = 'apex-grid { height: 100%; min-height: 240px; }';\nlet hostStylesInjected = false;\n\nfunction adoptHostStyles(): void {\n if (hostStylesInjected || typeof document === 'undefined') return;\n\n if ('adoptedStyleSheets' in Document.prototype && 'replaceSync' in CSSStyleSheet.prototype) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(HOST_CSS);\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n } else {\n const style = document.createElement('style');\n style.setAttribute('data-apex-grid', 'host-styles');\n style.textContent = HOST_CSS;\n document.head.appendChild(style);\n }\n\n hostStylesInjected = true;\n}\n\nlet themeWarned = false;\n\nfunction warnThemeIsInert(): void {\n if (themeWarned) return;\n themeWarned = true;\n // biome-ignore lint/suspicious/noConsole: intentional one-shot deprecation diagnostic\n console.warn(\n '[apex-grid] `setup({ theme })` is inert and will be removed. The grid styles ' +\n 'itself through `--ag-*` CSS custom properties; this option only ever forwarded ' +\n \"to igniteui-webcomponents' `configureTheme()`, which is no longer a dependency. \" +\n 'Call `configureTheme()` directly if you need it, and drop the option.'\n );\n}\n\n/**\n * One-call convenience: registers `<apex-grid>` and adopts a default host\n * stylesheet so the virtualizer has a bounded height. The grid is styled\n * out-of-the-box via `--ag-*` CSS custom properties — no theme import needed.\n *\n * @remarks\n * This is an **additive** alternative to the manual setup\n * (`import 'apex-grid/define'` + host CSS). Idempotent — safe to call more\n * than once; host styles are adopted only on the first call.\n *\n * Customize the look by overriding `--ag-*` CSS variables (see the README).\n * The deprecated {@link ApexGridSetupOptions.theme} option is inert.\n *\n * @example\n * ```ts\n * import { setup } from 'apex-grid';\n * setup();\n * ```\n *\n * @example Opt out of injected host styles:\n * ```ts\n * setup({ hostStyles: false });\n * ```\n */\nexport function setup(options: ApexGridSetupOptions = {}): void {\n const { theme, hostStyles = true } = options;\n\n ApexGrid.register();\n\n if (theme !== undefined) warnThemeIsInert();\n\n if (hostStyles) {\n adoptHostStyles();\n }\n}\n"]}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AA2C/F,SAAS,eAAe;IACtB,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAI5C,oBAAoB,CAAC,UAAU,GAAG,IAAI,CAAC;IACvC,SAAS,CAAC,QAAQ,EAAE,QAAQ,QAAQ,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACnF,CAAC;AAED,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,SAAS,gBAAgB;IACvB,IAAI,WAAW;QAAE,OAAO;IACxB,WAAW,GAAG,IAAI,CAAC;IAEnB,OAAO,CAAC,IAAI,CACV,+EAA+E;QAC7E,iFAAiF;QACjF,kFAAkF;QAClF,uEAAuE,CAC1E,CAAC;AACJ,CAAC;AA0BD,MAAM,UAAU,KAAK,CAAC,UAAgC,EAAE;IACtD,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAGjE,oBAAoB,CAAC,MAAM,GAAG,WAAW,CAAC;IAC1C,IAAI,UAAU,EAAE,CAAC;QACf,eAAe,EAAE,CAAC;IACpB,CAAC;IAED,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAEpB,IAAI,KAAK,KAAK,SAAS;QAAE,gBAAgB,EAAE,CAAC;AAC9C,CAAC","sourcesContent":["import { ApexGrid } from './components/grid.js';\nimport { adoptOnce, documentStyleOptions, hostSizingCss } from './internal/document-styles.js';\n\ntype ApexGridTheme = 'bootstrap' | 'material' | 'fluent' | 'indigo';\n\nexport interface ApexGridSetupOptions {\n /**\n * @deprecated Inert, and accepted only so existing calls keep compiling.\n *\n * The grid never shipped its own per-framework themes — it styles itself\n * entirely through `--ag-*` CSS custom properties (see the README's theming\n * section), so this option never affected its appearance. It used to forward\n * to `configureTheme()` from `igniteui-webcomponents`, which made a whole\n * component library a runtime dependency of every consumer for one\n * pass-through call. The dependency is gone and so is the forwarding.\n *\n * If you were relying on that side effect to theme your own Ignite UI\n * components, call `configureTheme()` yourself. Passing this option now warns\n * once and does nothing else; it will be removed in the next major version.\n */\n theme?: ApexGridTheme;\n\n /**\n * Whether to adopt a default host stylesheet that sets `height: 100%`\n * with a `min-height: 240px` fallback. Set to `false` if you want to\n * provide your own host sizing.\n *\n * @defaultValue true\n */\n hostStyles?: boolean;\n\n /**\n * Whether the grid adopts its `--ag-*` token defaults into the document, on\n * `:where(:root)` (zero specificity, so any value you set wins). They are what\n * make `var(--ag-*)` readable from your own CSS. Set to `false` if you manage\n * your own CSS, and load `apex-grid/tokens.css` (or your own values) instead.\n * The grid renders the same either way: it carries the same defaults as\n * fallbacks.\n *\n * @defaultValue true\n */\n tokenStyles?: boolean;\n}\n\nfunction adoptHostStyles(): void {\n if (typeof document === 'undefined') return;\n // Every grid adopts the sizing into the root it connects in (a page sheet\n // never reaches a grid inside a shadow root); the page gets it right away so\n // a grid already parsed into the document is sized before it connects.\n documentStyleOptions.hostSizing = true;\n adoptOnce(document, `host:${ApexGrid.tagName}`, hostSizingCss(ApexGrid.tagName));\n}\n\nlet themeWarned = false;\n\nfunction warnThemeIsInert(): void {\n if (themeWarned) return;\n themeWarned = true;\n // biome-ignore lint/suspicious/noConsole: intentional one-shot deprecation diagnostic\n console.warn(\n '[apex-grid] `setup({ theme })` is inert and will be removed. The grid styles ' +\n 'itself through `--ag-*` CSS custom properties; this option only ever forwarded ' +\n \"to igniteui-webcomponents' `configureTheme()`, which is no longer a dependency. \" +\n 'Call `configureTheme()` directly if you need it, and drop the option.'\n );\n}\n\n/**\n * One-call convenience: registers `<apex-grid>` and adopts a default host\n * stylesheet so the virtualizer has a bounded height. The grid is styled\n * out-of-the-box via `--ag-*` CSS custom properties — no theme import needed.\n *\n * @remarks\n * This is an **additive** alternative to the manual setup\n * (`import 'apex-grid/define'` + host CSS). Idempotent — safe to call more\n * than once; host styles are adopted only on the first call.\n *\n * Customize the look by overriding `--ag-*` CSS variables (see the README).\n * The deprecated {@link ApexGridSetupOptions.theme} option is inert.\n *\n * @example\n * ```ts\n * import { setup } from 'apex-grid';\n * setup();\n * ```\n *\n * @example Opt out of injected host styles:\n * ```ts\n * setup({ hostStyles: false });\n * ```\n */\nexport function setup(options: ApexGridSetupOptions = {}): void {\n const { theme, hostStyles = true, tokenStyles = true } = options;\n\n // Before registering: a grid already in the page connects during register().\n documentStyleOptions.tokens = tokenStyles;\n if (hostStyles) {\n adoptHostStyles();\n }\n\n ApexGrid.register();\n\n if (theme !== undefined) warnThemeIsInert();\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare const styles: import("lit").CSSResult;
@@ -0,0 +1,3 @@
1
+ import { css } from 'lit';
2
+ export const styles = css ``;
3
+ //# sourceMappingURL=_token-values.css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_token-values.css.js","sourceRoot":"","sources":["../../src/styles/_token-values.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA,EAAE,CAAC","sourcesContent":["import { css } from 'lit';\nexport const styles = css``;"]}
@@ -1,3 +1,3 @@
1
1
  import { css } from 'lit';
2
- export const styles = css `:host{--ag-brand: var(--ig-primary-500, #0d6fd3);--ag-brand-strong: var(--ig-primary-700, #0a56b8);--ag-brand-soft: color-mix(in srgb, var(--ag-brand) 10%, transparent);--ag-brand-softer: color-mix(in srgb, var(--ag-brand) 7%, transparent);--ag-brand-line: color-mix(in srgb, var(--ag-brand) 18%, transparent);--ag-hairline: rgb(15 23 42 / 8%);--ag-border: rgb(15 23 42 / 8%);--ag-pin-line: rgb(15 23 42 / 18%);--ag-header-separator: rgb(15 23 42 / 12%);--ag-row-hover: color-mix(in srgb, #0f172a 5%, var(--ag-surface));--ag-grid-bg: #fff;--ag-surface: #fff;--ag-surface-alt: var(--ag-surface);--ag-surface-elevated: #f8f9fb;--ag-text: #111827;--ag-text-body: #1f2937;--ag-text-muted: #6b7280;--ag-text-subtle: #9ca3af;--ag-text-on-brand: #fff;--ag-good: #10b981;--ag-good-text: #047857;--ag-good-soft: rgb(16 185 129 / 10%);--ag-watch: #f59e0b;--ag-watch-text: #b45309;--ag-watch-soft: rgb(245 158 11 / 10%);--ag-risk: #ef4444;--ag-risk-text: #b91c1c;--ag-risk-soft: rgb(239 68 68 / 10%);--ag-gold: #fef3c7;--ag-gold-line: #fde68a;--ag-gold-text: #92400e;--ag-shadow-card: 0 16px 38px rgb(15 23 42 / 12%), 0 0 0 1px rgb(15 23 42 / 6%), 0 1px 0 rgb(255 255 255 / 90%) inset;--ag-font: 'Inter', -apple-system, blinkmacsystemfont, sans-serif;--ag-fs-cell: 13px;--ag-fs-cell-secondary: 11.5px;--ag-fs-tiny: 10px;--ag-fw-regular: 500;--ag-fw-semibold: 600;--ag-fw-bold: 700;--ag-tracking-tight: -0.005em;--ag-tracking-header: 0.05em;--ag-leading: 1.4;--ag-cell-pad-x: 10px;--ag-row-h: 36px;--ag-header-h: 40px;--ag-toolbar-pad: 12px 14px;--ag-footer-pad: 10px 14px;--ag-radius: 8px;--ag-radius-sm: 6px;--ag-radius-xs: 4px;--ag-radius-pill: 20px;--ag-ease: cubic-bezier(0.2, 0.8, 0.2, 1);--ag-dur-fast: 120ms;--ag-dur-med: 180ms;--ag-dur-slow: 240ms}:host([theme~=dark]){--ag-brand: var(--ig-primary-500, #3b82f6);--ag-brand-strong: var(--ig-primary-400, #60a5fa);--ag-grid-bg: #0f172a;--ag-surface: #0f172a;--ag-surface-alt: var(--ag-surface);--ag-surface-elevated: #1e2532;--ag-hairline: rgb(255 255 255 / 12%);--ag-border: rgb(255 255 255 / 12%);--ag-pin-line: rgb(255 255 255 / 28%);--ag-header-separator: rgb(255 255 255 / 18%);--ag-row-hover: color-mix(in srgb, #fff 7%, var(--ag-surface));--ag-text: #f1f5f9;--ag-text-body: #e2e8f0;--ag-text-muted: #94a3b8;--ag-text-subtle: #64748b;--ag-good-text: #34d399;--ag-good-soft: rgb(16 185 129 / 18%);--ag-watch-text: #fbbf24;--ag-watch-soft: rgb(245 158 11 / 18%);--ag-risk-text: #f87171;--ag-risk-soft: rgb(239 68 68 / 18%);--ag-gold: rgb(245 158 11 / 16%);--ag-gold-line: rgb(245 158 11 / 35%);--ag-gold-text: #fcd34d;--ag-shadow-card: 0 16px 38px rgb(0 0 0 / 55%), 0 0 0 1px rgb(255 255 255 / 6%), 0 1px 0 rgb(255 255 255 / 4%) inset}:host([theme~=tinted]){--ag-surface-alt: color-mix(in srgb, var(--ag-brand) 4%, #fff);--ag-surface-elevated: color-mix(in srgb, var(--ag-brand) 11%, #fbfcfd);--ag-hairline: color-mix(in srgb, var(--ag-brand) 24%, rgb(15 23 42 / 7%));--ag-border: color-mix(in srgb, var(--ag-brand) 12%, transparent);--ag-row-hover: color-mix(in srgb, var(--ag-brand) 9%, var(--ag-surface));--ag-text-muted: color-mix(in srgb, var(--ag-brand) 32%, #6b7280)}:host([theme~=dark][theme~=tinted]){--ag-surface-alt: color-mix(in srgb, var(--ag-brand) 10%, #172033);--ag-surface-elevated: color-mix(in srgb, var(--ag-brand) 20%, #1e293b);--ag-hairline: color-mix(in srgb, var(--ag-brand) 30%, rgb(255 255 255 / 12%));--ag-border: color-mix(in srgb, var(--ag-brand) 16%, rgb(255 255 255 / 7%));--ag-row-hover: color-mix(in srgb, var(--ag-brand) 12%, var(--ag-surface));--ag-text-muted: color-mix(in srgb, var(--ag-brand) 28%, #94a3b8)}@media(prefers-reduced-motion: reduce){:host{--ag-dur-fast: 0ms;--ag-dur-med: 0ms;--ag-dur-slow: 0ms}}`;
2
+ export const styles = css `:host{--_ag-brand: var(--ag-brand, var(--ig-primary-500, #0d6fd3));--_ag-brand-strong: var(--ag-brand-strong, var(--ig-primary-700, #0a56b8));--_ag-hairline: var(--ag-hairline, rgba(15, 23, 42, 0.08));--_ag-border: var(--ag-border, rgba(15, 23, 42, 0.08));--_ag-pin-line: var(--ag-pin-line, rgba(15, 23, 42, 0.18));--_ag-header-separator: var(--ag-header-separator, rgba(15, 23, 42, 0.12));--_ag-grid-bg: var(--ag-grid-bg, #fff);--_ag-surface: var(--ag-surface, #fff);--_ag-surface-elevated: var(--ag-surface-elevated, #f8f9fb);--_ag-text: var(--ag-text, #111827);--_ag-text-body: var(--ag-text-body, #1f2937);--_ag-text-muted: var(--ag-text-muted, #6b7280);--_ag-text-subtle: var(--ag-text-subtle, #9ca3af);--_ag-text-on-brand: var(--ag-text-on-brand, #fff);--_ag-good: var(--ag-good, #10b981);--_ag-good-text: var(--ag-good-text, #047857);--_ag-good-soft: var(--ag-good-soft, rgba(16, 185, 129, 0.1));--_ag-watch: var(--ag-watch, #f59e0b);--_ag-watch-text: var(--ag-watch-text, #b45309);--_ag-watch-soft: var(--ag-watch-soft, rgba(245, 158, 11, 0.1));--_ag-risk: var(--ag-risk, #ef4444);--_ag-risk-text: var(--ag-risk-text, #b91c1c);--_ag-risk-soft: var(--ag-risk-soft, rgba(239, 68, 68, 0.1));--_ag-gold: var(--ag-gold, #fef3c7);--_ag-gold-line: var(--ag-gold-line, #fde68a);--_ag-gold-text: var(--ag-gold-text, #92400e);--_ag-shadow-card: var(--ag-shadow-card, 0 16px 38px rgba(15, 23, 42, 0.12), 0 0 0 1px rgba(15, 23, 42, 0.06), 0 1px 0 rgba(255, 255, 255, 0.9) inset);--_ag-font: var(--ag-font, Inter, -apple-system, blinkmacsystemfont, sans-serif);--_ag-fs-cell: var(--ag-fs-cell, 13px);--_ag-fs-cell-secondary: var(--ag-fs-cell-secondary, 11.5px);--_ag-fs-tiny: var(--ag-fs-tiny, 10px);--_ag-fw-regular: var(--ag-fw-regular, 500);--_ag-fw-semibold: var(--ag-fw-semibold, 600);--_ag-fw-bold: var(--ag-fw-bold, 700);--_ag-tracking-tight: var(--ag-tracking-tight, -0.005em);--_ag-tracking-header: var(--ag-tracking-header, 0.05em);--_ag-leading: var(--ag-leading, 1.4);--_ag-cell-pad-x: var(--ag-cell-pad-x, 10px);--_ag-row-h: var(--ag-row-h, 36px);--_ag-header-h: var(--ag-header-h, 40px);--_ag-toolbar-pad: var(--ag-toolbar-pad, 12px 14px);--_ag-footer-pad: var(--ag-footer-pad, 10px 14px);--_ag-radius: var(--ag-radius, 8px);--_ag-radius-sm: var(--ag-radius-sm, 6px);--_ag-radius-xs: var(--ag-radius-xs, 4px);--_ag-radius-pill: var(--ag-radius-pill, 20px);--_ag-ease: var(--ag-ease, cubic-bezier(0.2, 0.8, 0.2, 1));--_ag-dur-fast: var(--ag-dur-fast, 120ms);--_ag-dur-med: var(--ag-dur-med, 180ms);--_ag-dur-slow: var(--ag-dur-slow, 240ms);--_ag-brand-soft: var(--ag-brand-soft, color-mix(in srgb, var(--_ag-brand) 10%, transparent));--_ag-brand-softer: var(--ag-brand-softer, color-mix(in srgb, var(--_ag-brand) 7%, transparent));--_ag-brand-line: var(--ag-brand-line, color-mix(in srgb, var(--_ag-brand) 18%, transparent));--_ag-surface-alt: var(--ag-surface-alt, var(--_ag-surface));--_ag-row-hover: var(--ag-row-hover, color-mix(in srgb, #0f172a 5%, var(--_ag-surface)))}:host([theme~=dark]){--_ag-brand: var(--ag-brand, var(--ig-primary-500, #3b82f6));--_ag-brand-strong: var(--ag-brand-strong, var(--ig-primary-400, #60a5fa));--_ag-grid-bg: var(--ag-dark-grid-bg, #0f172a);--_ag-surface: var(--ag-dark-surface, #0f172a);--_ag-surface-elevated: var(--ag-dark-surface-elevated, #1e2532);--_ag-hairline: var(--ag-dark-hairline, rgba(255, 255, 255, 0.12));--_ag-border: var(--ag-dark-border, rgba(255, 255, 255, 0.12));--_ag-pin-line: var(--ag-dark-pin-line, rgba(255, 255, 255, 0.28));--_ag-header-separator: var(--ag-dark-header-separator, rgba(255, 255, 255, 0.18));--_ag-text: var(--ag-dark-text, #f1f5f9);--_ag-text-body: var(--ag-dark-text-body, #e2e8f0);--_ag-text-muted: var(--ag-dark-text-muted, #94a3b8);--_ag-text-subtle: var(--ag-dark-text-subtle, #64748b);--_ag-good-text: var(--ag-dark-good-text, #34d399);--_ag-good-soft: var(--ag-dark-good-soft, rgba(16, 185, 129, 0.18));--_ag-watch-text: var(--ag-dark-watch-text, #fbbf24);--_ag-watch-soft: var(--ag-dark-watch-soft, rgba(245, 158, 11, 0.18));--_ag-risk-text: var(--ag-dark-risk-text, #f87171);--_ag-risk-soft: var(--ag-dark-risk-soft, rgba(239, 68, 68, 0.18));--_ag-gold: var(--ag-dark-gold, rgba(245, 158, 11, 0.16));--_ag-gold-line: var(--ag-dark-gold-line, rgba(245, 158, 11, 0.35));--_ag-gold-text: var(--ag-dark-gold-text, #fcd34d);--_ag-shadow-card: var(--ag-dark-shadow-card, 0 16px 38px rgba(0, 0, 0, 0.55), 0 0 0 1px rgba(255, 255, 255, 0.06), 0 1px 0 rgba(255, 255, 255, 0.04) inset);--_ag-surface-alt: var(--ag-dark-surface-alt, var(--_ag-surface));--_ag-row-hover: var(--ag-dark-row-hover, color-mix(in srgb, #fff 7%, var(--_ag-surface)))}:host([theme~=tinted]){--_ag-surface-alt: var(--ag-surface-alt, color-mix(in srgb, var(--_ag-brand) 4%, var(--_ag-surface)));--_ag-surface-elevated: color-mix(in srgb, var(--_ag-brand) 11%, var(--ag-surface-elevated, #f8f9fb));--_ag-hairline: color-mix(in srgb, var(--_ag-brand) 24%, var(--ag-hairline, rgba(15, 23, 42, 0.08)));--_ag-border: color-mix(in srgb, var(--_ag-brand) 12%, transparent);--_ag-row-hover: var(--ag-row-hover, color-mix(in srgb, var(--_ag-brand) 9%, var(--_ag-surface)));--_ag-text-muted: color-mix(in srgb, var(--_ag-brand) 32%, var(--ag-text-muted, #6b7280))}:host([theme~=dark][theme~=tinted]){--_ag-surface-alt: var(--ag-dark-surface-alt, color-mix(in srgb, var(--_ag-brand) 10%, var(--_ag-surface)));--_ag-surface-elevated: color-mix(in srgb, var(--_ag-brand) 20%, var(--ag-dark-surface-elevated, #1e2532));--_ag-hairline: color-mix(in srgb, var(--_ag-brand) 30%, var(--ag-dark-hairline, rgba(255, 255, 255, 0.12)));--_ag-border: color-mix(in srgb, var(--_ag-brand) 16%, rgb(255 255 255 / 7%));--_ag-row-hover: var(--ag-dark-row-hover, color-mix(in srgb, var(--_ag-brand) 12%, var(--_ag-surface)));--_ag-text-muted: color-mix(in srgb, var(--_ag-brand) 28%, var(--ag-dark-text-muted, #94a3b8))}@media(prefers-reduced-motion: reduce){:host{--_ag-dur-fast: 0ms;--_ag-dur-med: 0ms;--_ag-dur-slow: 0ms}}`;
3
3
  //# sourceMappingURL=_tokens.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_tokens.css.js","sourceRoot":"","sources":["../../src/styles/_tokens.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA,knHAAknH,CAAC","sourcesContent":["import { css } from 'lit';\nexport const styles = css`:host{--ag-brand: var(--ig-primary-500, #0d6fd3);--ag-brand-strong: var(--ig-primary-700, #0a56b8);--ag-brand-soft: color-mix(in srgb, var(--ag-brand) 10%, transparent);--ag-brand-softer: color-mix(in srgb, var(--ag-brand) 7%, transparent);--ag-brand-line: color-mix(in srgb, var(--ag-brand) 18%, transparent);--ag-hairline: rgb(15 23 42 / 8%);--ag-border: rgb(15 23 42 / 8%);--ag-pin-line: rgb(15 23 42 / 18%);--ag-header-separator: rgb(15 23 42 / 12%);--ag-row-hover: color-mix(in srgb, #0f172a 5%, var(--ag-surface));--ag-grid-bg: #fff;--ag-surface: #fff;--ag-surface-alt: var(--ag-surface);--ag-surface-elevated: #f8f9fb;--ag-text: #111827;--ag-text-body: #1f2937;--ag-text-muted: #6b7280;--ag-text-subtle: #9ca3af;--ag-text-on-brand: #fff;--ag-good: #10b981;--ag-good-text: #047857;--ag-good-soft: rgb(16 185 129 / 10%);--ag-watch: #f59e0b;--ag-watch-text: #b45309;--ag-watch-soft: rgb(245 158 11 / 10%);--ag-risk: #ef4444;--ag-risk-text: #b91c1c;--ag-risk-soft: rgb(239 68 68 / 10%);--ag-gold: #fef3c7;--ag-gold-line: #fde68a;--ag-gold-text: #92400e;--ag-shadow-card: 0 16px 38px rgb(15 23 42 / 12%), 0 0 0 1px rgb(15 23 42 / 6%), 0 1px 0 rgb(255 255 255 / 90%) inset;--ag-font: 'Inter', -apple-system, blinkmacsystemfont, sans-serif;--ag-fs-cell: 13px;--ag-fs-cell-secondary: 11.5px;--ag-fs-tiny: 10px;--ag-fw-regular: 500;--ag-fw-semibold: 600;--ag-fw-bold: 700;--ag-tracking-tight: -0.005em;--ag-tracking-header: 0.05em;--ag-leading: 1.4;--ag-cell-pad-x: 10px;--ag-row-h: 36px;--ag-header-h: 40px;--ag-toolbar-pad: 12px 14px;--ag-footer-pad: 10px 14px;--ag-radius: 8px;--ag-radius-sm: 6px;--ag-radius-xs: 4px;--ag-radius-pill: 20px;--ag-ease: cubic-bezier(0.2, 0.8, 0.2, 1);--ag-dur-fast: 120ms;--ag-dur-med: 180ms;--ag-dur-slow: 240ms}:host([theme~=dark]){--ag-brand: var(--ig-primary-500, #3b82f6);--ag-brand-strong: var(--ig-primary-400, #60a5fa);--ag-grid-bg: #0f172a;--ag-surface: #0f172a;--ag-surface-alt: var(--ag-surface);--ag-surface-elevated: #1e2532;--ag-hairline: rgb(255 255 255 / 12%);--ag-border: rgb(255 255 255 / 12%);--ag-pin-line: rgb(255 255 255 / 28%);--ag-header-separator: rgb(255 255 255 / 18%);--ag-row-hover: color-mix(in srgb, #fff 7%, var(--ag-surface));--ag-text: #f1f5f9;--ag-text-body: #e2e8f0;--ag-text-muted: #94a3b8;--ag-text-subtle: #64748b;--ag-good-text: #34d399;--ag-good-soft: rgb(16 185 129 / 18%);--ag-watch-text: #fbbf24;--ag-watch-soft: rgb(245 158 11 / 18%);--ag-risk-text: #f87171;--ag-risk-soft: rgb(239 68 68 / 18%);--ag-gold: rgb(245 158 11 / 16%);--ag-gold-line: rgb(245 158 11 / 35%);--ag-gold-text: #fcd34d;--ag-shadow-card: 0 16px 38px rgb(0 0 0 / 55%), 0 0 0 1px rgb(255 255 255 / 6%), 0 1px 0 rgb(255 255 255 / 4%) inset}:host([theme~=tinted]){--ag-surface-alt: color-mix(in srgb, var(--ag-brand) 4%, #fff);--ag-surface-elevated: color-mix(in srgb, var(--ag-brand) 11%, #fbfcfd);--ag-hairline: color-mix(in srgb, var(--ag-brand) 24%, rgb(15 23 42 / 7%));--ag-border: color-mix(in srgb, var(--ag-brand) 12%, transparent);--ag-row-hover: color-mix(in srgb, var(--ag-brand) 9%, var(--ag-surface));--ag-text-muted: color-mix(in srgb, var(--ag-brand) 32%, #6b7280)}:host([theme~=dark][theme~=tinted]){--ag-surface-alt: color-mix(in srgb, var(--ag-brand) 10%, #172033);--ag-surface-elevated: color-mix(in srgb, var(--ag-brand) 20%, #1e293b);--ag-hairline: color-mix(in srgb, var(--ag-brand) 30%, rgb(255 255 255 / 12%));--ag-border: color-mix(in srgb, var(--ag-brand) 16%, rgb(255 255 255 / 7%));--ag-row-hover: color-mix(in srgb, var(--ag-brand) 12%, var(--ag-surface));--ag-text-muted: color-mix(in srgb, var(--ag-brand) 28%, #94a3b8)}@media(prefers-reduced-motion: reduce){:host{--ag-dur-fast: 0ms;--ag-dur-med: 0ms;--ag-dur-slow: 0ms}}`;"]}
1
+ {"version":3,"file":"_tokens.css.js","sourceRoot":"","sources":["../../src/styles/_tokens.css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1B,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA,s0LAAs0L,CAAC","sourcesContent":["import { css } from 'lit';\nexport const styles = css`:host{--_ag-brand: var(--ag-brand, var(--ig-primary-500, #0d6fd3));--_ag-brand-strong: var(--ag-brand-strong, var(--ig-primary-700, #0a56b8));--_ag-hairline: var(--ag-hairline, rgba(15, 23, 42, 0.08));--_ag-border: var(--ag-border, rgba(15, 23, 42, 0.08));--_ag-pin-line: var(--ag-pin-line, rgba(15, 23, 42, 0.18));--_ag-header-separator: var(--ag-header-separator, rgba(15, 23, 42, 0.12));--_ag-grid-bg: var(--ag-grid-bg, #fff);--_ag-surface: var(--ag-surface, #fff);--_ag-surface-elevated: var(--ag-surface-elevated, #f8f9fb);--_ag-text: var(--ag-text, #111827);--_ag-text-body: var(--ag-text-body, #1f2937);--_ag-text-muted: var(--ag-text-muted, #6b7280);--_ag-text-subtle: var(--ag-text-subtle, #9ca3af);--_ag-text-on-brand: var(--ag-text-on-brand, #fff);--_ag-good: var(--ag-good, #10b981);--_ag-good-text: var(--ag-good-text, #047857);--_ag-good-soft: var(--ag-good-soft, rgba(16, 185, 129, 0.1));--_ag-watch: var(--ag-watch, #f59e0b);--_ag-watch-text: var(--ag-watch-text, #b45309);--_ag-watch-soft: var(--ag-watch-soft, rgba(245, 158, 11, 0.1));--_ag-risk: var(--ag-risk, #ef4444);--_ag-risk-text: var(--ag-risk-text, #b91c1c);--_ag-risk-soft: var(--ag-risk-soft, rgba(239, 68, 68, 0.1));--_ag-gold: var(--ag-gold, #fef3c7);--_ag-gold-line: var(--ag-gold-line, #fde68a);--_ag-gold-text: var(--ag-gold-text, #92400e);--_ag-shadow-card: var(--ag-shadow-card, 0 16px 38px rgba(15, 23, 42, 0.12), 0 0 0 1px rgba(15, 23, 42, 0.06), 0 1px 0 rgba(255, 255, 255, 0.9) inset);--_ag-font: var(--ag-font, Inter, -apple-system, blinkmacsystemfont, sans-serif);--_ag-fs-cell: var(--ag-fs-cell, 13px);--_ag-fs-cell-secondary: var(--ag-fs-cell-secondary, 11.5px);--_ag-fs-tiny: var(--ag-fs-tiny, 10px);--_ag-fw-regular: var(--ag-fw-regular, 500);--_ag-fw-semibold: var(--ag-fw-semibold, 600);--_ag-fw-bold: var(--ag-fw-bold, 700);--_ag-tracking-tight: var(--ag-tracking-tight, -0.005em);--_ag-tracking-header: var(--ag-tracking-header, 0.05em);--_ag-leading: var(--ag-leading, 1.4);--_ag-cell-pad-x: var(--ag-cell-pad-x, 10px);--_ag-row-h: var(--ag-row-h, 36px);--_ag-header-h: var(--ag-header-h, 40px);--_ag-toolbar-pad: var(--ag-toolbar-pad, 12px 14px);--_ag-footer-pad: var(--ag-footer-pad, 10px 14px);--_ag-radius: var(--ag-radius, 8px);--_ag-radius-sm: var(--ag-radius-sm, 6px);--_ag-radius-xs: var(--ag-radius-xs, 4px);--_ag-radius-pill: var(--ag-radius-pill, 20px);--_ag-ease: var(--ag-ease, cubic-bezier(0.2, 0.8, 0.2, 1));--_ag-dur-fast: var(--ag-dur-fast, 120ms);--_ag-dur-med: var(--ag-dur-med, 180ms);--_ag-dur-slow: var(--ag-dur-slow, 240ms);--_ag-brand-soft: var(--ag-brand-soft, color-mix(in srgb, var(--_ag-brand) 10%, transparent));--_ag-brand-softer: var(--ag-brand-softer, color-mix(in srgb, var(--_ag-brand) 7%, transparent));--_ag-brand-line: var(--ag-brand-line, color-mix(in srgb, var(--_ag-brand) 18%, transparent));--_ag-surface-alt: var(--ag-surface-alt, var(--_ag-surface));--_ag-row-hover: var(--ag-row-hover, color-mix(in srgb, #0f172a 5%, var(--_ag-surface)))}:host([theme~=dark]){--_ag-brand: var(--ag-brand, var(--ig-primary-500, #3b82f6));--_ag-brand-strong: var(--ag-brand-strong, var(--ig-primary-400, #60a5fa));--_ag-grid-bg: var(--ag-dark-grid-bg, #0f172a);--_ag-surface: var(--ag-dark-surface, #0f172a);--_ag-surface-elevated: var(--ag-dark-surface-elevated, #1e2532);--_ag-hairline: var(--ag-dark-hairline, rgba(255, 255, 255, 0.12));--_ag-border: var(--ag-dark-border, rgba(255, 255, 255, 0.12));--_ag-pin-line: var(--ag-dark-pin-line, rgba(255, 255, 255, 0.28));--_ag-header-separator: var(--ag-dark-header-separator, rgba(255, 255, 255, 0.18));--_ag-text: var(--ag-dark-text, #f1f5f9);--_ag-text-body: var(--ag-dark-text-body, #e2e8f0);--_ag-text-muted: var(--ag-dark-text-muted, #94a3b8);--_ag-text-subtle: var(--ag-dark-text-subtle, #64748b);--_ag-good-text: var(--ag-dark-good-text, #34d399);--_ag-good-soft: var(--ag-dark-good-soft, rgba(16, 185, 129, 0.18));--_ag-watch-text: var(--ag-dark-watch-text, #fbbf24);--_ag-watch-soft: var(--ag-dark-watch-soft, rgba(245, 158, 11, 0.18));--_ag-risk-text: var(--ag-dark-risk-text, #f87171);--_ag-risk-soft: var(--ag-dark-risk-soft, rgba(239, 68, 68, 0.18));--_ag-gold: var(--ag-dark-gold, rgba(245, 158, 11, 0.16));--_ag-gold-line: var(--ag-dark-gold-line, rgba(245, 158, 11, 0.35));--_ag-gold-text: var(--ag-dark-gold-text, #fcd34d);--_ag-shadow-card: var(--ag-dark-shadow-card, 0 16px 38px rgba(0, 0, 0, 0.55), 0 0 0 1px rgba(255, 255, 255, 0.06), 0 1px 0 rgba(255, 255, 255, 0.04) inset);--_ag-surface-alt: var(--ag-dark-surface-alt, var(--_ag-surface));--_ag-row-hover: var(--ag-dark-row-hover, color-mix(in srgb, #fff 7%, var(--_ag-surface)))}:host([theme~=tinted]){--_ag-surface-alt: var(--ag-surface-alt, color-mix(in srgb, var(--_ag-brand) 4%, var(--_ag-surface)));--_ag-surface-elevated: color-mix(in srgb, var(--_ag-brand) 11%, var(--ag-surface-elevated, #f8f9fb));--_ag-hairline: color-mix(in srgb, var(--_ag-brand) 24%, var(--ag-hairline, rgba(15, 23, 42, 0.08)));--_ag-border: color-mix(in srgb, var(--_ag-brand) 12%, transparent);--_ag-row-hover: var(--ag-row-hover, color-mix(in srgb, var(--_ag-brand) 9%, var(--_ag-surface)));--_ag-text-muted: color-mix(in srgb, var(--_ag-brand) 32%, var(--ag-text-muted, #6b7280))}:host([theme~=dark][theme~=tinted]){--_ag-surface-alt: var(--ag-dark-surface-alt, color-mix(in srgb, var(--_ag-brand) 10%, var(--_ag-surface)));--_ag-surface-elevated: color-mix(in srgb, var(--_ag-brand) 20%, var(--ag-dark-surface-elevated, #1e2532));--_ag-hairline: color-mix(in srgb, var(--_ag-brand) 30%, var(--ag-dark-hairline, rgba(255, 255, 255, 0.12)));--_ag-border: color-mix(in srgb, var(--_ag-brand) 16%, rgb(255 255 255 / 7%));--_ag-row-hover: var(--ag-dark-row-hover, color-mix(in srgb, var(--_ag-brand) 12%, var(--_ag-surface)));--_ag-text-muted: color-mix(in srgb, var(--_ag-brand) 28%, var(--ag-dark-text-muted, #94a3b8))}@media(prefers-reduced-motion: reduce){:host{--_ag-dur-fast: 0ms;--_ag-dur-med: 0ms;--_ag-dur-slow: 0ms}}`;"]}
@@ -1,3 +1,3 @@
1
1
  import { css } from 'lit';
2
- export const styles = css `[part~=pill]{display:inline-flex;align-items:center;block-size:20px;padding:0 8px;border-radius:var(--ag-radius-sm);border:1px solid rgba(0,0,0,0);font-size:var(--ag-fs-cell-secondary);font-weight:var(--ag-fw-semibold);line-height:1;white-space:nowrap}[part~=pill--gold]{background:linear-gradient(180deg, #fff7e6 0%, var(--ag-gold) 100%);border-color:var(--ag-gold-line);color:var(--ag-gold-text)}[part~=pill--brand]{background:var(--ag-brand-soft);border-color:var(--ag-brand-line);color:var(--ag-brand-strong)}[part~=pill--neutral]{background:rgba(99,102,241,.08);border-color:rgba(99,102,241,.22);color:#4338ca}[part~=pill--muted]{background:rgba(107,114,128,.1);border-color:rgba(107,114,128,.22);color:#4b5563}[part~=avatar]{display:inline-flex;align-items:center;justify-content:center;inline-size:22px;block-size:22px;flex-shrink:0;border-radius:50%;background:hsl(var(--ag-avatar-hue, 210), 60%, 48%);color:#fff;font-size:var(--ag-fs-cell-secondary);font-weight:var(--ag-fw-bold);line-height:1;-webkit-user-select:none;-moz-user-select:none;user-select:none;box-shadow:0 0 0 2px hsla(0,0%,100%,.85),0 1px 2px rgba(15,23,42,.18)}[part~=progress]{display:inline-flex;align-items:center;gap:8px;inline-size:100%}[part~=progress-track]{position:relative;flex:1;block-size:5px;min-inline-size:40px;border-radius:3px;background:rgba(15,23,42,.08);overflow:hidden}[part~=progress-fill]{display:block;block-size:100%;border-radius:3px;background:linear-gradient(90deg, #10b981 0%, #34d399 100%);transition:width var(--ag-dur-slow) var(--ag-ease)}[part~=progress-fill--good]{background:linear-gradient(90deg, #10b981 0%, #34d399 100%)}[part~=progress-fill--watch]{background:linear-gradient(90deg, #f59e0b 0%, #fbbf24 100%)}[part~=progress-fill--risk]{background:linear-gradient(90deg, #ef4444 0%, #f87171 100%)}[part~=progress-label]{min-inline-size:18px;text-align:end;font-size:11px;font-weight:var(--ag-fw-semibold);font-variant-numeric:tabular-nums;color:var(--ag-text-body)}[part~=spark-cell]{display:inline-flex;align-items:center;gap:6px}[part~=sparkline]{display:block;inline-size:64px;block-size:22px;color:var(--ag-text-muted);overflow:visible}[part~=sparkline--up]{color:var(--ag-good)}[part~=sparkline--down]{color:var(--ag-risk)}[part~=spark-line]{fill:none;stroke:currentcolor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}[part~=spark-area]{fill:currentcolor;stroke:none;opacity:.18}[part~=spark-delta]{font-size:var(--ag-fs-cell-secondary);font-weight:var(--ag-fw-semibold);font-variant-numeric:tabular-nums;color:var(--ag-text-muted)}[part~=spark-delta--up]{color:var(--ag-good-text)}[part~=spark-delta--down]{color:var(--ag-risk-text)}[part~=status]{display:inline-flex;align-items:center;gap:6px;block-size:20px;padding:0 10px;border-radius:var(--ag-radius-pill);border:1px solid rgba(0,0,0,0);font-size:var(--ag-fs-cell-secondary);font-weight:var(--ag-fw-semibold);line-height:1;white-space:nowrap}[part~=status-dot]{inline-size:6px;block-size:6px;flex-shrink:0;border-radius:50%;background:currentcolor}[part~=status--active]{background:var(--ag-good-soft);border-color:rgba(16,185,129,.28);color:var(--ag-good-text)}[part~=status--trial]{background:var(--ag-watch-soft);border-color:rgba(245,158,11,.28);color:var(--ag-watch-text)}[part~=status--churn]{background:var(--ag-risk-soft);border-color:rgba(239,68,68,.3);color:var(--ag-risk-text)}:host{position:relative;display:inline-flex;flex:1 0 0;align-items:center;padding:0 var(--ag-cell-pad-x);color:inherit;font-size:var(--ag-fs-cell);overflow-wrap:anywhere;-webkit-user-select:none;-moz-user-select:none;user-select:none}:host([data-cell-type=number]),:host([data-cell-type=currency]){font-variant-numeric:tabular-nums;font-weight:var(--ag-fw-semibold);color:var(--ag-text)}:host([active]){outline:none;box-shadow:inset 0 0 0 1px var(--cell-active-border-color, var(--ag-brand))}:host([editing]){background:var(--ag-surface);z-index:calc(var(--z-index-base) + 2);overflow:hidden;cursor:text}:host([editing][data-pinned=start]),:host([editing][data-pinned=end]){background:var(--ag-surface)}:host([editing][data-cell-type=select]){overflow:visible}:host([data-pinned=start]),:host([data-pinned=end]){position:sticky;z-index:calc(var(--z-index-base) + 1);background:inherit}:host([data-pinned=start]){inset-inline-start:var(--apex-pin-offset, 0)}:host([data-pinned=end]){inset-inline-end:var(--apex-pin-offset, 0)}:host([data-pin-edge=start])::after,:host([data-pin-edge=end])::after{content:"";position:absolute;inset-block:0;inline-size:1px;background:var(--ag-pin-line);pointer-events:none;z-index:1}:host([data-pin-edge=start])::after{inset-inline-end:0}:host([data-pin-edge=end])::after{inset-inline-start:0}input[data-apex-editor]{box-sizing:border-box;position:absolute;inset:0;width:auto;height:auto;padding:0 var(--ag-cell-pad-x);margin:0;border:0;background:rgba(0,0,0,0);color:inherit;font:inherit;font-size:var(--ag-fs-cell);outline:none;caret-color:var(--cell-active-border-color, var(--ag-brand));-webkit-user-select:text;-moz-user-select:text;user-select:text}input[type=number][data-apex-editor]{font-variant-numeric:tabular-nums}input[type=checkbox][data-apex-editor]{-webkit-appearance:none;-moz-appearance:none;appearance:none;inline-size:14px;block-size:14px;margin:0;flex-shrink:0;box-sizing:border-box;border:1.4px solid color-mix(in srgb, var(--ag-brand) 30%, transparent);border-radius:var(--ag-radius-xs);background-color:var(--ag-surface);background-repeat:no-repeat;background-position:center;cursor:pointer;transition:background-color var(--ag-dur-fast) var(--ag-ease),border-color var(--ag-dur-fast) var(--ag-ease),transform var(--ag-dur-fast) var(--ag-ease)}input[type=checkbox][data-apex-editor]:hover{border-color:color-mix(in srgb, var(--ag-brand) 55%, transparent)}input[type=checkbox][data-apex-editor]:active{transform:scale(0.92)}input[type=checkbox][data-apex-editor]:checked,input[type=checkbox][data-apex-editor]:indeterminate{background-color:var(--ag-brand);border-color:var(--ag-brand)}input[type=checkbox][data-apex-editor]:checked{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M3 7.4 5.8 10.2 11 4.2' fill='none' stroke='%23ffffff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}input[type=checkbox][data-apex-editor]:indeterminate{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Crect x='3.5' y='6.2' width='7' height='1.6' rx='0.8' fill='%23ffffff'/%3E%3C/svg%3E")}input[type=checkbox][data-apex-editor]:focus-visible{outline:2px solid color-mix(in srgb, var(--ag-brand) 50%, transparent);outline-offset:2px}input[type=checkbox][data-apex-editor]{position:relative;inset:auto}input[part~=boolean-mark]{-webkit-appearance:none;-moz-appearance:none;appearance:none;inline-size:14px;block-size:14px;margin:0;flex-shrink:0;box-sizing:border-box;border:1.4px solid color-mix(in srgb, var(--ag-brand) 30%, transparent);border-radius:var(--ag-radius-xs);background-color:var(--ag-surface);background-repeat:no-repeat;background-position:center;cursor:pointer;transition:background-color var(--ag-dur-fast) var(--ag-ease),border-color var(--ag-dur-fast) var(--ag-ease),transform var(--ag-dur-fast) var(--ag-ease)}input[part~=boolean-mark]:hover{border-color:color-mix(in srgb, var(--ag-brand) 55%, transparent)}input[part~=boolean-mark]:active{transform:scale(0.92)}input[part~=boolean-mark]:checked,input[part~=boolean-mark]:indeterminate{background-color:var(--ag-brand);border-color:var(--ag-brand)}input[part~=boolean-mark]:checked{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M3 7.4 5.8 10.2 11 4.2' fill='none' stroke='%23ffffff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}input[part~=boolean-mark]:indeterminate{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Crect x='3.5' y='6.2' width='7' height='1.6' rx='0.8' fill='%23ffffff'/%3E%3C/svg%3E")}input[part~=boolean-mark]:focus-visible{outline:2px solid color-mix(in srgb, var(--ag-brand) 50%, transparent);outline-offset:2px}input[part~=boolean-mark][aria-readonly=true]{cursor:default;pointer-events:none}[part~=rating]{display:inline-flex;align-items:center;gap:0.0625rem;color:var(--ag-watch, #f5a623)}[part~=rating-star]{display:inline-flex;align-items:center;justify-content:center;color:currentcolor;opacity:.25;line-height:0}[part~=rating-star] svg{inline-size:0.875rem;block-size:0.875rem}[part~=rating-star][part~=filled]{opacity:1}[part=rating-editor]{display:inline-flex;align-items:center;gap:0.125rem;padding:0 0.125rem;color:var(--ag-watch, #f5a623);z-index:calc(var(--z-index-base) + 2)}[part=rating-editor] button[part~=rating-star]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:rgba(0,0,0,0);border:0;margin:0;padding:0.125rem;cursor:pointer;color:currentcolor;opacity:.35;border-radius:var(--ag-radius-xs)}[part=rating-editor] button[part~=rating-star]:hover{opacity:.75}[part=rating-editor] button[part~=rating-star][part~=filled]{opacity:1}[part=rating-editor] button[part~=rating-star]:focus-visible{outline:0.125rem solid var(--cell-active-border-color, var(--ag-brand));outline-offset:-0.0625rem}[part~=select-label]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0;inline-size:100%}[part~=select-popover]{position:absolute;inset-block-start:100%;inset-inline-start:0;margin:0.125rem 0 0;padding:0.25rem 0;min-inline-size:100%;background:var(--ag-surface);border:0.0625rem solid var(--ag-brand-line);border-radius:var(--ag-radius-sm);box-shadow:0 0.125rem 0.25rem rgba(0,0,0,.06),0 0.375rem 1rem rgba(0,0,0,.12);max-block-size:15rem;overflow-y:auto;outline:none;z-index:calc(var(--z-index-base) + 10);color:inherit;font:inherit}[part~=select-option]{display:block;padding:0.375rem 0.75rem;cursor:pointer;color:inherit;outline:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[part~=select-option]:hover{background:var(--ag-brand-softer)}[part~=select-option][part~=selected]{background:var(--ag-brand-soft);color:var(--ag-brand-strong);font-weight:var(--ag-fw-semibold)}[part~=select-option]:focus-visible{background:var(--ag-brand-soft);outline:0.125rem solid var(--cell-active-border-color, var(--ag-brand));outline-offset:-0.125rem}[part~=image]{block-size:calc(100% - 0.5rem);max-block-size:2.5rem;inline-size:auto;aspect-ratio:1/1;-o-object-fit:cover;object-fit:cover;border-radius:var(--ag-radius-xs);display:block;flex-shrink:0}[part~=image][part~=circle]{border-radius:50%}[part=tree-indent]{flex-shrink:0;display:inline-block}[part=tree-toggle]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;inline-size:1.5rem;block-size:1.5rem;margin-inline-end:0.25rem;padding:0;border:1px solid rgba(0,0,0,0);border-radius:var(--ag-radius-xs);background:rgba(0,0,0,0);color:var(--ag-text-muted);cursor:pointer;transition:background-color var(--ag-dur-fast) var(--ag-ease),border-color var(--ag-dur-fast) var(--ag-ease),color var(--ag-dur-fast) var(--ag-ease)}[part=tree-toggle]:hover{background:var(--ag-brand-soft);border-color:var(--ag-brand-line);color:var(--ag-brand-strong)}[part=tree-toggle]:focus-visible{outline:0.125rem solid color-mix(in srgb, var(--ag-brand) 50%, transparent);outline-offset:0.0625rem}[part=tree-chevron]{transition:transform var(--ag-dur-med) var(--ag-ease)}:host([data-tree-expanded]) [part=tree-chevron]{transform:rotate(90deg)}[part=tree-spacer]{display:inline-block;flex-shrink:0;inline-size:1.5rem;block-size:1.5rem;margin-inline-end:0.25rem}[part=tree-cell-content]{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host([data-invalid]){box-shadow:inset 0 0 0 1px var(--ag-risk, #ef4444)}:host([data-invalid][editing]){box-shadow:inset 0 0 0 1px var(--ag-risk, #ef4444);overflow:visible}[part~=cell-error]{position:absolute;inset-block-start:100%;inset-inline-start:0;z-index:calc(var(--z-index-base) + 11);margin-block-start:0.125rem;padding:0.125rem 0.375rem;max-inline-size:13.75rem;background:var(--ag-surface, #fff);color:var(--ag-risk-text, #b91c1c);border:0.0625rem solid var(--ag-risk, #ef4444);border-radius:var(--ag-radius-xs);font-size:var(--ag-fs-cell-secondary);font-weight:var(--ag-fw-regular);line-height:1.3;white-space:normal;pointer-events:none;box-shadow:0 0.125rem 0.375rem rgba(0,0,0,.12)}:host([data-range]){background:var(--apex-range-fill, color-mix(in srgb, var(--ag-brand) 12%, transparent))}:host([data-range~=active]){background:var(--apex-range-active-fill, var(--apex-range-fill, color-mix(in srgb, var(--ag-brand) 20%, transparent)))}:host([data-range])::before{content:"";position:absolute;inset:0;pointer-events:none;z-index:1;border:0 solid var(--apex-range-border, var(--ag-brand))}:host([data-range-edge~=top])::before{border-block-start-width:var(--apex-range-border-width, 1px)}:host([data-range-edge~=bottom])::before{border-block-end-width:var(--apex-range-border-width, 1px)}:host([data-range-edge~=left])::before{border-inline-start-width:var(--apex-range-border-width, 1px)}:host([data-range-edge~=right])::before{border-inline-end-width:var(--apex-range-border-width, 1px)}:host([data-range-handle])::after{content:"";position:absolute;inset-inline-end:-1px;inset-block-end:-1px;inline-size:7px;block-size:7px;background:var(--apex-range-border, var(--ag-brand));border:1px solid var(--ag-surface, #fff);z-index:4;pointer-events:none}:host([data-formula-ref]){--apex-formula-ref: var(--ag-brand);background:color-mix(in srgb, var(--apex-formula-ref) 14%, transparent);box-shadow:inset 0 0 0 1px var(--apex-formula-ref)}:host([data-formula-ref="0"]){--apex-formula-ref: var(--apex-formula-ref-0, #2563eb)}:host([data-formula-ref="1"]){--apex-formula-ref: var(--apex-formula-ref-1, #16a34a)}:host([data-formula-ref="2"]){--apex-formula-ref: var(--apex-formula-ref-2, #d97706)}:host([data-formula-ref="3"]){--apex-formula-ref: var(--apex-formula-ref-3, #db2777)}:host([data-formula-ref="4"]){--apex-formula-ref: var(--apex-formula-ref-4, #7c3aed)}:host([data-formula-ref="5"]){--apex-formula-ref: var(--apex-formula-ref-5, #0891b2)}:host([data-formula-pointer]){--apex-formula-pointer: var(--ag-brand);background:color-mix(in srgb, var(--apex-formula-pointer) 10%, transparent)}:host([data-formula-pointer])::before{content:"";position:absolute;inset:0;pointer-events:none;z-index:2;border:0 dashed var(--apex-formula-pointer, var(--ag-brand))}:host([data-formula-pointer-edge~=top])::before{border-block-start-width:var(--apex-formula-pointer-width, 1.5px)}:host([data-formula-pointer-edge~=bottom])::before{border-block-end-width:var(--apex-formula-pointer-width, 1.5px)}:host([data-formula-pointer-edge~=left])::before{border-inline-start-width:var(--apex-formula-pointer-width, 1.5px)}:host([data-formula-pointer-edge~=right])::before{border-inline-end-width:var(--apex-formula-pointer-width, 1.5px)}@media(forced-colors: active){:host([active]){outline:0.125rem solid Highlight;outline-offset:-0.125rem}:host([data-invalid]),:host([data-invalid][editing]){outline:0.125rem dashed CanvasText;outline-offset:-0.125rem}:host([editing]){background:Field;color:FieldText}}`;
2
+ export const styles = css `[part~=pill]{display:inline-flex;align-items:center;block-size:20px;padding:0 8px;border-radius:var(--_ag-radius-sm);border:1px solid rgba(0,0,0,0);font-size:var(--_ag-fs-cell-secondary);font-weight:var(--_ag-fw-semibold);line-height:1;white-space:nowrap}[part~=pill--gold]{background:linear-gradient(180deg, #fff7e6 0%, var(--_ag-gold) 100%);border-color:var(--_ag-gold-line);color:var(--_ag-gold-text)}[part~=pill--brand]{background:var(--_ag-brand-soft);border-color:var(--_ag-brand-line);color:var(--_ag-brand-strong)}[part~=pill--neutral]{background:rgba(99,102,241,.08);border-color:rgba(99,102,241,.22);color:#4338ca}[part~=pill--muted]{background:rgba(107,114,128,.1);border-color:rgba(107,114,128,.22);color:#4b5563}[part~=avatar]{display:inline-flex;align-items:center;justify-content:center;inline-size:22px;block-size:22px;flex-shrink:0;border-radius:50%;background:hsl(var(--ag-avatar-hue, 210), 60%, 48%);color:#fff;font-size:var(--_ag-fs-cell-secondary);font-weight:var(--_ag-fw-bold);line-height:1;-webkit-user-select:none;-moz-user-select:none;user-select:none;box-shadow:0 0 0 2px hsla(0,0%,100%,.85),0 1px 2px rgba(15,23,42,.18)}[part~=progress]{display:inline-flex;align-items:center;gap:8px;inline-size:100%}[part~=progress-track]{position:relative;flex:1;block-size:5px;min-inline-size:40px;border-radius:3px;background:rgba(15,23,42,.08);overflow:hidden}[part~=progress-fill]{display:block;block-size:100%;border-radius:3px;background:linear-gradient(90deg, #10b981 0%, #34d399 100%);transition:width var(--_ag-dur-slow) var(--_ag-ease)}[part~=progress-fill--good]{background:linear-gradient(90deg, #10b981 0%, #34d399 100%)}[part~=progress-fill--watch]{background:linear-gradient(90deg, #f59e0b 0%, #fbbf24 100%)}[part~=progress-fill--risk]{background:linear-gradient(90deg, #ef4444 0%, #f87171 100%)}[part~=progress-label]{min-inline-size:18px;text-align:end;font-size:11px;font-weight:var(--_ag-fw-semibold);font-variant-numeric:tabular-nums;color:var(--_ag-text-body)}[part~=spark-cell]{display:inline-flex;align-items:center;gap:6px}[part~=sparkline]{display:block;inline-size:64px;block-size:22px;color:var(--_ag-text-muted);overflow:visible}[part~=sparkline--up]{color:var(--_ag-good)}[part~=sparkline--down]{color:var(--_ag-risk)}[part~=spark-line]{fill:none;stroke:currentcolor;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}[part~=spark-area]{fill:currentcolor;stroke:none;opacity:.18}[part~=spark-delta]{font-size:var(--_ag-fs-cell-secondary);font-weight:var(--_ag-fw-semibold);font-variant-numeric:tabular-nums;color:var(--_ag-text-muted)}[part~=spark-delta--up]{color:var(--_ag-good-text)}[part~=spark-delta--down]{color:var(--_ag-risk-text)}[part~=status]{display:inline-flex;align-items:center;gap:6px;block-size:20px;padding:0 10px;border-radius:var(--_ag-radius-pill);border:1px solid rgba(0,0,0,0);font-size:var(--_ag-fs-cell-secondary);font-weight:var(--_ag-fw-semibold);line-height:1;white-space:nowrap}[part~=status-dot]{inline-size:6px;block-size:6px;flex-shrink:0;border-radius:50%;background:currentcolor}[part~=status--active]{background:var(--_ag-good-soft);border-color:rgba(16,185,129,.28);color:var(--_ag-good-text)}[part~=status--trial]{background:var(--_ag-watch-soft);border-color:rgba(245,158,11,.28);color:var(--_ag-watch-text)}[part~=status--churn]{background:var(--_ag-risk-soft);border-color:rgba(239,68,68,.3);color:var(--_ag-risk-text)}:host{position:relative;display:inline-flex;flex:1 0 0;align-items:center;padding:0 var(--_ag-cell-pad-x);color:inherit;font-size:var(--_ag-fs-cell);overflow-wrap:anywhere;-webkit-user-select:none;-moz-user-select:none;user-select:none}:host([data-cell-type=number]),:host([data-cell-type=currency]){font-variant-numeric:tabular-nums;font-weight:var(--_ag-fw-semibold);color:var(--_ag-text)}:host([active]){outline:none;box-shadow:inset 0 0 0 1px var(--cell-active-border-color, var(--_ag-brand))}:host([editing]){background:var(--_ag-surface);z-index:calc(var(--z-index-base) + 2);overflow:hidden;cursor:text}:host([editing][data-pinned=start]),:host([editing][data-pinned=end]){background:var(--_ag-surface)}:host([editing][data-cell-type=select]){overflow:visible}:host([data-pinned=start]),:host([data-pinned=end]){position:sticky;z-index:calc(var(--z-index-base) + 1);background:inherit}:host([data-pinned=start]){inset-inline-start:var(--apex-pin-offset, 0)}:host([data-pinned=end]){inset-inline-end:var(--apex-pin-offset, 0)}:host([data-pin-edge=start])::after,:host([data-pin-edge=end])::after{content:"";position:absolute;inset-block:0;inline-size:1px;background:var(--_ag-pin-line);pointer-events:none;z-index:1}:host([data-pin-edge=start])::after{inset-inline-end:0}:host([data-pin-edge=end])::after{inset-inline-start:0}input[data-apex-editor]{box-sizing:border-box;position:absolute;inset:0;width:auto;height:auto;padding:0 var(--_ag-cell-pad-x);margin:0;border:0;background:rgba(0,0,0,0);color:inherit;font:inherit;font-size:var(--_ag-fs-cell);outline:none;caret-color:var(--cell-active-border-color, var(--_ag-brand));-webkit-user-select:text;-moz-user-select:text;user-select:text}input[type=number][data-apex-editor]{font-variant-numeric:tabular-nums}input[type=checkbox][data-apex-editor]{-webkit-appearance:none;-moz-appearance:none;appearance:none;inline-size:14px;block-size:14px;margin:0;flex-shrink:0;box-sizing:border-box;border:1.4px solid color-mix(in srgb, var(--_ag-brand) 30%, transparent);border-radius:var(--_ag-radius-xs);background-color:var(--_ag-surface);background-repeat:no-repeat;background-position:center;cursor:pointer;transition:background-color var(--_ag-dur-fast) var(--_ag-ease),border-color var(--_ag-dur-fast) var(--_ag-ease),transform var(--_ag-dur-fast) var(--_ag-ease)}input[type=checkbox][data-apex-editor]:hover{border-color:color-mix(in srgb, var(--_ag-brand) 55%, transparent)}input[type=checkbox][data-apex-editor]:active{transform:scale(0.92)}input[type=checkbox][data-apex-editor]:checked,input[type=checkbox][data-apex-editor]:indeterminate{background-color:var(--_ag-brand);border-color:var(--_ag-brand)}input[type=checkbox][data-apex-editor]:checked{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M3 7.4 5.8 10.2 11 4.2' fill='none' stroke='%23ffffff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}input[type=checkbox][data-apex-editor]:indeterminate{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Crect x='3.5' y='6.2' width='7' height='1.6' rx='0.8' fill='%23ffffff'/%3E%3C/svg%3E")}input[type=checkbox][data-apex-editor]:focus-visible{outline:2px solid color-mix(in srgb, var(--_ag-brand) 50%, transparent);outline-offset:2px}input[type=checkbox][data-apex-editor]{position:relative;inset:auto}input[part~=boolean-mark]{-webkit-appearance:none;-moz-appearance:none;appearance:none;inline-size:14px;block-size:14px;margin:0;flex-shrink:0;box-sizing:border-box;border:1.4px solid color-mix(in srgb, var(--_ag-brand) 30%, transparent);border-radius:var(--_ag-radius-xs);background-color:var(--_ag-surface);background-repeat:no-repeat;background-position:center;cursor:pointer;transition:background-color var(--_ag-dur-fast) var(--_ag-ease),border-color var(--_ag-dur-fast) var(--_ag-ease),transform var(--_ag-dur-fast) var(--_ag-ease)}input[part~=boolean-mark]:hover{border-color:color-mix(in srgb, var(--_ag-brand) 55%, transparent)}input[part~=boolean-mark]:active{transform:scale(0.92)}input[part~=boolean-mark]:checked,input[part~=boolean-mark]:indeterminate{background-color:var(--_ag-brand);border-color:var(--_ag-brand)}input[part~=boolean-mark]:checked{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M3 7.4 5.8 10.2 11 4.2' fill='none' stroke='%23ffffff' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}input[part~=boolean-mark]:indeterminate{background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Crect x='3.5' y='6.2' width='7' height='1.6' rx='0.8' fill='%23ffffff'/%3E%3C/svg%3E")}input[part~=boolean-mark]:focus-visible{outline:2px solid color-mix(in srgb, var(--_ag-brand) 50%, transparent);outline-offset:2px}input[part~=boolean-mark][aria-readonly=true]{cursor:default;pointer-events:none}[part~=rating]{display:inline-flex;align-items:center;gap:0.0625rem;color:var(--_ag-watch, #f5a623)}[part~=rating-star]{display:inline-flex;align-items:center;justify-content:center;color:currentcolor;opacity:.25;line-height:0}[part~=rating-star] svg{inline-size:0.875rem;block-size:0.875rem}[part~=rating-star][part~=filled]{opacity:1}[part=rating-editor]{display:inline-flex;align-items:center;gap:0.125rem;padding:0 0.125rem;color:var(--_ag-watch, #f5a623);z-index:calc(var(--z-index-base) + 2)}[part=rating-editor] button[part~=rating-star]{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:rgba(0,0,0,0);border:0;margin:0;padding:0.125rem;cursor:pointer;color:currentcolor;opacity:.35;border-radius:var(--_ag-radius-xs)}[part=rating-editor] button[part~=rating-star]:hover{opacity:.75}[part=rating-editor] button[part~=rating-star][part~=filled]{opacity:1}[part=rating-editor] button[part~=rating-star]:focus-visible{outline:0.125rem solid var(--cell-active-border-color, var(--_ag-brand));outline-offset:-0.0625rem}[part~=select-label]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-inline-size:0;inline-size:100%}[part~=select-popover]{position:absolute;inset-block-start:100%;inset-inline-start:0;margin:0.125rem 0 0;padding:0.25rem 0;min-inline-size:100%;background:var(--_ag-surface);border:0.0625rem solid var(--_ag-brand-line);border-radius:var(--_ag-radius-sm);box-shadow:0 0.125rem 0.25rem rgba(0,0,0,.06),0 0.375rem 1rem rgba(0,0,0,.12);max-block-size:15rem;overflow-y:auto;outline:none;z-index:calc(var(--z-index-base) + 10);color:inherit;font:inherit}[part~=select-option]{display:block;padding:0.375rem 0.75rem;cursor:pointer;color:inherit;outline:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[part~=select-option]:hover{background:var(--_ag-brand-softer)}[part~=select-option][part~=selected]{background:var(--_ag-brand-soft);color:var(--_ag-brand-strong);font-weight:var(--_ag-fw-semibold)}[part~=select-option]:focus-visible{background:var(--_ag-brand-soft);outline:0.125rem solid var(--cell-active-border-color, var(--_ag-brand));outline-offset:-0.125rem}[part~=image]{block-size:calc(100% - 0.5rem);max-block-size:2.5rem;inline-size:auto;aspect-ratio:1/1;-o-object-fit:cover;object-fit:cover;border-radius:var(--_ag-radius-xs);display:block;flex-shrink:0}[part~=image][part~=circle]{border-radius:50%}[part=tree-indent]{flex-shrink:0;display:inline-block}[part=tree-toggle]{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;inline-size:1.5rem;block-size:1.5rem;margin-inline-end:0.25rem;padding:0;border:1px solid rgba(0,0,0,0);border-radius:var(--_ag-radius-xs);background:rgba(0,0,0,0);color:var(--_ag-text-muted);cursor:pointer;transition:background-color var(--_ag-dur-fast) var(--_ag-ease),border-color var(--_ag-dur-fast) var(--_ag-ease),color var(--_ag-dur-fast) var(--_ag-ease)}[part=tree-toggle]:hover{background:var(--_ag-brand-soft);border-color:var(--_ag-brand-line);color:var(--_ag-brand-strong)}[part=tree-toggle]:focus-visible{outline:0.125rem solid color-mix(in srgb, var(--_ag-brand) 50%, transparent);outline-offset:0.0625rem}[part=tree-chevron]{transition:transform var(--_ag-dur-med) var(--_ag-ease)}:host([data-tree-expanded]) [part=tree-chevron]{transform:rotate(90deg)}[part=tree-spacer]{display:inline-block;flex-shrink:0;inline-size:1.5rem;block-size:1.5rem;margin-inline-end:0.25rem}[part=tree-cell-content]{min-inline-size:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host([data-invalid]){box-shadow:inset 0 0 0 1px var(--_ag-risk, #ef4444)}:host([data-invalid][editing]){box-shadow:inset 0 0 0 1px var(--_ag-risk, #ef4444);overflow:visible}[part~=cell-error]{position:absolute;inset-block-start:100%;inset-inline-start:0;z-index:calc(var(--z-index-base) + 11);margin-block-start:0.125rem;padding:0.125rem 0.375rem;max-inline-size:13.75rem;background:var(--_ag-surface, #fff);color:var(--_ag-risk-text, #b91c1c);border:0.0625rem solid var(--_ag-risk, #ef4444);border-radius:var(--_ag-radius-xs);font-size:var(--_ag-fs-cell-secondary);font-weight:var(--_ag-fw-regular);line-height:1.3;white-space:normal;pointer-events:none;box-shadow:0 0.125rem 0.375rem rgba(0,0,0,.12)}:host([data-range]){background:var(--apex-range-fill, color-mix(in srgb, var(--_ag-brand) 12%, transparent))}:host([data-range~=active]){background:var(--apex-range-active-fill, var(--apex-range-fill, color-mix(in srgb, var(--_ag-brand) 20%, transparent)))}:host([data-range])::before{content:"";position:absolute;inset:0;pointer-events:none;z-index:1;border:0 solid var(--apex-range-border, var(--_ag-brand))}:host([data-range-edge~=top])::before{border-block-start-width:var(--apex-range-border-width, 1px)}:host([data-range-edge~=bottom])::before{border-block-end-width:var(--apex-range-border-width, 1px)}:host([data-range-edge~=left])::before{border-inline-start-width:var(--apex-range-border-width, 1px)}:host([data-range-edge~=right])::before{border-inline-end-width:var(--apex-range-border-width, 1px)}:host([data-range-handle])::after{content:"";position:absolute;inset-inline-end:-1px;inset-block-end:-1px;inline-size:7px;block-size:7px;background:var(--apex-range-border, var(--_ag-brand));border:1px solid var(--_ag-surface, #fff);z-index:4;pointer-events:none}:host([data-formula-ref]){--apex-formula-ref: var(--_ag-brand);background:color-mix(in srgb, var(--apex-formula-ref) 14%, transparent);box-shadow:inset 0 0 0 1px var(--apex-formula-ref)}:host([data-formula-ref="0"]){--apex-formula-ref: var(--apex-formula-ref-0, #2563eb)}:host([data-formula-ref="1"]){--apex-formula-ref: var(--apex-formula-ref-1, #16a34a)}:host([data-formula-ref="2"]){--apex-formula-ref: var(--apex-formula-ref-2, #d97706)}:host([data-formula-ref="3"]){--apex-formula-ref: var(--apex-formula-ref-3, #db2777)}:host([data-formula-ref="4"]){--apex-formula-ref: var(--apex-formula-ref-4, #7c3aed)}:host([data-formula-ref="5"]){--apex-formula-ref: var(--apex-formula-ref-5, #0891b2)}:host([data-formula-pointer]){--apex-formula-pointer: var(--_ag-brand);background:color-mix(in srgb, var(--apex-formula-pointer) 10%, transparent)}:host([data-formula-pointer])::before{content:"";position:absolute;inset:0;pointer-events:none;z-index:2;border:0 dashed var(--apex-formula-pointer, var(--_ag-brand))}:host([data-formula-pointer-edge~=top])::before{border-block-start-width:var(--apex-formula-pointer-width, 1.5px)}:host([data-formula-pointer-edge~=bottom])::before{border-block-end-width:var(--apex-formula-pointer-width, 1.5px)}:host([data-formula-pointer-edge~=left])::before{border-inline-start-width:var(--apex-formula-pointer-width, 1.5px)}:host([data-formula-pointer-edge~=right])::before{border-inline-end-width:var(--apex-formula-pointer-width, 1.5px)}@media(forced-colors: active){:host([active]){outline:0.125rem solid Highlight;outline-offset:-0.125rem}:host([data-invalid]),:host([data-invalid][editing]){outline:0.125rem dashed CanvasText;outline-offset:-0.125rem}:host([editing]){background:Field;color:FieldText}}`;
3
3
  //# sourceMappingURL=body-cell.css.js.map