@nova-design-system/nova-react 3.19.0 → 3.21.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 (67) hide show
  1. package/README.md +3 -20
  2. package/dist/cjs/generated/components.server.js +14 -2
  3. package/dist/cjs/{index-C12eD0Qt.js → index-yxDlFA78.js} +670 -346
  4. package/dist/cjs/index.js +3 -1
  5. package/dist/cjs/{nv-accordion-item.entry-99OJUl7m.js → nv-accordion-item.entry-5DF2ffDE.js} +1 -1
  6. package/dist/cjs/{nv-accordion.entry-D8jaknF9.js → nv-accordion.entry-CPB1HBT1.js} +1 -1
  7. package/dist/cjs/{nv-alert.entry-D_uvQxc9.js → nv-alert.entry-jPxt1obA.js} +1 -1
  8. package/dist/cjs/{nv-avatar.entry-B2zfDM3w.js → nv-avatar.entry-zmnREEN-.js} +1 -1
  9. package/dist/cjs/{nv-badge_2.entry-Fnq2K2Ul.js → nv-badge_2.entry-DtkQx_M9.js} +1 -1
  10. package/dist/cjs/{nv-breadcrumb.entry-CEN2iYUQ.js → nv-breadcrumb.entry-DHAe5FxQ.js} +1 -1
  11. package/dist/cjs/{nv-breadcrumbs.entry-Bq8qINNk.js → nv-breadcrumbs.entry-C7XepUqF.js} +1 -1
  12. package/dist/cjs/nv-button.entry-Dg1knj3Y.js +164 -0
  13. package/dist/cjs/{nv-buttongroup.entry-CbTXVSWL.js → nv-buttongroup.entry-Dlim9p8N.js} +1 -1
  14. package/dist/cjs/{nv-calendar.entry-DNkXS4ll.js → nv-calendar.entry-rL5_GdQg.js} +1 -1
  15. package/dist/cjs/{nv-col.entry-Dlrdqper.js → nv-col.entry-CnbFx7h1.js} +1 -1
  16. package/dist/cjs/{nv-datagrid.entry-Z5GHfOvp.js → nv-datagrid.entry-CjUfR4ha.js} +3 -3
  17. package/dist/cjs/{nv-datagridcolumn.entry-DvSFVguN.js → nv-datagridcolumn.entry-BiuYIp4q.js} +1 -1
  18. package/dist/cjs/{nv-dialog.entry-BV6QBtx2.js → nv-dialog.entry-fDywe5i2.js} +2 -2
  19. package/dist/cjs/{nv-dialogfooter_2.entry-Ci1C_E-2.js → nv-dialogfooter_2.entry-CckfZ_QW.js} +1 -1
  20. package/dist/cjs/{nv-fieldcheckbox.entry-BD9ETFVV.js → nv-fieldcheckbox.entry-WmfLxGad.js} +1 -1
  21. package/dist/cjs/{nv-fielddate.entry-C06n2Hri.js → nv-fielddate.entry-GLGb7tzu.js} +1 -1
  22. package/dist/cjs/{nv-fielddaterange.entry-DFlaA4gv.js → nv-fielddaterange.entry-C8gXNY2P.js} +1 -1
  23. package/dist/cjs/{nv-fielddropdown.entry-ONwdJHOm.js → nv-fielddropdown.entry-BX1V8Uef.js} +1 -1
  24. package/dist/cjs/{nv-fielddropdownitem.entry-CDKQtEra.js → nv-fielddropdownitem.entry-BMVFbA1v.js} +1 -1
  25. package/dist/cjs/{nv-fieldmultiselect.entry-BHJC59Mw.js → nv-fieldmultiselect.entry-BuV-qWbu.js} +1 -1
  26. package/dist/cjs/{nv-fieldnumber.entry-CmL1LPom.js → nv-fieldnumber.entry-qM1ct5SM.js} +25 -8
  27. package/dist/cjs/{nv-fieldpassword.entry-Bqbf_LJJ.js → nv-fieldpassword.entry-BnGWErFQ.js} +1 -1
  28. package/dist/cjs/{nv-fieldradio.entry-RzSCysif.js → nv-fieldradio.entry-EliQYldW.js} +1 -1
  29. package/dist/cjs/{nv-fieldselect.entry-COTE8Ntn.js → nv-fieldselect.entry-BfPVPmaZ.js} +1 -1
  30. package/dist/cjs/{nv-fieldslider.entry-BVfmpUhc.js → nv-fieldslider.entry-DBPpL94x.js} +4 -2
  31. package/dist/cjs/{nv-fieldtext.entry-DO0lmw9C.js → nv-fieldtext.entry-BnabKYgq.js} +1 -1
  32. package/dist/cjs/{nv-fieldtextarea.entry-CzVq8gjw.js → nv-fieldtextarea.entry-HaELAnJb.js} +1 -1
  33. package/dist/cjs/{nv-fieldtime.entry-CRNYbeMY.js → nv-fieldtime.entry-CWQM7fza.js} +1 -1
  34. package/dist/cjs/nv-icon.entry-B5cWNyvf.js +80 -0
  35. package/dist/cjs/{nv-iconbutton_2.entry-0lnnCk0B.js → nv-iconbutton_2.entry-CP1o9IVZ.js} +7 -2
  36. package/dist/cjs/{nv-menu.entry-BjXa70qP.js → nv-menu.entry-wMwI_sZ3.js} +1 -1
  37. package/dist/cjs/{nv-menuitem.entry-CSPwpUWz.js → nv-menuitem.entry-C53TrB0_.js} +1 -1
  38. package/dist/cjs/{nv-notification.entry-BYHTrzUz.js → nv-notification.entry-BPyEusqt.js} +1 -1
  39. package/dist/cjs/{nv-notificationcontainer.entry-BBjrL7gt.js → nv-notificationcontainer.entry-MRIJURIS.js} +1 -1
  40. package/dist/cjs/{nv-popover.entry-J_M8_rLL.js → nv-popover.entry-fj50OLMu.js} +1 -1
  41. package/dist/cjs/{nv-row.entry-CmOypCPp.js → nv-row.entry-T0OlcSij.js} +1 -1
  42. package/dist/cjs/{nv-split.entry-BqBytQZn.js → nv-split.entry-DlI7I6Tb.js} +1 -1
  43. package/dist/cjs/{nv-stack.entry-BKPf62wy.js → nv-stack.entry-991A3rOk.js} +1 -1
  44. package/dist/cjs/{nv-table.entry-DSL_jd5Y.js → nv-table.entry-ClSU3-cR.js} +1 -1
  45. package/dist/cjs/nv-tableheader.entry-DzvbPDBN.js +75 -0
  46. package/dist/cjs/{nv-toggle.entry-DbQQdp5m.js → nv-toggle.entry-Dq5hAoVB.js} +3 -3
  47. package/dist/cjs/nv-togglebutton.entry-DI8HQ5Ou.js +56 -0
  48. package/dist/cjs/{nv-togglebuttongroup.entry-Bl43CVZN.js → nv-togglebuttongroup.entry-DzGOSBF7.js} +2 -2
  49. package/dist/cjs/{nv-tooltip.entry-CV841nfI.js → nv-tooltip.entry-CF0-gdZL.js} +2 -2
  50. package/dist/components/{NvDatatable.js → NvDatatable/NvDatatable.js} +89 -32
  51. package/dist/components/NvDatatable/index.js +3 -0
  52. package/dist/components/NvDatatable/types.js +1 -0
  53. package/dist/components/NvDatatable/utils.js +5 -0
  54. package/dist/generated/components.js +8 -0
  55. package/dist/generated/components.server.js +13 -2
  56. package/dist/providers/NotificationProvider.js +27 -0
  57. package/dist/types/components/NvDatatable/NvDatatable.d.ts +7 -0
  58. package/dist/types/components/NvDatatable/index.d.ts +3 -0
  59. package/dist/types/components/{NvDatatable.d.ts → NvDatatable/types.d.ts} +37 -20
  60. package/dist/types/components/NvDatatable/utils.d.ts +2 -0
  61. package/dist/types/generated/components.d.ts +6 -1
  62. package/dist/types/generated/components.server.d.ts +6 -1
  63. package/dist/types/providers/NotificationProvider.d.ts +1 -0
  64. package/package.json +1 -1
  65. package/dist/cjs/nv-button.entry-CmpagMPP.js +0 -159
  66. package/dist/cjs/nv-icon.entry-FoRJzCHm.js +0 -80
  67. package/dist/cjs/nv-togglebutton.entry-DNG6SFTU.js +0 -56
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.js');
4
4
  var clsx297c1ffe = require('./clsx-297c1ffe-BtxeOLZW.js');
