@nvidia-elements/core 0.0.11 → 0.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 (136) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/accordion/accordion2.js +4 -4
  3. package/dist/alert/alert-group2.js +1 -1
  4. package/dist/alert/alert2.js +1 -1
  5. package/dist/avatar/avatar-group2.js +1 -1
  6. package/dist/avatar/avatar2.js +1 -1
  7. package/dist/badge/badge2.js +1 -1
  8. package/dist/breadcrumb/breadcrumb2.js +1 -1
  9. package/dist/bundle.d.ts +1 -0
  10. package/dist/bundles/index.d.ts +86 -0
  11. package/dist/bundles/index.js +4 -4
  12. package/dist/button/button2.js +1 -1
  13. package/dist/button-group/button-group.d.ts +1 -1
  14. package/dist/button-group/button-group2.js +1 -1
  15. package/dist/button-group/button-group2.js.map +1 -1
  16. package/dist/card/card2.js +4 -4
  17. package/dist/chat-message/chat-message2.js +1 -1
  18. package/dist/checkbox/checkbox-group2.js +1 -1
  19. package/dist/checkbox/checkbox2.js +1 -1
  20. package/dist/color/color2.js +1 -1
  21. package/dist/combobox/combobox2.js +1 -1
  22. package/dist/copy-button/copy-button2.js +1 -1
  23. package/dist/custom-elements-jsx.d.ts +51 -1
  24. package/dist/custom-elements-vue.d.ts +51 -1
  25. package/dist/custom-elements.json +790 -4
  26. package/dist/data.html.json +121 -3
  27. package/dist/data.snippets.json +2 -2
  28. package/dist/date/date2.js +1 -1
  29. package/dist/datetime/datetime2.js +1 -1
  30. package/dist/dialog/dialog-footer2.js +1 -1
  31. package/dist/dialog/dialog-header2.js +1 -1
  32. package/dist/dialog/dialog2.js +1 -1
  33. package/dist/divider/divider2.js +1 -1
  34. package/dist/dot/dot2.js +1 -1
  35. package/dist/drawer/drawer-content2.js +1 -1
  36. package/dist/drawer/drawer-footer2.js +1 -1
  37. package/dist/drawer/drawer-header2.js +1 -1
  38. package/dist/drawer/drawer2.js +1 -1
  39. package/dist/dropdown/dropdown-footer2.js +1 -1
  40. package/dist/dropdown/dropdown-header2.js +1 -1
  41. package/dist/dropdown/dropdown2.js +1 -1
  42. package/dist/dropdown-group/dropdown-group.js +1 -1
  43. package/dist/dropzone/dropzone2.js +1 -1
  44. package/dist/file/file2.js +1 -1
  45. package/dist/format-datetime/format-datetime2.js +1 -1
  46. package/dist/format-number/define.d.ts +6 -0
  47. package/dist/format-number/define.js +7 -0
  48. package/dist/format-number/define.js.map +1 -0
  49. package/dist/format-number/format-number.d.ts +87 -0
  50. package/dist/format-number/format-number.examples.js +6 -0
  51. package/dist/format-number/format-number.examples.js.map +1 -0
  52. package/dist/format-number/format-number.examples.json +87 -0
  53. package/dist/format-number/format-number.js +6 -0
  54. package/dist/format-number/format-number.js.map +1 -0
  55. package/dist/format-number/format-number2.js +111 -0
  56. package/dist/format-number/format-number2.js.map +1 -0
  57. package/dist/format-number/index.d.ts +1 -0
  58. package/dist/format-number/index.js +2 -0
  59. package/dist/format-relative-time/format-relative-time2.js +73 -53
  60. package/dist/format-relative-time/format-relative-time2.js.map +1 -1
  61. package/dist/forms/control/control2.js +1 -1
  62. package/dist/forms/control-group/control-group2.js +1 -1
  63. package/dist/forms/control-message/control-message2.js +1 -1
  64. package/dist/forms/validation.examples.js.map +1 -1
  65. package/dist/grid/cell/cell2.js +1 -1
  66. package/dist/grid/column/column2.js +1 -1
  67. package/dist/grid/footer/footer2.js +1 -1
  68. package/dist/grid/grid2.js +1 -1
  69. package/dist/grid/header/header2.js +1 -1
  70. package/dist/grid/placeholder/placeholder2.js +1 -1
  71. package/dist/grid/row/row2.js +1 -1
  72. package/dist/icon/icon2.js +2 -2
  73. package/dist/icon-button/icon-button2.js +1 -1
  74. package/dist/index.js +1 -1
  75. package/dist/input/input-group2.js +1 -1
  76. package/dist/input/input2.js +1 -1
  77. package/dist/internal/services/global.service.js +1 -1
  78. package/dist/internal/utils/objects.js +17 -9
  79. package/dist/internal/utils/objects.js.map +1 -1
  80. package/dist/logo/logo.examples.js.map +1 -1
  81. package/dist/logo/logo.examples.json +4 -4
  82. package/dist/logo/logo2.js +1 -1
  83. package/dist/menu/menu-item2.js +1 -1
  84. package/dist/menu/menu.examples.js.map +1 -1
  85. package/dist/menu/menu.examples.json +3 -3
  86. package/dist/menu/menu2.js +1 -1
  87. package/dist/month/month2.js +1 -1
  88. package/dist/notification/notification-group2.js +1 -1
  89. package/dist/notification/notification2.js +1 -1
  90. package/dist/page/page-panel/page-panel-content2.js +1 -1
  91. package/dist/page/page-panel/page-panel-footer2.js +1 -1
  92. package/dist/page/page-panel/page-panel-header2.js +1 -1
  93. package/dist/page/page-panel/page-panel2.js +1 -1
  94. package/dist/page/page.examples.js.map +1 -1
  95. package/dist/page/page.examples.json +1 -1
  96. package/dist/page/page2.js +1 -1
  97. package/dist/page-header/page-header2.js +1 -1
  98. package/dist/page-loader/page-loader2.js +1 -1
  99. package/dist/pagination/pagination2.js +1 -1
  100. package/dist/panel/panel2.js +4 -4
  101. package/dist/password/password2.js +1 -1
  102. package/dist/preferences-input/preferences-input.examples.js.map +1 -1
  103. package/dist/preferences-input/preferences-input.examples.json +1 -1
  104. package/dist/preferences-input/preferences-input2.js +1 -1
  105. package/dist/progress-bar/progress-bar2.js +1 -1
  106. package/dist/progress-ring/progress-ring2.js +1 -1
  107. package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
  108. package/dist/pulse/pulse2.js +1 -1
  109. package/dist/radio/radio-group2.js +1 -1
  110. package/dist/radio/radio2.js +1 -1
  111. package/dist/range/range2.js +1 -1
  112. package/dist/resize-handle/resize-handle2.js +1 -1
  113. package/dist/search/search2.js +1 -1
  114. package/dist/select/select2.js +1 -1
  115. package/dist/skeleton/skeleton2.js +1 -1
  116. package/dist/sort-button/sort-button2.js +1 -1
  117. package/dist/sparkline/sparkline2.js +1 -1
  118. package/dist/star-rating/star-rating2.js +1 -1
  119. package/dist/steps/steps2.js +2 -2
  120. package/dist/switch/switch-group2.js +1 -1
  121. package/dist/switch/switch2.js +1 -1
  122. package/dist/tabs/tabs-group2.js +1 -1
  123. package/dist/tabs/tabs2.js +2 -2
  124. package/dist/tag/tag2.js +1 -1
  125. package/dist/textarea/textarea2.js +1 -1
  126. package/dist/time/time2.js +1 -1
  127. package/dist/toast/toast2.js +1 -1
  128. package/dist/toggletip/toggletip-footer2.js +1 -1
  129. package/dist/toggletip/toggletip-header2.js +1 -1
  130. package/dist/toggletip/toggletip2.js +1 -1
  131. package/dist/toolbar/toolbar2.js +1 -1
  132. package/dist/tooltip/tooltip2.js +1 -1
  133. package/dist/tree/tree-node2.js +1 -1
  134. package/dist/tree/tree2.js +1 -1
  135. package/dist/week/week2.js +1 -1
  136. package/package.json +16 -4
