@aquera/nile-elements 0.1.57 → 0.1.58-beta-1.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 (121) hide show
  1. package/README.md +5 -3
  2. package/demo/index.html +10 -26
  3. package/demo/index.js +83 -0
  4. package/dist/index.cjs.js +1 -1
  5. package/dist/index.esm.js +1 -1
  6. package/dist/index.js +276 -281
  7. package/dist/internal/resizable-table-helper.cjs.js +2 -0
  8. package/dist/internal/resizable-table-helper.cjs.js.map +1 -0
  9. package/dist/internal/resizable-table-helper.esm.js +1 -0
  10. package/dist/internal/resizable-table-styles.cjs.js +2 -0
  11. package/dist/internal/resizable-table-styles.cjs.js.map +1 -0
  12. package/dist/internal/resizable-table-styles.esm.js +120 -0
  13. package/dist/nile-table-body/index.cjs.js +1 -1
  14. package/dist/nile-table-body/index.esm.js +1 -1
  15. package/dist/nile-table-body/nile-table-body.cjs.js +1 -1
  16. package/dist/nile-table-body/nile-table-body.cjs.js.map +1 -1
  17. package/dist/nile-table-body/nile-table-body.css.cjs.js +1 -1
  18. package/dist/nile-table-body/nile-table-body.css.cjs.js.map +1 -1
  19. package/dist/nile-table-body/nile-table-body.css.esm.js +5 -2
  20. package/dist/nile-table-body/nile-table-body.esm.js +3 -2
  21. package/dist/nile-table-cell-item/index.cjs.js +1 -1
  22. package/dist/nile-table-cell-item/index.esm.js +1 -1
  23. package/dist/nile-table-cell-item/nile-table-cell-item.cjs.js +1 -1
  24. package/dist/nile-table-cell-item/nile-table-cell-item.cjs.js.map +1 -1
  25. package/dist/nile-table-cell-item/nile-table-cell-item.css.cjs.js +1 -1
  26. package/dist/nile-table-cell-item/nile-table-cell-item.css.cjs.js.map +1 -1
  27. package/dist/nile-table-cell-item/nile-table-cell-item.css.esm.js +21 -3
  28. package/dist/nile-table-cell-item/nile-table-cell-item.esm.js +8 -3
  29. package/dist/nile-table-header-item/index.cjs.js +1 -1
  30. package/dist/nile-table-header-item/index.esm.js +1 -1
  31. package/dist/nile-table-header-item/nile-table-header-item.cjs.js +1 -1
  32. package/dist/nile-table-header-item/nile-table-header-item.cjs.js.map +1 -1
  33. package/dist/nile-table-header-item/nile-table-header-item.css.cjs.js +1 -1
  34. package/dist/nile-table-header-item/nile-table-header-item.css.cjs.js.map +1 -1
  35. package/dist/nile-table-header-item/nile-table-header-item.css.esm.js +8 -2
  36. package/dist/nile-table-header-item/nile-table-header-item.esm.js +64 -32
  37. package/dist/src/index.d.ts +0 -1
  38. package/dist/src/index.js +0 -1
  39. package/dist/src/index.js.map +1 -1
  40. package/dist/src/internal/resizable-table-helper.d.ts +59 -0
  41. package/dist/src/internal/resizable-table-helper.js +111 -0
  42. package/dist/src/internal/resizable-table-helper.js.map +1 -0
  43. package/dist/src/internal/resizable-table-styles.d.ts +16 -0
  44. package/dist/src/internal/resizable-table-styles.js +137 -0
  45. package/dist/src/internal/resizable-table-styles.js.map +1 -0
  46. package/dist/src/nile-table-body/nile-table-body.css.js +4 -0
  47. package/dist/src/nile-table-body/nile-table-body.css.js.map +1 -1
  48. package/dist/src/nile-table-body/nile-table-body.d.ts +2 -0
  49. package/dist/src/nile-table-body/nile-table-body.js +11 -0
  50. package/dist/src/nile-table-body/nile-table-body.js.map +1 -1
  51. package/dist/src/nile-table-cell-item/nile-table-cell-item.css.js +20 -1
  52. package/dist/src/nile-table-cell-item/nile-table-cell-item.css.js.map +1 -1
  53. package/dist/src/nile-table-cell-item/nile-table-cell-item.d.ts +3 -0
  54. package/dist/src/nile-table-cell-item/nile-table-cell-item.js +27 -8
  55. package/dist/src/nile-table-cell-item/nile-table-cell-item.js.map +1 -1
  56. package/dist/src/nile-table-header-item/nile-table-header-item.css.js +7 -0
  57. package/dist/src/nile-table-header-item/nile-table-header-item.css.js.map +1 -1
  58. package/dist/src/nile-table-header-item/nile-table-header-item.d.ts +3 -0
  59. package/dist/src/nile-table-header-item/nile-table-header-item.js +86 -35
  60. package/dist/src/nile-table-header-item/nile-table-header-item.js.map +1 -1
  61. package/dist/tsconfig.tsbuildinfo +1 -1
  62. package/package.json +4 -4
  63. package/src/index.ts +1 -2
  64. package/src/internal/resizable-table-helper.ts +151 -0
  65. package/src/internal/resizable-table-styles.ts +144 -0
  66. package/src/nile-table-body/nile-table-body.css.ts +4 -0
  67. package/src/nile-table-body/nile-table-body.ts +10 -0
  68. package/src/nile-table-cell-item/nile-table-cell-item.css.ts +20 -1
  69. package/src/nile-table-cell-item/nile-table-cell-item.ts +22 -5
  70. package/src/nile-table-header-item/nile-table-header-item.css.ts +7 -0
  71. package/src/nile-table-header-item/nile-table-header-item.ts +94 -45
  72. package/vscode-html-custom-data.json +59 -138
  73. package/dist/nile-slider/index.cjs.js +0 -2
  74. package/dist/nile-slider/index.cjs.js.map +0 -1
  75. package/dist/nile-slider/index.esm.js +0 -1
  76. package/dist/nile-slider/nile-slider.cjs.js +0 -2
  77. package/dist/nile-slider/nile-slider.cjs.js.map +0 -1
  78. package/dist/nile-slider/nile-slider.css.cjs.js +0 -2
  79. package/dist/nile-slider/nile-slider.css.cjs.js.map +0 -1
  80. package/dist/nile-slider/nile-slider.css.esm.js +0 -106
  81. package/dist/nile-slider/nile-slider.esm.js +0 -27
  82. package/dist/nile-slider/nile-slider.template.cjs.js +0 -2
  83. package/dist/nile-slider/nile-slider.template.cjs.js.map +0 -1
  84. package/dist/nile-slider/nile-slider.template.esm.js +0 -59
  85. package/dist/nile-slider/types/nile-slider.enums.cjs.js +0 -2
  86. package/dist/nile-slider/types/nile-slider.enums.cjs.js.map +0 -1
  87. package/dist/nile-slider/types/nile-slider.enums.esm.js +0 -1
  88. package/dist/nile-slider/types/nile-slider.types.cjs.js +0 -2
  89. package/dist/nile-slider/types/nile-slider.types.cjs.js.map +0 -1
  90. package/dist/nile-slider/types/nile-slider.types.esm.js +0 -1
  91. package/dist/nile-slider/utils/nile-slider.utils.cjs.js +0 -2
  92. package/dist/nile-slider/utils/nile-slider.utils.cjs.js.map +0 -1
  93. package/dist/nile-slider/utils/nile-slider.utils.esm.js +0 -1
  94. package/dist/src/nile-slider/index.d.ts +0 -1
  95. package/dist/src/nile-slider/index.js +0 -2
  96. package/dist/src/nile-slider/index.js.map +0 -1
  97. package/dist/src/nile-slider/nile-slider.css.d.ts +0 -6
  98. package/dist/src/nile-slider/nile-slider.css.js +0 -118
  99. package/dist/src/nile-slider/nile-slider.css.js.map +0 -1
  100. package/dist/src/nile-slider/nile-slider.d.ts +0 -48
  101. package/dist/src/nile-slider/nile-slider.js +0 -217
  102. package/dist/src/nile-slider/nile-slider.js.map +0 -1
  103. package/dist/src/nile-slider/nile-slider.template.d.ts +0 -5
  104. package/dist/src/nile-slider/nile-slider.template.js +0 -73
  105. package/dist/src/nile-slider/nile-slider.template.js.map +0 -1
  106. package/dist/src/nile-slider/types/nile-slider.enums.d.ts +0 -10
  107. package/dist/src/nile-slider/types/nile-slider.enums.js +0 -2
  108. package/dist/src/nile-slider/types/nile-slider.enums.js.map +0 -1
  109. package/dist/src/nile-slider/types/nile-slider.types.d.ts +0 -1
  110. package/dist/src/nile-slider/types/nile-slider.types.js +0 -2
  111. package/dist/src/nile-slider/types/nile-slider.types.js.map +0 -1
  112. package/dist/src/nile-slider/utils/nile-slider.utils.d.ts +0 -11
  113. package/dist/src/nile-slider/utils/nile-slider.utils.js +0 -99
  114. package/dist/src/nile-slider/utils/nile-slider.utils.js.map +0 -1
  115. package/src/nile-slider/index.ts +0 -1
  116. package/src/nile-slider/nile-slider.css.ts +0 -119
  117. package/src/nile-slider/nile-slider.template.ts +0 -77
  118. package/src/nile-slider/nile-slider.ts +0 -215
  119. package/src/nile-slider/types/nile-slider.enums.ts +0 -10
  120. package/src/nile-slider/types/nile-slider.types.ts +0 -13
  121. package/src/nile-slider/utils/nile-slider.utils.ts +0 -136
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Webcomponent nile-elements following open-wc recommendations",
4
4
  "license": "MIT",