5
5
  require('react');
6
6
  require('react-dom');
@@ -59,6 +59,11 @@ const NvIconbutton = class {
59
59
  * Sets the shape of the button. Choose between square and rounded.
60
60
  */
61
61
  this.shape = 'square';
62
+ /**
63
+ * Use this to make the button skip-able when users navigate with the keyboard.
64
+ * The button remains clickable but won’t be reached via the Tab key.
65
+ */
66
+ this.disableTabindex = false;
62
67
  //#endregion PROPERTIES
63
68
  /****************************************************************************/
64
69
  //#region METHODS
@@ -124,7 +129,7 @@ const NvIconbutton = class {
124
129
  /****************************************************************************/
125
130
  //#region RENDER
126
131
  render() {
127
- return (index.h(index.Host, { key: '5590d5f6378669a2f74ce93d33ac14c86f435523', role: "button", type: this.type, tabindex: "0", disabled: this.disabled ? true : undefined, class: clsx297c1ffe.clsx('root', `size-${this.size}`, `emphasis-${this.emphasis}`, this.loading && 'loading', `shape-${this.shape}`), onClick: this.handleClick }, this.loading && index.h("nv-loader", { key: 'f88ed8a8b579d15318f419c8072a4c14e56990ce', size: this.size }), !this.loading && index.h("nv-icon", { key: '12b3fc9818014ea93237e8037ce2d90ee214517a', name: this.name, size: this.size }), index.h("slot", { key: '97e130b7caf544954f3168866429ed7633e46301' })));
132
+ return (index.h(index.Host, { key: 'f3d9a8c4f5f3b549595b1a4b8eecddae89b23909', role: "button", type: this.type, tabindex: this.disableTabindex ? -1 : 0, disabled: this.disabled ? true : undefined, class: clsx297c1ffe.clsx('root', `size-${this.size}`, `emphasis-${this.emphasis}`, this.loading && 'loading', `shape-${this.shape}`), onClick: this.handleClick }, this.loading && index.h("nv-loader", { key: '9f25f8a2c72279f1ad4c92ed6e17341e4b43f26e', size: this.size }), !this.loading && index.h("nv-icon", { key: 'aa0d10482d4dded8f6680afe066c3c8d781160ef', name: this.name, size: this.size }), index.h("slot", { key: 'dc2a1ca7305ae4b14924d7acb79286596e5b358f' })));
128
133
  }
129
134
  static get formAssociated() { return true; }
130
135
  get el() { return index.getElement(this); }
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.js');
4
4
  require('react');
5
5
  require('react-dom');
6
6
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.js');
4
4
  require('react');
5
5
  require('react-dom');
6
6
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.js');
4
4
  var constants69bafca2 = require('./constants-69bafca2-DpB_ghPF.js');
5
5
  var collapse_animation6e0b08df = require('./collapse.animation-6e0b08df-AHWzNGm_.js');
6
6
  var fade_animation9b939939 = require('./fade.animation-9b939939-DV--bM4S.js');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.js');
4
4
  require('react');
5
5
  require('react-dom');
6
6
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.js');
4
4
  var fade_animation9b939939 = require('./fade.animation-9b939939-DV--bM4S.js');
5
5
  var styleValueTypes_esF5d10b79 = require('./style-value-types.es-f5d10b79-D0QCM8OB.js');
6
6
  var events_utilsFe1d907f = require('./events.utils-fe1d907f-01N__3wY.js');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.js');
4
4
  require('react');
5
5
  require('react-dom');
6
6
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.js');
4
4
  require('react');
5
5
  require('react-dom');
6
6
 
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.js');
4
4
  var clsx297c1ffe = require('./clsx-297c1ffe-BtxeOLZW.js');
5
5
  require('react');
6
6
  require('react-dom');
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.js');
4
4
  require('react');
5
5
  require('react-dom');
6
6
 
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-yxDlFA78.js');
4
+ require('react');
5
+ require('react-dom');
6
+
7
+ const nvTableheaderCss = "nv-tableheader{display:inline-flex;width:100%;align-items:center;gap:var(--spacing-2)}nv-tableheader:focus-visible{border-radius:var(--radius-rounded-sm)}nv-tableheader:focus-visible:focus,nv-tableheader:focus-visible:focus-within{outline:none}nv-tableheader:focus-visible:focus-visible,nv-tableheader:focus-visible:has(:focus-visible){outline:calc(var(--focus-outline-stroke) * 1) solid var(--color-focus-brand);outline-offset:calc(var(--focus-outline-offset) * 1)}nv-tableheader nv-iconbutton{transition:transform 120ms ease, opacity 120ms ease}nv-tableheader nv-iconbutton svg{transition:transform 240ms ease}nv-tableheader nv-iconbutton.is-none{opacity:0.5}nv-tableheader nv-iconbutton.is-desc svg{transform:rotate(180deg)}";
8
+ const NvTableheaderStyle0 = nvTableheaderCss;
9
+
10
+ const NvTableheader = class {
11
+ constructor(hostRef) {
12
+ index.registerInstance(this, hostRef);
13
+ this.sortDirectionChanged = index.createEvent(this, "sortDirectionChanged");
14
+ /****************************************************************************/
15
+ //#region PROPERTIES
16
+ /**
17
+ * Will render the header as sortable with the corresponding icon button.
18
+ * Allows the header to be tabbed, and trigger sorting via click or keyboard
19
+ * navigation
20
+ */
21
+ this.sortable = false;
22
+ /**
23
+ * The current sort direction of the header. Will be 'none' if the header is
24
+ * not sortable or if the sort direction is not set.
25
+ */
26
+ this.sortDirection = 'none';
27
+ }
28
+ //#endregion PROPERTIES
29
+ /****************************************************************************/
30
+ //#region METHODS
31
+ cycleSortDirection(e) {
32
+ if (!this.sortable)
33
+ return;
34
+ e === null || e === void 0 ? void 0 : e.preventDefault();
35
+ const next = {
36
+ none: 'asc',
37
+ asc: 'desc',
38
+ desc: 'none',
39
+ };
40
+ this.sortDirection = next[this.sortDirection];
41
+ this.sortDirectionChanged.emit(this.sortDirection);
42
+ }
43
+ handleKeyDown(event) {
44
+ if (!this.sortable)
45
+ return;
46
+ if (event.key === 'Enter' || event.key === ' ') {
47
+ event.preventDefault();
48
+ this.cycleSortDirection();
49
+ }
50
+ }
51
+ get ariaSort() {
52
+ const sortMap = {
53
+ none: 'none',
54
+ asc: 'ascending',
55
+ desc: 'descending',
56
+ };
57
+ if (!this.sortable)
58
+ return sortMap.none;
59
+ return sortMap[this.sortDirection];
60
+ }
61
+ //#endregion EVENTS
62
+ /****************************************************************************/
63
+ //#region RENDER
64
+ render() {
65
+ return (index.h(index.Host, { key: 'ff2fc290253d468d2d139afdc708b012258b3f31', role: "columnheader", "aria-sort": this.ariaSort, tabindex: this.sortable ? 0 : undefined, onKeyDown: this.handleKeyDown.bind(this), onClick: this.cycleSortDirection.bind(this) }, index.h("slot", { key: '3c70c590cc33ca2d722dbc3313c9e10583bfa631' }), this.sortable && (index.h("span", { key: '219a872d53157545302495cec6844d55b5026e00', class: "sort-icon-wrap", "aria-hidden": "true" }, index.h("nv-iconbutton", { key: 'd39698493a8504bb7e2af6fa52ac4c548b91bf40', disableTabindex: true, name: "arrow-up", size: "xs", emphasis: this.sortDirection === 'none' ? 'lower' : 'low',
66
+ // prevent mousedown from selecting text
67
+ onMouseDown: (e) => e.preventDefault(), class: {
68
+ 'is-none': this.sortDirection === 'none',
69
+ 'is-desc': this.sortDirection === 'desc',
70
+ } })))));
71
+ }
72
+ };
73
+ NvTableheader.style = NvTableheaderStyle0;
74
+
75
+ exports.nv_tableheader = NvTableheader;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.js');
4
4
  var clsx297c1ffe = require('./clsx-297c1ffe-BtxeOLZW.js');
5
5
  var v4A79185f4 = require('./v4-a79185f4-2n0dOd_Y.js');
6
6
  require('react');
@@ -66,8 +66,8 @@ const NvToggle = class {
66
66
  /****************************************************************************/
67
67
  //#region RENDER
68
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))))));
69
+ return (index.h(index.Host, { key: '8e5b801ed4263b02b9b00628e94de448986eca98', class: clsx297c1ffe.clsx(this.labelPlacement === 'before' && 'label-placement-before') }, index.h("div", { key: 'b25ed406fae37d41f1c1fbe4234ded3f94db14b0', class: "input-container" }, index.h("input", { key: '5a98b81705597f2a115517b6031289ee9be54bda', 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: '89366dfe5c0106d7e28a858745941f0358220ce7', class: "text-container" }, (this.label || this.el.querySelector('[slot="label"]')) && (index.h("label", { key: '3f0192378adbd8d5d5f5f5684d1e929462d7832b', htmlFor: this.inputId, class: clsx297c1ffe.clsx(this.hideLabel && 'visually-hidden') }, index.h("slot", { key: 'ee95958740e62af025bc4a456fe1b9f12b9aac71', name: "label" }, this.label))), (this.description ||
70
+ this.el.querySelector('[slot="description"]')) && (index.h("div", { key: 'eee5a91ccbe1eed1d2ce41c0ce08cf8b49440501', class: "description" }, index.h("slot", { key: 'a925c57db61229d032412e315ff1f738a479b090', name: "description" }, this.description))))));
71
71
  }