@@ -0,0 +1,111 @@
1
+ import { LogService as e } from "../internal/services/log.service.js";
2
+ import { __decorate as t } from "../_virtual/_@oxc-project_runtime@0.123.0/helpers/decorate.js";
3
+ import { typeSSR as n } from "../internal/controllers/type-ssr.controller.js";
4
+ import { useStyles as r } from "../internal/styles/index.js";
5
+ import i from "./format-number.js";
6
+ import { LitElement as a, html as o } from "lit";
7
+ import { property as s } from "lit/decorators/property.js";
8
+ //#region src/format-number/format-number.ts
9
+ var c = [
10
+ ["currency", "currency"],
11
+ ["currencyDisplay", "currencyDisplay"],
12
+ ["currencySign", "currencySign"],
13
+ ["notation", "notation"],
14
+ ["compactDisplay", "compactDisplay"],
15
+ ["unit", "unit"],
16
+ ["unitDisplay", "unitDisplay"],
17
+ ["signDisplay", "signDisplay"]
18
+ ], l = [
19
+ ["minimumFractionDigits", "minimumFractionDigits"],
20
+ ["maximumFractionDigits", "maximumFractionDigits"],
21
+ ["minimumIntegerDigits", "minimumIntegerDigits"]
22
+ ], u = class extends a {
23
+ constructor(...e) {
24
+ super(...e), this.formatStyle = "decimal";
25
+ }
26
+ static {
27
+ this.styles = r([i]);
28
+ }
29
+ static {
30
+ this.metadata = {
31
+ tag: "nve-format-number",
32
+ version: "0.1.0"
33
+ };
34
+ }
35
+ get #e() {
36
+ return this.number ?? this.textContent?.trim() ?? "";
37
+ }
38
+ get #t() {
39
+ return this.locale ?? (globalThis.document?.documentElement?.lang || void 0);
40
+ }
41
+ get #n() {
42
+ let t = this.#e;
43
+ if (!t) return null;
44
+ let n = Number(t);
45
+ return Number.isFinite(n) ? n : (e.warn(`format-number: invalid numeric value "${t}"`), null);
46
+ }
47
+ get #r() {
48
+ let e = { style: this.formatStyle };
49
+ for (let [t, n] of c) {
50
+ let r = this[t];
51
+ r !== void 0 && (e[n] = r);
52
+ }
53
+ for (let [t, n] of l) {
54
+ let r = this[t];
55
+ r !== void 0 && (e[n] = r);
56
+ }
57
+ return this.useGrouping !== void 0 && (e.useGrouping = this.useGrouping === "false" ? !1 : this.useGrouping === "true" ? !0 : this.useGrouping), e;
58
+ }
59
+ get #i() {
60
+ let t = this.#e;
61
+ if (!t) return "";
62
+ let n = this.#n;
63
+ if (n === null) return t;
64
+ try {
65
+ return new Intl.NumberFormat(this.#t, this.#r).format(n);
66
+ } catch (n) {
67
+ return e.warn(`format-number: ${n.message}`), t;
68
+ }
69
+ }
70
+ render() {
71
+ return o`<data internal-host value="${this.#e}">${this.#i}<slot @slotchange="${this.#a}" hidden></slot></data>`;
72
+ }
73
+ #a() {
74
+ this.requestUpdate();
75
+ }
76
+ };
77
+ t([s({ type: String })], u.prototype, "number", void 0), t([s({ type: String })], u.prototype, "locale", void 0), t([s({
78
+ type: String,
79
+ attribute: "format-style"
80
+ })], u.prototype, "formatStyle", void 0), t([s({ type: String })], u.prototype, "currency", void 0), t([s({
81
+ type: String,
82
+ attribute: "currency-sign"
83
+ })], u.prototype, "currencySign", void 0), t([s({
84
+ type: String,
85
+ attribute: "currency-display"
86
+ })], u.prototype, "currencyDisplay", void 0), t([s({ type: String })], u.prototype, "unit", void 0), t([s({
87
+ type: String,
88
+ attribute: "unit-display"
89
+ })], u.prototype, "unitDisplay", void 0), t([s({ type: String })], u.prototype, "notation", void 0), t([s({
90
+ type: String,
91
+ attribute: "compact-display"
92
+ })], u.prototype, "compactDisplay", void 0), t([s({
93
+ type: String,
94
+ attribute: "sign-display"
95
+ })], u.prototype, "signDisplay", void 0), t([s({
96
+ type: String,
97
+ attribute: "use-grouping"
98
+ })], u.prototype, "useGrouping", void 0), t([s({
99
+ type: Number,
100
+ attribute: "minimum-fraction-digits"
101
+ })], u.prototype, "minimumFractionDigits", void 0), t([s({
102
+ type: Number,
103
+ attribute: "maximum-fraction-digits"
104
+ })], u.prototype, "maximumFractionDigits", void 0), t([s({
105
+ type: Number,
106
+ attribute: "minimum-integer-digits"
107
+ })], u.prototype, "minimumIntegerDigits", void 0), u = t([n()], u);
108
+ //#endregion
109
+ export { u as FormatNumber };
110
+
111
+ //# sourceMappingURL=format-number2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-number2.js","names":["#rawValue","#resolvedLocale","#parsedNumber","#formatOptions","#formattedNumber","#onSlotChange"],"sources":["../../src/format-number/format-number.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { useStyles, typeSSR, LogService } from '@nvidia-elements/core/internal';\nimport styles from './format-number.css?inline';\n\nexport type FormatNumberStyle = 'decimal' | 'currency' | 'percent' | 'unit';\nexport type CurrencyDisplayOption = 'symbol' | 'code' | 'name' | 'narrowSymbol';\nexport type CurrencySignOption = 'standard' | 'accounting';\nexport type NotationOption = 'standard' | 'scientific' | 'engineering' | 'compact';\nexport type CompactDisplayOption = 'short' | 'long';\nexport type UnitDisplayOption = 'short' | 'long' | 'narrow';\nexport type SignDisplayOption = 'auto' | 'never' | 'always' | 'exceptZero';\n\nconst STRING_KEYS: [keyof FormatNumber, string][] = [\n ['currency', 'currency'],\n ['currencyDisplay', 'currencyDisplay'],\n ['currencySign', 'currencySign'],\n ['notation', 'notation'],\n ['compactDisplay', 'compactDisplay'],\n ['unit', 'unit'],\n ['unitDisplay', 'unitDisplay'],\n ['signDisplay', 'signDisplay']\n];\n\nconst NUMBER_KEYS: [keyof FormatNumber, string][] = [\n ['minimumFractionDigits', 'minimumFractionDigits'],\n ['maximumFractionDigits', 'maximumFractionDigits'],\n ['minimumIntegerDigits', 'minimumIntegerDigits']\n];\n\n/**\n * @element nve-format-number\n * @description A localized number formatter for currencies, percentages, units, and compact notation, backed by Intl.NumberFormat.\n * Provide a `currency` attribute when `formatStyle` is `currency`, and a `unit` attribute when `formatStyle` is `unit`.\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/format-number\n * @slot - Numeric string to format (such as 1234567 or 1234.56). Serves as fallback before hydration.\n */\n@typeSSR()\nexport class FormatNumber extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-format-number',\n version: '0.0.0'\n };\n\n /**\n * Optional numeric string for values supplied by JavaScript or bound data.\n * By default, the component formats the element's text content, which also serves as the SSR fallback.\n * When both are present, this property takes precedence.\n */\n @property({ type: String }) number?: string;\n\n /**\n * Language tag (such as en-US, de-DE). Defaults to document.documentElement.lang or browser default.\n */\n @property({ type: String }) locale?: string;\n\n /**\n * Formatting style: 'decimal' | 'currency' | 'percent' | 'unit'.\n */\n @property({ type: String, attribute: 'format-style' }) formatStyle: FormatNumberStyle = 'decimal';\n\n /**\n * ISO 4217 currency code (such as USD or EUR). Required when formatStyle is currency.\n */\n @property({ type: String }) currency?: string;\n\n /**\n * Currency sign style: 'standard' | 'accounting'.\n */\n @property({ type: String, attribute: 'currency-sign' }) currencySign?: CurrencySignOption;\n\n /**\n * Currency display style: 'symbol' | 'code' | 'name' | 'narrowSymbol'.\n */\n @property({ type: String, attribute: 'currency-display' }) currencyDisplay?: CurrencyDisplayOption;\n\n /**\n * Unit identifier (such as kilometer or byte). Required when formatStyle is unit.\n */\n @property({ type: String }) unit?: string;\n\n /**\n * Unit display style: 'short' | 'long' | 'narrow'.\n */\n @property({ type: String, attribute: 'unit-display' }) unitDisplay?: UnitDisplayOption;\n\n /**\n * Number notation: 'standard' | 'scientific' | 'engineering' | 'compact'.\n */\n @property({ type: String }) notation?: NotationOption;\n\n /**\n * Compact notation display: 'short' | 'long'. Only applies when notation is compact.\n */\n @property({ type: String, attribute: 'compact-display' }) compactDisplay?: CompactDisplayOption;\n\n /**\n * Sign display: 'auto' | 'never' | 'always' | 'exceptZero'.\n */\n @property({ type: String, attribute: 'sign-display' }) signDisplay?: SignDisplayOption;\n\n /**\n * Grouping separators: 'auto' | 'always' | 'min2' | 'true' | 'false'.\n */\n @property({ type: String, attribute: 'use-grouping' }) useGrouping?: string;\n\n /**\n * Pad fraction output to at least this many digits (0-20).\n */\n @property({ type: Number, attribute: 'minimum-fraction-digits' }) minimumFractionDigits?: number;\n\n /**\n * Round fraction output to at most this many digits (0-20).\n */\n @property({ type: Number, attribute: 'maximum-fraction-digits' }) maximumFractionDigits?: number;\n\n /**\n * Pad integer output to at least this many digits (1-21).\n */\n @property({ type: Number, attribute: 'minimum-integer-digits' }) minimumIntegerDigits?: number;\n\n get #rawValue(): string {\n return this.number ?? this.textContent?.trim() ?? '';\n }\n\n get #resolvedLocale(): string | undefined {\n return this.locale ?? (globalThis.document?.documentElement?.lang || undefined);\n }\n\n get #parsedNumber(): number | null {\n const raw = this.#rawValue;\n if (!raw) return null;\n\n const numericValue = Number(raw);\n if (Number.isFinite(numericValue)) return numericValue;\n\n LogService.warn(`format-number: invalid numeric value \"${raw}\"`);\n return null;\n }\n\n get #formatOptions(): Intl.NumberFormatOptions {\n const options: Intl.NumberFormatOptions = { style: this.formatStyle };\n\n for (const [prop, key] of STRING_KEYS) {\n const value = this[prop] as string | undefined;\n if (value !== undefined) (options as Record<string, unknown>)[key] = value;\n }\n\n for (const [prop, key] of NUMBER_KEYS) {\n const value = this[prop] as number | undefined;\n if (value !== undefined) (options as Record<string, unknown>)[key] = value;\n }\n\n if (this.useGrouping !== undefined) {\n const grouping = this.useGrouping === 'false' ? false : this.useGrouping === 'true' ? true : this.useGrouping;\n (options as Record<string, unknown>).useGrouping = grouping;\n }\n\n return options;\n }\n\n get #formattedNumber(): string {\n const raw = this.#rawValue;\n if (!raw) return '';\n\n const numericValue = this.#parsedNumber;\n if (numericValue === null) return raw;\n\n try {\n return new Intl.NumberFormat(this.#resolvedLocale, this.#formatOptions).format(numericValue);\n } catch (e) {\n LogService.warn(`format-number: ${(e as Error).message}`);\n return raw;\n }\n }\n\n render() {\n return html`<data internal-host value=${this.#rawValue}>${this.#formattedNumber}<slot @slotchange=${this.#onSlotChange} hidden></slot></data>`;\n }\n\n #onSlotChange() {\n this.requestUpdate();\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './format-number.js';
@@ -0,0 +1,2 @@
1
+ import { FormatNumber as e } from "./format-number2.js";
2
+ export { e as FormatNumber };
@@ -6,7 +6,44 @@ import i from "./format-relative-time.js";
6
6
  import { LitElement as a, html as o } from "lit";
