@nova-design-system/nova-react 3.15.0 → 3.16.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 (61) hide show
  1. package/dist/cjs/{index-BK1_MpRZ.js → index-7K7BV1CP.js} +7303 -4228
  2. package/dist/cjs/index.js +2 -2
  3. package/dist/cjs/{nv-accordion-item.entry-BPaDkIFa.js → nv-accordion-item.entry-C-9tYw-c.js} +2 -2
  4. package/dist/cjs/{nv-accordion.entry-BaHER2iL.js → nv-accordion.entry-BA3mTIdj.js} +6 -6
  5. package/dist/cjs/{nv-alert.entry-Hv-y3Bwl.js → nv-alert.entry-Bic-YGW1.js} +2 -2
  6. package/dist/cjs/nv-avatar.entry-C-yd0YlD.js +68 -0
  7. package/dist/cjs/{nv-badge_2.entry-CwlWa72m.js → nv-badge_2.entry-B_8yvNXL.js} +1 -1
  8. package/dist/cjs/{nv-breadcrumb.entry-BvHgDgxV.js → nv-breadcrumb.entry-BCTbG942.js} +2 -2
  9. package/dist/cjs/{nv-breadcrumbs.entry-BdptRKYA.js → nv-breadcrumbs.entry-C9B5Baf7.js} +1 -1
  10. package/dist/cjs/nv-button.entry-DgX8Bwmq.js +165 -0
  11. package/dist/cjs/{nv-buttongroup.entry-Bh0f3bAn.js → nv-buttongroup.entry-CKhZN_Yf.js} +1 -1
  12. package/dist/cjs/{nv-calendar.entry-BZLITXEC.js → nv-calendar.entry-E6Pk83WA.js} +1 -1
  13. package/dist/cjs/{nv-col.entry-I3bCSLB5.js → nv-col.entry-CkZpukX9.js} +1 -1
  14. package/dist/cjs/{nv-datagrid.entry-BzIkgOV6.js → nv-datagrid.entry-RsfP7vbC.js} +177 -10
  15. package/dist/cjs/{nv-datagridcolumn.entry-BuFhEECG.js → nv-datagridcolumn.entry-D4VrDWo9.js} +1 -1
  16. package/dist/cjs/{nv-dialog.entry-DIbIIXo2.js → nv-dialog.entry-BhtWpYHl.js} +32 -29
  17. package/dist/cjs/{nv-dialogfooter_2.entry-Thzk1kVd.js → nv-dialogfooter_2.entry-BXLYmzYl.js} +2 -2
  18. package/dist/cjs/{nv-fieldcheckbox.entry-mkas423y.js → nv-fieldcheckbox.entry-D96Nm6DZ.js} +2 -2
  19. package/dist/cjs/{nv-fielddate.entry-Cek70TQM.js → nv-fielddate.entry-ty37R9jF.js} +51 -26
  20. package/dist/cjs/{nv-fielddaterange.entry-C3BYAnVq.js → nv-fielddaterange.entry-BSIRu_mq.js} +68 -42
  21. package/dist/cjs/{nv-fielddropdown.entry-Djz5-R1T.js → nv-fielddropdown.entry-CUzvIoZZ.js} +33 -7
  22. package/dist/cjs/{nv-fielddropdownitem.entry-B2z13jEI.js → nv-fielddropdownitem.entry-D-GTxLNk.js} +1 -1
  23. package/dist/cjs/{nv-fieldmultiselect.entry-uJ9i2gtz.js → nv-fieldmultiselect.entry-DFY2bf6s.js} +187 -156
  24. package/dist/cjs/{nv-fieldnumber.entry-zpWCDG_-.js → nv-fieldnumber.entry-CILclJ7Q.js} +2 -2
  25. package/dist/cjs/{nv-fieldpassword.entry-C835HE_i.js → nv-fieldpassword.entry-CdR-NM8e.js} +2 -2
  26. package/dist/cjs/{nv-fieldradio.entry-CzLMbo4W.js → nv-fieldradio.entry-lC4scIvU.js} +2 -2
  27. package/dist/cjs/{nv-fieldselect.entry-BzcYzmqe.js → nv-fieldselect.entry-CYu6870F.js} +2 -2
  28. package/dist/cjs/{nv-fieldslider.entry-B5vyrQZw.js → nv-fieldslider.entry-DOuJAR6P.js} +2 -2
  29. package/dist/cjs/{nv-fieldtext.entry-DnPQxVqp.js → nv-fieldtext.entry-BFLUiPa4.js} +2 -2
  30. package/dist/cjs/{nv-fieldtextarea.entry-n2MJK2Jg.js → nv-fieldtextarea.entry-BeI0k97G.js} +2 -2
  31. package/dist/cjs/{nv-fieldtime.entry-DChhvqKi.js → nv-fieldtime.entry-C28EAKki.js} +25 -12
  32. package/dist/cjs/nv-icon.entry-BXgjUpe_.js +80 -0
  33. package/dist/cjs/{nv-iconbutton_2.entry-u0l16LeW.js → nv-iconbutton_2.entry-CpIkxrp9.js} +2 -2
  34. package/dist/cjs/{nv-menu.entry-OYVh6iMu.js → nv-menu.entry-as-NOsF-.js} +24 -9
  35. package/dist/cjs/{nv-menuitem.entry-Dj6N1n9X.js → nv-menuitem.entry-D8KAh6nr.js} +1 -1
  36. package/dist/cjs/{nv-notification.entry-D1dVSEYZ.js → nv-notification.entry-C-_jV-DL.js} +2 -2
  37. package/dist/cjs/{nv-notificationcontainer.entry-Bp2NR_fe.js → nv-notificationcontainer.entry-CMn42loT.js} +1 -1
  38. package/dist/cjs/{nv-popover.entry-Bf2AEn9B.js → nv-popover.entry--BhEBSir.js} +67 -61
  39. package/dist/cjs/{nv-row.entry-Bi9eoQEh.js → nv-row.entry-BxhcK9aY.js} +1 -1
  40. package/dist/cjs/{nv-stack.entry-Dd680LIT.js → nv-stack.entry-C3DF9jJZ.js} +1 -1
  41. package/dist/cjs/nv-table.entry-pfEGt2KH.js +245 -0
  42. package/dist/cjs/nv-toggle.entry-ChpqtQtn.js +80 -0
  43. package/dist/cjs/{nv-togglebutton.entry-ZpltTrQe.js → nv-togglebutton.entry-DE7CKmeN.js} +2 -2
  44. package/dist/cjs/{nv-togglebuttongroup.entry-Bu0C6Iq3.js → nv-togglebuttongroup.entry-BJPjdmHD.js} +2 -2
  45. package/dist/cjs/{nv-tooltip.entry-DR4aj5qF.js → nv-tooltip.entry-D9-Fga6C.js} +2 -2
  46. package/dist/components/NvDatatable.js +45 -0
  47. package/dist/generated/components.js +2 -10
  48. package/dist/generated/components.server.js +1 -16
  49. package/dist/index.js +1 -0
  50. package/dist/types/components/NvDatatable.d.ts +25 -0
  51. package/dist/types/generated/components.d.ts +2 -12
  52. package/dist/types/generated/components.server.d.ts +2 -12
  53. package/dist/types/index.d.ts +1 -0
  54. package/package.json +4 -3
  55. package/dist/cjs/dom.utils-ac71e0ef-CmIwRr6O.js +0 -168
  56. package/dist/cjs/nv-avatar.entry-BTmGyeGF.js +0 -68
  57. package/dist/cjs/nv-button.entry-6O39hBHY.js +0 -165
  58. package/dist/cjs/nv-icon.entry-agdqxUMS.js +0 -80
  59. package/dist/cjs/nv-table.entry-wxn9GDDo.js +0 -339
  60. package/dist/cjs/nv-tablecolumn.entry-Bo0z0XyB.js +0 -19
  61. package/dist/cjs/nv-toggle.entry-gBokGnGe.js +0 -80