72
72
  static get formAssociated() { return true; }
73
73
  get el() { return index.getElement(this); }
@@ -0,0 +1,56 @@
1
+ 'use strict';
2
+
3
+ var index = require('./index-yxDlFA78.js');
4
+ require('react');
5
+ require('react-dom');
6
+
7
+ const nvTogglebuttonCss = "nv-togglebutton{display:inline-flex;justify-content:center;align-items:center}nv-togglebutton:focus-visible,nv-togglebutton:has(:focus-visible){z-index:1}nv-togglebutton[size=xs]{padding:var(--button-xs-padding-y) var(--button-xs-padding-x);gap:var(--button-xs-gap);border-radius:var(--button-xs-border-radius);line-height:var(--button-xs-line-height);height:var(--button-xs-height);font-size:var(--button-xs-font-size);padding-top:calc(var(--togglegroup-xs-button-padding-y) - 1px);padding-bottom:calc(var(--togglegroup-xs-button-padding-y) - 1px);border-radius:calc(var(--togglegroup-xs-button-radius));border-width:0}nv-togglebutton[size=xs] nv-icon>svg{width:var(--spacing-3);height:var(--spacing-3);stroke-width:1.2px}nv-togglebutton[size=sm]{padding:var(--button-sm-padding-y) var(--button-sm-padding-x);gap:var(--button-sm-gap);border-radius:var(--button-sm-border-radius);line-height:var(--button-sm-line-height);height:var(--button-sm-height);font-size:var(--button-sm-font-size);padding-top:calc(var(--togglegroup-sm-button-padding-y) - 1px);padding-bottom:calc(var(--togglegroup-sm-button-padding-y) - 1px);border-radius:calc(var(--togglegroup-sm-button-radius));border-width:0}nv-togglebutton[size=sm] nv-icon>svg{width:var(--spacing-4);height:var(--spacing-4);stroke-width:1.5px}nv-togglebutton[size=md]{padding:var(--button-md-padding-y) var(--button-md-padding-x);gap:var(--button-md-gap);border-radius:var(--button-md-border-radius);line-height:var(--button-md-line-height);height:var(--button-md-height);font-size:var(--button-md-font-size);padding-top:calc(var(--togglegroup-md-button-padding-y) - 1px);padding-bottom:calc(var(--togglegroup-md-button-padding-y) - 1px);border-radius:calc(var(--togglegroup-md-button-radius));border-width:0}nv-togglebutton[size=md] nv-icon>svg{width:var(--spacing-5);height:var(--spacing-5);stroke-width:1.6px}nv-togglebutton[size=lg]{padding:var(--button-lg-padding-y) var(--button-lg-padding-x);gap:var(--button-lg-gap);border-radius:var(--button-lg-border-radius);line-height:var(--button-lg-line-height);height:var(--button-lg-height);font-size:var(--button-lg-font-size);padding-top:calc(var(--togglegroup-lg-button-padding-y) - 1px);padding-bottom:calc(var(--togglegroup-lg-button-padding-y) - 1px);border-radius:calc(var(--togglegroup-lg-button-radius));border-width:0}nv-togglebutton[size=lg] nv-icon>svg{width:var(--spacing-6);height:var(--spacing-6);stroke-width:1.8px}nv-togglebutton[emphasis=high]{background:var(--components-button-low-background);border:1px solid var(--components-button-low-border);color:var(--components-button-low-text)}nv-togglebutton[emphasis=high]:hover{background:var(--components-button-low-background-hover);border:1px solid var(--components-button-low-border);color:var(--components-button-low-text-hover)}nv-togglebutton[emphasis=high]:active{background:var(--components-button-low-background-active);border:1px solid var(--components-button-low-border-active);color:var(--components-button-low-text-active)}nv-togglebutton[emphasis=high]:focus,nv-togglebutton[emphasis=high]:focus-within{outline:none}nv-togglebutton[emphasis=high]:focus-visible,nv-togglebutton[emphasis=high]:has(:focus-visible){outline:calc(var(--focus-outline-stroke) * 1) solid var(--color-focus-brand);outline-offset:calc(var(--focus-outline-offset) * 1)}nv-togglebutton[emphasis=high]:disabled:not([disabled=false]){opacity:0.5;cursor:not-allowed;box-shadow:none}nv-togglebutton[emphasis=high][active]:not([active=false]){background:var(--components-button-low-background-active);border:1px solid var(--components-button-low-border-active);color:var(--components-button-low-text-active)}nv-togglebutton[emphasis=low]{background:var(--components-button-lower-background);border:1px solid var(--components-button-lower-border);color:var(--components-button-lower-text)}nv-togglebutton[emphasis=low]:hover{background:var(--components-button-lower-background-hover);border:1px solid var(--components-button-lower-border);color:var(--components-button-lower-text-hover)}nv-togglebutton[emphasis=low]:active{background:var(--components-button-lower-background-active);border:1px solid var(--components-button-lower-border-active);color:var(--components-button-lower-text-active)}nv-togglebutton[emphasis=low]:focus,nv-togglebutton[emphasis=low]:focus-within{outline:none}nv-togglebutton[emphasis=low]:focus-visible,nv-togglebutton[emphasis=low]:has(:focus-visible){outline:calc(var(--focus-outline-stroke) * 1) solid var(--color-focus-brand);outline-offset:calc(var(--focus-outline-offset) * 1)}nv-togglebutton[emphasis=low]:disabled:not([disabled=false]){opacity:0.5;cursor:not-allowed;box-shadow:none}nv-togglebutton[emphasis=low][active]:not([active=false]),nv-togglebutton[emphasis=low]:active{background:var(--components-button-lower-background-hover);border:1px solid var(--components-button-lower-border);color:var(--components-button-lower-text-hover)}";
8
+ const NvTogglebuttonStyle0 = nvTogglebuttonCss;
9
+
10
+ const NvTogglebutton = class {
11
+ constructor(hostRef) {
12
+ index.registerInstance(this, hostRef);
13
+ this.toggled = index.createEvent(this, "toggled");
14
+ /****************************************************************************/
15
+ //#region PROPERTIES
16
+ /**
17
+ * Determines how large or small the togglebutton appears, allowing for
18
+ * customization of the togglebutton's dimensions to fit different design
19
+ * specifications and user needs.
20
+ */
21
+ this.size = 'md';
22
+ /**
23
+ * Prevents all interaction, rendering the toggle in a non-interactive state.
24
+ */
25
+ this.disabled = false;
26
+ /**
27
+ * Whether the button is active or not. Will not toggle automatically but
28
+ * needs to be controlled externally.
29
+ */
30
+ this.active = false;
31
+ /**
32
+ * Make it more or less visually prominent to users.
33
+ */
34
+ this.emphasis = 'high';
35
+ //#endregion PROPERTIES
36
+ /****************************************************************************/
37
+ //#region METHODS
38
+ this.handleClick = () => {
39
+ if (this.disabled)
40
+ return;
41
+ this.toggled.emit({
42
+ value: this.value,
43
+ active: this.active,
44
+ });
45
+ };
46
+ }
47
+ //#endregion EVENTS
48
+ /****************************************************************************/
49
+ //#region RENDER
50
+ render() {
51
+ return (index.h(index.Host, { key: 'a36d2ac3ed287145dae1812e8488313e7509b979', role: "button", tabindex: "0", "aria-pressed": String(this.active), onClick: this.handleClick }, index.h("slot", { key: '463f95e6e68148d94047e8b71c99c449dccffbd6' })));
52
+ }
53
+ };
54
+ NvTogglebutton.style = NvTogglebuttonStyle0;
55
+
56
+ exports.nv_togglebutton = NvTogglebutton;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.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: 'ab91ff1817e3388508ed1da7a9ed57a79cf8c4bc' }, index.h("slot", { key: '4a3280db78c1f0cd120a0cb32d95eabaf69995a6' })));
159
+ return (index.h(index.Host, { key: '02b7814ffceeaa875edcbce4ebdd6465b24abf62' }, index.h("slot", { key: '89c9387a50ec0c1c660e490b66742be96e6f6b3e' })));
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-C12eD0Qt.js');
3
+ var index = require('./index-yxDlFA78.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: '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" }))));
49
+ return (index.h(index.Host, { key: '2ec10db6ad78e1637696e383069caf3fc8919587' }, index.h("slot", { key: '0df02ac8d76de82ae25ec3d9c73ef18cd6eee4d8' }), index.h("nv-popover", { key: '1ed0766ed0c3d43952be2be0dbafd94f07ec44b3', triggerMode: "hover", hasArrow: true, placement: this.placement, strategy: this.strategy, triggerElement: this.triggerElement, groupName: 'tooltip', enterDelay: this.enterDelay }, index.h("p", { key: 'bd44fba212d86969688bdf3e00a711f152500952', slot: "content" }, this.message), index.h("slot", { key: '31f2c47d800e4bd057c7475de931e11542eb5208', name: "content" }))));
50
50
  }