7
7
  import { property as s } from "lit/decorators/property.js";
8
8
  //#region src/format-relative-time/format-relative-time.ts
9
- var c = class extends a {
9
+ var c = {
10
+ second: 1e3,
11
+ minute: 6e4,
12
+ hour: 36e5,
13
+ day: 864e5,
14
+ week: 6048e5,
15
+ month: 2592e6,
16
+ year: 31536e6
17
+ }, l = [
18
+ {
19
+ unit: "second",
20
+ max: 60
21
+ },
22
+ {
23
+ unit: "minute",
24
+ max: 60
25
+ },
26
+ {
27
+ unit: "hour",
28
+ max: 24
29
+ },
30
+ {
31
+ unit: "day",
32
+ max: 7
33
+ },
34
+ {
35
+ unit: "week",
36
+ max: 4
37
+ },
38
+ {
39
+ unit: "month",
40
+ max: 12
41
+ },
42
+ {
43
+ unit: "year",
44
+ max: Infinity
45
+ }
46
+ ], u = class extends a {
10
47
  constructor(...e) {
11
48
  super(...e), this.numeric = "always", this.formatStyle = "long", this.unit = "auto", this.sync = !1;
12
49
  }
@@ -16,7 +53,7 @@ var c = class extends a {
16
53
  static {
17
54
  this.metadata = {
18
55
  tag: "nve-format-relative-time",
19
- version: "0.0.11"
56
+ version: "0.1.0"
20
57
  };
21
58
  }
22
59
  #e;
@@ -27,92 +64,75 @@ var c = class extends a {
27
64
  return this.locale ?? (globalThis.document?.documentElement?.lang || void 0);
28
65
  }
29
66
  #r(e) {
30
- let t = Math.abs(e), n = e < 0 ? -1 : 1, r = Math.round(t / 1e3), i = Math.round(t / 6e4), a = Math.round(t / 36e5), o = Math.round(t / 864e5), s = Math.round(t / 6048e5), c = Math.round(t / 2592e6), l = Math.round(t / 31536e6);
31
- return r < 60 ? {
32
- value: n * r,
33
- unit: "second"
34
- } : i < 60 ? {
35
- value: n * i,
36
- unit: "minute"
37
- } : a < 24 ? {
38
- value: n * a,
39
- unit: "hour"
40
- } : o < 7 ? {
41
- value: n * o,
42
- unit: "day"
43
- } : s < 4 ? {
44
- value: n * s,
45
- unit: "week"
46
- } : c < 12 ? {
47
- value: n * c,
48
- unit: "month"
49
- } : {
50
- value: n * l,
51
- unit: "year"
52
- };
67
+ let t = Math.abs(e), n = e < 0 ? -1 : 1;
68
+ for (let { unit: e, max: r } of l) {
69
+ let i = Math.round(t / c[e]);
70
+ if (i < r) return {
71
+ value: n * i,
72
+ unit: e
73
+ };
74
+ }
75
+ throw Error("format-relative-time: no relative time threshold matched");
53
76
  }
54
77
  #i(e, t) {
55
- return Math.round(e / ({
56
- second: 1e3,
57
- minute: 6e4,
58
- hour: 36e5,
59
- day: 864e5,
60
- week: 6048e5,
61
- month: 2592e6,
62
- year: 31536e6
63
- }[t] ?? 1));
64
- }
65
- get #a() {
78
+ return Math.round(e / c[t]);
79
+ }
80
+ #a(e) {
81
+ return this.unit === "auto" ? this.#r(e) : {
82
+ unit: this.unit,
83
+ value: this.#i(e, this.unit)
84
+ };
85
+ }
86
+ get #o() {
66
87
  let t = this.#t;