@@ -0,0 +1,80 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-7K7BV1CP.js');
4
+ var clsx297c1ffe = require('./clsx-297c1ffe-BtxeOLZW.js');
5
+ var v4A79185f4 = require('./v4-a79185f4-2n0dOd_Y.js');
6
+ require('react');
7
+ require('react-dom');
8
+
9
+ const nvToggleCss = "nv-toggle{display:inline-flex;align-items:flex-start;gap:var(--form-gap-x);position:relative}nv-toggle:not([disabled],[readonly]) input,nv-toggle:not([disabled],[readonly]) label{cursor:pointer}nv-toggle.label-placement-before{flex-direction:row-reverse}nv-toggle[disabled]{opacity:0.5}nv-toggle label{align-self:stretch;color:var(--components-form-text-label-default);font-family:var(--font-family-default), var(--font-family-fallback), sans-serif;font-size:var(--form-label-font-size);font-style:normal;font-weight:var(--font-weight-medium-emphasis);line-height:var(--form-label-line-height)}nv-toggle label.visually-hidden{position:absolute;padding:0;border:0;overflow:hidden;white-space:nowrap;width:1px;height:1px;margin:-1px;clip:rect(0, 0, 0, 0)}nv-toggle .input-container{position:relative;color:var(--components-form-shape-foreground-default)}nv-toggle .input-container:has(input[type=checkbox]:disabled:not([readonly])){color:var(--components-form-shape-foreground-disabled)}nv-toggle .input-container input[type=checkbox]{appearance:none;position:relative;display:flex;width:var(--form-toggle-width);height:var(--form-toggle-height);flex-direction:column;align-items:flex-start;border-radius:var(--form-toggle-radius);border-width:var(--form-toggle-border-width);border-style:solid;border-color:var(--components-toggle-border-default);background:var(--components-toggle-background-default)}nv-toggle .input-container input[type=checkbox]::after{content:\"\";display:block;width:var(--form-toggle-switch-dot-default);height:var(--form-toggle-switch-dot-default);background-color:var(--components-toggle-shape-default);border-radius:var(--radius-rounded-full);position:absolute;top:50%;left:25%;transform:translate(-50%, -50%)}nv-toggle .input-container input[type=checkbox]:hover{border-color:var(--components-toggle-border-hover)}nv-toggle .input-container input[type=checkbox]:hover::after{background-color:var(--components-toggle-shape-hover)}nv-toggle .input-container input[type=checkbox]:focus{border-color:var(--components-toggle-border-default)}nv-toggle .input-container input[type=checkbox]:focus::after{background-color:var(--components-toggle-shape-default)}nv-toggle .input-container input[type=checkbox]:focus,nv-toggle .input-container input[type=checkbox]:focus-within{outline:none}nv-toggle .input-container input[type=checkbox]:focus-visible,nv-toggle .input-container input[type=checkbox]:has(:focus-visible){outline:calc(var(--focus-outline-stroke) * 1) solid var(--color-focus-brand);outline-offset:calc(var(--focus-outline-offset) * 1)}nv-toggle .input-container input[type=checkbox]:checked{background:var(--components-toggle-background-default-checked);border-color:var(--components-toggle-border-default-checked)}nv-toggle .input-container input[type=checkbox]:checked::after{content:\"\";display:block;width:var(--form-toggle-switch-dot-default);height:var(--form-toggle-switch-dot-default);background-color:var(--components-toggle-shape-default-checked);border-radius:var(--radius-rounded-full);position:absolute;top:50%;left:75%;transform:translate(-50%, -50%)}nv-toggle .input-container input[type=checkbox]:checked:focus{background:var(--components-toggle-background-default-checked);border-color:var(--components-toggle-border-default-checked)}nv-toggle .input-container input[type=checkbox]:disabled:not([readonly]){box-shadow:unset;background:var(--components-toggle-background-disabled);border-color:var(--components-toggle-border-default)}nv-toggle .input-container input[type=checkbox]:disabled:not([readonly]):checked{background:var(--components-toggle-background-disabled-checked);border-color:var(--components-toggle-border-disabled-checked)}nv-toggle .input-container input[type=checkbox]:disabled:not([readonly]):checked::after{background-color:var(--components-toggle-shape-disabled-checked)}nv-toggle .description{align-self:stretch;color:var(--components-form-text-description-default);font-family:var(--font-family-default), var(--font-family-fallback), sans-serif;font-size:var(--form-description-font-size);font-style:normal;font-weight:450;line-height:var(--form-description-line-height)}nv-toggle .text-container{display:flex;flex-direction:column;align-items:flex-start;flex:1 0 0}";
10
+ const NvToggleStyle0 = nvToggleCss;
11
+
12
+ const NvToggle = class {
13
+ constructor(hostRef) {
14
+ index.registerInstance(this, hostRef);
15
+ this.checkedChanged = index.createEvent(this, "checkedChanged");
16
+ /****************************************************************************/
17
+ //#region PROPERTIES
18
+ /**
19
+ * Sets the ID for the radio button’s input element and the for attribute of
20
+ * the associated label. If no ID is provided, a random one will be
21
+ * automatically generated to ensure unique identification, facilitating
22
+ * proper label association and accessibility.
23
+ */
24
+ this.inputId = v4A79185f4.v4();
25
+ /**
26
+ * Hides the label visually while still keeping it available for screen
27
+ * readers.
28
+ */
29
+ this.hideLabel = false;
30
+ /** Indicates whether the toggle is checked or not. */
31
+ this.checked = false;
32
+ /** Disables the toggle, preventing user interaction. */
33
+ this.disabled = false;
34
+ /**
35
+ * Sets the toggle to read-only, preventing user changes but still allowing
36
+ * focus and selection of text.
37
+ */
38
+ this.readonly = false;
39
+ }
40
+ //#endregion EVENTS
41
+ /****************************************************************************/
42
+ //#region WATCHERS
43
+ /**
44
+ * Watches for changes to the checked state and emits the new value.
45
+ * @param {boolean} checked - The new value of the checked state.
46
+ */
47
+ onCheckedChanged(checked) {
48
+ this.checkedChanged.emit(checked);
49
+ }
50
+ /**
51
+ * Listens for the change event on the toggle input element and updates the checked state.
52
+ * the checked state of the host elements.
53
+ * @param {Event} event - The change event.
54
+ */
55
+ handleChange(event) {
56
+ const target = event.target;
57
+ if (target.type === 'checkbox' && target.id === this.inputId) {
58
+ if (this.readonly || this.disabled) {
59
+ event.preventDefault();
60
+ return;
61
+ }
62
+ this.checked = target.checked;
63
+ }
64
+ }
65
+ //#endregion WATCHERS
66
+ /****************************************************************************/
67
+ //#region RENDER
68
+ render() {
69
+ return (index.h(index.Host, { key: '65222149af4edb9f8fd2da7efe9a01e15dec4722', class: clsx297c1ffe.clsx(this.labelPlacement === 'before' && 'label-placement-before') }, index.h("div", { key: '7edd5587281b5610269f1ac09826ce379abfae24', class: "input-container" }, index.h("input", { key: '30d3db3cbdc263259a5ba1bf8e637225c4db3b4a', type: "checkbox", id: this.inputId, name: this.name, autocomplete: "off", value: this.value, checked: Boolean(this.checked), disabled: this.disabled || this.readonly, readonly: this.readonly })), index.h("div", { key: 'a8a6d3c2774560b7d43cda75882d90cc564f4c54', class: "text-container" }, (this.label || this.el.querySelector('[slot="label"]')) && (index.h("label", { key: 'fe980a07df4901081fda42df758236da0b8a11d0', htmlFor: this.inputId, class: clsx297c1ffe.clsx(this.hideLabel && 'visually-hidden') }, index.h("slot", { key: '723cec5914c6c0bed7e14e61e2f64e83c8e8b7b8', name: "label" }, this.label))), (this.description ||
70
+ this.el.querySelector('[slot="description"]')) && (index.h("div", { key: 'f811065ed06f0816d8f0f1f65d4c659cbde3f683', class: "description" }, index.h("slot", { key: '541946e3f33a315bf667999c30a44fd93fc5f07f', name: "description" }, this.description))))));
71
+ }
72
+ static get formAssociated() { return true; }
73
+ get el() { return index.getElement(this); }
74
+ static get watchers() { return {
75
+ "checked": ["onCheckedChanged"]
76
+ }; }
77
+ };
78
+ NvToggle.style = NvToggleStyle0;
79
+
80
+ exports.nv_toggle = NvToggle;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BK1_MpRZ.js');
3
+ var index = require('./index-7K7BV1CP.js');
4
4
  require('react');