51
51
  get el() { return index.getElement(this); }
52
52
  };
@@ -1,39 +1,88 @@
1
- import React, { useMemo, useState, useEffect, useRef, } from 'react';
2
- import { flexRender, getCoreRowModel, getPaginationRowModel, useReactTable, } from '@tanstack/react-table';
3
- import { NvTable } from '../generated/components';
4
- const NvDatatable = ({ columns, rows, pagination, renderPagination, stickyHeader, ...htmlProps }) => {
1
+ import React, { useMemo, useState, useEffect, useRef } from 'react';
2
+ import { flexRender, getCoreRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table';
3
+ import { NvTable, NvTableheader } from '../../generated/components';
4
+ function NvDatatable({ columns, rows, pagination, sorting, renderPagination, stickyHeader, ...htmlProps }) {
5
5
  const [paginationState, setPaginationState] = useState({
6
6
  pageIndex: 0,
7
7
  pageSize: pagination?.initialPageSize || 10,
8
8
  });
9
+ const [sortingState, setSortingState] = useState(sorting?.sortState || []);
9
10
  const lastRowRef = useRef(null);
10
11
  const tableColumns = useMemo(() => columns
11
12
  .filter((col) => !col.hidden)
12
- .map((col) => ({
13
- accessorKey: col.field,
14
- header: col.headerName || String(col.field),
15
- size: col.width,
16
- enableResizing: col.resizable ?? true,
17
- cell: (context) => {
18
- const value = context.getValue();
19
- const row = context.row.original;
20
- const rowIndex = context.row.index;
21
- if (col.renderCell) {
22
- return col.renderCell({
23
- value,
24
- row,
25
- field: col.field,
26
- rowIndex,
27
- });
28
- }
29
- return value;
30
- },
31
- })), [columns]);
13
+ .map((col) => {
14
+ const columnDef = {
15
+ accessorKey: col.field,
16
+ accessorFn: col.valueFormatter
17
+ ? (row) => {
18
+ const rawValue = row[col.field];
19
+ return col.valueFormatter({
20
+ value: rawValue,
21
+ row,
22
+ field: col.field,
23
+ });
24
+ }
25
+ : undefined,
26
+ header: col.headerName || String(col.field),
27
+ size: col.width,
28
+ enableResizing: col.resizable ?? true,
29
+ enableSorting: sorting ? col.sortable ?? true : false,
30
+ cell: (context) => {
31
+ const value = context.getValue();
32
+ const row = context.row.original;
33
+ const rowIndex = context.row.index;
34
+ if (col.renderCell) {
35
+ return col.renderCell({
36
+ value,
37
+ row,
38
+ field: col.field,
39
+ rowIndex,
40
+ });
41
+ }
42
+ return value;
43
+ },
44
+ };
45
+ if (col.sortingFn !== undefined) {
46
+ columnDef.sortingFn = col.sortingFn;
47
+ }
48
+ if (col.sortDescFirst !== undefined) {
49
+ columnDef.sortDescFirst = col.sortDescFirst;
50
+ }
51
+ if (col.invertSorting !== undefined) {
52
+ columnDef.invertSorting = col.invertSorting;
53
+ }
54
+ if (col.sortUndefined !== undefined) {
55
+ columnDef.sortUndefined = col.sortUndefined;
56
+ }
57
+ return columnDef;
58
+ }), [columns, sorting]);
32
59
  const tableConfig = useMemo(() => {
33
60
  const baseConfig = {
34
61
  data: rows,
35
62
  columns: tableColumns,
36
63
  getCoreRowModel: getCoreRowModel(),
64
+ ...(sorting && {
65
+ state: {
66
+ sorting: sorting.sortState || sortingState,
67
+ },
68
+ onSortingChange: sorting.mode === 'server'
69
+ ? (updater) => {
70
+ const newSort = typeof updater === 'function'
71
+ ? updater(sortingState)
72
+ : updater;
73
+ setSortingState(newSort);
74
+ sorting.onSortingChange?.(newSort);
75
+ }
76
+ : setSortingState,
77
+ manualSorting: sorting.mode === 'server',
78
+ enableSorting: true,
79
+ enableMultiSort: sorting.enableMultiSort ?? false,
80
+ enableSortingRemoval: sorting.enableSortingRemoval ?? true,
81
+ maxMultiSortColCount: sorting.maxMultiSortColCount,
82
+ sortDescFirst: sorting.sortDescFirst ?? false,
83
+ isMultiSortEvent: sorting.enableMultiSort ? () => true : undefined,
84
+ getSortedRowModel: sorting.mode === 'client' ? getSortedRowModel() : undefined,
85
+ }),
37
86
  };
38
87
  if (!pagination) {
39
88
  return baseConfig;
@@ -64,13 +113,14 @@ const NvDatatable = ({ columns, rows, pagination, renderPagination, stickyHeader
64
113
  manualPagination: true,
65
114
  pageCount,
66
115
  state: {
116
+ ...baseConfig.state,
67
117
  pagination: paginationState,
68
118
  },
69
119
  onPaginationChange: setPaginationState,
70
120
  };
71
121
  }
72
122
  return baseConfig;
73
- }, [rows, tableColumns, pagination, paginationState]);
123
+ }, [rows, tableColumns, pagination, paginationState, sorting, sortingState]);
74
124
  const table = useReactTable(tableConfig);
75
125
  useEffect(() => {
76
126
  if (pagination?.mode === 'server' && pagination.onPaginationChange) {
@@ -133,16 +183,23 @@ const NvDatatable = ({ columns, rows, pagination, renderPagination, stickyHeader
133
183
  return (React.createElement(React.Fragment, null,
134
184
  React.createElement(NvTable, { ...htmlProps },
135
185
  React.createElement("table", null,
136
- React.createElement("thead", { "data-sticky-top": stickyHeader ? 'true' : undefined }, 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: {
137
- width: header.column.columnDef.size + 'px',
138
- }, "data-no-resize": header.column.columnDef.enableResizing ? null : true }, header.isPlaceholder
139
- ? null
140
- : flexRender(header.column.columnDef.header, header.getContext())))))))),
186
+ React.createElement("thead", { "data-sticky-top": stickyHeader ? 'true' : undefined }, table.getHeaderGroups().map((headerGroup) => (React.createElement("tr", { key: headerGroup.id }, headerGroup.headers.map((header) => {
187
+ const canSort = header.column.getCanSort();
188
+ const sortDirection = header.column.getIsSorted();
189
+ return (React.createElement("th", { key: header.id, "data-testid": `datatable-header-${header.id}`, style: {
190
+ width: header.column.columnDef.size + 'px',
191
+ }, "data-no-resize": header.column.columnDef.enableResizing ? null : true },
192
+ React.createElement(NvTableheader, { sortable: canSort ? true : undefined, sortDirection: sortDirection || (canSort ? 'none' : undefined), onSortDirectionChanged: canSort
193
+ ? header.column.getToggleSortingHandler()
194
+ : undefined }, header.isPlaceholder
195
+ ? null
196
+ : flexRender(header.column.columnDef.header, header.getContext()))));
197
+ }))))),
141
198
  React.createElement("tbody", null, tableRows.map((row, index) => {
142
199
  const isLastRow = isInfiniteScroll && index === tableRows.length - 1;
143
- return (React.createElement("tr", { key: row.id, "data-testid": `datatable-row-${row.id}`, ref: isLastRow ? lastRowRef : undefined }, row.getVisibleCells().map((cell) => (React.createElement("td", { key: cell.id, "data-testid": `datatable-cell-${cell.id}` }, flexRender(cell.column.columnDef.cell, cell.getContext()))))));
200
+ return (React.createElement("tr", { key: row.id, "data-testid": `datatable-row-${index}`, ref: isLastRow ? lastRowRef : undefined }, row.getVisibleCells().map((cell) => (React.createElement("td", { key: cell.id, "data-testid": `datatable-cell-${cell.column.id}` }, flexRender(cell.column.columnDef.cell, cell.getContext()))))));
144
201
  })))),
145
202
  paginationAPI && renderPagination && renderPagination(paginationAPI)));
