apex-grid 1.1.0 → 2.0.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 (206) hide show
  1. package/LICENSE +76 -5
  2. package/README.md +520 -10
  3. package/components/cell.d.ts +39 -0
  4. package/components/cell.js +334 -5
  5. package/components/cell.js.map +1 -1
  6. package/components/filter-row.d.ts +7 -5
  7. package/components/filter-row.js +151 -68
  8. package/components/filter-row.js.map +1 -1
  9. package/components/grid.d.ts +948 -1
  10. package/components/grid.js +403 -13
  11. package/components/grid.js.map +1 -1
  12. package/components/header-row.d.ts +21 -1
  13. package/components/header-row.js +140 -7
  14. package/components/header-row.js.map +1 -1
  15. package/components/header.d.ts +7 -0
  16. package/components/header.js +151 -25
  17. package/components/header.js.map +1 -1
  18. package/components/paginator.d.ts +56 -0
  19. package/components/paginator.js +148 -0
  20. package/components/paginator.js.map +1 -0
  21. package/components/row.d.ts +21 -2
  22. package/components/row.js +185 -10
  23. package/components/row.js.map +1 -1
  24. package/components/toolbar.d.ts +60 -0
  25. package/components/toolbar.js +275 -0
  26. package/components/toolbar.js.map +1 -0
  27. package/components/virtualizer.js +1 -1
  28. package/components/virtualizer.js.map +1 -1
  29. package/controllers/data-operation.d.ts +14 -0
  30. package/controllers/data-operation.js +19 -2
  31. package/controllers/data-operation.js.map +1 -1
  32. package/controllers/dom.d.ts +37 -1
  33. package/controllers/dom.js +176 -9
  34. package/controllers/dom.js.map +1 -1
  35. package/controllers/editing.d.ts +130 -0
  36. package/controllers/editing.js +197 -0
  37. package/controllers/editing.js.map +1 -0
  38. package/controllers/expansion.d.ts +68 -0
  39. package/controllers/expansion.js +126 -0
  40. package/controllers/expansion.js.map +1 -0
  41. package/controllers/navigation.d.ts +17 -6
  42. package/controllers/navigation.js +24 -8
  43. package/controllers/navigation.js.map +1 -1
  44. package/controllers/pagination.d.ts +102 -0
  45. package/controllers/pagination.js +106 -0
  46. package/controllers/pagination.js.map +1 -0
  47. package/controllers/reorder.d.ts +78 -0
  48. package/controllers/reorder.js +124 -0
  49. package/controllers/reorder.js.map +1 -0
  50. package/controllers/selection.d.ts +109 -0
  51. package/controllers/selection.js +168 -0
  52. package/controllers/selection.js.map +1 -0
  53. package/controllers/sort.js +28 -0
  54. package/controllers/sort.js.map +1 -1
  55. package/controllers/state.d.ts +32 -0
  56. package/controllers/state.js +37 -0
  57. package/controllers/state.js.map +1 -1
  58. package/controllers/tree.d.ts +87 -0
  59. package/controllers/tree.js +0 -0
  60. package/controllers/tree.js.map +1 -0
  61. package/custom-elements.json +6142 -992
  62. package/docs/assets/hierarchy.js +1 -1
  63. package/docs/assets/highlight.css +70 -14
  64. package/docs/assets/navigation.js +1 -1
  65. package/docs/assets/search.js +1 -1
  66. package/docs/classes/ApexGrid.html +316 -19
  67. package/docs/functions/setup.html +22 -0
  68. package/docs/hierarchy.html +1 -1
  69. package/docs/index.html +503 -9
  70. package/docs/interfaces/ApexCellValueChangedEvent.html +11 -0
  71. package/docs/interfaces/ApexCellValueChangingEvent.html +13 -0
  72. package/docs/interfaces/ApexColumnMovedEvent.html +8 -0
  73. package/docs/interfaces/ApexColumnMovingEvent.html +11 -0
  74. package/docs/interfaces/ApexColumnPinnedEvent.html +6 -0
  75. package/docs/interfaces/ApexColumnPinningEvent.html +8 -0
  76. package/docs/interfaces/ApexDetailContext.html +8 -0
  77. package/docs/interfaces/ApexFilteredEvent.html +1 -1
  78. package/docs/interfaces/ApexFilteringEvent.html +3 -3
  79. package/docs/interfaces/ApexGridEventMap.html +58 -7
  80. package/docs/interfaces/ApexHeaderContext.html +1 -1
  81. package/docs/interfaces/ApexPageChangedEvent.html +10 -0
  82. package/docs/interfaces/ApexPageChangingEvent.html +10 -0
  83. package/docs/interfaces/ApexQuickFilterChangedEvent.html +4 -0
  84. package/docs/interfaces/ApexQuickFilterChangingEvent.html +6 -0
  85. package/docs/interfaces/ApexRowEditEndedEvent.html +6 -0
  86. package/docs/interfaces/ApexRowEditStartedEvent.html +4 -0
  87. package/docs/interfaces/ApexRowExpandedEvent.html +8 -0
  88. package/docs/interfaces/ApexRowExpandingEvent.html +11 -0
  89. package/docs/interfaces/ApexRowSelectedEvent.html +8 -0
  90. package/docs/interfaces/ApexRowSelectingEvent.html +11 -0
  91. package/docs/interfaces/ApexTreeRowExpandedEvent.html +8 -0
  92. package/docs/interfaces/ApexTreeRowExpandingEvent.html +10 -0
  93. package/docs/interfaces/BaseApexCellContext.html +9 -3
  94. package/docs/interfaces/BaseApexEditorContext.html +19 -0
  95. package/docs/interfaces/BaseColumnConfiguration.html +65 -10
  96. package/docs/interfaces/BaseColumnSortConfiguration.html +1 -1
  97. package/docs/interfaces/BaseFilterExpression.html +1 -1
  98. package/docs/interfaces/BaseSortExpression.html +1 -1
  99. package/docs/interfaces/CSVExportOptions.html +22 -0
  100. package/docs/interfaces/ColumnFilterConfiguration.html +1 -1
  101. package/docs/interfaces/DataPipelineConfiguration.html +13 -4
  102. package/docs/interfaces/ExportOptions.html +15 -0
  103. package/docs/interfaces/GridEditingConfiguration.html +10 -0
  104. package/docs/interfaces/GridExpansionConfiguration.html +15 -0
  105. package/docs/interfaces/GridSelectionConfiguration.html +11 -0
  106. package/docs/interfaces/GridSortConfiguration.html +1 -1
  107. package/docs/interfaces/GridTreeConfiguration.html +33 -0
  108. package/docs/interfaces/PaginationConfiguration.html +18 -0
  109. package/docs/interfaces/PaginationState.html +10 -0
  110. package/docs/interfaces/XLSXExportOptions.html +17 -0
  111. package/docs/media/package.json +83 -0
  112. package/docs/media/publish.yml +111 -0
  113. package/docs/modules.html +1 -1
  114. package/docs/types/ApexCellContext.html +1 -1
  115. package/docs/types/ApexEditorContext.html +2 -0
  116. package/docs/types/BasePropertyType.html +1 -1
  117. package/docs/types/BaseSortComparer.html +1 -1
  118. package/docs/types/ColumnConfiguration.html +1 -1
  119. package/docs/types/ColumnDropPosition.html +2 -0
  120. package/docs/types/ColumnSortConfiguration.html +1 -1
  121. package/docs/types/DataPipelineHook.html +1 -1
  122. package/docs/types/DataPipelineParams.html +3 -3
  123. package/docs/types/DataType.html +30 -2
  124. package/docs/types/EditMode.html +6 -0
  125. package/docs/types/EditTrigger.html +4 -0
  126. package/docs/types/ExportCellValue.html +5 -0
  127. package/docs/types/ExportSource.html +8 -0
  128. package/docs/types/FilterCriteria.html +1 -1
  129. package/docs/types/FilterExpression.html +1 -1
  130. package/docs/types/Keys.html +1 -1
  131. package/docs/types/PaginationMode.html +6 -0
  132. package/docs/types/PinPosition.html +5 -0
  133. package/docs/types/PropertyType.html +1 -1
  134. package/docs/types/SelectionMode.html +7 -0
  135. package/docs/types/SortComparer.html +1 -1
  136. package/docs/types/SortExpression.html +1 -1
  137. package/docs/types/SortState.html +1 -1
  138. package/docs/types/SortingDirection.html +1 -1
  139. package/index.d.ts +5 -2
  140. package/index.js +1 -0
  141. package/index.js.map +1 -1
  142. package/internal/column-types.d.ts +94 -0
  143. package/internal/column-types.js +268 -0
  144. package/internal/column-types.js.map +1 -0
  145. package/internal/export.d.ts +106 -0
  146. package/internal/export.js +122 -0
  147. package/internal/export.js.map +1 -0
  148. package/internal/flip.d.ts +80 -0
  149. package/internal/flip.js +52 -0
  150. package/internal/flip.js.map +1 -0
  151. package/internal/icons.d.ts +24 -0
  152. package/internal/icons.js +134 -0
  153. package/internal/icons.js.map +1 -0
  154. package/internal/tags.d.ts +2 -0
  155. package/internal/tags.js +2 -0
  156. package/internal/tags.js.map +1 -1
  157. package/internal/theming.js +1 -1
  158. package/internal/theming.js.map +1 -1
  159. package/internal/types.d.ts +424 -3
  160. package/internal/types.js.map +1 -1
  161. package/internal/utils.d.ts +24 -1
  162. package/internal/utils.js +48 -7
  163. package/internal/utils.js.map +1 -1
  164. package/internal/xlsx.d.ts +22 -0
  165. package/internal/xlsx.js +228 -0
  166. package/internal/xlsx.js.map +1 -0
  167. package/operations/pagination.d.ts +19 -0
  168. package/operations/pagination.js +12 -0
  169. package/operations/pagination.js.map +1 -0
  170. package/operations/quick-filter.d.ts +21 -0
  171. package/operations/quick-filter.js +26 -0
  172. package/operations/quick-filter.js.map +1 -0
  173. package/package.json +6 -5
  174. package/setup.d.ts +58 -0
  175. package/setup.js +29 -0
  176. package/setup.js.map +1 -0
  177. package/styles/body-cell/body-cell.css.js +1 -1
  178. package/styles/body-cell/body-cell.css.js.map +1 -1
  179. package/styles/body-row/body-row.css.js +1 -1
  180. package/styles/body-row/body-row.css.js.map +1 -1
  181. package/styles/filter-row/filter-row.css.js +1 -1
  182. package/styles/filter-row/filter-row.css.js.map +1 -1
  183. package/styles/grid/_grid.base.css.js +1 -1
  184. package/styles/grid/_grid.base.css.js.map +1 -1
  185. package/styles/grid/themes/light/grid.bootstrap.css.js +1 -1
  186. package/styles/grid/themes/light/grid.bootstrap.css.js.map +1 -1
  187. package/styles/grid/themes/light/grid.fluent.css.js +1 -1
  188. package/styles/grid/themes/light/grid.fluent.css.js.map +1 -1
  189. package/styles/grid/themes/light/grid.indigo.css.js +1 -1
  190. package/styles/grid/themes/light/grid.indigo.css.js.map +1 -1
  191. package/styles/grid/themes/light/grid.material.css.js +1 -1
  192. package/styles/grid/themes/light/grid.material.css.js.map +1 -1
  193. package/styles/header-cell/header-cell.css.js +1 -1
  194. package/styles/header-cell/header-cell.css.js.map +1 -1
  195. package/styles/header-row/header-row.base.css.js +1 -1
  196. package/styles/header-row/header-row.base.css.js.map +1 -1
  197. package/styles/paginator/paginator.css.d.ts +1 -0
  198. package/styles/paginator/paginator.css.js +3 -0
  199. package/styles/paginator/paginator.css.js.map +1 -0
  200. package/styles/toolbar/toolbar.css.d.ts +1 -0
  201. package/styles/toolbar/toolbar.css.js +3 -0
  202. package/styles/toolbar/toolbar.css.js.map +1 -0
  203. package/styles.css +17 -0
  204. package/internal/icon-registry.d.ts +0 -1
  205. package/internal/icon-registry.js +0 -29
  206. package/internal/icon-registry.js.map +0 -1
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Lightweight FLIP (First / Last / Invert / Play) helpers for animating
3
+ * element re-positioning during column reorder + row sort.
4
+ *
5
+ * @remarks
6
+ * Uses the Web Animations API with `composite: 'add'` so the FLIP delta
7
+ * stacks ON TOP of whatever inline `transform` the virtualizer already set
8
+ * on row elements — without `'add'` our keyframe would clobber the
9
+ * virtualizer's `translate(...)` and rows would jump to the origin before
10
+ * settling.
11
+ *
12
+ * Respects `prefers-reduced-motion: reduce` and bails out entirely when the
13
+ * user has opted out of motion.
14
+ */
15
+ /**
16
+ * One element to FLIP, captured at its "first" (pre-mutation) position.
17
+ */
18
+ export interface FlipEntry {
19
+ element: HTMLElement;
20
+ rect: DOMRect;
21
+ }
22
+ /**
23
+ * Plays the FLIP animation for every captured element by computing the
24
+ * delta against its current (post-mutation) bounding rect and animating it
25
+ * back to identity.
26
+ *
27
+ * @param entries - Elements captured by {@link captureRect}.
28
+ * @param axis - `'x'` for horizontal motion (column reorder), `'y'` for
29
+ * vertical motion (row sort), `'both'` for diagonal motion if either axis
30
+ * could move.
31
+ */
32
+ export declare function playFlip(entries: ReadonlyArray<FlipEntry>, axis?: 'x' | 'y' | 'both'): void;
33
+ /**
34
+ * Convenience: capture a rect for an element, returning a {@link FlipEntry}.
35
+ */
36
+ export declare function captureRect(element: HTMLElement): FlipEntry;
37
+ /**
38
+ * A subset of `LitElement` needed for {@link awaitChildUpdates}.
39
+ */
40
+ interface UpdatableElement {
41
+ updateComplete: Promise<unknown>;
42
+ }
43
+ /**
44
+ * Awaits a set of child elements' `updateComplete` promises.
45
+ *
46
+ * @remarks
47
+ * The grid's `updateComplete` only resolves the grid's own update — child
48
+ * components (header row, body rows, cells) schedule their updates one
49
+ * microtask later. FLIP needs every relevant child to have its new DOM
50
+ * committed before computing the "Last" rect; without this wait the
51
+ * captured-before and measured-after rects match and the animation
52
+ * silently no-ops.
53
+ */
54
+ export declare function awaitChildUpdates(elements: ReadonlyArray<UpdatableElement | null | undefined>): Promise<void>;
55
+ /**
56
+ * Keyed FLIP entry — pairs an arbitrary identity key with a captured rect.
57
+ *
58
+ * @remarks
59
+ * Used for row sort animation: the virtualizer recycles `<apex-grid-row>`
60
+ * DOM elements so the same element holds different row data before and
61
+ * after a sort. We capture rects keyed by row data identity, then resolve
62
+ * the new DOM element after the sort via the `resolveElement` callback.
63
+ */
64
+ export interface KeyedFlipEntry<K> {
65
+ key: K;
66
+ rect: DOMRect;
67
+ }
68
+ /**
69
+ * Plays a FLIP animation against elements located by key after a DOM
70
+ * mutation has settled. Used for row sort, where DOM elements get recycled
71
+ * across the mutation and can only be found by data identity.
72
+ *
73
+ * @param before - Rects captured before the mutation, keyed by data
74
+ * identity (or any other stable key).
75
+ * @param resolveElement - Function that returns the current DOM element
76
+ * representing `key`, or `null` if the keyed row is no longer in view.
77
+ * @param axis - Same semantics as {@link playFlip}.
78
+ */
79
+ export declare function playKeyedFlip<K>(before: ReadonlyArray<KeyedFlipEntry<K>>, resolveElement: (key: K) => HTMLElement | null, axis?: 'x' | 'y' | 'both'): void;
80
+ export {};
@@ -0,0 +1,52 @@
1
+ const FLIP_DURATION_MS = 220;
2
+ const FLIP_EASING = 'cubic-bezier(0.2, 0, 0.2, 1)';
3
+ const MIN_DELTA_PX = 0.5;
4
+ function prefersReducedMotion() {
5
+ if (typeof window === 'undefined' || !window.matchMedia)
6
+ return false;
7
+ return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
8
+ }
9
+ export function playFlip(entries, axis = 'both') {
10
+ if (prefersReducedMotion() || entries.length === 0)
11
+ return;
12
+ for (const { element, rect: oldRect } of entries) {
13
+ if (!element.isConnected)
14
+ continue;
15
+ const newRect = element.getBoundingClientRect();
16
+ const dx = axis === 'y' ? 0 : oldRect.left - newRect.left;
17
+ const dy = axis === 'x' ? 0 : oldRect.top - newRect.top;
18
+ if (Math.abs(dx) < MIN_DELTA_PX && Math.abs(dy) < MIN_DELTA_PX)
19
+ continue;
20
+ element.animate([{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0, 0)' }], {
21
+ duration: FLIP_DURATION_MS,
22
+ easing: FLIP_EASING,
23
+ composite: 'add',
24
+ });
25
+ }
26
+ }
27
+ export function captureRect(element) {
28
+ return { element, rect: element.getBoundingClientRect() };
29
+ }
30
+ export async function awaitChildUpdates(elements) {
31
+ await Promise.all(elements.filter((el) => el != null).map((el) => el.updateComplete));
32
+ }
33
+ export function playKeyedFlip(before, resolveElement, axis = 'both') {
34
+ if (prefersReducedMotion() || before.length === 0)
35
+ return;
36
+ for (const { key, rect: oldRect } of before) {
37
+ const element = resolveElement(key);
38
+ if (!element || !element.isConnected)
39
+ continue;
40
+ const newRect = element.getBoundingClientRect();
41
+ const dx = axis === 'y' ? 0 : oldRect.left - newRect.left;
42
+ const dy = axis === 'x' ? 0 : oldRect.top - newRect.top;
43
+ if (Math.abs(dx) < MIN_DELTA_PX && Math.abs(dy) < MIN_DELTA_PX)
44
+ continue;
45
+ element.animate([{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0, 0)' }], {
46
+ duration: FLIP_DURATION_MS,
47
+ easing: FLIP_EASING,
48
+ composite: 'add',
49
+ });
50
+ }
51
+ }
52
+ //# sourceMappingURL=flip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flip.js","sourceRoot":"","sources":["../../src/internal/flip.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Lightweight FLIP (First / Last / Invert / Play) helpers for animating\n * element re-positioning during column reorder + row sort.\n *\n * @remarks\n * Uses the Web Animations API with `composite: 'add'` so the FLIP delta\n * stacks ON TOP of whatever inline `transform` the virtualizer already set\n * on row elements — without `'add'` our keyframe would clobber the\n * virtualizer's `translate(...)` and rows would jump to the origin before\n * settling.\n *\n * Respects `prefers-reduced-motion: reduce` and bails out entirely when the\n * user has opted out of motion.\n */\n\nconst FLIP_DURATION_MS = 220;\nconst FLIP_EASING = 'cubic-bezier(0.2, 0, 0.2, 1)';\nconst MIN_DELTA_PX = 0.5;\n\nfunction prefersReducedMotion(): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/**\n * One element to FLIP, captured at its \"first\" (pre-mutation) position.\n */\nexport interface FlipEntry {\n element: HTMLElement;\n rect: DOMRect;\n}\n\n/**\n * Plays the FLIP animation for every captured element by computing the\n * delta against its current (post-mutation) bounding rect and animating it\n * back to identity.\n *\n * @param entries - Elements captured by {@link captureRect}.\n * @param axis - `'x'` for horizontal motion (column reorder), `'y'` for\n * vertical motion (row sort), `'both'` for diagonal motion if either axis\n * could move.\n */\nexport function playFlip(entries: ReadonlyArray<FlipEntry>, axis: 'x' | 'y' | 'both' = 'both') {\n if (prefersReducedMotion() || entries.length === 0) return;\n\n for (const { element, rect: oldRect } of entries) {\n if (!element.isConnected) continue;\n const newRect = element.getBoundingClientRect();\n const dx = axis === 'y' ? 0 : oldRect.left - newRect.left;\n const dy = axis === 'x' ? 0 : oldRect.top - newRect.top;\n if (Math.abs(dx) < MIN_DELTA_PX && Math.abs(dy) < MIN_DELTA_PX) continue;\n\n // `composite: 'add'` stacks our delta on top of any inline transform\n // (e.g. the virtualizer's `translate(0, Ypx)` on row elements).\n element.animate(\n [{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0, 0)' }],\n {\n duration: FLIP_DURATION_MS,\n easing: FLIP_EASING,\n composite: 'add',\n }\n );\n }\n}\n\n/**\n * Convenience: capture a rect for an element, returning a {@link FlipEntry}.\n */\nexport function captureRect(element: HTMLElement): FlipEntry {\n return { element, rect: element.getBoundingClientRect() };\n}\n\n/**\n * A subset of `LitElement` needed for {@link awaitChildUpdates}.\n */\ninterface UpdatableElement {\n updateComplete: Promise<unknown>;\n}\n\n/**\n * Awaits a set of child elements' `updateComplete` promises.\n *\n * @remarks\n * The grid's `updateComplete` only resolves the grid's own update — child\n * components (header row, body rows, cells) schedule their updates one\n * microtask later. FLIP needs every relevant child to have its new DOM\n * committed before computing the \"Last\" rect; without this wait the\n * captured-before and measured-after rects match and the animation\n * silently no-ops.\n */\nexport async function awaitChildUpdates(\n elements: ReadonlyArray<UpdatableElement | null | undefined>\n) {\n await Promise.all(\n elements.filter((el): el is UpdatableElement => el != null).map((el) => el.updateComplete)\n );\n}\n\n/**\n * Keyed FLIP entry — pairs an arbitrary identity key with a captured rect.\n *\n * @remarks\n * Used for row sort animation: the virtualizer recycles `<apex-grid-row>`\n * DOM elements so the same element holds different row data before and\n * after a sort. We capture rects keyed by row data identity, then resolve\n * the new DOM element after the sort via the `resolveElement` callback.\n */\nexport interface KeyedFlipEntry<K> {\n key: K;\n rect: DOMRect;\n}\n\n/**\n * Plays a FLIP animation against elements located by key after a DOM\n * mutation has settled. Used for row sort, where DOM elements get recycled\n * across the mutation and can only be found by data identity.\n *\n * @param before - Rects captured before the mutation, keyed by data\n * identity (or any other stable key).\n * @param resolveElement - Function that returns the current DOM element\n * representing `key`, or `null` if the keyed row is no longer in view.\n * @param axis - Same semantics as {@link playFlip}.\n */\nexport function playKeyedFlip<K>(\n before: ReadonlyArray<KeyedFlipEntry<K>>,\n resolveElement: (key: K) => HTMLElement | null,\n axis: 'x' | 'y' | 'both' = 'both'\n) {\n if (prefersReducedMotion() || before.length === 0) return;\n\n for (const { key, rect: oldRect } of before) {\n const element = resolveElement(key);\n if (!element || !element.isConnected) continue;\n const newRect = element.getBoundingClientRect();\n const dx = axis === 'y' ? 0 : oldRect.left - newRect.left;\n const dy = axis === 'x' ? 0 : oldRect.top - newRect.top;\n if (Math.abs(dx) < MIN_DELTA_PX && Math.abs(dy) < MIN_DELTA_PX) continue;\n\n element.animate(\n [{ transform: `translate(${dx}px, ${dy}px)` }, { transform: 'translate(0, 0)' }],\n {\n duration: FLIP_DURATION_MS,\n easing: FLIP_EASING,\n composite: 'add',\n }\n );\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import { type SVGTemplateResult, type TemplateResult } from 'lit';
2
+ interface IconDef {
3
+ viewBox: string;
4
+ paths: SVGTemplateResult;
5
+ }
6
+ declare const ICONS: Record<string, IconDef>;
7
+ export type GridIconName = keyof typeof ICONS;
8
+ export interface IconRenderOptions {
9
+ /** Lit `slot` attribute. Useful when icons sit inside slotted positions of other components. */
10
+ slot?: string;
11
+ /** Lit `part` attribute. */
12
+ part?: string;
13
+ /** Inline `class` attribute. */
14
+ class?: string;
15
+ /** When provided, sets `data-sort-index` (used by the header sort indicator). */
16
+ sortIndex?: number | string;
17
+ }
18
+ /**
19
+ * Renders one of the grid's built-in icons as an inline `<svg>`. All icons are
20
+ * decorative (`aria-hidden="true"`) by default — surrounding controls supply
21
+ * the accessible label via `aria-label`.
22
+ */
23
+ export declare function renderIcon(name: string, opts?: IconRenderOptions): TemplateResult;
24
+ export {};
@@ -0,0 +1,134 @@
1
+ import { html, svg } from 'lit';
2
+ import { ifDefined } from 'lit/directives/if-defined.js';
3
+ const ICONS = {
4
+ 'arrow-upward': {
5
+ viewBox: '0 0 45 45',
6
+ paths: svg `<path d="M22.5 40V13.7L10.1 26.1 8 24 24 8l16 16-2.1 2.1-12.4-12.4V40Z"/>`,
7
+ },
8
+ 'arrow-downward': {
9
+ viewBox: '0 0 45 45',
10
+ paths: svg `<path fill="currentColor" d="M24 40 8 24l2.1-2.1 12.4 12.4V8h3v26.3l12.4-12.4L40 24Z"/>`,
11
+ },
12
+ all: {
13
+ viewBox: '0 0 24 24',
14
+ paths: svg `<path d="M2 14h8v2H2zm0-8h12v2H2zm14 11l-3-3-1.5 1.5L16 20l7-7-1.5-1.5L16 17zM2 10h12v2H2z"/>`,
15
+ },
16
+ contains: {
17
+ viewBox: '0 0 24 24',
18
+ paths: svg `<path d="M3 3v18h18V3zm16 16H5V5h14z"/><path d="M12 11.3a4.39 4.39 0 00-2.54.63 2.07 2.07 0 00-.9 1.78 2.29 2.29 0 00.66 1.74 2.63 2.63 0 001.89.63 2.39 2.39 0 001.32-.37 3.05 3.05 0 001-.93 3.72 3.72 0 00.08.57c0 .19.1.38.16.58h1.79a4.51 4.51 0 01-.21-.88 5.57 5.57 0 01-.07-.93v-3.5a2.44 2.44 0 00-.84-2 3.34 3.34 0 00-2.22-.7 3.54 3.54 0 00-2.3.72A1.93 1.93 0 009 10.29h1.71a.93.93 0 01.29-.71 1.5 1.5 0 011-.29 1.45 1.45 0 011 .35 1.3 1.3 0 01.37 1v.69zm1.4 1.08v1.17a1.61 1.61 0 01-.71.77 2.27 2.27 0 01-1.21.34 1.18 1.18 0 01-.84-.27.92.92 0 01-.3-.72 1.16 1.16 0 01.44-.9 1.76 1.76 0 011.22-.39z"/>`,
19
+ },
20
+ doesNotContain: {
21
+ viewBox: '0 0 24 24',
22
+ paths: svg `<path d="M21 19.74V3H4.26L2.89 1.63 1.63 2.92 3 4.29V21h16.73l1.37 1.37 1.27-1.26zM5 19V6.28l5.28 5.27a3.19 3.19 0 00-.81.38 2.07 2.07 0 00-.9 1.78 2.29 2.29 0 00.66 1.74 2.63 2.63 0 001.89.63 2.39 2.39 0 001.32-.37 3.05 3.05 0 001-.93 3.72 3.72 0 00.08.57c0 .19.1.38.16.58h1L17.73 19zm5.79-6.23a1.31 1.31 0 01.45-.25l1.37 1.36.28.29a1.57 1.57 0 01-.19.15 2.27 2.27 0 01-1.21.34 1.18 1.18 0 01-.84-.27.92.92 0 01-.3-.72 1.16 1.16 0 01.44-.9zm2.6-1.47h-.83l-1.62-1.62.08-.1a1.5 1.5 0 011-.29 1.45 1.45 0 011 .35 1.3 1.3 0 01.37 1zM19 17.74l-3.85-3.85v-3.27a2.44 2.44 0 00-.84-2 3.34 3.34 0 00-2.22-.7 3.64 3.64 0 00-2.24.67L6.26 5H19z"/>`,
23
+ },
24
+ greaterThan: {
25
+ viewBox: '0 0 24 24',
26
+ paths: svg `<path d="M6 7.11L15.09 12 6 16.89V19l12-6.46v-1.08L6 5v2.11z"/>`,
27
+ },
28
+ greaterThanOrEqual: {
29
+ viewBox: '0 0 24 24',
30
+ paths: svg `<path d="M5.99 19h12.02v2H5.99zM18 9.47L6 3v2.11L15.09 10 6 14.9v2.11l12-6.47V9.47z"/>`,
31
+ },
32
+ empty: {
33
+ viewBox: '0 0 24 24',
34
+ paths: svg `<path d="M5 17h2v2H5zm8 0h2v2h-2zm-8-4h2v2H5zm12 4h2v2h-2zM13 5h2v2h-2zM9 17h2v2H9zm8-8h2v2h-2zm0 4h2v2h-2zm0-8h2v2h-2zM5 9h2v2H5zm0-4h2v2H5zm4 0h2v2H9z"/>`,
35
+ },
36
+ endsWith: {
37
+ viewBox: '0 0 24 24',
38
+ paths: svg `<path d="M3 14.5h2v2H3zm8 0h2v2h-2zm-4 0h2v2H7zm13.8.3v-3A2.1 2.1 0 0020 10a3 3 0 00-2-.6 3 3 0 00-2 .6 1.7 1.7 0 00-.7 1.5h1.5a.8.8 0 01.3-.7 1.3 1.3 0 01.9-.3 1.3 1.3 0 01.9.4 1.1 1.1 0 01.3.8v.6H18a3.8 3.8 0 00-2.2.6 1.8 1.8 0 00-.8 1.5 2 2 0 00.6 1.6 2.3 2.3 0 001.6.6 2.1 2.1 0 001.2-.4 2.8 2.8 0 00.8-.8 4.3 4.3 0 00.1.5l.1.5H21a4.1 4.1 0 01-.2-.7 5.4 5.4 0 010-1zm-1.6-.5a1.5 1.5 0 01-.6.7 2 2 0 01-1 .2 1.1 1.1 0 01-.8-.2.8.8 0 01-.2-.6 1 1 0 01.3-.8 1.5 1.5 0 011.1-.3h1.2z"/>`,
39
+ },
40
+ equals: {
41
+ viewBox: '0 0 24 24',
42
+ paths: svg `<path d="M5 13.5h14v2H5zm0-5h14v2H5z"/>`,
43
+ },
44
+ false: {
45
+ viewBox: '0 0 24 24',
46
+ paths: svg `<path d="M8 5a7 7 0 107 7 7 7 0 00-7-7zm4.31 9.79l-1.52 1.52L8 13.52l-2.79 2.79-1.52-1.52L6.48 12 3.69 9.21l1.52-1.52L8 10.48l2.79-2.79 1.52 1.52L9.52 12zM18 7a5 5 0 00-3 1.06 7.48 7.48 0 01.49 1 3.89 3.89 0 110 5.82 8.08 8.08 0 01-.49 1A5 5 0 1018 7z"/><path d="M17.52 13.85l2.91-2.92-.78-.78-2.13 2.12-1.17-1.15-.38.37-.41.41.42.42L17 13.34l.52.51z"/>`,
47
+ },
48
+ lessThan: {
49
+ viewBox: '0 0 24 24',
50
+ paths: svg `<path d="M6 12.54L18 19v-2.11L8.91 12 18 7.11V5L6 11.46v1.08z"/>`,
51
+ },
52
+ lessThanOrEqual: {
53
+ viewBox: '0 0 24 24',
54
+ paths: svg `<path d="M5.99 19h12.02v2H5.99zM18 14.9L8.91 10 18 5.11V3L6 9.47v1.07l12 6.47V14.9z"/>`,
55
+ },
56
+ notEmpty: {
57
+ viewBox: '0 0 24 24',
58
+ paths: svg `<path d="M5 9h2v2H5zm4 8h2v2H9zm4 0h2v2h-2zm4-8h2v2h-2zm0-4h2v2h-2zM5 17h2v2H5zm8-12h2v2h-2zm-8 8h2v2H5zm14 2v-2h-2v.47L18.53 15H19zm-8-8V5H9v.46L10.54 7H11zM2.76 1.76L1.5 3.06 20.97 22.5l1.26-1.26-8.89-8.89L2.76 1.76z"/>`,
59
+ },
60
+ doesNotEqual: {
61
+ viewBox: '0 0 24 24',
62
+ paths: svg `<path d="M17.37 4.71l-1.74-1-2.76 4.79H5v2h6.71l-1.73 3H5v2h3.82l-2.19 3.79 1.74 1 2.76-4.79H19v-2h-6.71l1.73-3H19v-2h-3.82l2.19-3.79z"/>`,
63
+ },
64
+ startsWith: {
65
+ viewBox: '0 0 24 24',
66
+ paths: svg `<path d="M5.9 7.5l-3.9 9h1.7l.7-1.8h4.1l.7 1.8H11l-3.9-9H5.9zM5 13.2l1.5-4.1L8 13.2H5zm7 1.3h2v2h-2v-2zm8 0h2v2h-2v-2zm-4 0h2v2h-2v-2z"/>`,
67
+ },
68
+ true: {
69
+ viewBox: '0 0 24 24',
70
+ paths: svg `<path d="M19.44 14.22zm-2.88 0zm0 0L18 12.79l1.44 1.43.78-.78L18.79 12l1.43-1.44-.78-.78L18 11.21l-1.44-1.43-.78.78L17.21 12l-1.43 1.44.78.78z"/><path d="M18 7a5 5 0 00-3 1.06 7.48 7.48 0 01.49 1 3.89 3.89 0 110 5.82 8.08 8.08 0 01-.49 1A5 5 0 1018 7zM8 5a7 7 0 107 7 7 7 0 00-7-7zm-.93 10.18l-3.38-3.37 1.13-1.12 2.25 2.25 4.11-4.12 1.13 1.12z"/>`,
71
+ },
72
+ filter: {
73
+ viewBox: '0 0 45 45',
74
+ paths: svg `<path d="M20 36v-3h8v3Zm-8-10.5v-3h24v3ZM6 15v-3h36v3Z"/>`,
75
+ },
76
+ close: {
77
+ viewBox: '0 0 48 48',
78
+ paths: svg `<path d="m12.45 37.65-2.1-2.1L21.9 24 10.35 12.45l2.1-2.1L24 21.9l11.55-11.55 2.1 2.1L26.1 24l11.55 11.55-2.1 2.1L24 26.1Z"/>`,
79
+ },
80
+ refresh: {
81
+ viewBox: '0 0 48 48',
82
+ paths: svg `<path d="M24 40q-6.65 0-11.325-4.675Q8 30.65 8 24q0-6.65 4.675-11.325Q17.35 8 24 8q4.25 0 7.45 1.725T37 14.45V8h3v12.7H27.3v-3h8.4q-1.9-3-4.85-4.85Q27.9 11 24 11q-5.45 0-9.225 3.775Q11 18.55 11 24q0 5.45 3.775 9.225Q18.55 37 24 37q4.15 0 7.6-2.375 3.45-2.375 4.8-6.275h3.1q-1.45 5.25-5.75 8.45Q29.45 40 24 40Z"/>`,
83
+ },
84
+ 'page-first': {
85
+ viewBox: '0 0 24 24',
86
+ paths: svg `<path d="M6 6h2v12H6zm3.5 6l8.5 6V6z"/>`,
87
+ },
88
+ 'page-previous': {
89
+ viewBox: '0 0 24 24',
90
+ paths: svg `<path d="M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>`,
91
+ },
92
+ 'page-next': {
93
+ viewBox: '0 0 24 24',
94
+ paths: svg `<path d="M8.59 16.59 10 18l6-6-6-6-1.41 1.41L13.17 12z"/>`,
95
+ },
96
+ 'page-last': {
97
+ viewBox: '0 0 24 24',
98
+ paths: svg `<path d="M6 18l8.5-6L6 6v12zM16 6h2v12h-2z"/>`,
99
+ },
100
+ search: {
101
+ viewBox: '0 0 24 24',
102
+ paths: svg `<path d="M15.5 14h-.79l-.28-.27a6.471 6.471 0 0 0 1.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 0 0-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.471 6.471 0 0 0 5.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"/>`,
103
+ },
104
+ star: {
105
+ viewBox: '0 0 24 24',
106
+ paths: svg `<path d="M12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/>`,
107
+ },
108
+ 'chevron-down': {
109
+ viewBox: '0 0 24 24',
110
+ paths: svg `<path d="M7.41 8.58 12 13.17l4.59-4.59L18 10l-6 6-6-6z"/>`,
111
+ },
112
+ download: {
113
+ viewBox: '0 0 24 24',
114
+ paths: svg `<path d="M5 20h14v-2H5v2zM19 9h-4V3H9v6H5l7 7 7-7z"/>`,
115
+ },
116
+ };
117
+ export function renderIcon(name, opts = {}) {
118
+ const icon = ICONS[name];
119
+ if (!icon)
120
+ return html ``;
121
+ return html `<svg
122
+ xmlns="http://www.w3.org/2000/svg"
123
+ viewBox=${icon.viewBox}
124
+ fill="currentColor"
125
+ aria-hidden="true"
126
+ focusable="false"
127
+ data-icon=${name}
128
+ slot=${ifDefined(opts.slot)}
129
+ part=${ifDefined(opts.part)}
130
+ class=${ifDefined(opts.class)}
131
+ data-sort-index=${ifDefined(opts.sortIndex)}
132
+ >${icon.paths}</svg>`;
133
+ }
134
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/internal/icons.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, type SVGTemplateResult, svg, type TemplateResult } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\ninterface IconDef {\n viewBox: string;\n paths: SVGTemplateResult;\n}\n\nconst ICONS: Record<string, IconDef> = {\n 'arrow-upward': {\n viewBox: '0 0 45 45',\n paths: svg`<path d=\"M22.5 40V13.7L10.1 26.1 8 24 24 8l16 16-2.1 2.1-12.4-12.4V40Z\"/>`,\n },\n 'arrow-downward': {\n viewBox: '0 0 45 45',\n paths: svg`<path fill=\"currentColor\" d=\"M24 40 8 24l2.1-2.1 12.4 12.4V8h3v26.3l12.4-12.4L40 24Z\"/>`,\n },\n all: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M2 14h8v2H2zm0-8h12v2H2zm14 11l-3-3-1.5 1.5L16 20l7-7-1.5-1.5L16 17zM2 10h12v2H2z\"/>`,\n },\n contains: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M3 3v18h18V3zm16 16H5V5h14z\"/><path d=\"M12 11.3a4.39 4.39 0 00-2.54.63 2.07 2.07 0 00-.9 1.78 2.29 2.29 0 00.66 1.74 2.63 2.63 0 001.89.63 2.39 2.39 0 001.32-.37 3.05 3.05 0 001-.93 3.72 3.72 0 00.08.57c0 .19.1.38.16.58h1.79a4.51 4.51 0 01-.21-.88 5.57 5.57 0 01-.07-.93v-3.5a2.44 2.44 0 00-.84-2 3.34 3.34 0 00-2.22-.7 3.54 3.54 0 00-2.3.72A1.93 1.93 0 009 10.29h1.71a.93.93 0 01.29-.71 1.5 1.5 0 011-.29 1.45 1.45 0 011 .35 1.3 1.3 0 01.37 1v.69zm1.4 1.08v1.17a1.61 1.61 0 01-.71.77 2.27 2.27 0 01-1.21.34 1.18 1.18 0 01-.84-.27.92.92 0 01-.3-.72 1.16 1.16 0 01.44-.9 1.76 1.76 0 011.22-.39z\"/>`,\n },\n doesNotContain: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M21 19.74V3H4.26L2.89 1.63 1.63 2.92 3 4.29V21h16.73l1.37 1.37 1.27-1.26zM5 19V6.28l5.28 5.27a3.19 3.19 0 00-.81.38 2.07 2.07 0 00-.9 1.78 2.29 2.29 0 00.66 1.74 2.63 2.63 0 001.89.63 2.39 2.39 0 001.32-.37 3.05 3.05 0 001-.93 3.72 3.72 0 00.08.57c0 .19.1.38.16.58h1L17.73 19zm5.79-6.23a1.31 1.31 0 01.45-.25l1.37 1.36.28.29a1.57 1.57 0 01-.19.15 2.27 2.27 0 01-1.21.34 1.18 1.18 0 01-.84-.27.92.92 0 01-.3-.72 1.16 1.16 0 01.44-.9zm2.6-1.47h-.83l-1.62-1.62.08-.1a1.5 1.5 0 011-.29 1.45 1.45 0 011 .35 1.3 1.3 0 01.37 1zM19 17.74l-3.85-3.85v-3.27a2.44 2.44 0 00-.84-2 3.34 3.34 0 00-2.22-.7 3.64 3.64 0 00-2.24.67L6.26 5H19z\"/>`,\n },\n greaterThan: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 7.11L15.09 12 6 16.89V19l12-6.46v-1.08L6 5v2.11z\"/>`,\n },\n greaterThanOrEqual: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5.99 19h12.02v2H5.99zM18 9.47L6 3v2.11L15.09 10 6 14.9v2.11l12-6.47V9.47z\"/>`,\n },\n empty: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 17h2v2H5zm8 0h2v2h-2zm-8-4h2v2H5zm12 4h2v2h-2zM13 5h2v2h-2zM9 17h2v2H9zm8-8h2v2h-2zm0 4h2v2h-2zm0-8h2v2h-2zM5 9h2v2H5zm0-4h2v2H5zm4 0h2v2H9z\"/>`,\n },\n endsWith: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M3 14.5h2v2H3zm8 0h2v2h-2zm-4 0h2v2H7zm13.8.3v-3A2.1 2.1 0 0020 10a3 3 0 00-2-.6 3 3 0 00-2 .6 1.7 1.7 0 00-.7 1.5h1.5a.8.8 0 01.3-.7 1.3 1.3 0 01.9-.3 1.3 1.3 0 01.9.4 1.1 1.1 0 01.3.8v.6H18a3.8 3.8 0 00-2.2.6 1.8 1.8 0 00-.8 1.5 2 2 0 00.6 1.6 2.3 2.3 0 001.6.6 2.1 2.1 0 001.2-.4 2.8 2.8 0 00.8-.8 4.3 4.3 0 00.1.5l.1.5H21a4.1 4.1 0 01-.2-.7 5.4 5.4 0 010-1zm-1.6-.5a1.5 1.5 0 01-.6.7 2 2 0 01-1 .2 1.1 1.1 0 01-.8-.2.8.8 0 01-.2-.6 1 1 0 01.3-.8 1.5 1.5 0 011.1-.3h1.2z\"/>`,\n },\n equals: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 13.5h14v2H5zm0-5h14v2H5z\"/>`,\n },\n false: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M8 5a7 7 0 107 7 7 7 0 00-7-7zm4.31 9.79l-1.52 1.52L8 13.52l-2.79 2.79-1.52-1.52L6.48 12 3.69 9.21l1.52-1.52L8 10.48l2.79-2.79 1.52 1.52L9.52 12zM18 7a5 5 0 00-3 1.06 7.48 7.48 0 01.49 1 3.89 3.89 0 110 5.82 8.08 8.08 0 01-.49 1A5 5 0 1018 7z\"/><path d=\"M17.52 13.85l2.91-2.92-.78-.78-2.13 2.12-1.17-1.15-.38.37-.41.41.42.42L17 13.34l.52.51z\"/>`,\n },\n lessThan: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 12.54L18 19v-2.11L8.91 12 18 7.11V5L6 11.46v1.08z\"/>`,\n },\n lessThanOrEqual: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5.99 19h12.02v2H5.99zM18 14.9L8.91 10 18 5.11V3L6 9.47v1.07l12 6.47V14.9z\"/>`,\n },\n notEmpty: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 9h2v2H5zm4 8h2v2H9zm4 0h2v2h-2zm4-8h2v2h-2zm0-4h2v2h-2zM5 17h2v2H5zm8-12h2v2h-2zm-8 8h2v2H5zm14 2v-2h-2v.47L18.53 15H19zm-8-8V5H9v.46L10.54 7H11zM2.76 1.76L1.5 3.06 20.97 22.5l1.26-1.26-8.89-8.89L2.76 1.76z\"/>`,\n },\n doesNotEqual: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M17.37 4.71l-1.74-1-2.76 4.79H5v2h6.71l-1.73 3H5v2h3.82l-2.19 3.79 1.74 1 2.76-4.79H19v-2h-6.71l1.73-3H19v-2h-3.82l2.19-3.79z\"/>`,\n },\n startsWith: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5.9 7.5l-3.9 9h1.7l.7-1.8h4.1l.7 1.8H11l-3.9-9H5.9zM5 13.2l1.5-4.1L8 13.2H5zm7 1.3h2v2h-2v-2zm8 0h2v2h-2v-2zm-4 0h2v2h-2v-2z\"/>`,\n },\n true: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M19.44 14.22zm-2.88 0zm0 0L18 12.79l1.44 1.43.78-.78L18.79 12l1.43-1.44-.78-.78L18 11.21l-1.44-1.43-.78.78L17.21 12l-1.43 1.44.78.78z\"/><path d=\"M18 7a5 5 0 00-3 1.06 7.48 7.48 0 01.49 1 3.89 3.89 0 110 5.82 8.08 8.08 0 01-.49 1A5 5 0 1018 7zM8 5a7 7 0 107 7 7 7 0 00-7-7zm-.93 10.18l-3.38-3.37 1.13-1.12 2.25 2.25 4.11-4.12 1.13 1.12z\"/>`,\n },\n filter: {\n viewBox: '0 0 45 45',\n paths: svg`<path d=\"M20 36v-3h8v3Zm-8-10.5v-3h24v3ZM6 15v-3h36v3Z\"/>`,\n },\n close: {\n viewBox: '0 0 48 48',\n paths: svg`<path d=\"m12.45 37.65-2.1-2.1L21.9 24 10.35 12.45l2.1-2.1L24 21.9l11.55-11.55 2.1 2.1L26.1 24l11.55 11.55-2.1 2.1L24 26.1Z\"/>`,\n },\n refresh: {\n viewBox: '0 0 48 48',\n paths: svg`<path d=\"M24 40q-6.65 0-11.325-4.675Q8 30.65 8 24q0-6.65 4.675-11.325Q17.35 8 24 8q4.25 0 7.45 1.725T37 14.45V8h3v12.7H27.3v-3h8.4q-1.9-3-4.85-4.85Q27.9 11 24 11q-5.45 0-9.225 3.775Q11 18.55 11 24q0 5.45 3.775 9.225Q18.55 37 24 37q4.15 0 7.6-2.375 3.45-2.375 4.8-6.275h3.1q-1.45 5.25-5.75 8.45Q29.45 40 24 40Z\"/>`,\n },\n 'page-first': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 6h2v12H6zm3.5 6l8.5 6V6z\"/>`,\n },\n 'page-previous': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z\"/>`,\n },\n 'page-next': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M8.59 16.59 10 18l6-6-6-6-1.41 1.41L13.17 12z\"/>`,\n },\n 'page-last': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M6 18l8.5-6L6 6v12zM16 6h2v12h-2z\"/>`,\n },\n search: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M15.5 14h-.79l-.28-.27a6.471 6.471 0 0 0 1.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 0 0-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.471 6.471 0 0 0 5.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"/>`,\n },\n star: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M12 17.27 18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z\"/>`,\n },\n 'chevron-down': {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M7.41 8.58 12 13.17l4.59-4.59L18 10l-6 6-6-6z\"/>`,\n },\n download: {\n viewBox: '0 0 24 24',\n paths: svg`<path d=\"M5 20h14v-2H5v2zM19 9h-4V3H9v6H5l7 7 7-7z\"/>`,\n },\n};\n\nexport type GridIconName = keyof typeof ICONS;\n\nexport interface IconRenderOptions {\n /** Lit `slot` attribute. Useful when icons sit inside slotted positions of other components. */\n slot?: string;\n /** Lit `part` attribute. */\n part?: string;\n /** Inline `class` attribute. */\n class?: string;\n /** When provided, sets `data-sort-index` (used by the header sort indicator). */\n sortIndex?: number | string;\n}\n\n/**\n * Renders one of the grid's built-in icons as an inline `<svg>`. All icons are\n * decorative (`aria-hidden=\"true\"`) by default — surrounding controls supply\n * the accessible label via `aria-label`.\n */\nexport function renderIcon(name: string, opts: IconRenderOptions = {}): TemplateResult {\n const icon = ICONS[name];\n if (!icon) return html``;\n return html`<svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=${icon.viewBox}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n focusable=\"false\"\n data-icon=${name}\n slot=${ifDefined(opts.slot)}\n part=${ifDefined(opts.part)}\n class=${ifDefined(opts.class)}\n data-sort-index=${ifDefined(opts.sortIndex)}\n >${icon.paths}</svg>`;\n}\n"]}
@@ -5,3 +5,5 @@ export declare const GRID_HEADER_TAG: "apex-grid-header";
5
5
  export declare const GRID_ROW_TAG: "apex-grid-row";
