@justeattakeaway/pie-data-table 0.0.0-snapshot-release-20250818121553 → 0.0.0-snapshot-release-20251010234024

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 (104) hide show
  1. package/custom-elements.json +748 -259
  2. package/dist/{PieElement-Y2VnHR4y.js → PieElement-DgHPBi0_.js} +1 -1
  3. package/dist/defs.d.ts +19 -3
  4. package/dist/defs.d.ts.map +1 -1
  5. package/dist/index.d.ts +18 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +98 -46
  8. package/dist/pie-data-table-body/defs-react.d.ts +3 -0
  9. package/dist/pie-data-table-body/defs-react.d.ts.map +1 -0
  10. package/dist/pie-data-table-body/defs.d.ts +2 -0
  11. package/dist/pie-data-table-body/defs.d.ts.map +1 -0
  12. package/dist/pie-data-table-body/index.d.ts +17 -0
  13. package/dist/pie-data-table-body/index.d.ts.map +1 -0
  14. package/dist/pie-data-table-body/index.js +21 -0
  15. package/dist/pie-data-table-body/react.d.ts +7 -0
  16. package/dist/pie-data-table-body/react.d.ts.map +1 -0
  17. package/dist/pie-data-table-body/react.js +13 -0
  18. package/dist/pie-data-table-cell/defs-react.d.ts +3 -0
  19. package/dist/pie-data-table-cell/defs-react.d.ts.map +1 -0
  20. package/dist/pie-data-table-cell/defs.d.ts +14 -0
  21. package/dist/pie-data-table-cell/defs.d.ts.map +1 -0
  22. package/dist/pie-data-table-cell/index.d.ts +27 -0
  23. package/dist/pie-data-table-cell/index.d.ts.map +1 -0
  24. package/dist/pie-data-table-cell/index.js +39 -0
  25. package/dist/pie-data-table-cell/react.d.ts +7 -0
  26. package/dist/pie-data-table-cell/react.d.ts.map +1 -0
  27. package/dist/pie-data-table-cell/react.js +16 -0
  28. package/dist/pie-data-table-contents/defs-react.d.ts +3 -0
  29. package/dist/pie-data-table-contents/defs-react.d.ts.map +1 -0
  30. package/dist/pie-data-table-contents/defs.d.ts +2 -0
  31. package/dist/pie-data-table-contents/defs.d.ts.map +1 -0
  32. package/dist/pie-data-table-contents/index.d.ts +18 -0
  33. package/dist/pie-data-table-contents/index.d.ts.map +1 -0
  34. package/dist/pie-data-table-contents/index.js +24 -0
  35. package/dist/pie-data-table-contents/react.d.ts +7 -0
  36. package/dist/pie-data-table-contents/react.d.ts.map +1 -0
  37. package/dist/pie-data-table-contents/react.js +13 -0
  38. package/dist/pie-data-table-head/defs-react.d.ts +3 -0
  39. package/dist/pie-data-table-head/defs-react.d.ts.map +1 -0
  40. package/dist/pie-data-table-head/defs.d.ts +2 -0
  41. package/dist/pie-data-table-head/defs.d.ts.map +1 -0
  42. package/dist/pie-data-table-head/index.d.ts +18 -0
  43. package/dist/pie-data-table-head/index.d.ts.map +1 -0
  44. package/dist/pie-data-table-head/index.js +24 -0
  45. package/dist/pie-data-table-head/react.d.ts +7 -0
  46. package/dist/pie-data-table-head/react.d.ts.map +1 -0
  47. package/dist/pie-data-table-head/react.js +13 -0
  48. package/dist/pie-data-table-head-cell/defs-react.d.ts +3 -0
  49. package/dist/pie-data-table-head-cell/defs-react.d.ts.map +1 -0
  50. package/dist/pie-data-table-head-cell/defs.d.ts +14 -0
  51. package/dist/pie-data-table-head-cell/defs.d.ts.map +1 -0
  52. package/dist/pie-data-table-head-cell/index.d.ts +27 -0
  53. package/dist/pie-data-table-head-cell/index.d.ts.map +1 -0
  54. package/dist/pie-data-table-head-cell/index.js +39 -0
  55. package/dist/pie-data-table-head-cell/react.d.ts +7 -0
  56. package/dist/pie-data-table-head-cell/react.d.ts.map +1 -0
  57. package/dist/pie-data-table-head-cell/react.js +16 -0
  58. package/dist/pie-data-table-header/index.d.ts.map +1 -1
  59. package/dist/pie-data-table-header/index.js +2 -1
  60. package/dist/pie-data-table-row/defs-react.d.ts +3 -0
  61. package/dist/pie-data-table-row/defs-react.d.ts.map +1 -0
  62. package/dist/pie-data-table-row/defs.d.ts +13 -0
  63. package/dist/pie-data-table-row/defs.d.ts.map +1 -0
  64. package/dist/pie-data-table-row/index.d.ts +30 -0
  65. package/dist/pie-data-table-row/index.d.ts.map +1 -0
  66. package/dist/pie-data-table-row/index.js +46 -0
  67. package/dist/pie-data-table-row/react.d.ts +7 -0
  68. package/dist/pie-data-table-row/react.d.ts.map +1 -0
  69. package/dist/pie-data-table-row/react.js +15 -0
  70. package/package.json +7 -4
  71. package/src/data-table.scss +11 -17
  72. package/src/defs.ts +24 -6
  73. package/src/index.ts +83 -12
  74. package/src/pie-data-table-body/data-table-body.scss +3 -0
  75. package/src/pie-data-table-body/defs-react.ts +3 -0
  76. package/src/pie-data-table-body/defs.ts +1 -0
  77. package/src/pie-data-table-body/index.ts +29 -0
  78. package/src/pie-data-table-body/react.ts +19 -0
  79. package/src/pie-data-table-cell/data-table-cell.scss +21 -0
  80. package/src/pie-data-table-cell/defs-react.ts +3 -0
  81. package/src/pie-data-table-cell/defs.ts +19 -0
  82. package/src/pie-data-table-cell/index.ts +61 -0
  83. package/src/pie-data-table-cell/react.ts +19 -0
  84. package/src/pie-data-table-contents/data-table-contents.scss +4 -0
  85. package/src/pie-data-table-contents/defs-react.ts +3 -0
  86. package/src/pie-data-table-contents/defs.ts +1 -0
  87. package/src/pie-data-table-contents/index.ts +35 -0
  88. package/src/pie-data-table-contents/react.ts +19 -0
  89. package/src/pie-data-table-head/data-table-head.scss +8 -0
  90. package/src/pie-data-table-head/defs-react.ts +3 -0
  91. package/src/pie-data-table-head/defs.ts +1 -0
  92. package/src/pie-data-table-head/index.ts +36 -0
  93. package/src/pie-data-table-head/react.ts +19 -0
  94. package/src/pie-data-table-head-cell/data-table-head-cell.scss +21 -0
  95. package/src/pie-data-table-head-cell/defs-react.ts +3 -0
  96. package/src/pie-data-table-head-cell/defs.ts +19 -0
  97. package/src/pie-data-table-head-cell/index.ts +59 -0
  98. package/src/pie-data-table-head-cell/react.ts +19 -0
  99. package/src/pie-data-table-header/index.ts +1 -0
  100. package/src/pie-data-table-row/data-table-row.scss +12 -0
  101. package/src/pie-data-table-row/defs-react.ts +3 -0
  102. package/src/pie-data-table-row/defs.ts +17 -0
  103. package/src/pie-data-table-row/index.ts +77 -0
  104. package/src/pie-data-table-row/react.ts +19 -0