146
- };
203
+ }
147
204
  NvDatatable.displayName = 'NvDatatable';
148
205
  export { NvDatatable };
@@ -0,0 +1,3 @@
1
+ export * from './NvDatatable';
2
+ export * from './types';
3
+ export * from './utils';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ export function makeColumn() {
2
+ return function define(col) {
3
+ return col;
4
+ };
5
+ }
@@ -42,6 +42,7 @@ import { NvRow as NvRowElement, defineCustomElement as defineNvRow } from "@nova
42
42
  import { NvSplit as NvSplitElement, defineCustomElement as defineNvSplit } from "@nova-design-system/nova-webcomponents/dist/components/nv-split.js";
43
43
  import { NvStack as NvStackElement, defineCustomElement as defineNvStack } from "@nova-design-system/nova-webcomponents/dist/components/nv-stack.js";
44
44
  import { NvTable as NvTableElement, defineCustomElement as defineNvTable } from "@nova-design-system/nova-webcomponents/dist/components/nv-table.js";
45
+ import { NvTableheader as NvTableheaderElement, defineCustomElement as defineNvTableheader } from "@nova-design-system/nova-webcomponents/dist/components/nv-tableheader.js";
45
46
  import { NvToggle as NvToggleElement, defineCustomElement as defineNvToggle } from "@nova-design-system/nova-webcomponents/dist/components/nv-toggle.js";