67
88
  if (!t) return "";
68
89
  let n = new Date(t);
69
90
  if (isNaN(n.getTime())) return e.warn(`format-relative-time: invalid date value "${t}"`), t;
70
- let r = n.getTime() - Date.now(), i, a;
71
- this.unit === "auto" ? {value: i, unit: a} = this.#r(r) : (a = this.unit, i = this.#i(r, a));
91
+ let { value: r, unit: i } = this.#a(n.getTime() - Date.now());
72
92
  try {
73
93
  return new Intl.RelativeTimeFormat(this.#n, {
74
94
  numeric: this.numeric,
75
95
  style: this.formatStyle
76
- }).format(i, a);
96
+ }).format(r, i);
77
97
  } catch (n) {
78
98
  return e.warn(`format-relative-time: ${n.message}`), t;
79
99
  }
80
100
  }
81
- #o() {
101
+ #s() {
82
102
  let e = this.#t;
83
103
  if (!e) return 6e4;
84
104
  let t = Math.abs(new Date(e).getTime() - Date.now());
85
105
  return t < 6e4 ? 1e4 : t < 36e5 ? 3e4 : t < 864e5 ? 3e5 : 36e5;
86
106
  }
87
- #s() {
88
- this.#c(), this.sync && (this.#e = setTimeout(() => {
89
- this.requestUpdate(), this.#s();
90
- }, this.#o()));
91
- }
92
107
  #c() {
108
+ this.#l(), this.sync && (this.#e = setTimeout(() => {
109
+ this.requestUpdate(), this.#c();
110
+ }, this.#s()));
111
+ }
112
+ #l() {
93
113
  this.#e !== void 0 && (clearTimeout(this.#e), this.#e = void 0);
94
114
  }
95
115
  connectedCallback() {
96
- super.connectedCallback(), this.sync && this.#s();
116
+ super.connectedCallback(), this.sync && this.#c();
97
117
  }
98
118
  disconnectedCallback() {
99
- this.#c(), super.disconnectedCallback();
119
+ this.#l(), super.disconnectedCallback();
100
120
  }
101
121
  updated(e) {
102
- e.has("sync") && (this.sync ? this.#s() : this.#c());
122
+ e.has("sync") && (this.sync ? this.#c() : this.#l());
103
123
  }
104
124
  render() {
105
- return o`<time internal-host datetime="${this.#t}">${this.#a}<slot @slotchange="${this.#l}" hidden></slot></time>`;
125
+ return o`<time internal-host datetime="${this.#t}">${this.#o}<slot @slotchange="${this.#u}" hidden></slot></time>`;
106
126
  }
107
- #l() {
127
+ #u() {
108
128
  this.requestUpdate();
109
129
  }
110
130
  };
111
- t([s({ type: String })], c.prototype, "date", void 0), t([s({ type: String })], c.prototype, "locale", void 0), t([s({ type: String })], c.prototype, "numeric", void 0), t([s({
131
+ t([s({ type: String })], u.prototype, "date", void 0), t([s({ type: String })], u.prototype, "locale", void 0), t([s({ type: String })], u.prototype, "numeric", void 0), t([s({
112
132
  type: String,
113
133
  attribute: "format-style"
114
- })], c.prototype, "formatStyle", void 0), t([s({ type: String })], c.prototype, "unit", void 0), t([s({ type: Boolean })], c.prototype, "sync", void 0), c = t([n()], c);
134
+ })], u.prototype, "formatStyle", void 0), t([s({ type: String })], u.prototype, "unit", void 0), t([s({ type: Boolean })], u.prototype, "sync", void 0), u = t([n()], u);
115
135
  //#endregion
116
- export { c as FormatRelativeTime };
136
+ export { u as FormatRelativeTime };
117
137
 