5
5
  require('react-dom');
6
6
 
@@ -48,7 +48,7 @@ const NvTogglebutton = class {
48
48
  /****************************************************************************/
49
49
  //#region RENDER
50
50
  render() {
51
- return (index.h(index.Host, { key: 'b9e37fc1cb34272bca476c7b61db173ab2a9d238', role: "button", tabindex: "0", "aria-pressed": String(this.active), onClick: this.handleClick }, index.h("slot", { key: 'cf9cf3445fd93873def1f9fa9cbec46c35600025' })));
51
+ return (index.h(index.Host, { key: 'c4b698b1fb80f0dcca5d7a77bc20d22db1cbf538', role: "button", tabindex: "0", "aria-pressed": String(this.active), onClick: this.handleClick }, index.h("slot", { key: '605385f07f32b989685983cfd1a082525741fba4' })));
52
52
  }
53
53
  };
54
54
  NvTogglebutton.style = NvTogglebuttonStyle0;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BK1_MpRZ.js');
3
+ var index = require('./index-7K7BV1CP.js');
4
4
  require('react');
5
5
  require('react-dom');
6
6
 
@@ -156,7 +156,7 @@ const NvTogglebuttongroup = class {
156
156
  /****************************************************************************/
157
157
  //#region RENDER
158
158
  render() {
159
- return (index.h(index.Host, { key: 'edb5b3bb7651b482cd02625038e36cdb35743453' }, index.h("slot", { key: '2b0bc4891b885ecf7febdce7062fc02b120ec939' })));
159
+ return (index.h(index.Host, { key: 'ab91ff1817e3388508ed1da7a9ed57a79cf8c4bc' }, index.h("slot", { key: '4a3280db78c1f0cd120a0cb32d95eabaf69995a6' })));
160
160
  }
161
161
  get el() { return index.getElement(this); }
162
162
  static get watchers() { return {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-BK1_MpRZ.js');
3
+ var index = require('./index-7K7BV1CP.js');
4
4
  require('react');
5
5
  require('react-dom');
6
6
 
@@ -46,7 +46,7 @@ const NvTooltip = class {
46
46
  /****************************************************************************/
47
47
  //#region RENDER
48
48
  render() {
49
- return (index.h(index.Host, { key: '5d5facbf2a0487bda4fbae49913a2cb4f69dcf5a' }, index.h("slot", { key: '91080d347f3473879109f7b0b59b159f5bb5979b' }), index.h("nv-popover", { key: '876e5e2487d1b2b5182e42909a6edeab5b3e9db2', triggerMode: "hover", hasArrow: true, placement: this.placement, strategy: this.strategy, triggerElement: this.triggerElement, groupName: 'tooltip', enterDelay: this.enterDelay }, index.h("p", { key: 'e30ce16ed27e41dee7359fb44ccba7a780e72d37', slot: "content" }, this.message), index.h("slot", { key: '395c75d7f45bab9aaebf979bd75087058b979350', name: "content" }))));
49
+ return (index.h(index.Host, { key: 'c2fdcd47be909554e31a3a7d77cd94dcb07c0d6e' }, index.h("slot", { key: '2305f6b7175d0ba84819351f60f2a4d76d117df9' }), index.h("nv-popover", { key: 'e388730b5858671d08981c6bbf72588a5084edbf', triggerMode: "hover", hasArrow: true, placement: this.placement, strategy: this.strategy, triggerElement: this.triggerElement, groupName: 'tooltip', enterDelay: this.enterDelay }, index.h("p", { key: '73f548a1c822f7c6d5a97bb4ef8da0d335cf049e', slot: "content" }, this.message), index.h("slot", { key: 'abb7a2dfa6a327122732802a867c5d4057fd1616', name: "content" }))));
50
50
  }
51
51
  get el() { return index.getElement(this); }
52
52
  };
@@ -0,0 +1,45 @@
1
+ import React, { useMemo } from 'react';
2
+ import { flexRender, getCoreRowModel, useReactTable, } from '@tanstack/react-table';
3
+ import { NvTable } from '../generated/components';
4
+ const NvDatatable = ({ columns, rows, ...htmlProps }) => {
5
+ const tableColumns = useMemo(() => columns
6
+ .filter((col) => !col.hidden)
7
+ .map((col) => ({
8
+ accessorKey: col.field,
9
+ header: col.headerName || String(col.field),
10
+ size: col.width,
11
+ enableResizing: col.resizable ?? true,
12
+ cell: (context) => {
13
+ const value = context.getValue();
14
+ const row = context.row.original;
15
+ const rowIndex = context.row.index;
16
+ if (col.renderCell) {
17
+ return col.renderCell({
18
+ value,
19
+ row,
20
+ field: col.field,
21
+ rowIndex,
22
+ });
23
+ }
24
+ return value;
25
+ },
26
+ })), [columns]);
27
+ const table = useReactTable({
28
+ data: rows,
29
+ columns: tableColumns,
30
+ getCoreRowModel: getCoreRowModel(),
31
+ });
32
+ return (React.createElement(NvTable, { ...htmlProps },
33
+ React.createElement("table", null,
34
+ React.createElement("thead", null, table.getHeaderGroups().map((headerGroup) => (React.createElement("tr", { key: headerGroup.id }, headerGroup.headers.map((header) => (React.createElement("th", { key: header.id, "data-testid": `datatable-header-${header.id}`, style: {
35
+ width: header.column.columnDef.size + 'px',
36
+ }, "data-no-resize": header.column.columnDef.enableResizing ? null : true }, header.isPlaceholder
37
+ ? null
38
+ : flexRender(header.column.columnDef.header, header.getContext())))))))),
39
+ React.createElement("tbody", null, table.getRowModel().rows.map((row) => (React.createElement("tr", { key: row.id, "data-testid": `datatable-row-${row.id}` }, row.getVisibleCells().map((cell) => (React.createElement("td", { key: cell.id, "data-testid": `datatable-cell-${cell.id}`, style: {
40
+ padding: '8px',
41
+ borderBottom: '1px solid #eee',
42
+ } }, flexRender(cell.column.columnDef.cell, cell.getContext())))))))))));
43
+ };
44
+ NvDatatable.displayName = 'NvDatatable';
45
+ export { NvDatatable };
@@ -41,7 +41,6 @@ import { NvPopover as NvPopoverElement, defineCustomElement as defineNvPopover }
41
41
  import { NvRow as NvRowElement, defineCustomElement as defineNvRow } from "@nova-design-system/nova-webcomponents/dist/components/nv-row.js";
42
42
  import { NvStack as NvStackElement, defineCustomElement as defineNvStack } from "@nova-design-system/nova-webcomponents/dist/components/nv-stack.js";
43
43
  import { NvTable as NvTableElement, defineCustomElement as defineNvTable } from "@nova-design-system/nova-webcomponents/dist/components/nv-table.js";
44
- import { NvTablecolumn as NvTablecolumnElement, defineCustomElement as defineNvTablecolumn } from "@nova-design-system/nova-webcomponents/dist/components/nv-tablecolumn.js";
45
44
  import { NvToggle as NvToggleElement, defineCustomElement as defineNvToggle } from "@nova-design-system/nova-webcomponents/dist/components/nv-toggle.js";
46
45
  import { NvTogglebutton as NvTogglebuttonElement, defineCustomElement as defineNvTogglebutton } from "@nova-design-system/nova-webcomponents/dist/components/nv-togglebutton.js";
47
46
  import { NvTogglebuttongroup as NvTogglebuttongroupElement, defineCustomElement as defineNvTogglebuttongroup } from "@nova-design-system/nova-webcomponents/dist/components/nv-togglebuttongroup.js";
@@ -52,7 +51,7 @@ export const NvAccordion = createComponent({
52
51
  tagName: 'nv-accordion',
53
52
  elementClass: NvAccordionElement,
54
53
  react: React,
55
- events: { onOpenChanged: 'openChanged' },
54
+ events: { onOpenIndexesChanged: 'openIndexesChanged' },
56
55
  defineCustomElement: defineNvAccordion
57
56
  });
58
57
  export const NvAccordionItem = createComponent({
@@ -367,15 +366,8 @@ export const NvTable = createComponent({
367
366
  tagName: 'nv-table',
368
367
  elementClass: NvTableElement,
369
368
  react: React,
370
- events: { onAction: 'action' },
371
- defineCustomElement: defineNvTable
372
- });
373
- export const NvTablecolumn = createComponent({
374
- tagName: 'nv-tablecolumn',
375
- elementClass: NvTablecolumnElement,
376
- react: React,
377
369
  events: {},
378
- defineCustomElement: defineNvTablecolumn
370
+ defineCustomElement: defineNvTable
379
371
  });
380
372
  export const NvToggle = createComponent({
381
373
  tagName: 'nv-toggle',
@@ -708,22 +708,7 @@ export const NvStack = createComponent({
708
708
  });
709
709
  export const NvTable = createComponent({
710
710
  tagName: 'nv-table',
711
- properties: {
712
- dataJson: 'data-json',
713
- columnsConfigJson: 'columns-config-json',
714
- fallbackValue: 'fallback-value',
715
- noDataMessage: 'no-data-message',
716
- noColumnsNoDataMessage: 'no-columns-no-data-message'
717
- },
718
- hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
719
- serializeShadowRoot
720
- });
721
- export const NvTablecolumn = createComponent({
722
- tagName: 'nv-tablecolumn',
723
- properties: {
724
- name: 'name',
725
- header: 'header'
726
- },
711
+ properties: {},
727
712
  hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
728
713
  serializeShadowRoot
729
714
  });
package/dist/index.js CHANGED
@@ -2,3 +2,4 @@ export * from './generated/components';
2
2
  export * from '@nova-design-system/nova-webcomponents/constants';
3
3
  export { defineCustomElements } from '@nova-design-system/nova-webcomponents/loader';
4
4
  export { useNotifications, NotificationProvider, } from './providers/NotificationProvider';
5
+ export * from './components/NvDatatable';
@@ -0,0 +1,25 @@
1
+ import React, { type ComponentProps } from 'react';
2
+ declare const NvDatatable: {
3
+ <T extends NvDatatableRow = NvDatatableRow>({ columns, rows, ...htmlProps }: NvDatatableProps<T>): React.JSX.Element;
4
+ displayName: string;
5
+ };
6
+ export { NvDatatable };
7
+ export type NvDatatableProps<T> = {
8
+ columns: Array<NvDatatableColumn<T>>;
9
+ rows: Array<T>;
10
+ } & Pick<ComponentProps<'div'>, 'className' | 'style'>;
11
+ export interface NvDatatableColumn<T> {
12
+ field: keyof T;
13
+ headerName?: string;
14
+ width?: number;
15
+ resizable?: boolean;
16
+ hidden?: boolean;
17
+ renderCell?: (params: NvTableRenderCellParams<T, T[keyof T]>) => React.ReactNode;
18
+ }
19
+ export type NvDatatableRow = Record<string, string | number | boolean | null | undefined | typeof Date>;
20
+ export interface NvTableRenderCellParams<T, V> {
21
+ value: V;
22
+ row: T;
23
+ field: keyof T;
24
+ rowIndex: number;
25
+ }
@@ -41,16 +41,13 @@ import { NvPopover as NvPopoverElement } from "@nova-design-system/nova-webcompo
41
41
  import { NvRow as NvRowElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-row.js";
42
42
  import { NvStack as NvStackElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-stack.js";
43
43
  import { NvTable as NvTableElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-table.js";
44
- import { NvTablecolumn as NvTablecolumnElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-tablecolumn.js";
45
44
  import { NvToggle as NvToggleElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-toggle.js";
46
45
  import { NvTogglebutton as NvTogglebuttonElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-togglebutton.js";
47
46
  import { NvTogglebuttongroup as NvTogglebuttongroupElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-togglebuttongroup.js";
48
47
  import { NvTooltip as NvTooltipElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-tooltip.js";
49
48
  import type { EventName, StencilReactComponent } from '@stencil/react-output-target/runtime';
50
49
  export type NvAccordionEvents = {
51
- onOpenChanged: EventName<CustomEvent<{
52
- openIndexes: number[];
53
- }>>;
50
+ onOpenIndexesChanged: EventName<CustomEvent<number[]>>;
54
51
  };
55
52
  export declare const NvAccordion: StencilReactComponent<NvAccordionElement, NvAccordionEvents>;
56
53
  export type NvAccordionItemEvents = {
@@ -221,15 +218,8 @@ export type NvRowEvents = NonNullable<unknown>;
221
218
  export declare const NvRow: StencilReactComponent<NvRowElement, NvRowEvents>;
222
219
  export type NvStackEvents = NonNullable<unknown>;
223
220
  export declare const NvStack: StencilReactComponent<NvStackElement, NvStackEvents>;
224
- export type NvTableEvents = {
225
- onAction: EventName<CustomEvent<{
226
- keyAction: string;
227
- details: any;
228
- }>>;
229
- };
221
+ export type NvTableEvents = NonNullable<unknown>;
230
222
  export declare const NvTable: StencilReactComponent<NvTableElement, NvTableEvents>;
231
- export type NvTablecolumnEvents = NonNullable<unknown>;
232
- export declare const NvTablecolumn: StencilReactComponent<NvTablecolumnElement, NvTablecolumnEvents>;
233
223
  export type NvToggleEvents = {
234
224
  onCheckedChanged: EventName<CustomEvent<boolean>>;
235
225
  };
@@ -41,7 +41,6 @@ import { NvPopover as NvPopoverElement } from "@nova-design-system/nova-webcompo
41
41
  import { NvRow as NvRowElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-row.js";
42
42
  import { NvStack as NvStackElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-stack.js";
43
43
  import { NvTable as NvTableElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-table.js";
44
- import { NvTablecolumn as NvTablecolumnElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-tablecolumn.js";
45
44
  import { NvToggle as NvToggleElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-toggle.js";
46
45
  import { NvTogglebutton as NvTogglebuttonElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-togglebutton.js";
47
46
  import { NvTogglebuttongroup as NvTogglebuttongroupElement } from "@nova-design-system/nova-webcomponents/dist/components/nv-togglebuttongroup.js";
@@ -50,9 +49,7 @@ import type { EventName, StencilReactComponent } from '@stencil/react-output-tar
50
49
  import { type SerializeShadowRootOptions } from '@stencil/react-output-target/ssr';
51
50
  export declare const serializeShadowRoot: SerializeShadowRootOptions;
52
51
  export type NvAccordionEvents = {
53
- onOpenChanged: EventName<CustomEvent<{
54
- openIndexes: number[];
55
- }>>;
52
+ onOpenIndexesChanged: EventName<CustomEvent<number[]>>;
56
53
  };
57
54
  export declare const NvAccordion: StencilReactComponent<NvAccordionElement, NvAccordionEvents>;
58
55
  export type NvAccordionItemEvents = {
@@ -223,15 +220,8 @@ export type NvRowEvents = NonNullable<unknown>;
223
220
  export declare const NvRow: StencilReactComponent<NvRowElement, NvRowEvents>;
224
221
  export type NvStackEvents = NonNullable<unknown>;
225
222
  export declare const NvStack: StencilReactComponent<NvStackElement, NvStackEvents>;
226
- export type NvTableEvents = {
227
- onAction: EventName<CustomEvent<{
228
- keyAction: string;
229
- details: any;
230
- }>>;
231
- };
223
+ export type NvTableEvents = NonNullable<unknown>;
232
224
  export declare const NvTable: StencilReactComponent<NvTableElement, NvTableEvents>;
233
- export type NvTablecolumnEvents = NonNullable<unknown>;
234
- export declare const NvTablecolumn: StencilReactComponent<NvTablecolumnElement, NvTablecolumnEvents>;
235
225
  export type NvToggleEvents = {
236
226
  onCheckedChanged: EventName<CustomEvent<boolean>>;
237
227
  };
@@ -2,3 +2,4 @@ export * from './generated/components';
2
2
  export * from '@nova-design-system/nova-webcomponents/constants';
3
3
  export { defineCustomElements } from '@nova-design-system/nova-webcomponents/loader';
4
4
  export { useNotifications, NotificationProvider, type NotificationOptions, type NotificationContextValue, type NotificationProviderProps, type Notification, } from './providers/NotificationProvider';
5
+ export * from './components/NvDatatable';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nova-design-system/nova-react",
3
- "version": "3.15.0",
3
+ "version": "3.16.0",
4
4
  "description": "Nova is a design system created by Elia Group to empower creators to efficiently build solutions that people love to use.",
5
5
  "author": "Elia Group",
6
6
  "homepage": "https://nova.eliagroup.io",
@@ -33,11 +33,12 @@
33
33
  "tsc:watch": "tsc -p . --outDir ./dist --declarationDir ./dist/types --declaration true --watch",
34
34
  "storybook": "storybook dev -p 6006",
35
35
  "storybook.build": "storybook build -o ../../storybook-static/react",
36
- "clean": "rimraf dist lib/generated",
36
+ "clean": "rimraf dist lib/generated lib/stories/generated",
37
37
  "typecheck": "tsc --emitDeclarationOnly false --noEmit"
38
38
  },
39
39
  "dependencies": {
40
- "@nova-design-system/nova-webcomponents": "*"
40
+ "@nova-design-system/nova-webcomponents": "*",
41
+ "@tanstack/react-table": "8.21.3"
41
42
  },
42
43
  "devDependencies": {
43
44
  "react": "^18.3.1",
@@ -1,168 +0,0 @@
1
- 'use strict';
2
-
3
- /* eslint-disable @typescript-eslint/no-explicit-any */
4
- /**
5
- * All properties that should be excluded from the deep copy of an HTML element.
6
- */
7
- const excludedProps = new Set([
8
- // Text and content-related properties
9
- 'textContent',
10
- 'innerText',
11
- 'outerText',
12
- 'innerHTML',
13
- 'outerHTML',
14
- 'text',
15
- // Form element properties
16
- 'value',
17
- 'defaultValue',
18
- 'checked',
19
- 'defaultChecked',
20
- 'selectionStart',
21
- 'selectionEnd',
22
- 'selectionDirection',
23
- 'form',
24
- 'willValidate',
25
- 'validity',
26
- 'validationMessage',
27
- 'labels',
28
- 'list',
29
- 'maxLength',
30
- 'minLength',
31
- 'valueAsDate',
32
- 'valueAsNumber',
33
- // Editability and namespaces
34
- 'contentEditable',
35
- 'isContentEditable',
36
- 'namespaceURI',
37
- // Child-related properties (handled recursively)
38
- 'attributes',
39
- 'children',
40
- 'childNodes',
41
- 'firstChild',
42
- 'lastChild',
43
- // Blazor-related properties
44
- 'origin',
45
- 'dataset',
46
- 'attributeStyleMap',
47
- 'prefix',
48
- 'localName',
49
- 'tagName',
50
- 'shadowRoot',
51
- 'assignedSlot',
52
- 'scrollWidth',
53
- 'scrollHeight',
54
- 'clientTop',
55
- 'clientLeft',
56
- 'clientWidth',
57
- 'clientHeight',
58
- 'firstElementChild',
59
- 'lastElementChild',
60
- 'childElementCount',
61
- 'previousElementSibling',
62
- 'nextElementSibling',
63
- 'currentCSSZoom',
64
- 'nodeType',
65
- 'nodeName',
66
- 'baseURI',
67
- 'isConnected',
68
- 'ownerDocument',
69
- 'parentNode',
70
- 'parentElement',
71
- 'previousSibling',
72
- 'nextSibling',
73
- 'ELEMENT_NODE',
74
- 'ATTRIBUTE_NODE',
75
- 'TEXT_NODE',
76
- 'CDATA_SECTION_NODE',
77
- 'ENTITY_REFERENCE_NODE',
78
- 'ENTITY_NODE',
79
- 'PROCESSING_INSTRUCTION_NODE',
80
- 'COMMENT_NODE',
81
- 'DOCUMENT_NODE',
82
- 'DOCUMENT_TYPE_NODE',
83
- 'DOCUMENT_FRAGMENT_NODE',
84
- 'NOTATION_NODE',
85
- 'DOCUMENT_POSITION_DISCONNECTED',
86
- 'DOCUMENT_POSITION_PRECEDING',
87
- 'DOCUMENT_POSITION_FOLLOWING',
88
- 'DOCUMENT_POSITION_CONTAINS',
89
- 'DOCUMENT_POSITION_CONTAINED_BY',
90
- 'DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC',
91
- ]);
92
- /**
93
- * Deep copy an HTML element with all its attributes, properties, and child nodes.
94
- * This method is useful for creating a clone of an element that can be safely modified without affecting the original.
95
- * @param {HTMLElement} element - The HTML element to copy.
96
- * @returns {HTMLElement} - A deep copy of the HTML element.
97
- * @example const copy = deepCopyElement(document.getElementById('myElement'));
98
- */
99
- function deepCopyElement(element) {
100
- const copy = document.createElement(element.tagName);
101
- // ✅ Copy attributes
102
- Array.from(element.attributes).forEach(attr => {
103
- copy.setAttribute(attr.name, attr.value);
104
- });
105
- // ✅ Dynamically extract relevant properties
106
- const properties = new Set();
107
- // Collect only own enumerable properties
108
- Object.keys(element).forEach(key => properties.add(key));
109
- // Collect inherited properties from prototypes (HTMLElement -> Element -> Node)
110
- let proto = Object.getPrototypeOf(element);
111
- while (proto && proto !== HTMLElement.prototype) {
112
- Object.keys(proto).forEach(key => properties.add(key));
113
- proto = Object.getPrototypeOf(proto);
114
- }
115
- // ✅ Filter and copy only non-function properties (methods are excluded) and non-event listeners
116
- properties.forEach(prop => {
117
- if (typeof element[prop] !== 'function' && // Ignore methods
118
- !prop.startsWith('on') && // Ignore event listeners (onclick, oninput, etc.)
119
- !excludedProps.has(prop) // 🚨 Prevent text duplication and irrelevant props
120
- ) {
121
- try {
122
- copy[prop] = element[prop];
123
- }
124
- catch (error) {
125
- console.warn(`Could not copy property ${prop}:`, error.message);
126
- }
127
- }
128
- });
129
- // ✅ Copy dataset separately
130
- Object.assign(copy.dataset, element.dataset);
131
- // ✅ Handle form elements specifically
132
- if (element instanceof HTMLInputElement) {
133
- copy.value = element.value;
134
- copy.checked = element.checked;
135
- copy.defaultValue = element.defaultValue;
136
- copy.defaultChecked = element.defaultChecked;
137
- copy.selectionStart = element.selectionStart;
138
- copy.selectionEnd = element.selectionEnd;
139
- copy.selectionDirection = element.selectionDirection;
140
- }
141
- else if (element instanceof HTMLTextAreaElement) {
142
- copy.value = element.value;
143
- copy.defaultValue = element.defaultValue;
144
- copy.selectionStart = element.selectionStart;
145
- copy.selectionEnd = element.selectionEnd;
146
- copy.selectionDirection =
147
- element.selectionDirection;
148
- }
149
- else if (element instanceof HTMLSelectElement) {
150
- copy.value = element.value;
151
- copy.selectedIndex = element.selectedIndex;
152
- }
153
- // ✅ Recursively copy child nodes (prevent duplicates)
154
- element.childNodes.forEach(child => {
155
- let childCopy;
156
- if (child.nodeType === Node.ELEMENT_NODE) {
157
- childCopy = deepCopyElement(child);
158
- }
159
- else {
160
- childCopy = child.cloneNode(true);
161
- }
162
- copy.appendChild(childCopy);
163
- });
164
- return copy;
165
- }
166
-
167
- exports.deepCopyElement = deepCopyElement;
168
- exports.excludedProps = excludedProps;
@@ -1,68 +0,0 @@
1
- 'use strict';
2
-
3
- var index = require('./index-BK1_MpRZ.js');
4
- var clsx297c1ffe = require('./clsx-297c1ffe-BtxeOLZW.js');
5
- var constants69bafca2 = require('./constants-69bafca2-DpB_ghPF.js');
6
- require('react');
7
- require('react-dom');
8
-
9
- const nvAvatarCss = "nv-avatar{align-items:center !important;background-color:var(--components-avatar-background-1);border-radius:var(--radius-rounded-full) !important;display:flex !important;flex-shrink:0 !important;font-family:\"TT Norms Pro\", sans-serif;font-style:normal;font-weight:var(--font-weight-medium-emphasis);justify-content:center !important;leading-trim:both;line-height:1 !important;text-align:center;text-edge:cap;text-transform:uppercase}nv-avatar.avatar-color-1{background-color:var(--components-avatar-background-1);color:var(--components-avatar-content-1)}nv-avatar.avatar-color-2{background-color:var(--components-avatar-background-2);color:var(--components-avatar-content-2)}nv-avatar.avatar-color-3{background-color:var(--components-avatar-background-3);color:var(--components-avatar-content-3)}nv-avatar.avatar-color-4{background-color:var(--components-avatar-background-4);color:var(--components-avatar-content-4)}nv-avatar.avatar-color-5{background-color:var(--components-avatar-background-5);color:var(--components-avatar-content-5)}nv-avatar.avatar-color-6{background-color:var(--components-avatar-background-6);color:var(--components-avatar-content-6)}nv-avatar.avatar-color-7{background-color:var(--components-avatar-background-7);color:var(--components-avatar-content-7)}nv-avatar.avatar-color-8{background-color:var(--components-avatar-background-8);color:var(--components-avatar-content-8)}nv-avatar.avatar-color-9{background-color:var(--components-avatar-background-9);color:var(--components-avatar-content-9)}nv-avatar.avatar-color-10{background-color:var(--components-avatar-background-10);color:var(--components-avatar-content-10)}nv-avatar img{height:100%;width:100%;object-fit:cover;object-position:center;border-radius:50%}nv-avatar.avatar-xs{width:var(--avatar-xs-size);height:var(--avatar-xs-size);font-size:var(--avatar-xs-font-size);line-height:var(--avatar-xs-font-size)}nv-avatar.avatar-xs nv-icon>svg{width:var(--spacing-3);height:var(--spacing-3);stroke-width:1.2px}nv-avatar.avatar-sm{width:var(--avatar-sm-size);height:var(--avatar-sm-size);font-size:var(--avatar-sm-font-size);line-height:var(--avatar-sm-font-size)}nv-avatar.avatar-sm nv-icon>svg{width:var(--spacing-4);height:var(--spacing-4);stroke-width:1.5px}nv-avatar.avatar-md{width:var(--avatar-md-size);height:var(--avatar-md-size);font-size:var(--avatar-md-font-size);line-height:var(--avatar-md-font-size)}nv-avatar.avatar-md nv-icon>svg{width:var(--spacing-5);height:var(--spacing-5);stroke-width:1.6px}nv-avatar.avatar-lg{width:var(--avatar-lg-size);height:var(--avatar-lg-size);font-size:var(--avatar-lg-font-size);line-height:var(--avatar-lg-font-size)}nv-avatar.avatar-lg nv-icon>svg{width:var(--spacing-6);height:var(--spacing-6);stroke-width:1.8px}nv-avatar.avatar-xl{width:var(--avatar-xl-size);height:var(--avatar-xl-size);font-size:var(--avatar-xl-font-size);line-height:var(--avatar-xl-font-size)}nv-avatar.avatar-xl nv-icon>svg{width:var(--spacing-7);height:var(--spacing-7);stroke-width:1.9px}";
10
- const NvAvatarStyle0 = nvAvatarCss;
11
-
12
- const NvAvatar = class {
13
- constructor(hostRef) {
14
- index.registerInstance(this, hostRef);
15
- /**
16
- * Define the size of the avatar. You can use t-shirt sizes.
17
- */
18
- this.size = 'md';
19
- /**
20
- * You can apply different colors on the Avatar.
21
- * Use a string number between 1 and 10.
22
- */
23
- this.color = '1';
24
- }
25
- componentWillRender() {
26
- if (this.xsmall) {
27
- this.size = constants69bafca2.SemanticSizes.ExtraSmall;
28
- }
29
- if (this.small) {
30
- this.size = constants69bafca2.SemanticSizes.Small;
31
- }
32
- if (this.medium) {
33
- this.size = constants69bafca2.SemanticSizes.Medium;
34
- }
35
- if (this.large) {
36
- this.size = constants69bafca2.SemanticSizes.Large;
37
- }
38
- if (this.xlarge) {
39
- this.size = constants69bafca2.SemanticSizes.ExtraLarge;
40
- }
41
- if (this.text) {
42
- this.initials = this.text;
43
- }
44
- if (this.url) {
45
- this.src = this.url;
46
- }
47
- }
48
- //#endregion PROPERTIES
49
- /****************************************************************************/
50
- //#region METHODS
51
- /**
52
- * Makes sure the initials are trimmed to 2 letters.
53
- * @param {string} initials - The initials to be trimmed.
54
- * @returns {string} The trimmed initials.
55
- */
56
- trimInitials(initials) {
57
- return initials.trim().substring(0, 2);
58
- }
59
- //#endregion METHODS
60
- /****************************************************************************/
61
- //#region RENDER
62
- render() {
63
- return (index.h(index.Host, { key: '127d470eb9121f611f9e18f029ab9ef15a4a49df', class: clsx297c1ffe.clsx(`avatar-${this.size}`, `avatar-color-${this.color}`), "aria-label": this.alt }, this.src ? (index.h("img", { src: this.src, alt: this.alt })) : this.initials ? (this.trimInitials(this.initials)) : (index.h("slot", { name: "icon" }, index.h("nv-icon", { name: "user" })))));
64
- }
65
- };
66
- NvAvatar.style = NvAvatarStyle0;
67
-
68
- exports.nv_avatar = NvAvatar;