5
5
  "author": "nile-elements",
6
- "version": "0.1.57",
6
+ "version": "0.1.58-beta-1.0",
7
7
  "main": "dist/src/index.js",
8
8
  "type": "module",
9
9
  "module": "dist/src/index.js",
@@ -86,8 +86,7 @@
86
86
  "./nile-inline-edit": "./dist/src/nile-inline-edit/index.js",
87
87
  "./nile-tour": "./dist/src/nile-tour/index.js",
88
88
  "./nile-table": "./dist/src/nile-table/index.js",
89
- "./nile-pagination": "./dist/src/nile-pagination/index.js",
90
- "./nile-slider": "./dist/src/nile-slider/index.js"
89
+ "./nile-pagination": "./dist/src/nile-pagination/index.js"
91
90
  },
92
91
  "scripts": {
93
92
  "analyze": "cem analyze --litelement",
@@ -191,4 +190,5 @@
191
190
  "prettier --write"
192
191
  ]
193
192
  }
194
- }
193
+ }
194
+
package/src/index.ts CHANGED
@@ -77,5 +77,4 @@ export { NileToolbar } from './nile-toolbar';
77
77
  export { NileInlineEdit } from './nile-inline-edit';
78
78
  export { NileTable } from './nile-table';
79
79
  export { NileFilterChip } from './nile-filter-chip';