118
138
  //# sourceMappingURL=format-relative-time2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format-relative-time2.js","names":["#dateValue","#resolvedLocale","#formattedRelativeTime","#computeUnit","#computeExplicitUnit","#stopSync","#timer","#startSync","#getSyncInterval","#onSlotChange"],"sources":["../../src/format-relative-time/format-relative-time.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { useStyles, typeSSR, LogService } from '@nvidia-elements/core/internal';\nimport styles from './format-relative-time.css?inline';\n\ntype TimeUnitOption = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year';\n\n/**\n * @element nve-format-relative-time\n * @description Formats a date/time value as localized relative text using the Intl.RelativeTimeFormat API. Renders inside a semantic time element.\n * Options mirror the Intl.RelativeTimeFormat API. When unit is 'auto', the component selects the best unit based on the time difference.\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/format-relative-time\n * @slot - Date string to format (such as 2023-07-28T04:20:17.434Z). Serves as fallback before hydration.\n */\n@typeSSR()\nexport class FormatRelativeTime extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-format-relative-time',\n version: '0.0.0'\n };\n\n /**\n * Optional date string for values supplied by JavaScript or bound data.\n * By default, the component formats the element's text content, which also serves as the SSR fallback.\n * When both are present, this property takes precedence.\n */\n @property({ type: String }) date?: string;\n\n /**\n * Language tag (such as en-US, de-DE). Defaults to document.documentElement.lang or browser default.\n */\n @property({ type: String }) locale?: string;\n\n /**\n * Numeric formatting: 'always' | 'auto'. When 'auto', enables natural language forms such as 'yesterday' instead of '1 day ago'.\n */\n @property({ type: String }) numeric: 'always' | 'auto' = 'always';\n\n /**\n * Formatting length: 'long' | 'short' | 'narrow'. Controls verbosity (such as '3 days ago' vs '3d ago'). Maps to Intl.RelativeTimeFormat style option.\n */\n @property({ type: String, attribute: 'format-style' }) formatStyle: 'long' | 'short' | 'narrow' = 'long';\n\n /**\n * Time unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year' | 'auto'. Use 'auto' to let the component select the most appropriate unit based on the time difference.\n */\n @property({ type: String }) unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year' | 'auto' = 'auto';\n\n /**\n * When present, auto-updates the displayed relative time at appropriate intervals.\n */\n @property({ type: Boolean }) sync = false;\n\n #timer?: ReturnType<typeof setTimeout>;\n\n get #dateValue(): string {\n return this.date ?? this.textContent?.trim() ?? '';\n }\n\n get #resolvedLocale(): string | undefined {\n return this.locale ?? (globalThis.document?.documentElement?.lang || undefined);\n }\n\n #computeUnit(diffMs: number): { value: number; unit: Intl.RelativeTimeFormatUnit } {\n const absDiff = Math.abs(diffMs);\n const sign = diffMs < 0 ? -1 : 1;\n\n const seconds = Math.round(absDiff / 1000);\n const minutes = Math.round(absDiff / 60000);\n const hours = Math.round(absDiff / 3600000);\n const days = Math.round(absDiff / 86400000);\n const weeks = Math.round(absDiff / 604800000);\n const months = Math.round(absDiff / 2592000000);\n const years = Math.round(absDiff / 31536000000);\n\n if (seconds < 60) return { value: sign * seconds, unit: 'second' };\n if (minutes < 60) return { value: sign * minutes, unit: 'minute' };\n if (hours < 24) return { value: sign * hours, unit: 'hour' };\n if (days < 7) return { value: sign * days, unit: 'day' };\n if (weeks < 4) return { value: sign * weeks, unit: 'week' };\n if (months < 12) return { value: sign * months, unit: 'month' };\n return { value: sign * years, unit: 'year' };\n }\n\n #computeExplicitUnit(diffMs: number, unit: TimeUnitOption): number {\n const divisors: Record<string, number> = {\n second: 1000,\n minute: 60000,\n hour: 3600000,\n day: 86400000,\n week: 604800000,\n month: 2592000000,\n year: 31536000000\n };\n return Math.round(diffMs / (divisors[unit] ?? 1));\n }\n\n get #formattedRelativeTime(): string {\n const iso = this.#dateValue;\n if (!iso) return '';\n\n const target = new Date(iso);\n if (isNaN(target.getTime())) {\n LogService.warn(`format-relative-time: invalid date value \"${iso}\"`);\n return iso;\n }\n\n const diffMs = target.getTime() - Date.now();\n let value: number;\n let resolvedUnit: Intl.RelativeTimeFormatUnit;\n\n if (this.unit === 'auto') {\n ({ value, unit: resolvedUnit } = this.#computeUnit(diffMs));\n } else {\n resolvedUnit = this.unit;\n value = this.#computeExplicitUnit(diffMs, resolvedUnit);\n }\n\n try {\n return new Intl.RelativeTimeFormat(this.#resolvedLocale, {\n numeric: this.numeric,\n style: this.formatStyle\n }).format(value, resolvedUnit);\n } catch (e) {\n LogService.warn(`format-relative-time: ${(e as Error).message}`);\n return iso;\n }\n }\n\n #getSyncInterval(): number {\n const iso = this.#dateValue;\n if (!iso) return 60000;\n\n const absDiff = Math.abs(new Date(iso).getTime() - Date.now());\n if (absDiff < 60000) return 10000;\n if (absDiff < 3600000) return 30000;\n if (absDiff < 86400000) return 300000;\n return 3600000;\n }\n\n #startSync() {\n this.#stopSync();\n if (!this.sync) return;\n\n this.#timer = setTimeout(() => {\n this.requestUpdate();\n this.#startSync();\n }, this.#getSyncInterval());\n }\n\n #stopSync() {\n if (this.#timer !== undefined) {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (this.sync) this.#startSync();\n }\n\n disconnectedCallback() {\n this.#stopSync();\n super.disconnectedCallback();\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has('sync')) {\n if (this.sync) {\n this.#startSync();\n } else {\n this.#stopSync();\n }\n }\n }\n\n render() {\n return html`<time internal-host datetime=${this.#dateValue}>${this.#formattedRelativeTime}<slot @slotchange=${this.#onSlotChange} hidden></slot></time>`;\n }\n\n #onSlotChange() {\n this.requestUpdate();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"format-relative-time2.js","names":["#dateValue","#resolvedLocale","#computeUnit","#computeExplicitUnit","#formattedRelativeTime","#resolveValueAndUnit","#stopSync","#timer","#startSync","#getSyncInterval","#onSlotChange"],"sources":["../../src/format-relative-time/format-relative-time.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { useStyles, typeSSR, LogService } from '@nvidia-elements/core/internal';\nimport styles from './format-relative-time.css?inline';\n\ntype TimeUnitOption = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year';\n\nconst UNIT_DIVISORS: Record<TimeUnitOption, number> = {\n second: 1000,\n minute: 60000,\n hour: 3600000,\n day: 86400000,\n week: 604800000,\n month: 2592000000,\n year: 31536000000\n};\n\nconst THRESHOLDS: { unit: TimeUnitOption; max: number }[] = [\n { unit: 'second', max: 60 },\n { unit: 'minute', max: 60 },\n { unit: 'hour', max: 24 },\n { unit: 'day', max: 7 },\n { unit: 'week', max: 4 },\n { unit: 'month', max: 12 },\n { unit: 'year', max: Number.POSITIVE_INFINITY }\n];\n\n/**\n * @element nve-format-relative-time\n * @description Formats a date/time value as localized relative text using the Intl.RelativeTimeFormat API. Renders inside a semantic time element.\n * Options mirror the Intl.RelativeTimeFormat API. When unit is 'auto', the component selects the best unit based on the time difference.\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/format-relative-time\n * @slot - Date string to format (such as 2023-07-28T04:20:17.434Z). Serves as fallback before hydration.\n */\n@typeSSR()\nexport class FormatRelativeTime extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-format-relative-time',\n version: '0.0.0'\n };\n\n /**\n * Optional date string for values supplied by JavaScript or bound data.\n * By default, the component formats the element's text content, which also serves as the SSR fallback.\n * When both are present, this property takes precedence.\n */\n @property({ type: String }) date?: string;\n\n /**\n * Language tag (such as en-US, de-DE). Defaults to document.documentElement.lang or browser default.\n */\n @property({ type: String }) locale?: string;\n\n /**\n * Numeric formatting: 'always' | 'auto'. When 'auto', enables natural language forms such as 'yesterday' instead of '1 day ago'.\n */\n @property({ type: String }) numeric: 'always' | 'auto' = 'always';\n\n /**\n * Formatting length: 'long' | 'short' | 'narrow'. Controls verbosity (such as '3 days ago' vs '3d ago'). Maps to Intl.RelativeTimeFormat style option.\n */\n @property({ type: String, attribute: 'format-style' }) formatStyle: 'long' | 'short' | 'narrow' = 'long';\n\n /**\n * Time unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year' | 'auto'. Use 'auto' to let the component select the most appropriate unit based on the time difference.\n */\n @property({ type: String }) unit: 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year' | 'auto' = 'auto';\n\n /**\n * When present, auto-updates the displayed relative time at appropriate intervals.\n */\n @property({ type: Boolean }) sync = false;\n\n #timer?: ReturnType<typeof setTimeout>;\n\n get #dateValue(): string {\n return this.date ?? this.textContent?.trim() ?? '';\n }\n\n get #resolvedLocale(): string | undefined {\n return this.locale ?? (globalThis.document?.documentElement?.lang || undefined);\n }\n\n #computeUnit(diffMs: number): { value: number; unit: Intl.RelativeTimeFormatUnit } {\n const absDiff = Math.abs(diffMs);\n const sign = diffMs < 0 ? -1 : 1;\n\n for (const { unit, max } of THRESHOLDS) {\n const value = Math.round(absDiff / UNIT_DIVISORS[unit]);\n if (value < max) return { value: sign * value, unit };\n }\n throw new Error('format-relative-time: no relative time threshold matched');\n }\n\n #computeExplicitUnit(diffMs: number, unit: TimeUnitOption): number {\n return Math.round(diffMs / UNIT_DIVISORS[unit]);\n }\n\n #resolveValueAndUnit(diffMs: number): { value: number; unit: Intl.RelativeTimeFormatUnit } {\n if (this.unit === 'auto') {\n return this.#computeUnit(diffMs);\n }\n return { unit: this.unit, value: this.#computeExplicitUnit(diffMs, this.unit) };\n }\n\n get #formattedRelativeTime(): string {\n const iso = this.#dateValue;\n if (!iso) return '';\n\n const target = new Date(iso);\n if (isNaN(target.getTime())) {\n LogService.warn(`format-relative-time: invalid date value \"${iso}\"`);\n return iso;\n }\n\n const { value, unit: resolvedUnit } = this.#resolveValueAndUnit(target.getTime() - Date.now());\n\n try {\n return new Intl.RelativeTimeFormat(this.#resolvedLocale, {\n numeric: this.numeric,\n style: this.formatStyle\n }).format(value, resolvedUnit);\n } catch (e) {\n LogService.warn(`format-relative-time: ${(e as Error).message}`);\n return iso;\n }\n }\n\n #getSyncInterval(): number {\n const iso = this.#dateValue;\n if (!iso) return 60000;\n\n const absDiff = Math.abs(new Date(iso).getTime() - Date.now());\n if (absDiff < 60000) return 10000;\n if (absDiff < 3600000) return 30000;\n if (absDiff < 86400000) return 300000;\n return 3600000;\n }\n\n #startSync() {\n this.#stopSync();\n if (!this.sync) return;\n\n this.#timer = setTimeout(() => {\n this.requestUpdate();\n this.#startSync();\n }, this.#getSyncInterval());\n }\n\n #stopSync() {\n if (this.#timer !== undefined) {\n clearTimeout(this.#timer);\n this.#timer = undefined;\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n if (this.sync) this.#startSync();\n }\n\n disconnectedCallback() {\n this.#stopSync();\n super.disconnectedCallback();\n }\n\n updated(changed: Map<string, unknown>) {\n if (changed.has('sync')) {\n if (this.sync) {\n this.#startSync();\n } else {\n this.#stopSync();\n }\n }\n }\n\n render() {\n return html`<time internal-host datetime=${this.#dateValue}>${this.#formattedRelativeTime}<slot @slotchange=${this.#onSlotChange} hidden></slot></time>`;\n }\n\n #onSlotChange() {\n this.requestUpdate();\n }\n}\n"],"mappings":"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"}