46
47
  import { NvTogglebutton as NvTogglebuttonElement, defineCustomElement as defineNvTogglebutton } from "@nova-design-system/nova-webcomponents/dist/components/nv-togglebutton.js";
47
48
  import { NvTogglebuttongroup as NvTogglebuttongroupElement, defineCustomElement as defineNvTogglebuttongroup } from "@nova-design-system/nova-webcomponents/dist/components/nv-togglebuttongroup.js";
@@ -379,6 +380,13 @@ export const NvTable = createComponent({
379
380
  events: {},
380
381
  defineCustomElement: defineNvTable
381
382
  });
383
+ export const NvTableheader = createComponent({
384
+ tagName: 'nv-tableheader',
385
+ elementClass: NvTableheaderElement,
386
+ react: React,
387
+ events: { onSortDirectionChanged: 'sortDirectionChanged' },
388
+ defineCustomElement: defineNvTableheader
389
+ });
382
390
  export const NvToggle = createComponent({
383
391
  tagName: 'nv-toggle',
384
392
  elementClass: NvToggleElement,
@@ -98,7 +98,8 @@ export const NvButton = createComponent({
98
98
  disabled: 'disabled',
99
99
  fluid: 'fluid',
100
100
  type: 'type',
101
- form: 'form'
101
+ form: 'form',
102
+ disableTabindex: 'disable-tabindex'
102
103
  },
103
104
  hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
104
105
  serializeShadowRoot
@@ -612,7 +613,8 @@ export const NvIconbutton = createComponent({
612
613
  active: 'active',
613
614
  name: 'name',
614
615
  type: 'type',
615
- shape: 'shape'
616
+ shape: 'shape',
617
+ disableTabindex: 'disable-tabindex'
616
618
  },
617
619
  hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
618
620
  serializeShadowRoot
@@ -723,6 +725,15 @@ export const NvTable = createComponent({
723
725
  hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
724
726
  serializeShadowRoot
725
727
  });
728
+ export const NvTableheader = createComponent({
729
+ tagName: 'nv-tableheader',
730
+ properties: {
731
+ sortable: 'sortable',
732
+ sortDirection: 'sort-direction'
733
+ },
734
+ hydrateModule: import('@nova-design-system/nova-webcomponents/hydrate'),
735
+ serializeShadowRoot
736
+ });
726
737
  export const NvToggle = createComponent({
727
738
  tagName: 'nv-toggle',
728
739
  properties: {
@@ -12,9 +12,16 @@ const generateId = () => {
12
12
  export const NotificationProvider = ({ children, position = DEFAULT_POSITION, maxNotifications = DEFAULT_MAX_NOTIFICATIONS, className, }) => {
13
13
  const [notifications, setNotifications] = useState([]);
14
14
  const notificationsRef = useRef([]);
15
+ const timersRef = useRef(new Map());
15
16
  useEffect(() => {
16
17
  notificationsRef.current = notifications;
17
18
  }, [notifications]);
19
+ useEffect(() => {
20
+ return () => {
21
+ timersRef.current.forEach((timer) => clearTimeout(timer));
22
+ timersRef.current.clear();
23
+ };
24
+ }, []);
18
25
  const show = useCallback((options) => {
19
26
  const id = options.id || generateId();
20
27
  const ref = createRef();
@@ -28,6 +35,7 @@ export const NotificationProvider = ({ children, position = DEFAULT_POSITION, ma
28
35
  icon: options.icon,
29
36
  actions: options.actions ?? [],
30
37
  actionSlot: options.actionSlot,
38
+ duration: options.duration ?? 0,
31
39
  createdAt: Date.now(),
32
40
  ref,
33
41
  };
@@ -40,17 +48,36 @@ export const NotificationProvider = ({ children, position = DEFAULT_POSITION, ma
40
48
  });
41
49
  setTimeout(() => {
42
50
  notification.ref.current?.show();
51
+ if (notification.duration && notification.duration > 0) {
52
+ const timer = setTimeout(() => {
53
+ const n = notificationsRef.current.find((item) => item.id === id);
54
+ n?.ref.current?.dismiss();
55
+ }, notification.duration);
56
+ timersRef.current.set(id, timer);
57
+ }
43
58
  }, 0);
44
59
  return id;
45
60
  }, [maxNotifications]);
46
61
  const dismiss = useCallback((id) => {
62
+ const timer = timersRef.current.get(id);
63
+ if (timer) {
64
+ clearTimeout(timer);
65
+ timersRef.current.delete(id);
66
+ }
47
67
  const n = notificationsRef.current.find((item) => item.id === id);
48
68
  n?.ref.current?.dismiss();
49
69
  }, []);
50
70
  const remove = useCallback((id) => {
71
+ const timer = timersRef.current.get(id);
72
+ if (timer) {
73
+ clearTimeout(timer);
74
+ timersRef.current.delete(id);
75
+ }
51
76
  setNotifications((prev) => prev.filter((notification) => notification.id !== id));
52
77
  }, []);
53
78
  const removeAll = useCallback(() => {
79
+ timersRef.current.forEach((timer) => clearTimeout(timer));
80
+ timersRef.current.clear();
54
81
  setNotifications([]);
55
82
  }, []);
56
83
  const handleNotificationClose = useCallback((id) => {
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { NvDatatableProps } from './types';
3
+ declare function NvDatatable<T>({ columns, rows, pagination, sorting, renderPagination, stickyHeader, ...htmlProps }: NvDatatableProps<T>): React.JSX.Element;
4
+ declare namespace NvDatatable {
5
+ var displayName: string;
6
+ }
7
+ export { NvDatatable };
@@ -0,0 +1,3 @@
1
+ export * from './NvDatatable';
2
+ export * from './types';
3
+ export * from './utils';