80
- export {NilePagination } from './nile-pagination';
81
- export { NileSlider } from './nile-slider';
80
+ export {NilePagination } from './nile-pagination';
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Copyright Aquera Inc 2025
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ /**
9
+ * Resizable Helper Utility
10
+ * Provides common functionality for resizable table columns
11
+ */
12
+
13
+ export interface ResizeOptions {
14
+ minWidth?: number;
15
+ startX: number;
16
+ startWidth: number;
17
+ element: HTMLElement;
18
+ }
19
+
20
+ export interface ColumnResizeData {
21
+ columnIndex: number;
22
+ newWidth: number;
23
+ }
24
+
25
+ /**
26
+ * Handles the start of a resize operation
27
+ * @param e Mouse event
28
+ * @param options Resize configuration options
29
+ * @returns Cleanup function to remove event listeners
30
+ */
31
+ export function handleResizeStart(e: MouseEvent, options: ResizeOptions): () => void {
32
+ e.preventDefault();
33
+ e.stopPropagation();
34
+
35
+ const { minWidth = 50, startX, startWidth, element } = options;
36
+ const resizer = e.target as HTMLElement;
37
+
38
+ resizer.classList.add('resizing');
39
+
40
+ const onMouseMove = (e: MouseEvent) => {
41
+ e.preventDefault();
42
+ e.stopPropagation();
43
+
44
+ const delta = e.pageX - startX;
45
+ const newWidth = Math.max(minWidth, startWidth + delta);
46
+
47
+ element.style.width = newWidth + 'px';
48
+
49
+ synchronizeColumnWidth(element, newWidth);
50
+ };
51
+
52
+ const onMouseUp = () => {
53
+ resizer.classList.remove('resizing');
54
+ document.removeEventListener('mousemove', onMouseMove);
55
+ document.removeEventListener('mouseup', onMouseUp);
56
+ };
57
+
58
+ document.addEventListener('mousemove', onMouseMove);
59
+ document.addEventListener('mouseup', onMouseUp);
60
+
61
+ return () => {
62
+ document.removeEventListener('mousemove', onMouseMove);
63
+ document.removeEventListener('mouseup', onMouseUp);
64
+ };
65
+ }
66
+
67
+ /**
68
+ * Gets the column index of an element within its table row
69
+ * @param element The table cell or header element
70
+ * @param selector The CSS selector for the column elements
71
+ * @returns Column index (0-based)
72
+ */
73
+ export function getColumnIndex(element: HTMLElement, selector: string): number {
74
+ const tableRow = element.closest('nile-table-row');
75
+ if (tableRow) {
76
+ const columns = tableRow.querySelectorAll(selector);
77
+ return Array.from(columns).indexOf(element);
78
+ }
79
+ return 0;
80
+ }
81
+
82
+ /**
83
+ * Synchronizes the width of all cells in the same column
84
+ * @param sourceElement The element that was resized
85
+ * @param newWidth The new width to apply
86
+ */
87
+ export function synchronizeColumnWidth(sourceElement: HTMLElement, newWidth: number): void {
88
+ const tableBody = sourceElement.closest('nile-table-body');
89
+ if (!tableBody) return;
90
+
91
+ const isHeader = sourceElement.tagName.toLowerCase() === 'nile-table-header-item';
92
+ const selector = isHeader ? 'nile-table-header-item' : 'nile-table-cell-item';
93
+ const targetSelector = isHeader ? 'nile-table-cell-item' : 'nile-table-cell-item';
94
+
95
+ const columnIndex = getColumnIndex(sourceElement, selector);
96
+ const rows = tableBody.querySelectorAll('nile-table-row');
97
+
98
+ rows.forEach(row => {
99
+ const cells = row.querySelectorAll(targetSelector);
100
+ if (cells[columnIndex]) {
101
+ cells[columnIndex].style.width = newWidth + 'px';
102
+ }
103
+ });
104
+ }
105
+
106
+ /**
107
+ * Checks if an element has the resizable attribute
108
+ * @param element The element to check
109
+ * @returns True if the element is resizable
110
+ */
111
+ export function isResizable(element: HTMLElement): boolean {
112
+ return element.hasAttribute('resizable');
113
+ }
114
+
115
+ /**
116
+ * Creates a resize handler function for use in component event listeners
117
+ * @param element The element to make resizable
118
+ * @param minWidth Minimum width constraint
119
+ * @returns Event handler function
120
+ */
121
+ export function createResizeHandler(element: HTMLElement, minWidth: number = 50): (e: MouseEvent) => void {
122
+ return (e: MouseEvent) => {
123
+ const options: ResizeOptions = {
124
+ minWidth,
125
+ startX: e.pageX,
126
+ startWidth: element.offsetWidth,
127
+ element
128
+ };
129
+
130
+ handleResizeStart(e, options);
131
+ };
132
+ }
133
+
134
+ /**
135
+ * Detects if any columns in a table are resizable
136
+ * @param tableBody The table body element
137
+ * @returns True if any columns have resizable attribute
138
+ */
139
+ export function hasResizableColumns(tableBody: HTMLElement): boolean {
140
+ const headerItems = tableBody.querySelectorAll('nile-table-header-item');
141
+ const cellItems = tableBody.querySelectorAll('nile-table-cell-item');
142
+
143
+ const hasResizableHeaders = Array.from(headerItems).some(item =>
144
+ isResizable(item)
145
+ );
146
+ const hasResizableCells = Array.from(cellItems).some(item =>
147
+ isResizable(item)
148
+ );
149
+
150
+ return hasResizableHeaders || hasResizableCells;
151
+ }
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Copyright Aquera Inc 2023
3
+ *
4
+ * This source code is licensed under the BSD-3-Clause license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ import { css } from 'lit';
9
+
10
+ /**
11
+ * Resizable Styles Utility
12
+ * Centralized styles for resizable table functionality
13
+ */
14
+
15
+ export const resizableHostStyles = css`
16
+ :host([resizable]) {
17
+ position: relative;
18
+ overflow: hidden;
19
+ table-layout: fixed;
20
+ }
21
+ `;
22
+
23
+ export const resizableHeaderStyles = css`
24
+ :host([resizable]) {
25
+ position: relative;
26
+ }
27
+
28
+ :host([resizable]) .header__item__wrapper {
29
+ border-right: 1px solid var(--nile-colors-neutral-400);
30
+ position: relative;
31
+ }
32
+ `;
33
+
34
+ export const resizerStyles = css`
35
+ .resizer {
36
+ position: absolute;
37
+ right: 0;
38
+ top: -1000px;
39
+ bottom: -1000px;
40
+ width: 8px;
41
+ cursor: col-resize;
42
+ user-select: none;
43
+ background-color: var(--nile-colors-neutral-100);
44
+ transition: background-color 0.2s;
45
+ z-index: 10;
46
+ opacity: 0;
47
+ transition: opacity 0.2s ease;
48
+ pointer-events: none;
49
+ }
50
+
51
+ :host([resizable]):hover .resizer {
52
+ opacity: 1;
53
+ pointer-events: auto;
54
+ }
55
+
56
+ .resizer::before {
57
+ content: '';
58
+ position: absolute;
59
+ right: 3px;
60
+ top: 0;
61
+ width: 2px;
62
+ height: 100%;
63
+ background-color: var(--nile-colors-neutral-500);
64
+ opacity: 0.8;
65
+ }
66
+
67
+ .resizer:hover {
68
+ background-color: var(--nile-colors-neutral-400);
69
+ }
70
+
71
+ .resizer:hover::before {
72
+ background-color: var(--nile-colors-neutral-700);
73
+ opacity: 1;
74
+ }
75
+
76
+ .resizer.resizing {
77
+ background-color: var(--nile-colors-neutral-400);
78
+ opacity: 1;
79
+ pointer-events: auto;
80
+ }
81
+
82
+ .resizer.resizing::before {
83
+ background-color: var(--nile-colors-neutral-700);
84
+ opacity: 1;
85
+ width: 3px;
86
+ }
87
+ `;
88
+
89
+ export const headerResizerStyles = css`
90
+ .resizer {
91
+ position: absolute;
92
+ right: -2px;
93
+ top: -1000px;
94
+ bottom: -1000px;
95
+ width: 8px;
96
+ cursor: ew-resize;
97
+ user-select: none;
98
+ transition: background-color 0.2s;
99
+ z-index: 10;
100
+ opacity: 0;
101
+ transition: opacity 0.2s ease;
102
+ }
103
+
104
+ :host([resizable]):hover .resizer {
105
+ opacity: 1;
106
+ }
107
+
108
+ .resizer::before {
109
+ content: '';
110
+ position: absolute;
111
+ height: 100%;
112
+ opacity: 0.8;
113
+ }
114
+
115
+ .resizer.resizing {
116
+ border-right: 4px double var(--nile-colors-neutral-400);
117
+ background-color: transparent;
118
+ opacity: 1;
119
+ }
120
+ `;
121
+
122
+ export const resizableSlotStyles = css`
123
+ :host([resizable]) ::slotted(*) {
124
+ overflow: hidden;
125
+ text-overflow: ellipsis;
126
+ white-space: nowrap;
127
+ display: block;
128
+ }
129
+
130
+ :host([resizable]) ::slotted(span),
131
+ :host([resizable]) ::slotted(div),
132
+ :host([resizable]) ::slotted(p) {
133
+ overflow: hidden;
134
+ text-overflow: ellipsis;
135
+ white-space: nowrap;
136
+ display: block;
137
+ }
138
+ `;
139
+
140
+ export const tableLayoutStyles = css`
141
+ .nile__table__body[resizable] {
142
+ table-layout: fixed;
143
+ }
144
+ `;
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import { css } from 'lit';
9
+ import { tableLayoutStyles } from '../internal/resizable-table-styles';
9
10
 