6
6
  export declare const GRID_CELL_TAG: "apex-grid-cell";
7
7
  export declare const GRID_FILTER_ROW_TAG: "apex-filter-row";
8
+ export declare const GRID_PAGINATOR_TAG: "apex-grid-paginator";
9
+ export declare const GRID_TOOLBAR_TAG: "apex-grid-toolbar";
package/internal/tags.js CHANGED
@@ -5,4 +5,6 @@ export const GRID_HEADER_TAG = 'apex-grid-header';
5
5
  export const GRID_ROW_TAG = 'apex-grid-row';
6
6
  export const GRID_CELL_TAG = 'apex-grid-cell';
7
7
  export const GRID_FILTER_ROW_TAG = 'apex-filter-row';
8
+ export const GRID_PAGINATOR_TAG = 'apex-grid-paginator';
9
+ export const GRID_TOOLBAR_TAG = 'apex-grid-toolbar';
8
10
  //# sourceMappingURL=tags.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/internal/tags.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAoB,CAAC;AAC7C,MAAM,CAAC,MAAM,SAAS,GAAG,kBAA2B,CAAC;AACrD,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAA+B,CAAC;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,kBAA2B,CAAC;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,eAAwB,CAAC;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAyB,CAAC;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAA0B,CAAC","sourcesContent":["export const GRID_TAG = 'apex-grid' as const;\nexport const GRID_BODY = 'apex-virtualizer' as const;\nexport const GRID_HEADER_ROW_TAG = 'apex-grid-header-row' as const;\nexport const GRID_HEADER_TAG = 'apex-grid-header' as const;\nexport const GRID_ROW_TAG = 'apex-grid-row' as const;\nexport const GRID_CELL_TAG = 'apex-grid-cell' as const;\nexport const GRID_FILTER_ROW_TAG = 'apex-filter-row' as const;\n"]}
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/internal/tags.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,WAAoB,CAAC;AAC7C,MAAM,CAAC,MAAM,SAAS,GAAG,kBAA2B,CAAC;AACrD,MAAM,CAAC,MAAM,mBAAmB,GAAG,sBAA+B,CAAC;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,kBAA2B,CAAC;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,eAAwB,CAAC;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAyB,CAAC;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAA0B,CAAC;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAA8B,CAAC;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAA4B,CAAC","sourcesContent":["export const GRID_TAG = 'apex-grid' as const;\nexport const GRID_BODY = 'apex-virtualizer' as const;\nexport const GRID_HEADER_ROW_TAG = 'apex-grid-header-row' as const;\nexport const GRID_HEADER_TAG = 'apex-grid-header' as const;\nexport const GRID_ROW_TAG = 'apex-grid-row' as const;\nexport const GRID_CELL_TAG = 'apex-grid-cell' as const;\nexport const GRID_FILTER_ROW_TAG = 'apex-filter-row' as const;\nexport const GRID_PAGINATOR_TAG = 'apex-grid-paginator' as const;\nexport const GRID_TOOLBAR_TAG = 'apex-grid-toolbar' as const;\n"]}
@@ -85,7 +85,7 @@ class ThemingController {
85
85
  globalThis.addEventListener(CHANGE_THEME_EVENT, this);
86
86
  }