package/src/index.ts CHANGED
@@ -4,10 +4,19 @@ import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElem
4
4
  import { RtlMixin, safeCustomElement } from '@justeattakeaway/pie-webc-core';
5
5
  import { classMap } from 'lit/directives/class-map.js';
6
6
 
7
+ // import '@justeattakeaway/pie-data-table-contents';
8
+ // import '@justeattakeaway/pie-data-table-head';
9
+ // import '@justeattakeaway/pie-data-table-head-cell';
10
+ // import '@justeattakeaway/pie-data-table-body';
11
+ // import '@justeattakeaway/pie-data-table-row';
12
+ // import '@justeattakeaway/pie-data-table-cell';
13
+
7
14
  import styles from './data-table.scss?inline';
8
15
  import {
9
16
  type DataTableProps,
10
17
  type Column,
18
+ type DataTableAdditionalRow,
19
+ defaultProps,
11
20
  } from './defs';
12
21
 
13
22
  // Valid values available to consumers
@@ -32,6 +41,27 @@ export class PieDataTable extends RtlMixin(PieElement) implements DataTableProps
32
41
  @property({ type: Array })
33
42
  public data: Record<string, unknown>[] = [];
34
43
 
44
+ /**
45
+ * Arbitrary additional rows to display at the bottom of the table
46
+ */
47
+ @property({ type: Array })
48
+ public additionalRows?: DataTableAdditionalRow[] = defaultProps.additionalRows;
49
+
50
+ /**
51
+ * Maps text alignment values to corresponding CSS classes
52
+ *
53
+ * @param prefix - The prefix for the CSS class
54
+ * @param textAlign - The text alignment value
55
+ * @returns An object with CSS classes as keys and boolean values indicating whether the class should be applied
56
+ */
57
+ private mapTextAlignClasses (prefix: string, textAlign?: string) {
58
+ return {
59
+ [`${prefix}-text-align--left`]: textAlign === 'left',
60
+ [`${prefix}-text-align--right`]: textAlign === 'right',
61
+ [`${prefix}-text-align--center`]: textAlign === 'center',
62
+ };
63
+ }
64
+
35
65
  /**
36
66
  * Renders a header cell for the table
37
67
  * @param column - The column definition to render
@@ -40,14 +70,12 @@ export class PieDataTable extends RtlMixin(PieElement) implements DataTableProps
40
70
  const { width, heading, textAlign } = column;
41
71
  const style = width ? `width: ${width}` : nothing;
42
72
  const classes = {
43
- 'c-data-table-header': true,
44
- 'c-data-table-header-text-align--left': textAlign === 'left',
45
- 'c-data-table-header-text-align--right': textAlign === 'right',
46
- 'c-data-table-header-text-align--center': textAlign === 'center',
73
+ 'c-data-table-head-cell': true,
74
+ ...this.mapTextAlignClasses('c-data-table-head-cell', textAlign),
47
75
  };
48
76
 
49
77
  return html`
50
- <th style="${style}" class="${classMap(classes)}">
78
+ <th style="${String(style)}" class="${classMap(classes)}">
51
79
  ${heading}
52
80
  </th>
53
81
  `;
@@ -74,9 +102,7 @@ export class PieDataTable extends RtlMixin(PieElement) implements DataTableProps
74
102
  private renderTableCell (column: Column, row: Record<string, unknown>) {
75
103
  const classes = {
76
104
  'c-data-table-cell': true,
77
- 'c-data-table-cell-text-align--left': column.textAlign === 'left',
78
- 'c-data-table-cell-text-align--right': column.textAlign === 'right',
79
- 'c-data-table-cell-text-align--center': column.textAlign === 'center',
105
+ ...this.mapTextAlignClasses('c-data-table-cell', column.textAlign),
80
106
  };
81
107
 
82
108
  return html`
@@ -101,6 +127,54 @@ export class PieDataTable extends RtlMixin(PieElement) implements DataTableProps
101
127
  `;
102
128
  }
103
129
 
130
+ /**
131
+ * Renders the additional rows for the table
132
+ */
133
+ private renderAdditionalRows () {
134
+ /* eslint-disable indent */
135
+ return html`
136
+ <tfoot>
137
+ ${this.additionalRows && this.additionalRows.length > 0 && this.additionalRows.map((row) => {
138
+ const rowClasses = {
139
+ 'c-data-table-row': true,
140
+ 'c-data-table-row--hidden': !!row.hideRow,
141
+ };
142
+ return html`
143
+ <tr class="${classMap(rowClasses)}">
144
+ ${row.cells.map((cell) => {
145
+ const cellClasses = {
146
+ 'c-data-table-cell': true,
147
+ 'c-data-table-cell--hidden': !!cell.hideCell,
148
+ ...this.mapTextAlignClasses('c-data-table-cell', cell.textAlign),
149
+ };
150
+
151
+ return html`
152
+ <td
153
+ class="${classMap(cellClasses)}"
154
+ colspan=${cell.colSpan || 1}
155
+ >
156
+ ${cell.content}
157
+ </td>
158
+ `;
159
+ })}
160
+ </tr>
161
+ `;
162
+ })}
163
+ </tfoot>
164
+ `;
165
+ /* eslint-enable indent */
166
+ }
167
+
168
+ private renderHTMLTable () {
169
+ return html`
170
+ <table>
171
+ ${this.columns.length > 0 ? this.renderTableHeader() : nothing}
172
+ ${this.data.length > 0 ? this.renderTableRows() : nothing}
173
+ ${this.additionalRows && this.additionalRows.length > 0 ? this.renderAdditionalRows() : nothing}
174
+ </table>
175
+ `;
176
+ }
177
+
104
178
  render () {
105
179
  const classes = {
106
180
  'c-data-table': true,
@@ -109,10 +183,7 @@ export class PieDataTable extends RtlMixin(PieElement) implements DataTableProps
109
183
  return html`
110
184
  <div class="${classMap(classes)}">
111
185
  <slot name="table-header"></slot>
112
- <table>
113
- ${this.columns.length > 0 ? this.renderTableHeader() : nothing}
114
- ${this.data.length > 0 ? this.renderTableRows() : nothing}
115
- </table>
186
+ ${this.data.length > 0 && this.columns.length > 0 ? this.renderHTMLTable() : html`<slot></slot>`}
116
187
  </div>
117
188
  `;
118
189
  }
@@ -0,0 +1,3 @@
1
+ :host {
2
+ display: table-row-group;
3
+ }
@@ -0,0 +1,3 @@
1
+ import type React from 'react';
2
+
3
+ export type ReactBaseType = React.HTMLAttributes<HTMLElement>
@@ -0,0 +1 @@
1
+ export type DataTableBodyProps = Partial<HTMLTableSectionElement>;
@@ -0,0 +1,29 @@
1
+ import { html, unsafeCSS } from 'lit';
2
+ import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
3
+ import { safeCustomElement } from '@justeattakeaway/pie-webc-core';
4
+
5
+ import styles from './data-table-body.scss?inline';
6
+ import { type DataTableBodyProps } from './defs';
7
+
8
+ export * from './defs';
9
+
10
+ const componentSelector = 'pie-data-table-body';
11
+
12
+ /**
13
+ * @tagname pie-data-table-body
14
+ */
15
+ @safeCustomElement('pie-data-table-body')
16
+ export class PieDataTableBody extends PieElement implements DataTableBodyProps {
17
+ render () {
18
+ return html`<slot></slot>`;
19
+ }
20
+
21
+ // Renders a `CSSResult` generated from SCSS by Vite
22
+ static styles = unsafeCSS(styles);
23
+ }
24
+
25
+ declare global {
26
+ interface HTMLElementTagNameMap {
27
+ [componentSelector]: PieDataTableBody;
28
+ }
29
+ }
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+ import { createComponent } from '@lit/react';
3
+ import { PieDataTableBody as PieDataTableBodyLit } from './index';
4
+ import { type DataTableBodyProps } from './defs';
5
+
6
+ export * from './defs';
7
+
8
+ const PieDataTableBodyReact = createComponent({
9
+ displayName: 'PieDataTableBody',
10
+ elementClass: PieDataTableBodyLit,
11
+ react: React,
12
+ tagName: 'pie-data-table-body',
13
+ events: {},
14
+ });
15
+
16
+ type ReactBaseType = React.HTMLAttributes<HTMLElement>
17
+
18
+ export const PieDataTableBody = PieDataTableBodyReact as React.ForwardRefExoticComponent<React.PropsWithoutRef<DataTableBodyProps>
19
+ & React.RefAttributes<PieDataTableBodyLit> & ReactBaseType>;
@@ -0,0 +1,21 @@
1
+ :host {
2
+ padding: var(--dt-spacing-d);
3
+ border-bottom: 1px solid var(--data-table-border-color);
4
+ display: table-cell;
5
+ }
6
+
7
+ :host([textAlign="right"]) {
8
+ text-align: right;
9
+ }
10
+
11
+ :host([textAlign="center"]) {
12
+ text-align: center;
13
+ }
14
+
15
+ :host([textAlign="left"]) {
16
+ text-align: left;
17
+ }
18
+
19
+ :host([isHidden]) {
20
+ display: none;
21
+ }
@@ -0,0 +1,3 @@
1
+ import type React from 'react';
2
+
3
+ export type ReactBaseType = React.HTMLAttributes<HTMLElement>
@@ -0,0 +1,19 @@
1
+ import { type ComponentDefaultProps } from '@justeattakeaway/pie-webc-core';
2
+
3
+ export const dataTableCellTextAlign = ['left', 'right', 'center'] as const;
4
+
5
+ export interface DataTableCellProps {
6
+ /**
7
+ * Text alignment for the cell content
8
+ */
9
+ textAlign?: typeof dataTableCellTextAlign[number];
10
+ /**
11
+ * Whether the cell is hidden
12
+ */
13
+ isHidden?: boolean;
14
+ }
15
+
16
+ export const defaultProps: ComponentDefaultProps<DataTableCellProps, 'textAlign' | 'isHidden'> = {
17
+ textAlign: 'left',
18
+ isHidden: false,
19
+ };
@@ -0,0 +1,61 @@
1
+ import { html, nothing, unsafeCSS } from 'lit';
2
+ import { property } from 'lit/decorators.js';
3
+ import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
4
+ import { safeCustomElement, validPropertyValues } from '@justeattakeaway/pie-webc-core';
5
+
6
+ import styles from './data-table-cell.scss?inline';
7
+ import {
8
+ type DataTableCellProps,
9
+ dataTableCellTextAlign,
10
+ defaultProps,
11
+ } from './defs';
12
+
13
+ export * from './defs';
14
+
15
+ const componentSelector = 'pie-data-table-cell';
16
+
17
+ /**
18
+ * @tagname pie-data-table-cell
19
+ */
20
+ @safeCustomElement('pie-data-table-cell')
21
+ export class PieDataTableCell extends PieElement implements DataTableCellProps {
22
+ /**
23
+ * Text alignment for the cell content
24
+ */
25
+ @property({ type: String })
26
+ @validPropertyValues(componentSelector, dataTableCellTextAlign, defaultProps.textAlign)
27
+ public textAlign?: DataTableCellProps['textAlign'];
28
+
29
+ /**
30
+ * Whether the cell is hidden
31
+ */
32
+ @property({ type: Boolean })
33
+ public isHidden?: DataTableCellProps['isHidden'];
34
+
35
+ connectedCallback () {
36
+ if (!this.hasAttribute('role')) {
37
+ this.setAttribute('role', 'cell');
38
+ }
39
+
40
+ super.connectedCallback();
41
+ }
42
+
43
+ render () {
44
+ const { isHidden } = this;
45
+
46
+ if (isHidden) {
47
+ return nothing;
48
+ }
49
+
50
+ return html`<slot></slot>`;
51
+ }
52
+
53
+ // Renders a `CSSResult` generated from SCSS by Vite
54
+ static styles = unsafeCSS(styles);
55
+ }
56
+
57
+ declare global {
58
+ interface HTMLElementTagNameMap {
59
+ [componentSelector]: PieDataTableCell;
60
+ }
61
+ }
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+ import { createComponent } from '@lit/react';
3
+ import { PieDataTableCell as PieDataTableCellLit } from './index';
4
+ import { type DataTableCellProps } from './defs';
5
+
6
+ export * from './defs';
7
+
8
+ const PieDataTableCellReact = createComponent({
9
+ displayName: 'PieDataTableCell',
10
+ elementClass: PieDataTableCellLit,
11
+ react: React,
12
+ tagName: 'pie-data-table-cell',
13
+ events: {},
14
+ });
15
+
16
+ type ReactBaseType = React.HTMLAttributes<HTMLElement>
17
+
18
+ export const PieDataTableCell = PieDataTableCellReact as React.ForwardRefExoticComponent<React.PropsWithoutRef<DataTableCellProps>
19
+ & React.RefAttributes<PieDataTableCellLit> & ReactBaseType>;
@@ -0,0 +1,4 @@
1
+ :host {
2
+ inline-size: 100%;
3
+ display: table;
4
+ }
@@ -0,0 +1,3 @@
1
+ import type React from 'react';
2
+
3
+ export type ReactBaseType = React.HTMLAttributes<HTMLElement>
@@ -0,0 +1 @@
1
+ export type DataTableContentsProps = Partial<HTMLTableElement>;
@@ -0,0 +1,35 @@
1
+ import { html, unsafeCSS } from 'lit';
2
+ import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
3
+ import { safeCustomElement } from '@justeattakeaway/pie-webc-core';
4
+
5
+ import styles from './data-table-contents.scss?inline';
6
+ import { type DataTableContentsProps } from './defs';
7
+
8
+ export * from './defs';
9
+
10
+ const componentSelector = 'pie-data-table-contents';
11
+
12
+ /**
13
+ * @tagname pie-data-table-contents
14
+ */
15
+ @safeCustomElement('pie-data-table-contents')
16
+ export class PieDataTableContents extends PieElement implements DataTableContentsProps {
17
+ connectedCallback () {
18
+ if (!this.hasAttribute('role')) {
19
+ this.setAttribute('role', 'table');
20
+ }
21
+ super.connectedCallback();
22
+ }
23
+
24
+ render () {
25
+ return html`<slot></slot>`;
26
+ }
27
+
28
+ static styles = unsafeCSS(styles);
29
+ }
30
+
31
+ declare global {
32
+ interface HTMLElementTagNameMap {
33
+ [componentSelector]: PieDataTableContents;
34
+ }
35
+ }
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+ import { createComponent } from '@lit/react';
3
+ import { PieDataTableContents as PieDataTableContentsLit } from './index';
4
+ import { type DataTableContentsProps } from './defs';
5
+
6
+ export * from './defs';
7
+
8
+ const PieDataTableContentsReact = createComponent({
9
+ displayName: 'PieDataTableContents',
10
+ elementClass: PieDataTableContentsLit,
11
+ react: React,
12
+ tagName: 'pie-data-table-contents',
13
+ events: {},
14
+ });
15
+
16
+ type ReactBaseType = React.HTMLAttributes<HTMLElement>
17
+
18
+ export const PieDataTableContents = PieDataTableContentsReact as React.ForwardRefExoticComponent<React.PropsWithoutRef<DataTableContentsProps>
19
+ & React.RefAttributes<PieDataTableContentsLit> & ReactBaseType>;
@@ -0,0 +1,8 @@
1
+ :host {
2
+ background-color: transparent;
3
+ font-weight: var(--dt-font-weight-bold);
4
+ color: var(--data-table-header-color);
5
+ border-bottom: 1px solid var(--data-table-border-color);
6
+ display: table-header-group;
7
+ }
8
+
@@ -0,0 +1,3 @@
1
+ import type React from 'react';
2
+
3
+ export type ReactBaseType = React.HTMLAttributes<HTMLElement>
@@ -0,0 +1 @@
1
+ export type DataTableHeadProps = Partial<HTMLTableSectionElement>;
@@ -0,0 +1,36 @@
1
+ import { html, unsafeCSS } from 'lit';
2
+ import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
3
+ import { safeCustomElement } from '@justeattakeaway/pie-webc-core';
4
+
5
+ import styles from './data-table-head.scss?inline';
6
+ import { type DataTableHeadProps } from './defs';
7
+
8
+ export * from './defs';
9
+
10
+ const componentSelector = 'pie-data-table-head';
11
+
12
+ /**
13
+ * @tagname pie-data-table-head
14
+ */
15
+ @safeCustomElement('pie-data-table-head')
16
+ export class PieDataTableHead extends PieElement implements DataTableHeadProps {
17
+ connectedCallback () {
18
+ if (!this.hasAttribute('role')) {
19
+ this.setAttribute('role', 'rowgroup');
20
+ }
21
+ super.connectedCallback();
22
+ }
23
+
24
+ render () {
25
+ return html`<slot></slot>`;
26
+ }
27
+
28
+ static styles = unsafeCSS(styles);
29
+ }
30
+
31
+ declare global {
32
+ interface HTMLElementTagNameMap {
33
+ [componentSelector]: PieDataTableHead;
34
+ }
35
+ }
36
+
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+ import { createComponent } from '@lit/react';
3
+ import { PieDataTableHead as PieDataTableHeadLit } from './index';
4
+ import { type DataTableHeadProps } from './defs';
5
+
6
+ export * from './defs';
7
+
8
+ const PieDataTableHeadReact = createComponent({
9
+ displayName: 'PieDataTableHead',
10
+ elementClass: PieDataTableHeadLit,
11
+ react: React,
12
+ tagName: 'pie-data-table-head',
13
+ events: {},
14
+ });
15
+
16
+ type ReactBaseType = React.HTMLAttributes<HTMLElement>
17
+
18
+ export const PieDataTableHead = PieDataTableHeadReact as React.ForwardRefExoticComponent<React.PropsWithoutRef<DataTableHeadProps>
19
+ & React.RefAttributes<PieDataTableHeadLit> & ReactBaseType>;
@@ -0,0 +1,21 @@
1
+ :host {
2
+ padding: var(--dt-spacing-d);
3
+ border-bottom: 1px solid var(--data-table-border-color);
4
+ display: table-cell;
5
+ }
6
+
7
+ :host([textAlign="right"]) {
8
+ text-align: right;
9
+ }
10
+
11
+ :host([textAlign="center"]) {
12
+ text-align: center;
13
+ }
14
+
15
+ :host([textAlign="left"]) {
16
+ text-align: left;
17
+ }
18
+
19
+ :host([isHidden]) {
20
+ display: none;
21
+ }
@@ -0,0 +1,3 @@
1
+ import type React from 'react';
2
+
3
+ export type ReactBaseType = React.HTMLAttributes<HTMLElement>
@@ -0,0 +1,19 @@
1
+ import { type ComponentDefaultProps } from '@justeattakeaway/pie-webc-core';
2
+
3
+ export const dataTableHeadCellTextAlign = ['left', 'right', 'center'] as const;
4
+
5
+ export interface DataTableHeadCellProps {
6
+ /**
7
+ * Text alignment for the cell content
8
+ */
9
+ textAlign?: typeof dataTableHeadCellTextAlign[number];
10
+ /**
11
+ * Whether the cell is hidden
12
+ */
13
+ isHidden?: boolean;
14
+ }
15
+
16
+ export const defaultProps: ComponentDefaultProps<DataTableHeadCellProps, 'textAlign' | 'isHidden'> = {
17
+ textAlign: 'left',
18
+ isHidden: false,
19
+ };
@@ -0,0 +1,59 @@
1
+ import { html, nothing, unsafeCSS } from 'lit';
2
+ import { property } from 'lit/decorators.js';
3
+ import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
4
+ import { safeCustomElement, validPropertyValues } from '@justeattakeaway/pie-webc-core';
5
+
6
+ import styles from './data-table-head-cell.scss?inline';
7
+ import {
8
+ type DataTableHeadCellProps,
9
+ dataTableHeadCellTextAlign,
10
+ defaultProps,
11
+ } from './defs';
12
+
13
+ export * from './defs';
14
+
15
+ const componentSelector = 'pie-data-table-head-cell';
16
+
17
+ /**
18
+ * @tagname pie-data-table-head-cell
19
+ */
20
+ @safeCustomElement('pie-data-table-head-cell')
21
+ export class PieDataTableHeadCell extends PieElement implements DataTableHeadCellProps {
22
+ /**
23
+ * Text alignment for the cell content
24
+ */
25
+ @property({ type: String })
26
+ @validPropertyValues(componentSelector, dataTableHeadCellTextAlign, defaultProps.textAlign)
27
+ public textAlign?: DataTableHeadCellProps['textAlign'];
28
+
29
+ /**
30
+ * Whether the cell is hidden
31
+ */
32
+ @property({ type: Boolean })
33
+ public isHidden?: DataTableHeadCellProps['isHidden'];
34
+
35
+ connectedCallback () {
36
+ if (!this.hasAttribute('role')) {
37
+ this.setAttribute('role', 'columnheader');
38
+ }
39
+ super.connectedCallback();
40
+ }
41
+
42
+ render () {
43
+ const { isHidden } = this;
44
+
45
+ if (isHidden) {
46
+ return nothing;
47
+ }
48
+
49
+ return html`<slot></slot>`;
50
+ }
51
+
52
+ static styles = unsafeCSS(styles);
53
+ }
54
+
55
+ declare global {
56
+ interface HTMLElementTagNameMap {
57
+ [componentSelector]: PieDataTableHeadCell;
58
+ }
59
+ }
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+ import { createComponent } from '@lit/react';
3
+ import { PieDataTableHeadCell as PieDataTableHeadCellLit } from './index';
4
+ import { type DataTableHeadCellProps } from './defs';
5
+
6
+ export * from './defs';
7
+
8
+ const PieDataTableHeadCellReact = createComponent({
9
+ displayName: 'PieDataTableHeadCell',
10
+ elementClass: PieDataTableHeadCellLit,
11
+ react: React,
12
+ tagName: 'pie-data-table-head-cell',
13
+ events: {},
14
+ });
15
+
16
+ type ReactBaseType = React.HTMLAttributes<HTMLElement>
17
+
18
+ export const PieDataTableHeadCell = PieDataTableHeadCellReact as React.ForwardRefExoticComponent<React.PropsWithoutRef<DataTableHeadCellProps>
19
+ & React.RefAttributes<PieDataTableHeadCellLit> & ReactBaseType>;
@@ -76,6 +76,7 @@ export class PieDataTableHeader extends PieElement implements DataTableHeaderPro
76
76
  <header class="${classMap(classes)}">
77
77
  <div class="c-data-table-header-title-wrapper">
78
78
  ${title ? html`<span class="c-data-table-header-title">${title}</span>` : nothing}
79
+
79
80
  ${subtitle ? html`<span class="c-data-table-header-subtitle">${subtitle}</span>` : nothing}
80
81
  </div>
81
82
  ${this.hasActionButtons ? html`
@@ -0,0 +1,12 @@
1
+ :host {
2
+ display: table-row;
3
+ border-bottom: 1px solid var(--data-table-border-color);
4
+
5
+ ::slotted(pie-data-table-cell) {
6
+ background-color: var(--data-table-background-hover-or-active, transparent);
7
+ }
8
+ }
9
+
10
+ :host([isSelected]) {
11
+ background-color: var(--dt-color-container-subtle);
12
+ }
@@ -0,0 +1,3 @@
1
+ import type React from 'react';
2
+
3
+ export type ReactBaseType = React.HTMLAttributes<HTMLElement>
@@ -0,0 +1,17 @@
1
+ import { type ComponentDefaultProps } from '@justeattakeaway/pie-webc-core';
2
+
3
+ export interface DataTableRowProps extends Partial<HTMLTableRowElement> {
4
+ /**
5
+ * Whether the row is currently selected
6
+ */
7
+ isSelected?: boolean;
8
+ /**
9
+ * Whether the row is hidden
10
+ */
11
+ isHidden?: boolean;
12
+ }
13
+
14
+ export const defaultProps: ComponentDefaultProps<DataTableRowProps, 'isSelected' | 'isHidden'> = {
15
+ isSelected: false,
16
+ isHidden: false,
17
+ };