10
11
  /**
11
12
  * TableBody CSS
@@ -48,6 +49,9 @@ export const styles = css`
48
49
  slot::slotted(nile-table-row:last-child) {
49
50
  border-bottom: 0px;
50
51
  }
52
+
53
+ /* Import resizable styles */
54
+ ${tableLayoutStyles}
51
55
  `;
52
56
 
53
57
  export default [styles];
@@ -24,6 +24,7 @@ import {
24
24
  import { styles } from './nile-table-body.css';
25
25
  import NileElement from '../internal/nile-element';
26
26
  import { getInnerHTML } from '../slot';
27
+ import { hasResizableColumns } from '../internal/resizable-table-helper';
27
28
 
28
29
  /**
29
30
  * nile-table-body component.
@@ -46,6 +47,7 @@ export class NileTableBody extends NileElement {
46
47
  @state() private header_rows_data: any[] = [];
47
48
  @state() private sort__index: number;
48
49
  @state() private search__index: number;
50
+ @state() private hasResizableColumns = false;
49
51
 
50
52
  public static get styles(): CSSResultArray {
51
53
  return [styles];
@@ -67,6 +69,10 @@ export class NileTableBody extends NileElement {
67
69
  return this.header_rows_data.indexOf(index__value);
68
70
  }
69
71
 
72
+ private checkForResizableColumns() {
73
+ this.hasResizableColumns = hasResizableColumns(this);
74
+ }
75
+
70
76
  handleSlotchange(e: any) {
71
77
  let row_data: any = [];
72
78
  this._childNodes.forEach((child: any) => {
@@ -88,6 +94,9 @@ export class NileTableBody extends NileElement {
88
94
  row_data = [];
89
95
  }
90
96
  });
97
+
98
+ // Check for resizable columns after slot change
99
+ this.checkForResizableColumns();
91
100
  }
92
101
 
93
102
  private handleSort(e: any) {
@@ -115,6 +124,7 @@ export class NileTableBody extends NileElement {
115
124
  @slotchange=${this.handleSlotchange}
116
125
  @nile-click-sort=${this.handleSort}
117
126
  class="nile__table__body"
127
+ ?resizable=${this.hasResizableColumns}
118
128
  @nile-search=${this.handleSearch}
119
129
  ></slot>
120
130
  </div>
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import { css } from 'lit';
9
+ import { resizableHostStyles, resizerStyles, resizableSlotStyles } from '../internal/resizable-table-styles';
9
10
 
10
11
  /**
11
12
  * TableCellItem CSS
@@ -19,11 +20,20 @@ export const styles = css`
19
20
  box-sizing: border-box;