87
87
  hostDisconnected() {
88
- globalThis.addEventListener(CHANGE_THEME_EVENT, this);
88
+ globalThis.removeEventListener(CHANGE_THEME_EVENT, this);
89
89
  }
90
90
  handleEvent() {
91
91
  this._handleThemeChanged();
@@ -1 +1 @@
1
- {"version":3,"file":"theming.js","sourceRoot":"","sources":["../../src/internal/theming.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CSSResult,\n LitElement,\n ReactiveController,\n ReactiveControllerHost,\n ReactiveElement,\n} from 'lit';\nimport { adoptStyles, css, isServer } from 'lit';\n\ntype Theme = 'material' | 'bootstrap' | 'indigo' | 'fluent';\ntype ThemeVariant = 'light' | 'dark';\n\ntype Themes = {\n light: {\n [K in Theme | 'shared']?: CSSResult;\n };\n dark: {\n [K in Theme | 'shared']?: CSSResult;\n };\n};\n\ntype ThemeChangedCallback = (theme: Theme) => unknown;\ntype ThemingControllerConfig = {\n themeChange?: ThemeChangedCallback;\n};\n\nconst CHANGE_THEME_EVENT = 'igc-change-theme';\nlet theme: Theme;\nlet themeVariant: ThemeVariant;\n\nfunction isStyleRule(rule: CSSRule): rule is CSSStyleRule {\n return rule != null && 'style' in rule;\n}\n\nfunction cssKeyToJsKey(key: string): string {\n return key.replace(/^--|-./g, (match) => {\n return match.startsWith('--') ? '' : match.charAt(1).toUpperCase();\n });\n}\n\nfunction getAllCssVariableNames(): Set<string> {\n const cssVars = new Set<string>();\n const styleSheets = Array.from(document.styleSheets);\n\n for (const sheet of styleSheets) {\n let rules: CSSRuleList | undefined;\n\n // Potential CORS or access errors\n try {\n rules = sheet.cssRules;\n } catch {\n continue;\n }\n\n if (!rules) {\n continue;\n }\n\n for (const rule of Array.from(rules)) {\n if (isStyleRule(rule)) {\n const length = rule.style.length;\n\n for (let i = 0; i < length; i++) {\n const style = rule.style[i];\n\n if (style.startsWith('--')) {\n cssVars.add(style);\n }\n }\n }\n }\n }\n\n return cssVars;\n}\n\nfunction getElementCssVariables(\n allCssVars: Set<string>,\n element: HTMLElement,\n pseudo?: string\n): Record<string, string> {\n const cssVars: Record<string, string> = {};\n const styles = getComputedStyle(element, pseudo);\n\n for (const key of allCssVars) {\n const value = styles.getPropertyValue(key);\n\n if (value) {\n cssVars[cssKeyToJsKey(key)] = value.trim();\n }\n }\n\n return cssVars;\n}\n\nfunction getAllCssVariables(): Record<string, string> {\n /* c8 ignore next 2 */\n return isServer ? {} : getElementCssVariables(getAllCssVariableNames(), document.documentElement);\n}\n\nfunction isOfTypeTheme(theme: string): theme is Theme {\n return ['bootstrap', 'material', 'indigo', 'fluent'].includes(theme);\n}\n\nfunction isOfTypeThemeVariant(variant: string): variant is ThemeVariant {\n return ['light', 'dark'].includes(variant);\n}\n\nfunction getTheme() {\n if (!(theme && themeVariant)) {\n const cssVars = getAllCssVariables();\n const foundTheme = cssVars.igTheme;\n const foundVariant = cssVars.igThemeVariant;\n\n theme = isOfTypeTheme(foundTheme) ? foundTheme : 'bootstrap';\n themeVariant = isOfTypeThemeVariant(foundVariant) ? foundVariant : 'light';\n }\n\n return { theme, themeVariant };\n}\n\nclass ThemingController implements ReactiveController {\n private readonly _host: ReactiveControllerHost & ReactiveElement;\n private readonly _themes: Themes;\n private readonly _options?: ThemingControllerConfig;\n\n private _theme: Theme = 'bootstrap';\n private _variant: ThemeVariant = 'light';\n\n public get theme(): Theme {\n return this._theme;\n }\n\n constructor(\n host: ReactiveControllerHost & ReactiveElement,\n themes: Themes,\n config?: ThemingControllerConfig\n ) {\n this._host = host;\n this._themes = themes;\n this._options = config;\n this._host.addController(this);\n }\n\n /** @internal */\n public hostConnected(): void {\n this._handleThemeChanged();\n globalThis.addEventListener(CHANGE_THEME_EVENT, this);\n }\n\n /** @internal */\n public hostDisconnected(): void {\n globalThis.addEventListener(CHANGE_THEME_EVENT, this);\n }\n\n /** @internal */\n public handleEvent(): void {\n this._handleThemeChanged();\n }\n\n private _getStyles() {\n const props = this._themes[this._variant];\n const styles = { shared: css``, theme: css`` };\n\n for (const [name, sheet] of Object.entries(props)) {\n if (name === 'shared') {\n styles.shared = sheet;\n }\n if (name === this.theme) {\n styles.theme = sheet;\n }\n }\n\n return styles;\n }\n\n protected _adoptStyles(): void {\n const { theme: currentTheme, themeVariant } = getTheme();\n this._theme = currentTheme;\n this._variant = themeVariant;\n\n const ctor = this._host.constructor as typeof LitElement;\n const { shared, theme } = this._getStyles();\n\n adoptStyles(this._host.shadowRoot!, [...ctor.elementStyles, shared, theme]);\n }\n\n private _handleThemeChanged(): void {\n this._adoptStyles();\n this._options?.themeChange?.call(this._host, this._theme);\n this._host.requestUpdate();\n }\n}\n\nexport function addThemingController(\n host: ReactiveControllerHost & ReactiveElement,\n themes: Themes,\n config?: ThemingControllerConfig\n): ThemingController {\n return new ThemingController(host, themes, config);\n}\n\nexport type { ThemingController };\n"]}
1
+ {"version":3,"file":"theming.js","sourceRoot":"","sources":["../../src/internal/theming.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CSSResult,\n LitElement,\n ReactiveController,\n ReactiveControllerHost,\n ReactiveElement,\n} from 'lit';\nimport { adoptStyles, css, isServer } from 'lit';\n\ntype Theme = 'material' | 'bootstrap' | 'indigo' | 'fluent';\ntype ThemeVariant = 'light' | 'dark';\n\ntype Themes = {\n light: {\n [K in Theme | 'shared']?: CSSResult;\n };\n dark: {\n [K in Theme | 'shared']?: CSSResult;\n };\n};\n\ntype ThemeChangedCallback = (theme: Theme) => unknown;\ntype ThemingControllerConfig = {\n themeChange?: ThemeChangedCallback;\n};\n\nconst CHANGE_THEME_EVENT = 'igc-change-theme';\nlet theme: Theme;\nlet themeVariant: ThemeVariant;\n\nfunction isStyleRule(rule: CSSRule): rule is CSSStyleRule {\n return rule != null && 'style' in rule;\n}\n\nfunction cssKeyToJsKey(key: string): string {\n return key.replace(/^--|-./g, (match) => {\n return match.startsWith('--') ? '' : match.charAt(1).toUpperCase();\n });\n}\n\nfunction getAllCssVariableNames(): Set<string> {\n const cssVars = new Set<string>();\n const styleSheets = Array.from(document.styleSheets);\n\n for (const sheet of styleSheets) {\n let rules: CSSRuleList | undefined;\n\n // Potential CORS or access errors\n try {\n rules = sheet.cssRules;\n } catch {\n continue;\n }\n\n if (!rules) {\n continue;\n }\n\n for (const rule of Array.from(rules)) {\n if (isStyleRule(rule)) {\n const length = rule.style.length;\n\n for (let i = 0; i < length; i++) {\n const style = rule.style[i];\n\n if (style.startsWith('--')) {\n cssVars.add(style);\n }\n }\n }\n }\n }\n\n return cssVars;\n}\n\nfunction getElementCssVariables(\n allCssVars: Set<string>,\n element: HTMLElement,\n pseudo?: string\n): Record<string, string> {\n const cssVars: Record<string, string> = {};\n const styles = getComputedStyle(element, pseudo);\n\n for (const key of allCssVars) {\n const value = styles.getPropertyValue(key);\n\n if (value) {\n cssVars[cssKeyToJsKey(key)] = value.trim();\n }\n }\n\n return cssVars;\n}\n\nfunction getAllCssVariables(): Record<string, string> {\n /* c8 ignore next 2 */\n return isServer ? {} : getElementCssVariables(getAllCssVariableNames(), document.documentElement);\n}\n\nfunction isOfTypeTheme(theme: string): theme is Theme {\n return ['bootstrap', 'material', 'indigo', 'fluent'].includes(theme);\n}\n\nfunction isOfTypeThemeVariant(variant: string): variant is ThemeVariant {\n return ['light', 'dark'].includes(variant);\n}\n\nfunction getTheme() {\n if (!(theme && themeVariant)) {\n const cssVars = getAllCssVariables();\n const foundTheme = cssVars.igTheme;\n const foundVariant = cssVars.igThemeVariant;\n\n theme = isOfTypeTheme(foundTheme) ? foundTheme : 'bootstrap';\n themeVariant = isOfTypeThemeVariant(foundVariant) ? foundVariant : 'light';\n }\n\n return { theme, themeVariant };\n}\n\nclass ThemingController implements ReactiveController {\n private readonly _host: ReactiveControllerHost & ReactiveElement;\n private readonly _themes: Themes;\n private readonly _options?: ThemingControllerConfig;\n\n private _theme: Theme = 'bootstrap';\n private _variant: ThemeVariant = 'light';\n\n public get theme(): Theme {\n return this._theme;\n }\n\n constructor(\n host: ReactiveControllerHost & ReactiveElement,\n themes: Themes,\n config?: ThemingControllerConfig\n ) {\n this._host = host;\n this._themes = themes;\n this._options = config;\n this._host.addController(this);\n }\n\n /** @internal */\n public hostConnected(): void {\n this._handleThemeChanged();\n globalThis.addEventListener(CHANGE_THEME_EVENT, this);\n }\n\n /** @internal */\n public hostDisconnected(): void {\n globalThis.removeEventListener(CHANGE_THEME_EVENT, this);\n }\n\n /** @internal */\n public handleEvent(): void {\n this._handleThemeChanged();\n }\n\n private _getStyles() {\n const props = this._themes[this._variant];\n const styles = { shared: css``, theme: css`` };\n\n for (const [name, sheet] of Object.entries(props)) {\n if (name === 'shared') {\n styles.shared = sheet;\n }\n if (name === this.theme) {\n styles.theme = sheet;\n }\n }\n\n return styles;\n }\n\n protected _adoptStyles(): void {\n const { theme: currentTheme, themeVariant } = getTheme();\n this._theme = currentTheme;\n this._variant = themeVariant;\n\n const ctor = this._host.constructor as typeof LitElement;\n const { shared, theme } = this._getStyles();\n\n adoptStyles(this._host.shadowRoot!, [...ctor.elementStyles, shared, theme]);\n }\n\n private _handleThemeChanged(): void {\n this._adoptStyles();\n this._options?.themeChange?.call(this._host, this._theme);\n this._host.requestUpdate();\n }\n}\n\nexport function addThemingController(\n host: ReactiveControllerHost & ReactiveElement,\n themes: Themes,\n config?: ThemingControllerConfig\n): ThemingController {\n return new ThemingController(host, themes, config);\n}\n\nexport type { ThemingController };\n"]}