@@ -40,7 +40,7 @@ var C = class extends v {
40
40
  static {
41
41
  this.metadata = {
42
42
  tag: "nve-control",
43
- version: "0.0.11"
43
+ version: "0.1.0"
44
44
  };
45
45
  }
46
46
  render() {
@@ -24,7 +24,7 @@ var m = class extends d {
24
24
  static {
25
25
  this.metadata = {
26
26
  tag: "nve-control-group",
27
- version: "0.0.11"
27
+ version: "0.1.0"
28
28
  };
29
29
  }
30
30
  render() {
@@ -23,7 +23,7 @@ var l = {
23
23
  static {
24
24
  this.metadata = {
25
25
  tag: "nve-control-message",
26
- version: "0.0.11"
26
+ version: "0.1.0"
27
27
  };
28
28
  }
29
29
  static {
@@ -1 +1 @@
1
- {"version":3,"file":"validation.examples.js","names":["#submit","#input"],"sources":["../../src/forms/validation.examples.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, unsafeCSS, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators/custom-element.js';\nimport { state } from 'lit/decorators/state.js';\nimport { query } from 'lit/decorators/query.js';\nimport layout from '@nvidia-elements/styles/layout.css?inline';\nimport '@nvidia-elements/core/forms/define.js';\nimport '@nvidia-elements/core/button/define.js';\nimport '@nvidia-elements/core/alert/define.js';\nimport '@nvidia-elements/core/input/define.js';\nimport '@nvidia-elements/core/password/define.js';\n\nexport default {\n title: 'Elements/Forms',\n component: 'forms'\n};\n\n/**\n * @summary Use real-time validation with contextual error messages to disable submit until form is valid.\n * @tags pattern\n */\nexport const LoginForm = {\n render() {\n return html`\n<form id=\"validation\" nve-layout=\"column gap:md\" style=\"max-width: 350px;\">\n <nve-input>\n <label>email</label>\n <input type=\"email\" name=\"email\" required pattern=\".+@nvidia\\.com\" autocomplete=\"off\" />\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n <nve-control-message error=\"patternMismatch\">invalid NVIDIA email</nve-control-message>\n </nve-input>\n\n <nve-password>\n <label>password</label>\n <input type=\"password\" name=\"password\" required minlength=\"6\" autocomplete=\"off\" />\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n <nve-control-message error=\"tooShort\">minimum length is 6 characters</nve-control-message>\n </nve-password>\n\n <nve-button disabled>login to account</nve-button>\n\n <nve-alert-group hidden status=\"success\">\n <nve-alert></nve-alert>\n </nve-alert-group>\n</form>\n<script type=\"module\">\n const form = document.querySelector('form#validation');\n const alertGroup = document.querySelector('#validation nve-alert-group');\n const alert = document.querySelector('#validation nve-alert');\n\n form.addEventListener('submit', e => {\n e.preventDefault();\n const { email, password } = Object.fromEntries(new FormData(form));\n alert.innerText = email + ' / ' + password;\n alertGroup.hidden = false;\n });\n\n form.addEventListener('input', e => {\n form.querySelector('nve-button').disabled = form.matches(':invalid');\n });\n</script>\n `\n }\n}\n\n/**\n * @summary Login form with grouped error display showing all validation issues together after submission attempt.\n */\nexport const ErrorGroup = {\n render: () => html`\n<form nve-layout=\"column gap:md\" style=\"max-width: 350px;\" novalidate>\n <nve-input>\n <label>email</label>\n <input type=\"email\" name=\"email\" required pattern=\".+@nvidia\\.com\" autocomplete=\"off\" />\n <nve-control-message status=\"error\">invalid email</nve-control-message>\n </nve-input>\n\n <nve-password>\n <label>password</label>\n <input type=\"password\" name=\"password\" required minlength=\"6\" autocomplete=\"off\" />\n <nve-control-message status=\"error\">minimum length is 6 characters</nve-control-message>\n </nve-password>\n\n <nve-button>login to account</nve-button>\n\n <nve-alert-group status=\"danger\">\n <nve-alert>invalid email</nve-alert>\n <nve-alert>password required</nve-alert>\n </nve-alert-group>\n</form>\n `\n}\n\n/**\n * @summary Login form example of success feedback with positive confirmation messages for valid input and successful form submission.\n */\nexport const SuccessGroup = {\n render: () => {\n return html`\n<form nve-layout=\"column gap:md\" style=\"max-width: 350px;\" novalidate>\n <nve-input>\n <label>username</label>\n <input type=\"email\" name=\"email\" required pattern=\".+@nvidia\\.com\" autocomplete=\"off\" />\n <nve-control-message status=\"success\">username available</nve-control-message>\n </nve-input>\n\n <nve-password>\n <label>password</label>\n <input type=\"password\" name=\"password\" required minlength=\"6\" autocomplete=\"off\" />\n </nve-password>\n\n <nve-button>login to account</nve-button>\n\n <nve-alert-group status=\"success\">\n <nve-alert closable>account created</nve-alert>\n </nve-alert-group>\n</form>\n`\n }\n}\n\n/**\n * @summary Form reset functionality allowing users to clear individual fields or reset the entire form.\n */\nexport const ResetForm = {\n render: () => {\n return html`\n<form nve-layout=\"column gap:md\" style=\"max-width: 350px;\">\n <nve-input>\n <label>email</label>\n <input type=\"email\" name=\"email\" required pattern=\".+@nvidia\\.com\" autocomplete=\"off\" value=\"test@nvidia.com\" />\n <nve-icon-button aria-label=\"reset\" icon-name=\"cancel\" container=\"flat\" type=\"button\"></nve-icon-button>\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n <nve-control-message error=\"patternMismatch\">invalid NVIDIA email</nve-control-message>\n </nve-input>\n\n <nve-password>\n <label>password</label>\n <input type=\"password\" name=\"password\" required minlength=\"6\" autocomplete=\"off\" />\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n </nve-password>\n\n <nve-button type=\"button\">reset form</nve-button>\n</form>\n<script type=\"module\">\n const form = document.querySelector('form');\n const input = form.querySelector('nve-input');\n const resetInput = form.querySelector('nve-icon-button[icon-name=\"cancel\"]');\n const resetForm = form.querySelector('nve-button');\n\n resetInput.addEventListener('click', e => input.reset());\n resetForm.addEventListener('click', e => form.reset());\n form.addEventListener('reset', e => console.log(e));\n</script>\n`\n }\n}\n\n/* eslint-disable @nvidia-elements/lint/no-missing-popover-trigger */\n\n@customElement('app-login')\nexport class AppLogin extends LitElement {\n static styles = [unsafeCSS(layout)];\n\n @query('form') form: HTMLFormElement;\n\n @state() formValues = { email: '', password: '', remember: false };\n\n @state() showNotification = false;\n\n render() {\n return html`\n <form @submit=${e => this.#submit(e)} @input=${this.#input} nve-layout=\"column gap:lg align:stretch\" style=\"max-width: 400px\">\n <nve-input>\n <label>Email</label>\n <input .value=${this.formValues.email} type=\"email\" name=\"email\" autocomplete=\"off\" pattern=\".+@nvidia.com\" required />\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n <nve-control-message error=\"patternMismatch\">invalid NVIDIA email</nve-control-message>\n </nve-input>\n\n <nve-password>\n <label>Password</label>\n <input .value=${this.formValues.password} type=\"password\" name=\"password\" minlength=\"6\" required />\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n <nve-control-message error=\"tooShort\">minimum length is 6 characters</nve-control-message>\n </nve-password>\n\n <nve-checkbox>\n <label>Remember me</label>\n <input ?checked=${this.formValues.remember} type=\"checkbox\" name=\"remember\" />\n </nve-checkbox>\n\n <nve-button interaction=\"emphasis\">Login</nve-button>\n </form>\n <pre>${JSON.stringify(this.formValues, null, 2)}</pre>\n <nve-notification ?hidden=${!this.showNotification} @close=${() => this.showNotification = false} close-timeout=\"2000\" status=\"success\" position=\"top\">Submited: ${JSON.stringify(this.formValues)}</nve-notification>\n `;\n }\n\n #input() {\n this.formValues = Object.fromEntries(new FormData(this.form)) as unknown as { email: string, password: string, remember: boolean };\n }\n\n #submit(e) {\n e.preventDefault();\n if (this.form.reportValidity()) {\n this.showNotification = true\n }\n }\n}\n\n/**\n * @summary Forms work with LitElement\n * @tags test-case\n */\nexport const LitForms = {\n render: () => html`<app-login></app-login>`\n}\n"],"mappings":";AAGA,IAAA,IAAe"}
1
+ {"version":3,"file":"validation.examples.js","names":["#submit","#input"],"sources":["../../src/forms/validation.examples.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { html, unsafeCSS, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators/custom-element.js';\nimport { state } from 'lit/decorators/state.js';\nimport { query } from 'lit/decorators/query.js';\nimport layout from '@nvidia-elements/styles/layout.css?inline';\nimport '@nvidia-elements/core/forms/define.js';\nimport '@nvidia-elements/core/button/define.js';\nimport '@nvidia-elements/core/alert/define.js';\nimport '@nvidia-elements/core/input/define.js';\nimport '@nvidia-elements/core/password/define.js';\n\nexport default {\n title: 'Elements/Forms',\n component: 'forms'\n};\n\n/**\n * @summary Use real-time validation with contextual error messages to disable submit until form is valid.\n * @tags pattern\n */\nexport const LoginForm = {\n render() {\n return html`\n<form id=\"validation\" nve-layout=\"column gap:md\" style=\"max-width: 350px;\">\n <nve-input>\n <label>email</label>\n <input type=\"email\" name=\"email\" required pattern=\".+@nvidia\\.com\" autocomplete=\"off\" />\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n <nve-control-message error=\"patternMismatch\">invalid NVIDIA email</nve-control-message>\n </nve-input>\n\n <nve-password>\n <label>password</label>\n <input type=\"password\" name=\"password\" required minlength=\"6\" autocomplete=\"off\" />\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n <nve-control-message error=\"tooShort\">minimum length is 6 characters</nve-control-message>\n </nve-password>\n\n <nve-button disabled>login to account</nve-button>\n\n <nve-alert-group hidden status=\"success\">\n <nve-alert></nve-alert>\n </nve-alert-group>\n</form>\n<script type=\"module\">\n const form = document.querySelector('form#validation');\n const alertGroup = document.querySelector('#validation nve-alert-group');\n const alert = document.querySelector('#validation nve-alert');\n\n form.addEventListener('submit', e => {\n e.preventDefault();\n const { email, password } = Object.fromEntries(new FormData(form));\n alert.innerText = email + ' / ' + password;\n alertGroup.hidden = false;\n });\n\n form.addEventListener('input', e => {\n form.querySelector('nve-button').disabled = form.matches(':invalid');\n });\n</script>\n `\n }\n}\n\n/**\n * @summary Login form with grouped error display showing all validation issues together after submission attempt.\n */\nexport const ErrorGroup = {\n render: () => html`\n<form nve-layout=\"column gap:md\" style=\"max-width: 350px;\" novalidate>\n <nve-input>\n <label>email</label>\n <input type=\"email\" name=\"email\" required pattern=\".+@nvidia\\.com\" autocomplete=\"off\" />\n <nve-control-message status=\"error\">invalid email</nve-control-message>\n </nve-input>\n\n <nve-password>\n <label>password</label>\n <input type=\"password\" name=\"password\" required minlength=\"6\" autocomplete=\"off\" />\n <nve-control-message status=\"error\">minimum length is 6 characters</nve-control-message>\n </nve-password>\n\n <nve-button>login to account</nve-button>\n\n <nve-alert-group status=\"danger\">\n <nve-alert>invalid email</nve-alert>\n <nve-alert>password required</nve-alert>\n </nve-alert-group>\n</form>\n `\n}\n\n/**\n * @summary Login form example of success feedback with positive confirmation messages for valid input and successful form submission.\n */\nexport const SuccessGroup = {\n render: () => {\n return html`\n<form nve-layout=\"column gap:md\" style=\"max-width: 350px;\" novalidate>\n <nve-input>\n <label>username</label>\n <input type=\"email\" name=\"email\" required pattern=\".+@nvidia\\.com\" autocomplete=\"off\" />\n <nve-control-message status=\"success\">username available</nve-control-message>\n </nve-input>\n\n <nve-password>\n <label>password</label>\n <input type=\"password\" name=\"password\" required minlength=\"6\" autocomplete=\"off\" />\n </nve-password>\n\n <nve-button>login to account</nve-button>\n\n <nve-alert-group status=\"success\">\n <nve-alert closable>account created</nve-alert>\n </nve-alert-group>\n</form>\n`\n }\n}\n\n/**\n * @summary Form reset functionality allowing users to clear individual fields or reset the entire form.\n */\nexport const ResetForm = {\n render: () => {\n return html`\n<form nve-layout=\"column gap:md\" style=\"max-width: 350px;\">\n <nve-input>\n <label>email</label>\n <input type=\"email\" name=\"email\" required pattern=\".+@nvidia\\.com\" autocomplete=\"off\" value=\"test@nvidia.com\" />\n <nve-icon-button aria-label=\"reset\" icon-name=\"cancel\" container=\"flat\" type=\"button\"></nve-icon-button>\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n <nve-control-message error=\"patternMismatch\">invalid NVIDIA email</nve-control-message>\n </nve-input>\n\n <nve-password>\n <label>password</label>\n <input type=\"password\" name=\"password\" required minlength=\"6\" autocomplete=\"off\" />\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n </nve-password>\n\n <nve-button type=\"button\">reset form</nve-button>\n</form>\n<script type=\"module\">\n const form = document.querySelector('form');\n const input = form.querySelector('nve-input');\n const resetInput = form.querySelector('nve-icon-button[icon-name=\"cancel\"]');\n const resetForm = form.querySelector('nve-button');\n\n resetInput.addEventListener('click', e => input.reset());\n resetForm.addEventListener('click', e => form.reset());\n form.addEventListener('reset', e => console.log(e));\n</script>\n`\n }\n}\n\n@customElement('app-login')\nexport class AppLogin extends LitElement {\n static styles = [unsafeCSS(layout)];\n\n @query('form') form: HTMLFormElement;\n\n @state() formValues = { email: '', password: '', remember: false };\n\n @state() showNotification = false;\n\n render() {\n return html`\n <form @submit=${e => this.#submit(e)} @input=${this.#input} nve-layout=\"column gap:lg align:stretch\" style=\"max-width: 400px\">\n <nve-input>\n <label>Email</label>\n <input .value=${this.formValues.email} type=\"email\" name=\"email\" autocomplete=\"off\" pattern=\".+@nvidia.com\" required />\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n <nve-control-message error=\"patternMismatch\">invalid NVIDIA email</nve-control-message>\n </nve-input>\n\n <nve-password>\n <label>Password</label>\n <input .value=${this.formValues.password} type=\"password\" name=\"password\" minlength=\"6\" required />\n <nve-control-message error=\"valueMissing\">required</nve-control-message>\n <nve-control-message error=\"tooShort\">minimum length is 6 characters</nve-control-message>\n </nve-password>\n\n <nve-checkbox>\n <label>Remember me</label>\n <input ?checked=${this.formValues.remember} type=\"checkbox\" name=\"remember\" />\n </nve-checkbox>\n\n <nve-button interaction=\"emphasis\">Login</nve-button>\n </form>\n <pre>${JSON.stringify(this.formValues, null, 2)}</pre>\n <nve-notification ?hidden=${!this.showNotification} @close=${() => this.showNotification = false} close-timeout=\"2000\" status=\"success\" position=\"top\">Submited: ${JSON.stringify(this.formValues)}</nve-notification>\n `;\n }\n\n #input() {\n this.formValues = Object.fromEntries(new FormData(this.form)) as unknown as { email: string, password: string, remember: boolean };\n }\n\n #submit(e) {\n e.preventDefault();\n if (this.form.reportValidity()) {\n this.showNotification = true\n }\n }\n}\n\n/**\n * @summary Forms work with LitElement\n * @tags test-case\n */\nexport const LitForms = {\n render: () => html`<app-login></app-login>`\n}\n"],"mappings":";AAGA,IAAA,IAAe"}
@@ -10,7 +10,7 @@ var a = class extends r {
10
10
  static {
11
11
  this.metadata = {
12
12
  tag: "nve-grid-cell",
13
- version: "0.0.11"
13
+ version: "0.1.0"
14
14
  };
15
15
  }
16
16
  render() {
@@ -13,7 +13,7 @@ var c = class n extends a {
13
13
  static {
14
14
  this.metadata = {
15
15
  tag: "nve-grid-column",
16
- version: "0.0.11"
16
+ version: "0.1.0"
17
17
  };
18
18
  }
19
19
  get #e() {
@@ -15,7 +15,7 @@ var s = class extends a {
15
15
  static {
16
16
  this.metadata = {
17
17
  tag: "nve-grid-footer",
18
- version: "0.0.11"
18
+ version: "0.1.0"
19
19
  };
20
20
  }
21
21
  static {
@@ -22,7 +22,7 @@ var v = class extends h {
22
22
  static {
23
23
  this.metadata = {
24
24
  tag: "nve-grid",
25
- version: "0.0.11",
25
+ version: "0.1.0",
26
26
  children: [
27
27
  u.metadata.tag,
28
28
  d.metadata.tag,
@@ -19,7 +19,7 @@ var m = class extends d {
19
19
  static {
20
20
  this.metadata = {
21
21
  tag: "nve-grid-header",
22
- version: "0.0.11",
22
+ version: "0.1.0",
23
23
  children: [c.metadata.tag]
24
24
  };
25
25
  }
@@ -10,7 +10,7 @@ var a = class extends r {
10
10
  static {
11
11
  this.metadata = {
12
12
  tag: "nve-grid-placeholder",
13
- version: "0.0.11"
13
+ version: "0.1.0"
14
14
  };
15
15
  }
16
16
  render() {
@@ -15,7 +15,7 @@ var u = class extends s {
15
15
  static {
16
16
  this.metadata = {
17
17
  tag: "nve-grid-row",
18
- version: "0.0.11",
18
+ version: "0.1.0",
19
19
  children: [a.metadata.tag]
20
20
  };
21
21
  }
@@ -16,7 +16,7 @@ var f = class e extends o {
16
16
  static {
17
17
  this.metadata = {
18
18
  tag: "nve-icon",
19
- version: "0.0.11"
19
+ version: "0.1.0"
20
20
  };
21
21
  }
22
22
  static {
@@ -86,7 +86,7 @@ n([l({
86
86
  })], f.prototype, "name", void 0), n([d()], f.prototype, "svg", void 0);
87
87
  function p(t) {
88
88
  if (typeof globalThis.customElements?.get == "function") {
89
- let n = e(t.metadata.version), r = e("0.0.11");
89
+ let n = e(t.metadata.version), r = e("0.1.0");
90
90
  n.minor <= r.minor && n.major <= r.major && (t._icons = {
91
91
  ...t._icons,
92
92
  ...i
@@ -15,7 +15,7 @@ var l = class extends a {
15
15
  static {
16
16
  this.metadata = {
17
17
  tag: "nve-icon-button",
18
- version: "0.0.11"
18
+ version: "0.1.0"
19
19
  };
20
20
  }
21
21
  static {
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import { getThemeTokens as e } from "./internal/utils/dom.js";
2
2
  import { I18nService as t } from "./internal/services/i18n.service.js";
3
3
  import { statusIcons as n } from "./internal/types/index.js";
4
4
  //#region src/index.ts
5
- var r = "0.0.11", i = "@nvidia-elements";
5
+ var r = "0.1.0", i = "@nvidia-elements";
6
6
  //#endregion
7
7
  export { t as I18nService, i as SCOPE, r as VERSION, e as getThemeTokens, n as statusIcons };
8
8
 
@@ -11,7 +11,7 @@ var a = class extends n {
11
11
  static {
12
12
  this.metadata = {
13
13
  tag: "nve-input-group",
14
- version: "0.0.11"
14
+ version: "0.1.0"
15
15
  };
16
16
  }
17
17
  async connectedCallback() {
@@ -14,7 +14,7 @@ var a = r, o = class extends n {
14
14
  static {
15
15
  this.metadata = {
16
16
  tag: "nve-input",
17
- version: "0.0.11"
17
+ version: "0.1.0"
18
18
  };
19
19
  }
20
20
  };
@@ -19,7 +19,7 @@ var a = class {
19
19
  i18nRegistry: {},
20
20
  audit: {}
21
21
  }
22
- }, globalThis.NVE_ELEMENTS.state.versions = Array.from(new Set([...globalThis.NVE_ELEMENTS.state.versions, "0.0.11"])), globalThis.NVE_ELEMENTS.state.scopedRegistry ??= {}, globalThis.NVE_ELEMENTS.state.scopedRegistry["0.0.11"] = i(), globalThis.NVE_ELEMENTS.state.versions.length > 1 && globalThis.NVE_ELEMENTS.state.env !== "production" && console.warn(e(), `\n\n${JSON.stringify(globalThis.NVE_ELEMENTS.state.versions, null, 2)}`);
22
+ }, globalThis.NVE_ELEMENTS.state.versions = Array.from(new Set([...globalThis.NVE_ELEMENTS.state.versions, "0.1.0"])), globalThis.NVE_ELEMENTS.state.scopedRegistry ??= {}, globalThis.NVE_ELEMENTS.state.scopedRegistry["0.1.0"] = i(), globalThis.NVE_ELEMENTS.state.versions.length > 1 && globalThis.NVE_ELEMENTS.state.env !== "production" && console.warn(e(), `\n\n${JSON.stringify(globalThis.NVE_ELEMENTS.state.versions, null, 2)}`);
23
23
  }
24
24
  get state() {
25
25
  return globalThis.NVE_ELEMENTS.state;