20
21
  display: table-cell;
21
22
  vertical-align: middle;
22
- max-width: var(--max--cell-width);
23
23
  padding: 16px 24px;
24
+ max-width: var(--max--cell-width);
24
25
  min-height: var(--min--height);
25
26
  }
26
27
 
28
+ .cell__wrapper {
29
+ height: 100%;
30
+ position: relative;
31
+ display: flex;
32
+ align-items: center;
33
+ overflow: hidden;
34
+ width: 100%;
35
+ }
36
+
27
37
  .column {
28
38
  min-width:var(--min-cell-width);
29
39
  width:var(--cell-width);
@@ -36,7 +46,16 @@ export const styles = css`
36
46
  /* line-height: var(--nile-type-scale-6); */
37
47
  line-height: normal;
38
48
  letter-spacing: 0.2px;
49
+ overflow: hidden;
50
+ text-overflow: ellipsis;
51
+ white-space: nowrap;
52
+ display: block;
39
53
  }
54
+
55
+ /* Import resizable styles */
56
+ ${resizableHostStyles}
57
+ ${resizerStyles}
58
+ ${resizableSlotStyles}
40
59
  `;
41
60
 
42
61
  export default [styles];
@@ -15,6 +15,7 @@ import { customElement, property } from 'lit/decorators.js';
15
15
  import { styles } from './nile-table-cell-item.css';
16
16
  import NileElement from '../internal/nile-element';
17
17
  import { HasSlotController } from '../internal/slot';
18
+ import { createResizeHandler } from '../internal/resizable-table-helper';
18
19
 
19
20
  /**
20
21
  * Nile table Cell Item component.
@@ -33,20 +34,36 @@ export class NileTableCellItem extends NileElement {
33
34
  return [styles];
34
35
  }
35
36
 
37
+ /** Enables the resize functionality. */
38
+ @property({ type: Boolean, reflect: true }) resizable = false;
39
+
36
40
  /* #endregion */
37
41
 
38
42
  /* #region Methods */
39
43
 
44
+ private handleResizeStart = createResizeHandler(this, 50);
45
+
40
46
  /**
41
47
  * Render method
42
48
  * @slot This is a slot test
43
49
  */
44
50
  public render(): TemplateResult {
45
- return html`
46
- ${this.hasSlotController.test('[default]')
47
- ? html` <slot class="column" part="nile__table-cell"> </slot>`
48
- : ''}
49
- `;
51
+ if (this.resizable) {
52
+ return html`
53
+ <div class="cell__wrapper" part="nile__table-cell">
54
+ ${this.hasSlotController.test('[default]')
55
+ ? html` <div class="column" part="nile__table-cell"><slot></slot></div>`
56
+ : ''}
57
+ <div class="resizer" @mousedown=${this.handleResizeStart}></div>
58
+ </div>
59
+ `;
60
+ } else {
61
+ return html`
62
+ ${this.hasSlotController.test('[default]')
63
+ ? html` <slot class="column" part="nile__table-cell"> </slot>`
64
+ : ''}
65
+ `;
66
+ }
50
67
  }
51
68
 
52
69
  /* #endregion */
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import { css } from 'lit';
9
+ import { resizableHeaderStyles, headerResizerStyles } from '../internal/resizable-table-styles';
9
10
 
10
11
  /**
11
12
  * TableHeaderItem CSS
@@ -44,6 +45,8 @@ export const styles = css`
44
45
  font-style: normal;
45
46
  /* line-height: var(--nile-type-scale-5); */
46
47
  line-height: normal;
48
+ text-overflow: ellipsis;
49
+ white-space: nowrap;
47
50
  }
48
51
 
49
52
  nile-icon {
@@ -67,6 +70,10 @@ export const styles = css`
67
70
  .headers:hover .hover__arrow {
68
71
  opacity: 0.3;
69
72
  }
73
+
74
+ /* Import resizable styles */
75
+ ${resizableHeaderStyles}
76
+ ${headerResizerStyles}
70
77
  `;
71
78
 
72
79
  export default [styles];
@@ -15,6 +15,7 @@ import { customElement, state, property } from 'lit/decorators.js';
15
15
  import { styles } from './nile-table-header-item.css';
16
16
  import NileElement from '../internal/nile-element';
17
17
  import { HasSlotController } from '../internal/slot';
18
+ import { createResizeHandler } from '../internal/resizable-table-helper';
18
19
 
19
20
  /**
20
21
  * Nile icon component.
@@ -43,6 +44,9 @@ export class NileTableHeaderItem extends NileElement {
43
44
  @property({ type: String, reflect: true, attribute: 'icon-name' }) iconName =
44
45
  '';
45
46
 
47
+ /** Enables the resize functionality. */
48
+ @property({ type: Boolean, reflect: true }) resizable = false;
49
+
46
50
  @state() sorting_ct = 0;
47
51
 
48
52
  /* #endregion */
@@ -66,53 +70,98 @@ export class NileTableHeaderItem extends NileElement {
66
70
  this.emit('nile-search', { value: e.detail.value });
67
71
  }
68
72
 
73
+ private handleResizeStart = createResizeHandler(this, 50);
74
+
69
75
  public render(): TemplateResult {
70
- return html` ${this.hasSlotController.test('[default]')
71
- ? html`
72
- <div class="header__item__wrapper" part="nile__table-header-cell">
73
- <div class="headers">
74
- <slot> </slot>
75
- ${this.havesort && this.sorting_ct % 3 === 0
76
- ? html`<nile-icon
77
- name="sortdown"
78
- size="16"
79
- @click=${this.handleSort}
80
- class="hover__arrow"
81
- ></nile-icon>`
82
- : null}
83
- ${this.havesort && this.sorting_ct % 3 === 1
84
- ? html`<nile-icon
85
- name="sortdown"
86
- size="16"
87
- @click=${this.handleSort}
88
- ></nile-icon>`
89
- : null}
90
- ${this.havesort && this.sorting_ct % 3 === 2
91
- ? html`<nile-icon
92
- name="sortup"
93
- size="16"
94
- @click=${this.handleSort}
95
- ></nile-icon>`
96
- : null}
97
- ${this.iconName
98
- ? html` <nile-icon name="${this.iconName}" size="16"></nile-icon>`
99
- : html``}
100
- ${this.havefilter
101
- ? html` <nile-popover title="Filter" placement="bottom">
102
- <nile-icon name="filter" size="16" slot="anchor"></nile-icon>
103
- <nile-input
104
- placeholder="Search"
105
- @nile-input=${this.handleSearch}
106
- part="filter__search"
107
- ></nile-input>
108
- <slot name="filter__content" part="filter__content"></slot>
109
- </nile-popover>`
110
- : html``}
111
- </div>
112
- </div>`
113
- : null}`;
76
+ if (this.resizable) {
77
+ return html`
78
+ <div class="header__item__wrapper" part="nile__table-header-cell">
79
+ <div class="headers">
80
+ <slot> </slot>
81
+ ${this.havesort && this.sorting_ct % 3 === 0
82
+ ? html`<nile-icon
83
+ name="sortdown"
84
+ size="16"
85
+ @click=${this.handleSort}
86
+ class="hover__arrow"
87
+ ></nile-icon>`
88
+ : null}
89
+ ${this.havesort && this.sorting_ct % 3 === 1
90
+ ? html`<nile-icon
91
+ name="sortdown"
92
+ size="16"
93
+ @click=${this.handleSort}
94
+ ></nile-icon>`
95
+ : null}
96
+ ${this.havesort && this.sorting_ct % 3 === 2
97
+ ? html`<nile-icon
98
+ name="sortup"
99
+ size="16"
100
+ @click=${this.handleSort}
101
+ ></nile-icon>`
102
+ : null}
103
+ ${this.iconName
104
+ ? html` <nile-icon name="${this.iconName}" size="16"></nile-icon>`
105
+ : html``}
106
+ ${this.havefilter
107
+ ? html` <nile-popover title="Filter" placement="bottom">
108
+ <nile-icon name="filter" size="16" slot="anchor"></nile-icon>
109
+ <nile-input
110
+ placeholder="Search"
111
+ @nile-input=${this.handleSearch}
112
+ part="filter__search"
113
+ ></nile-input>
114
+ <slot name="filter__content" part="filter__content"></slot>
115
+ </nile-popover>`
116
+ : html``}
117
+ </div>
118
+ <div class="resizer" @mousedown=${this.handleResizeStart}></div>
119
+ </div>`;
120
+ } else {
121
+ return html`
122
+ <div class="header__item__wrapper" part="nile__table-header-cell">
123
+ <div class="headers">
124
+ <slot> </slot>
125
+ ${this.havesort && this.sorting_ct % 3 === 0
126
+ ? html`<nile-icon
127
+ name="sortdown"
128
+ size="16"
129
+ @click=${this.handleSort}
130
+ class="hover__arrow"
131
+ ></nile-icon>`
132
+ : null}
133
+ ${this.havesort && this.sorting_ct % 3 === 1
134
+ ? html`<nile-icon
135
+ name="sortdown"
136
+ size="16"
137
+ @click=${this.handleSort}
138
+ ></nile-icon>`
139
+ : null}
140
+ ${this.havesort && this.sorting_ct % 3 === 2
141
+ ? html`<nile-icon
142
+ name="sortup"
143
+ size="16"
144
+ @click=${this.handleSort}
145
+ ></nile-icon>`
146
+ : null}
147
+ ${this.iconName
148
+ ? html` <nile-icon name="${this.iconName}" size="16"></nile-icon>`
149
+ : html``}
150
+ ${this.havefilter
151
+ ? html` <nile-popover title="Filter" placement="bottom">
152
+ <nile-icon name="filter" size="16" slot="anchor"></nile-icon>
153
+ <nile-input
154
+ placeholder="Search"
155
+ @nile-input=${this.handleSearch}
156
+ part="filter__search"
157
+ ></nile-input>
158
+ <slot name="filter__content" part="filter__content"></slot>
159
+ </nile-popover>`
160
+ : html``}
161
+ </div>
162
+ </div>`;
163
+ }
114
164
  }
115
- /* #endregion */
116
165
  }
117
166
 
118
167
  export default NileTableHeaderItem;