@nvidia-elements/core 2.23.4 → 2.23.5
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.
- package/CHANGELOG.md +10 -0
- package/dist/accordion/accordion2.js +49 -49
- package/dist/accordion/accordion2.js.map +1 -1
- package/dist/alert/alert-group2.js +22 -21
- package/dist/alert/alert-group2.js.map +1 -1
- package/dist/alert/alert2.js +29 -28
- package/dist/alert/alert2.js.map +1 -1
- package/dist/avatar/avatar-group2.js +9 -9
- package/dist/avatar/avatar-group2.js.map +1 -1
- package/dist/avatar/avatar2.js +12 -11
- package/dist/avatar/avatar2.js.map +1 -1
- package/dist/badge/badge2.js +27 -26
- package/dist/badge/badge2.js.map +1 -1
- package/dist/breadcrumb/breadcrumb2.js +17 -17
- package/dist/breadcrumb/breadcrumb2.js.map +1 -1
- package/dist/bundles/index.js +6 -6
- package/dist/button/button2.js +12 -12
- package/dist/button/button2.js.map +1 -1
- package/dist/button-group/button-group2.js +18 -18
- package/dist/button-group/button-group2.js.map +1 -1
- package/dist/card/card2.js +28 -28
- package/dist/card/card2.js.map +1 -1
- package/dist/chat-message/chat-message2.js +15 -14
- package/dist/chat-message/chat-message2.js.map +1 -1
- package/dist/checkbox/checkbox-group2.js +8 -8
- package/dist/checkbox/checkbox-group2.js.map +1 -1
- package/dist/checkbox/checkbox2.js +8 -8
- package/dist/checkbox/checkbox2.js.map +1 -1
- package/dist/color/color2.js +21 -21
- package/dist/color/color2.js.map +1 -1
- package/dist/combobox/combobox2.js +37 -37
- package/dist/combobox/combobox2.js.map +1 -1
- package/dist/copy-button/copy-button.d.ts +1 -1
- package/dist/copy-button/copy-button2.js +21 -21
- package/dist/copy-button/copy-button2.js.map +1 -1
- package/dist/custom-elements.json +0 -76
- package/dist/date/date2.js +19 -19
- package/dist/date/date2.js.map +1 -1
- package/dist/datetime/datetime2.js +19 -19
- package/dist/datetime/datetime2.js.map +1 -1
- package/dist/dialog/dialog-footer2.js +7 -7
- package/dist/dialog/dialog-footer2.js.map +1 -1
- package/dist/dialog/dialog-header2.js +7 -7
- package/dist/dialog/dialog-header2.js.map +1 -1
- package/dist/dialog/dialog2.js +25 -25
- package/dist/dialog/dialog2.js.map +1 -1
- package/dist/divider/divider2.js +12 -12
- package/dist/divider/divider2.js.map +1 -1
- package/dist/dot/dot2.js +17 -16
- package/dist/dot/dot2.js.map +1 -1
- package/dist/drag-handle/drag-handle2.js +12 -12
- package/dist/drag-handle/drag-handle2.js.map +1 -1
- package/dist/drawer/drawer-content2.js +7 -7
- package/dist/drawer/drawer-content2.js.map +1 -1
- package/dist/drawer/drawer-footer2.js +7 -7
- package/dist/drawer/drawer-footer2.js.map +1 -1
- package/dist/drawer/drawer-header2.js +7 -7
- package/dist/drawer/drawer-header2.js.map +1 -1
- package/dist/drawer/drawer2.js +21 -21
- package/dist/drawer/drawer2.js.map +1 -1
- package/dist/dropdown/dropdown-footer2.js +7 -7
- package/dist/dropdown/dropdown-footer2.js.map +1 -1
- package/dist/dropdown/dropdown-header2.js +7 -7
- package/dist/dropdown/dropdown-header2.js.map +1 -1
- package/dist/dropdown/dropdown2.js +21 -21
- package/dist/dropdown/dropdown2.js.map +1 -1
- package/dist/dropdown-group/dropdown-group.js +10 -10
- package/dist/dropdown-group/dropdown-group.js.map +1 -1
- package/dist/dropzone/dropzone2.js +19 -19
- package/dist/dropzone/dropzone2.js.map +1 -1
- package/dist/file/file2.js +8 -8
- package/dist/file/file2.js.map +1 -1
- package/dist/format-bytes/format-bytes2.js +13 -13
- package/dist/format-bytes/format-bytes2.js.map +1 -1
- package/dist/format-datetime/format-datetime2.js +14 -14
- package/dist/format-datetime/format-datetime2.js.map +1 -1
- package/dist/format-number/format-number2.js +20 -20
- package/dist/format-number/format-number2.js.map +1 -1
- package/dist/format-relative-time/format-relative-time2.js +11 -11
- package/dist/format-relative-time/format-relative-time2.js.map +1 -1
- package/dist/format-truncate/format-truncate2.js +21 -21
- package/dist/format-truncate/format-truncate2.js.map +1 -1
- package/dist/forms/control/control2.js +30 -29
- package/dist/forms/control/control2.js.map +1 -1
- package/dist/forms/control-group/control-group2.js +19 -18
- package/dist/forms/control-group/control-group2.js.map +1 -1
- package/dist/forms/control-message/control-message2.js +15 -15
- package/dist/forms/control-message/control-message2.js.map +1 -1
- package/dist/gauge/gauge2.js +20 -20
- package/dist/gauge/gauge2.js.map +1 -1
- package/dist/ghost/ghost2.js +10 -10
- package/dist/ghost/ghost2.js.map +1 -1
- package/dist/grid/cell/cell2.js +9 -9
- package/dist/grid/cell/cell2.js.map +1 -1
- package/dist/grid/column/column2.js +16 -16
- package/dist/grid/column/column2.js.map +1 -1
- package/dist/grid/footer/footer2.js +12 -12
- package/dist/grid/footer/footer2.js.map +1 -1
- package/dist/grid/grid2.js +30 -30
- package/dist/grid/grid2.js.map +1 -1
- package/dist/grid/header/header2.js +20 -20
- package/dist/grid/header/header2.js.map +1 -1
- package/dist/grid/placeholder/placeholder2.js +9 -9
- package/dist/grid/placeholder/placeholder2.js.map +1 -1
- package/dist/grid/row/row2.js +15 -15
- package/dist/grid/row/row2.js.map +1 -1
- package/dist/icon/icon2.js +40 -40
- package/dist/icon/icon2.js.map +1 -1
- package/dist/icon-button/icon-button2.js +17 -17
- package/dist/icon-button/icon-button2.js.map +1 -1
- package/dist/iframe/iframe2.js +7 -7
- package/dist/iframe/iframe2.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/input/input-group2.js +8 -8
- package/dist/input/input-group2.js.map +1 -1
- package/dist/input/input2.js +10 -10
- package/dist/input/input2.js.map +1 -1
- package/dist/internal/controllers/state-expanded.controller.js +1 -1
- package/dist/internal/controllers/state-expanded.controller.js.map +1 -1
- package/dist/internal/controllers/state-highlighted.controller.js +1 -1
- package/dist/internal/controllers/state-highlighted.controller.js.map +1 -1
- package/dist/internal/controllers/state-scroll.controller.js +1 -1
- package/dist/internal/controllers/state-scroll.controller.js.map +1 -1
- package/dist/internal/controllers/state-selected.controller.js +1 -1
- package/dist/internal/controllers/state-selected.controller.js.map +1 -1
- package/dist/internal/controllers/type-anchor.controller.js +1 -1
- package/dist/internal/controllers/type-anchor.controller.js.map +1 -1
- package/dist/internal/controllers/type-closable.controller.js +1 -1
- package/dist/internal/controllers/type-closable.controller.js.map +1 -1
- package/dist/internal/controllers/type-expandable.controller.js +1 -1
- package/dist/internal/controllers/type-expandable.controller.js.map +1 -1
- package/dist/internal/controllers/type-native-popover.controller.js +6 -6
- package/dist/internal/controllers/type-native-popover.controller.js.map +1 -1
- package/dist/internal/controllers/type-popover.controller.examples.js.map +1 -1
- package/dist/internal/controllers/type-selectable.controller.js +1 -1
- package/dist/internal/controllers/type-selectable.controller.js.map +1 -1
- package/dist/internal/index.d.ts +0 -1
- package/dist/internal/index.js +57 -61
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/styles/index.d.ts +0 -1
- package/dist/internal/styles/index.js +5 -15
- package/dist/internal/styles/index.js.map +1 -1
- package/dist/internal/utils/a11y.d.ts +0 -3
- package/dist/internal/utils/a11y.js +6 -9
- package/dist/internal/utils/a11y.js.map +1 -1
- package/dist/joystick/joystick2.js +19 -19
- package/dist/joystick/joystick2.js.map +1 -1
- package/dist/logo/logo2.js +14 -13
- package/dist/logo/logo2.js.map +1 -1
- package/dist/menu/menu-group2.js +20 -20
- package/dist/menu/menu-group2.js.map +1 -1
- package/dist/menu/menu-item2.js +11 -11
- package/dist/menu/menu-item2.js.map +1 -1
- package/dist/menu/menu2.js +14 -14
- package/dist/menu/menu2.js.map +1 -1
- package/dist/month/month2.js +19 -19
- package/dist/month/month2.js.map +1 -1
- package/dist/notification/notification-group2.js +13 -13
- package/dist/notification/notification-group2.js.map +1 -1
- package/dist/notification/notification2.js +31 -31
- package/dist/notification/notification2.js.map +1 -1
- package/dist/page/page-panel/page-panel-content2.js +7 -7
- package/dist/page/page-panel/page-panel-content2.js.map +1 -1
- package/dist/page/page-panel/page-panel-footer2.js +9 -9
- package/dist/page/page-panel/page-panel-footer2.js.map +1 -1
- package/dist/page/page-panel/page-panel-header2.js +9 -9
- package/dist/page/page-panel/page-panel-header2.js.map +1 -1
- package/dist/page/page-panel/page-panel2.js +15 -15
- package/dist/page/page-panel/page-panel2.js.map +1 -1
- package/dist/page/page2.js +13 -13
- package/dist/page/page2.js.map +1 -1
- package/dist/page-header/page-header2.js +10 -10
- package/dist/page-header/page-header2.js.map +1 -1
- package/dist/page-loader/page-loader2.js +13 -13
- package/dist/page-loader/page-loader2.js.map +1 -1
- package/dist/pagination/pagination2.js +34 -34
- package/dist/pagination/pagination2.js.map +1 -1
- package/dist/panel/panel2.js +36 -36
- package/dist/panel/panel2.js.map +1 -1
- package/dist/password/password2.js +19 -19
- package/dist/password/password2.js.map +1 -1
- package/dist/preferences-input/preferences-input.d.ts +1 -1
- package/dist/preferences-input/preferences-input2.js +25 -25
- package/dist/preferences-input/preferences-input2.js.map +1 -1
- package/dist/progress-bar/progress-bar2.js +13 -13
- package/dist/progress-bar/progress-bar2.js.map +1 -1
- package/dist/progress-dot/progress-dot2.js +15 -15
- package/dist/progress-dot/progress-dot2.js.map +1 -1
- package/dist/progress-ring/progress-ring2.js +20 -20
- package/dist/progress-ring/progress-ring2.js.map +1 -1
- package/dist/progressive-filter-chip/progressive-filter-chip2.js +28 -28
- package/dist/progressive-filter-chip/progressive-filter-chip2.js.map +1 -1
- package/dist/pulse/pulse2.js +15 -15
- package/dist/pulse/pulse2.js.map +1 -1
- package/dist/radio/radio-group2.js +8 -8
- package/dist/radio/radio-group2.js.map +1 -1
- package/dist/radio/radio2.js +8 -8
- package/dist/radio/radio2.js.map +1 -1
- package/dist/range/range2.js +16 -16
- package/dist/range/range2.js.map +1 -1
- package/dist/resize-handle/resize-handle2.js +17 -17
- package/dist/resize-handle/resize-handle2.js.map +1 -1
- package/dist/search/search2.js +20 -20
- package/dist/search/search2.js.map +1 -1
- package/dist/select/select2.js +32 -32
- package/dist/select/select2.js.map +1 -1
- package/dist/skeleton/skeleton2.js +14 -14
- package/dist/skeleton/skeleton2.js.map +1 -1
- package/dist/sort-button/sort-button.d.ts +1 -1
- package/dist/sort-button/sort-button2.js +16 -16
- package/dist/sort-button/sort-button2.js.map +1 -1
- package/dist/sparkline/sparkline2.js +45 -44
- package/dist/sparkline/sparkline2.js.map +1 -1
- package/dist/star-rating/star-rating2.js +14 -14
- package/dist/star-rating/star-rating2.js.map +1 -1
- package/dist/steps/steps2.js +32 -32
- package/dist/steps/steps2.js.map +1 -1
- package/dist/switch/switch-group2.js +8 -8
- package/dist/switch/switch-group2.js.map +1 -1
- package/dist/switch/switch2.js +8 -8
- package/dist/switch/switch2.js.map +1 -1
- package/dist/tabs/tabs-group2.js +18 -18
- package/dist/tabs/tabs-group2.js.map +1 -1
- package/dist/tabs/tabs-item-group2.js +9 -9
- package/dist/tabs/tabs-item-group2.js.map +1 -1
- package/dist/tabs/tabs2.js +28 -28
- package/dist/tabs/tabs2.js.map +1 -1
- package/dist/tag/tag2.js +19 -18
- package/dist/tag/tag2.js.map +1 -1
- package/dist/textarea/textarea2.js +9 -9
- package/dist/textarea/textarea2.js.map +1 -1
- package/dist/time/time2.js +19 -19
- package/dist/time/time2.js.map +1 -1
- package/dist/toast/toast2.js +28 -28
- package/dist/toast/toast2.js.map +1 -1
- package/dist/toggletip/toggletip-footer2.js +7 -7
- package/dist/toggletip/toggletip-footer2.js.map +1 -1
- package/dist/toggletip/toggletip-header2.js +7 -7
- package/dist/toggletip/toggletip-header2.js.map +1 -1
- package/dist/toggletip/toggletip2.js +23 -23
- package/dist/toggletip/toggletip2.js.map +1 -1
- package/dist/toolbar/toolbar2.js +20 -19
- package/dist/toolbar/toolbar2.js.map +1 -1
- package/dist/tooltip/tooltip2.js +20 -20
- package/dist/tooltip/tooltip2.js.map +1 -1
- package/dist/tree/tree-node2.js +39 -39
- package/dist/tree/tree-node2.js.map +1 -1
- package/dist/tree/tree2.js +20 -20
- package/dist/tree/tree2.js.map +1 -1
- package/dist/week/week2.js +19 -19
- package/dist/week/week2.js.map +1 -1
- package/dist/workspace/panel/panel2.js +14 -14
- package/dist/workspace/panel/panel2.js.map +1 -1
- package/dist/workspace/panel-content/panel-content2.js +7 -7
- package/dist/workspace/panel-content/panel-content2.js.map +1 -1
- package/dist/workspace/panel-footer/panel-footer2.js +9 -9
- package/dist/workspace/panel-footer/panel-footer2.js.map +1 -1
- package/dist/workspace/panel-header/panel-header2.js +16 -16
- package/dist/workspace/panel-header/panel-header2.js.map +1 -1
- package/dist/workspace/workspace2.js +97 -97
- package/dist/workspace/workspace2.js.map +1 -1
- package/package.json +2 -2
- package/dist/internal/decorators/scoped-registry.d.ts +0 -2
- package/dist/internal/decorators/scoped-registry.js +0 -36
- package/dist/internal/decorators/scoped-registry.js.map +0 -1
- package/dist/internal/styles/base.js +0 -5
- package/dist/internal/styles/base.js.map +0 -1
- package/dist/internal/styles/interaction-state.js +0 -5
- package/dist/internal/styles/interaction-state.js.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { typeSSR as e } from "../internal/controllers/type-ssr.controller.js";
|
|
2
|
-
import
|
|
3
|
-
import n from "
|
|
4
|
-
import r from "
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import t from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
|
|
3
|
+
import n from "./format-relative-time.js";
|
|
4
|
+
import { LitElement as r, html as i } from "lit";
|
|
5
|
+
import { property as a } from "lit/decorators/property.js";
|
|
6
|
+
import { useStyles as o } from "@nvidia-elements/foundations/internal/styles";
|
|
7
7
|
// src/format-relative-time/format-relative-time.ts
|
|
8
8
|
var s = {
|
|
9
9
|
second: 1e3,
|
|
@@ -42,17 +42,17 @@ var s = {
|
|
|
42
42
|
unit: "year",
|
|
43
43
|
max: Infinity
|
|
44
44
|
}
|
|
45
|
-
], l = class extends
|
|
45
|
+
], l = class extends r {
|
|
46
46
|
constructor(...e) {
|
|
47
47
|
super(...e), this.numeric = "always", this.formatStyle = "long", this.unit = "auto", this.sync = !1;
|
|
48
48
|
}
|
|
49
49
|
static {
|
|
50
|
-
this.styles =
|
|
50
|
+
this.styles = o([n]);
|
|
51
51
|
}
|
|
52
52
|
static {
|
|
53
53
|
this.metadata = {
|
|
54
54
|
tag: "nve-format-relative-time",
|
|
55
|
-
version: "2.23.
|
|
55
|
+
version: "2.23.5"
|
|
56
56
|
};
|
|
57
57
|
}
|
|
58
58
|
#e;
|
|
@@ -124,16 +124,16 @@ var s = {
|
|
|
124
124
|
e.has("sync") && (this.sync ? this.#c() : this.#l());
|
|
125
125
|
}
|
|
126
126
|
render() {
|
|
127
|
-
return
|
|
127
|
+
return i`<time internal-host datetime="${this.#t}">${this.#o}<slot @slotchange="${this.#u}" hidden></slot></time>`;
|
|
128
128
|
}
|
|
129
129
|
#u() {
|
|
130
130
|
this.requestUpdate();
|
|
131
131
|
}
|
|
132
132
|
};
|
|
133
|
-
|
|
133
|
+
t([a({ type: String })], l.prototype, "date", void 0), t([a({ type: String })], l.prototype, "locale", void 0), t([a({ type: String })], l.prototype, "numeric", void 0), t([a({
|
|
134
134
|
type: String,
|
|
135
135
|
attribute: "format-style"
|
|
136
|
-
})], l.prototype, "formatStyle", void 0),
|
|
136
|
+
})], l.prototype, "formatStyle", void 0), t([a({ type: String })], l.prototype, "unit", void 0), t([a({ type: Boolean })], l.prototype, "sync", void 0), l = t([e()], l);
|
|
137
137
|
export { l as FormatRelativeTime };
|
|
138
138
|
|
|
139
139
|
//# sourceMappingURL=format-relative-time2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-relative-time2.js","names":["styles","_decorate","__decorate","format_relative_time_default","UNIT_DIVISORS","THRESHOLDS","FormatRelativeTime","LitElement","_args","useStyles","#dateValue","#resolvedLocale","absDiff","diffMs","sign","value","unit","max","#computeUnit","#computeExplicitUnit","#formattedRelativeTime","iso","target","resolvedUnit","#resolveValueAndUnit","#stopSync","#timer","#startSync","#getSyncInterval","changed","#onSlotChange","property","typeSSR"],"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 {
|
|
1
|
+
{"version":3,"file":"format-relative-time2.js","names":["styles","_decorate","__decorate","format_relative_time_default","UNIT_DIVISORS","THRESHOLDS","FormatRelativeTime","LitElement","_args","useStyles","#dateValue","#resolvedLocale","absDiff","diffMs","sign","value","unit","max","#computeUnit","#computeExplicitUnit","#formattedRelativeTime","iso","target","resolvedUnit","#resolveValueAndUnit","#stopSync","#timer","#startSync","#getSyncInterval","changed","#onSlotChange","property","typeSSR"],"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 { typeSSR } from '@nvidia-elements/core/internal';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\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 * @documentation https://nvidia.github.io/elements/docs/elements/format-relative-time/\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 * @aria https://developer.mozilla.org/en-US/docs/Web/HTML/Element/time\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 return { value: sign * Math.round(absDiff / UNIT_DIVISORS.year), unit: 'year' };\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 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 {\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,25 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import s from "
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
1
|
+
import { typeSSR as e } from "../internal/controllers/type-ssr.controller.js";
|
|
2
|
+
import t from "../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
|
|
3
|
+
import { normalizeTruncateString as n, normalizeTruncateText as r, truncateText as i } from "./utils.js";
|
|
4
|
+
import a from "./format-truncate.js";
|
|
5
|
+
import { attachInternals as o } from "@nvidia-elements/foundations/internal/a11y";
|
|
6
|
+
import { LitElement as s, html as c } from "lit";
|
|
7
|
+
import { property as l } from "lit/decorators/property.js";
|
|
8
|
+
import { useStyles as u } from "@nvidia-elements/foundations/internal/styles";
|
|
9
9
|
// src/format-truncate/format-truncate.ts
|
|
10
|
-
var d = class extends
|
|
10
|
+
var d = class extends s {
|
|
11
11
|
constructor(...e) {
|
|
12
12
|
super(...e), this.position = "start", this.strategy = "character", this.bias = "end", this.preserve = 6, this.#r = Infinity, this.#u = () => {
|
|
13
13
|
this.requestUpdate();
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
16
|
static {
|
|
17
|
-
this.styles =
|
|
17
|
+
this.styles = u([a]);
|
|
18
18
|
}
|
|
19
19
|
static {
|
|
20
20
|
this.metadata = {
|
|
21
21
|
tag: "nve-format-truncate",
|
|
22
|
-
version: "2.23.
|
|
22
|
+
version: "2.23.5"
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
#e;
|
|
@@ -27,7 +27,7 @@ var d = class extends c {
|
|
|
27
27
|
#n;
|
|
28
28
|
#r;
|
|
29
29
|
connectedCallback() {
|
|
30
|
-
super.connectedCallback(),
|
|
30
|
+
super.connectedCallback(), o(this), this.#r = Infinity, this.#l(), this.requestUpdate();
|
|
31
31
|
}
|
|
32
32
|
disconnectedCallback() {
|
|
33
33
|
super.disconnectedCallback(), this.#t?.disconnect(), this.#n !== void 0 && this.ownerDocument.defaultView?.cancelAnimationFrame(this.#n), this.#n = void 0;
|
|
@@ -37,17 +37,17 @@ var d = class extends c {
|
|
|
37
37
|
}
|
|
38
38
|
render() {
|
|
39
39
|
let e = this.#i, t = this.#a(e);
|
|
40
|
-
return t === e ? this.removeAttribute("title") : this.title !== e && (this.title = e),
|
|
40
|
+
return t === e ? this.removeAttribute("title") : this.title !== e && (this.title = e), c`<span internal-host aria-hidden="true">${t}</span><span sizing-host aria-hidden="true">${e}</span><slot @slotchange="${this.#u}"></slot>`;
|
|
41
41
|
}
|
|
42
42
|
get #i() {
|
|
43
43
|
let e = this.shadowRoot?.querySelector("slot:not([name])");
|
|
44
|
-
if (e) return
|
|
44
|
+
if (e) return r(e.assignedNodes({ flatten: !0 }));
|
|
45
45
|
let t = Array.from(this.childNodes ?? []).filter(p);
|
|
46
|
-
return t.length ?
|
|
46
|
+
return t.length ? r(t) : n(this.textContent ?? "");
|
|
47
47
|
}
|
|
48
48
|
#a(e) {
|
|
49
49
|
let t = this.#o();
|
|
50
|
-
return
|
|
50
|
+
return i(e, {
|
|
51
51
|
position: this.position,
|
|
52
52
|
strategy: this.strategy,
|
|
53
53
|
bias: this.bias,
|
|
@@ -90,19 +90,19 @@ var d = class extends c {
|
|
|
90
90
|
}
|
|
91
91
|
#u;
|
|
92
92
|
};
|
|
93
|
-
|
|
93
|
+
t([l({
|
|
94
94
|
type: String,
|
|
95
95
|
reflect: !0
|
|
96
|
-
})], d.prototype, "position", void 0),
|
|
96
|
+
})], d.prototype, "position", void 0), t([l({
|
|
97
97
|
type: String,
|
|
98
98
|
reflect: !0
|
|
99
|
-
})], d.prototype, "strategy", void 0),
|
|
99
|
+
})], d.prototype, "strategy", void 0), t([l({
|
|
100
100
|
type: String,
|
|
101
101
|
reflect: !0
|
|
102
|
-
})], d.prototype, "bias", void 0),
|
|
102
|
+
})], d.prototype, "bias", void 0), t([l({
|
|
103
103
|
type: Number,
|
|
104
104
|
reflect: !0
|
|
105
|
-
})], d.prototype, "preserve", void 0), d =
|
|
105
|
+
})], d.prototype, "preserve", void 0), d = t([e()], d);
|
|
106
106
|
function f(e) {
|
|
107
107
|
let t = Number.parseFloat(e);
|
|
108
108
|
return Number.isFinite(t) ? t : 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-truncate2.js","names":["styles","_decorate","__decorate","format_truncate_default","FormatTruncate","LitElement","_args","#availableWidth","#onSlotChange","useStyles","attachInternals","#observeAvailableWidth","#resizeObserver","#resizeFrame","text","#slottedText","truncatedText","#renderText","slot","normalizeTruncateText","nodes","isDefaultSlotNode","normalizeTruncateString","measureText","#createTextMeasurer","truncateText","view","context","#textMeasurementContext","computedStyles","letterSpacing","cssPixelValue","wordSpacing","graphemeSegmenter","#measureText","graphemeSegments","whitespaceCount","#measurementContext","entry","entries","property","typeSSR","parsed","value","isElementNode","node"],"sources":["../../src/format-truncate/format-truncate.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TemplateResult } from 'lit';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { attachInternals, useStyles, typeSSR } from '@nvidia-elements/core/internal';\nimport { normalizeTruncateString, normalizeTruncateText, truncateText } from './utils.js';\nimport styles from './format-truncate.css?inline';\n\n/**\n * @element nve-format-truncate\n * @description Truncates text at its start, center, or end while preserving the full text for assistive technology.\n * @documentation https://nvidia.github.io/elements/docs/elements/format-truncate/\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/format-truncate\n * @slot - Text to truncate. The component flattens, trims, and normalizes mixed text and element nodes.\n * @beta\n */\n@typeSSR()\nexport class FormatTruncate extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-format-truncate',\n version: '0.0.0'\n };\n\n /**\n * Location of the ellipsis. Use start or end to preserve one edge, or center to preserve both edges.\n */\n @property({ type: String, reflect: true }) position: 'start' | 'center' | 'end' = 'start';\n\n /**\n * Text unit used for center truncation. Character preserves graphemes, word preserves words, and path preserves path segments.\n */\n @property({ type: String, reflect: true }) strategy: 'character' | 'word' | 'path' = 'character';\n\n /**\n * Edge favored by center truncation. The favored edge keeps at least the configured number of units.\n */\n @property({ type: String, reflect: true }) bias: 'start' | 'end' = 'end';\n\n /**\n * Number of strategy units retained at the biased edge during center truncation.\n */\n @property({ type: Number, reflect: true }) preserve = 6;\n\n /** @private */\n declare _internals: ElementInternals;\n\n #measurementContext?: CanvasRenderingContext2D | null;\n #resizeObserver?: ResizeObserver;\n #resizeFrame?: number;\n #availableWidth = Number.POSITIVE_INFINITY;\n\n override connectedCallback(): void {\n super.connectedCallback();\n attachInternals(this);\n this.#availableWidth = Number.POSITIVE_INFINITY;\n this.#observeAvailableWidth();\n this.requestUpdate();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#resizeObserver?.disconnect();\n if (this.#resizeFrame !== undefined) this.ownerDocument.defaultView?.cancelAnimationFrame(this.#resizeFrame);\n this.#resizeFrame = undefined;\n }\n\n connectedMoveCallback(): void {\n this.#availableWidth = Number.POSITIVE_INFINITY;\n this.#observeAvailableWidth();\n this.requestUpdate();\n }\n\n override render(): TemplateResult {\n const text = this.#slottedText;\n const truncatedText = this.#renderText(text);\n\n if (truncatedText !== text) {\n if (this.title !== text) this.title = text;\n } else this.removeAttribute('title');\n\n return html`<span internal-host aria-hidden=\"true\">${truncatedText}</span><span sizing-host aria-hidden=\"true\">${text}</span><slot @slotchange=${this.#onSlotChange}></slot>`;\n }\n\n get #slottedText(): string {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n if (slot) return normalizeTruncateText(slot.assignedNodes({ flatten: true }));\n\n const nodes = Array.from(this.childNodes ?? []).filter(isDefaultSlotNode);\n return nodes.length ? normalizeTruncateText(nodes) : normalizeTruncateString(this.textContent ?? '');\n }\n\n #renderText(text: string): string {\n const measureText = this.#createTextMeasurer();\n\n return truncateText(text, {\n position: this.position,\n strategy: this.strategy,\n bias: this.bias,\n preserve: this.preserve,\n availableWidth: this.#availableWidth,\n measureText\n });\n }\n\n #createTextMeasurer(): (text: string) => number {\n const view = this.ownerDocument?.defaultView;\n const context = this.#textMeasurementContext;\n if (!view || !context) return () => 0;\n\n const computedStyles = view.getComputedStyle(this);\n context.font = computedStyles.font;\n\n const letterSpacing = cssPixelValue(computedStyles.letterSpacing);\n const wordSpacing = cssPixelValue(computedStyles.wordSpacing);\n const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n\n return text => this.#measureText(text, { context, letterSpacing, wordSpacing, graphemeSegmenter });\n }\n\n #measureText(\n text: string,\n {\n context,\n letterSpacing,\n wordSpacing,\n graphemeSegmenter\n }: {\n context: CanvasRenderingContext2D;\n letterSpacing: number;\n wordSpacing: number;\n graphemeSegmenter: Intl.Segmenter;\n }\n ): number {\n const graphemeSegments = graphemeSegmenter.segment(text);\n const whitespaceCount = Array.from(text.matchAll(/\\s/gu)).length;\n\n return (\n context.measureText(text).width +\n Math.max(0, Array.from(graphemeSegments).length - 1) * letterSpacing +\n whitespaceCount * wordSpacing\n );\n }\n\n get #textMeasurementContext(): CanvasRenderingContext2D | null {\n if (this.#measurementContext === undefined) {\n this.#measurementContext = this.ownerDocument?.createElement('canvas').getContext('2d') ?? null;\n }\n\n return this.#measurementContext;\n }\n\n #observeAvailableWidth(): void {\n if (typeof ResizeObserver === 'undefined') return;\n\n this.#resizeObserver ??= new ResizeObserver(entries => {\n const entry = entries[0];\n if (this.isConnected && entry) {\n // Content-box measurements avoid synchronous geometry reads between sibling Lit updates.\n this.#availableWidth = entry.contentRect.width;\n const view = this.ownerDocument.defaultView;\n if (view && this.#resizeFrame === undefined) {\n this.#resizeFrame = view.requestAnimationFrame(() => {\n this.#resizeFrame = undefined;\n if (this.isConnected) this.requestUpdate();\n });\n }\n }\n });\n this.#resizeObserver.disconnect();\n this.#resizeObserver.observe(this);\n }\n\n #onSlotChange = (): void => {\n this.requestUpdate();\n };\n}\n\nfunction cssPixelValue(value: string): number {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction isDefaultSlotNode(node: Node): boolean {\n return !isElementNode(node) || !node.getAttribute('slot');\n}\n\nfunction isElementNode(node: Node): node is Element {\n return node.nodeType === 1;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format-truncate2.js","names":["styles","_decorate","__decorate","format_truncate_default","FormatTruncate","LitElement","_args","#availableWidth","#onSlotChange","useStyles","attachInternals","#observeAvailableWidth","#resizeObserver","#resizeFrame","text","#slottedText","truncatedText","#renderText","slot","normalizeTruncateText","nodes","isDefaultSlotNode","normalizeTruncateString","measureText","#createTextMeasurer","truncateText","view","context","#textMeasurementContext","computedStyles","letterSpacing","cssPixelValue","wordSpacing","graphemeSegmenter","#measureText","graphemeSegments","whitespaceCount","#measurementContext","entry","entries","property","typeSSR","parsed","value","isElementNode","node"],"sources":["../../src/format-truncate/format-truncate.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TemplateResult } from 'lit';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { typeSSR } from '@nvidia-elements/core/internal';\nimport { attachInternals } from '@nvidia-elements/foundations/internal/a11y';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\nimport { normalizeTruncateString, normalizeTruncateText, truncateText } from './utils.js';\nimport styles from './format-truncate.css?inline';\n\n/**\n * @element nve-format-truncate\n * @description Truncates text at its start, center, or end while preserving the full text for assistive technology.\n * @documentation https://nvidia.github.io/elements/docs/elements/format-truncate/\n * @since 0.0.0\n * @entrypoint \\@nvidia-elements/core/format-truncate\n * @slot - Text to truncate. The component flattens, trims, and normalizes mixed text and element nodes.\n * @beta\n */\n@typeSSR()\nexport class FormatTruncate extends LitElement {\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-format-truncate',\n version: '0.0.0'\n };\n\n /**\n * Location of the ellipsis. Use start or end to preserve one edge, or center to preserve both edges.\n */\n @property({ type: String, reflect: true }) position: 'start' | 'center' | 'end' = 'start';\n\n /**\n * Text unit used for center truncation. Character preserves graphemes, word preserves words, and path preserves path segments.\n */\n @property({ type: String, reflect: true }) strategy: 'character' | 'word' | 'path' = 'character';\n\n /**\n * Edge favored by center truncation. The favored edge keeps at least the configured number of units.\n */\n @property({ type: String, reflect: true }) bias: 'start' | 'end' = 'end';\n\n /**\n * Number of strategy units retained at the biased edge during center truncation.\n */\n @property({ type: Number, reflect: true }) preserve = 6;\n\n /** @private */\n declare _internals: ElementInternals;\n\n #measurementContext?: CanvasRenderingContext2D | null;\n #resizeObserver?: ResizeObserver;\n #resizeFrame?: number;\n #availableWidth = Number.POSITIVE_INFINITY;\n\n override connectedCallback(): void {\n super.connectedCallback();\n attachInternals(this);\n this.#availableWidth = Number.POSITIVE_INFINITY;\n this.#observeAvailableWidth();\n this.requestUpdate();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#resizeObserver?.disconnect();\n if (this.#resizeFrame !== undefined) this.ownerDocument.defaultView?.cancelAnimationFrame(this.#resizeFrame);\n this.#resizeFrame = undefined;\n }\n\n connectedMoveCallback(): void {\n this.#availableWidth = Number.POSITIVE_INFINITY;\n this.#observeAvailableWidth();\n this.requestUpdate();\n }\n\n override render(): TemplateResult {\n const text = this.#slottedText;\n const truncatedText = this.#renderText(text);\n\n if (truncatedText !== text) {\n if (this.title !== text) this.title = text;\n } else this.removeAttribute('title');\n\n return html`<span internal-host aria-hidden=\"true\">${truncatedText}</span><span sizing-host aria-hidden=\"true\">${text}</span><slot @slotchange=${this.#onSlotChange}></slot>`;\n }\n\n get #slottedText(): string {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot:not([name])');\n if (slot) return normalizeTruncateText(slot.assignedNodes({ flatten: true }));\n\n const nodes = Array.from(this.childNodes ?? []).filter(isDefaultSlotNode);\n return nodes.length ? normalizeTruncateText(nodes) : normalizeTruncateString(this.textContent ?? '');\n }\n\n #renderText(text: string): string {\n const measureText = this.#createTextMeasurer();\n\n return truncateText(text, {\n position: this.position,\n strategy: this.strategy,\n bias: this.bias,\n preserve: this.preserve,\n availableWidth: this.#availableWidth,\n measureText\n });\n }\n\n #createTextMeasurer(): (text: string) => number {\n const view = this.ownerDocument?.defaultView;\n const context = this.#textMeasurementContext;\n if (!view || !context) return () => 0;\n\n const computedStyles = view.getComputedStyle(this);\n context.font = computedStyles.font;\n\n const letterSpacing = cssPixelValue(computedStyles.letterSpacing);\n const wordSpacing = cssPixelValue(computedStyles.wordSpacing);\n const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' });\n\n return text => this.#measureText(text, { context, letterSpacing, wordSpacing, graphemeSegmenter });\n }\n\n #measureText(\n text: string,\n {\n context,\n letterSpacing,\n wordSpacing,\n graphemeSegmenter\n }: {\n context: CanvasRenderingContext2D;\n letterSpacing: number;\n wordSpacing: number;\n graphemeSegmenter: Intl.Segmenter;\n }\n ): number {\n const graphemeSegments = graphemeSegmenter.segment(text);\n const whitespaceCount = Array.from(text.matchAll(/\\s/gu)).length;\n\n return (\n context.measureText(text).width +\n Math.max(0, Array.from(graphemeSegments).length - 1) * letterSpacing +\n whitespaceCount * wordSpacing\n );\n }\n\n get #textMeasurementContext(): CanvasRenderingContext2D | null {\n if (this.#measurementContext === undefined) {\n this.#measurementContext = this.ownerDocument?.createElement('canvas').getContext('2d') ?? null;\n }\n\n return this.#measurementContext;\n }\n\n #observeAvailableWidth(): void {\n if (typeof ResizeObserver === 'undefined') return;\n\n this.#resizeObserver ??= new ResizeObserver(entries => {\n const entry = entries[0];\n if (this.isConnected && entry) {\n // Content-box measurements avoid synchronous geometry reads between sibling Lit updates.\n this.#availableWidth = entry.contentRect.width;\n const view = this.ownerDocument.defaultView;\n if (view && this.#resizeFrame === undefined) {\n this.#resizeFrame = view.requestAnimationFrame(() => {\n this.#resizeFrame = undefined;\n if (this.isConnected) this.requestUpdate();\n });\n }\n }\n });\n this.#resizeObserver.disconnect();\n this.#resizeObserver.observe(this);\n }\n\n #onSlotChange = (): void => {\n this.requestUpdate();\n };\n}\n\nfunction cssPixelValue(value: string): number {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction isDefaultSlotNode(node: Node): boolean {\n return !isElementNode(node) || !node.getAttribute('slot');\n}\n\nfunction isElementNode(node: Node): node is Element {\n return node.nodeType === 1;\n}\n"],"mappings":"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"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { appendRootNodeStyle as e, getAttributeListChanges as t } from "../../internal/utils/dom.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import l from "
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import { LitElement as
|
|
12
|
-
import { property as
|
|
13
|
-
import { I18nController as
|
|
2
|
+
import { typeSSR as n } from "../../internal/controllers/type-ssr.controller.js";
|
|
3
|
+
import { hostAttr as r } from "../../internal/decorators/host-attr.js";
|
|
4
|
+
import { associateAriaDescribedBy as i, associateDataList as a, associateLabel as o } from "../../internal/utils/a11y.js";
|
|
5
|
+
import s from "../../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
|
|
6
|
+
import { inputQuery as c, setupControlStates as l, setupControlStatusStates as u, setupControlValidationStates as d } from "../utils/states.js";
|
|
7
|
+
import { setupControlLayoutStates as f } from "../utils/layout.js";
|
|
8
|
+
import p from "./control.global.js";
|
|
9
|
+
import m from "./control.js";
|
|
10
|
+
import { attachInternals as h } from "@nvidia-elements/foundations/internal/a11y";
|
|
11
|
+
import { LitElement as g, html as _, isServer as v, nothing as y } from "lit";
|
|
12
|
+
import { property as b } from "lit/decorators/property.js";
|
|
13
|
+
import { I18nController as x } from "@nvidia-elements/foundations/internal/i18n";
|
|
14
|
+
import { useStyles as S } from "@nvidia-elements/foundations/internal/styles";
|
|
14
15
|
// src/forms/control/control.ts
|
|
15
|
-
var C = class extends
|
|
16
|
+
var C = class extends g {
|
|
16
17
|
constructor(...e) {
|
|
17
|
-
super(...e), this.fitText = !1, this.fitContent = !1, this.#e = new
|
|
18
|
+
super(...e), this.fitText = !1, this.fitContent = !1, this.#e = new x(this, this.i18nDefaults), this.i18n = this.#e.i18n, this.nveControl = "", this.#i = [], this._associateDatalist = !0, this.#a = () => {
|
|
18
19
|
this.#f(), this.input && this.#i.length === 0 && this.#l();
|
|
19
20
|
}, this.#u = () => {
|
|
20
21
|
this.#f(), this.#p();
|
|
@@ -32,33 +33,33 @@ var C = class extends _ {
|
|
|
32
33
|
}
|
|
33
34
|
#r;
|
|
34
35
|
get input() {
|
|
35
|
-
if (!
|
|
36
|
+
if (!v && !this.#r) {
|
|
36
37
|
let e = this.querySelector("slot")?.assignedElements()?.find((e) => e.matches("input, select, selectmenu, textarea, [nve-control]")) ?? Array.from(this.shadowRoot.querySelector("slot")?.assignedElements({ flatten: !0 }) ?? []).find((e) => e.matches("input, select, selectmenu, textarea, [nve-control]"));
|
|
37
|
-
this.#r = e || this.querySelector(
|
|
38
|
+
this.#r = e || this.querySelector(c);
|
|
38
39
|
}
|
|
39
40
|
return this.#r;
|
|
40
41
|
}
|
|
41
42
|
get prefixContent() {
|
|
42
|
-
return
|
|
43
|
+
return y;
|
|
43
44
|
}
|
|
44
45
|
get suffixContent() {
|
|
45
|
-
return
|
|
46
|
+
return y;
|
|
46
47
|
}
|
|
47
48
|
#i;
|
|
48
49
|
static {
|
|
49
|
-
this.styles =
|
|
50
|
+
this.styles = S([m]);
|
|
50
51
|
}
|
|
51
52
|
static {
|
|
52
53
|
this.metadata = {
|
|
53
54
|
tag: "nve-control",
|
|
54
|
-
version: "2.23.
|
|
55
|
+
version: "2.23.5"
|
|
55
56
|
};
|
|
56
57
|
}
|
|
57
58
|
render() {
|
|
58
|
-
return this.nveControl === "inline" ?
|
|
59
|
+
return this.nveControl === "inline" ? _`<div internal-host part="_internal-host"><div input part="_input"><slot interaction-state></slot></div><slot name="label" part="_label"></slot><slot name="messages" part="_messages"></slot></div>` : _`<div internal-host part="_internal-host"><slot name="label" part="_label"></slot><div input part="_input">${this.prefixContent}<slot></slot>${this.suffixContent}</div><slot name="messages" part="_messages"></slot></div>`;
|
|
59
60
|
}
|
|
60
61
|
connectedCallback() {
|
|
61
|
-
super.connectedCallback(),
|
|
62
|
+
super.connectedCallback(), h(this), e(this, p), this.shadowRoot.addEventListener("slotchange", this.#a);
|
|
62
63
|
}
|
|
63
64
|
disconnectedCallback() {
|
|
64
65
|
super.disconnectedCallback(), this.shadowRoot.removeEventListener("slotchange", this.#a), this.shadowRoot.removeEventListener("slotchange", this.#u), this.#i.forEach((e) => e.disconnect()), this.#i.length = 0;
|
|
@@ -81,7 +82,7 @@ var C = class extends _ {
|
|
|
81
82
|
return e instanceof HTMLInputElement && (e.type === "checkbox" || e.type === "radio");
|
|
82
83
|
}
|
|
83
84
|
#l() {
|
|
84
|
-
this.#i.push(...
|
|
85
|
+
this.#i.push(...d(this, this.#n), ...l(this), ...u(this, this.#n), f(this), t(this, ["hidden", "status"], () => this.#f())), this.#d(), this.#p(), this.shadowRoot.addEventListener("slotchange", this.#u);
|
|
85
86
|
}
|
|
86
87
|
#u;
|
|
87
88
|
#d() {
|
|
@@ -91,7 +92,7 @@ var C = class extends _ {
|
|
|
91
92
|
this.input && (this.toggleAttribute("multiple", this.input?.multiple), this.input?.hasAttribute("size") ? this.setAttribute("size", "") : this.removeAttribute("size"));
|
|
92
93
|
}
|
|
93
94
|
#p() {
|
|
94
|
-
this.#m(),
|
|
95
|
+
this.#m(), o(this.#t, this.input), i(Array.from(this.#n), this.input), this._associateDatalist && a(this.querySelector("datalist"), this.input);
|
|
95
96
|
}
|
|
96
97
|
#m() {
|
|
97
98
|
let e = this.querySelector("label") || this.shadowRoot.querySelector("slot").assignedNodes({ flatten: !0 }).find((e) => e.tagName === "LABEL");
|
|
@@ -103,21 +104,21 @@ var C = class extends _ {
|
|
|
103
104
|
} catch {}
|
|
104
105
|
}
|
|
105
106
|
};
|
|
106
|
-
|
|
107
|
+
s([b({ type: String })], C.prototype, "status", void 0), s([b({
|
|
107
108
|
type: String,
|
|
108
109
|
reflect: !0
|
|
109
|
-
})], C.prototype, "layout", void 0),
|
|
110
|
+
})], C.prototype, "layout", void 0), s([b({
|
|
110
111
|
type: Boolean,
|
|
111
112
|
reflect: !0,
|
|
112
113
|
attribute: "fit-text"
|
|
113
|
-
})], C.prototype, "fitText", void 0),
|
|
114
|
+
})], C.prototype, "fitText", void 0), s([b({
|
|
114
115
|
type: Boolean,
|
|
115
116
|
reflect: !0,
|
|
116
117
|
attribute: "fit-content"
|
|
117
|
-
})], C.prototype, "fitContent", void 0),
|
|
118
|
+
})], C.prototype, "fitContent", void 0), s([b({ type: Object })], C.prototype, "i18n", void 0), s([b({
|
|
118
119
|
type: String,
|
|
119
120
|
reflect: !0
|
|
120
|
-
})], C.prototype, "prominence", void 0),
|
|
121
|
+
})], C.prototype, "prominence", void 0), s([r({ attribute: "nve-control" })], C.prototype, "nveControl", void 0), C = s([n()], C);
|
|
121
122
|
export { C as Control };
|
|
122
123
|
|
|
123
124
|
//# sourceMappingURL=control2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control2.js","names":["styles","globalStyles","_decorate","__decorate","control_global_default","control_default","Control","LitElement","_args","#i18nController","I18nController","#observers","#onRootSlotchange","#updateStyleStates","#setupInput","#onInputSlotchange","#updateAssociations","#label","#messages","isServer","#input","slotted","i","inputQuery","nothing","useStyles","attachInternals","appendRootNodeStyle","observer","#resetInputValue","input","#resetSelectValue","#isCheckedInput","hasDefaultSelection","option","setupControlValidationStates","setupControlStates","setupControlStatusStates","setupControlLayoutStates","getAttributeListChanges","#polyfillShowPicker","#assignLabel","associateLabel","associateAriaDescribedBy","associateDataList","label","property","hostAttr","typeSSR"],"sources":["../../../src/forms/control/control.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TemplateResult } from 'lit';\nimport { LitElement, html, nothing, isServer } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport {\n attachInternals,\n useStyles,\n associateLabel,\n associateAriaDescribedBy,\n associateDataList,\n appendRootNodeStyle,\n getAttributeListChanges,\n hostAttr,\n typeSSR\n} from '@nvidia-elements/core/internal';\nimport { I18nController, type I18nDefaults } from '@nvidia-elements/foundations/internal/i18n';\nimport type { ControlMessage } from '../control-message/control-message.js';\nimport {\n setupControlValidationStates,\n setupControlStates,\n setupControlStatusStates,\n inputQuery,\n type ControlStateCleanup\n} from '../utils/states.js';\nimport { setupControlLayoutStates } from '../utils/layout.js';\nimport globalStyles from './control.global.css?inline';\nimport styles from './control.css?inline';\n\ninterface ResettableControl {\n getAttribute: Element['getAttribute'];\n value: string;\n}\n\ntype ControlInput = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | ResettableControl;\n\n/**\n * @element nve-control\n * @description Wraps a form input with its associated label and validation messages, managing layout and accessibility associations.\n * @documentation https://nvidia.github.io/elements/docs/elements/control/\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/forms\n * @slot - Control input element\n * @slot label - Label element\n * @cssprop --cursor\n * @cssprop --accent-color\n * @cssprop --color\n * @cssprop --label-color\n * @cssprop --label-width\n * @cssprop --label-font-weight\n * @cssprop --label-font-size\n * @cssprop --control-width\n * @cssprop --control-height\n\n * @aria https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals\n * @package true\n */\n@typeSSR()\nexport class Control extends LitElement {\n /** Set current visual state for control. This overrides any validation states active. */\n @property({ type: String }) status: 'warning' | 'error' | 'success' | 'disabled';\n\n /** Set current control + label + control message layout. Layouts will collapse based on available container space. */\n @property({ type: String, reflect: true }) layout:\n | 'vertical'\n | 'vertical-inline'\n | 'horizontal'\n | 'horizontal-inline';\n\n /** Sets the input to match the width of the active text content of the control value. Only applicable to vertical input box type controls (input, select) */\n @property({ type: Boolean, reflect: true, attribute: 'fit-text' }) fitText = false;\n\n /** Sets the input to match native default content block */\n @property({ type: Boolean, reflect: true, attribute: 'fit-content' }) fitContent = false;\n\n /** Component-specific defaults supplied by a derived control. */\n protected get i18nDefaults(): I18nDefaults {\n return {};\n }\n\n #i18nController: I18nController<this> = new I18nController<this>(this, this.i18nDefaults);\n\n /** Enables internal string values to update for internationalization. */\n @property({ type: Object }) i18n = this.#i18nController.i18n;\n\n /** Set the visual prominence of the control */\n @property({ type: String, reflect: true }) prominence: 'muted';\n\n get #label() {\n return this.shadowRoot\n ?.querySelector<HTMLSlotElement>('slot[name=\"label\"]')\n ?.assignedElements({ flatten: true })?.[0] as HTMLLabelElement;\n }\n\n get #messages() {\n return (this.shadowRoot\n ?.querySelector<HTMLSlotElement>('slot[name=\"messages\"]')\n ?.assignedElements({ flatten: true }) ?? []) as ControlMessage[];\n }\n\n #input: HTMLInputElement;\n\n /** @private */\n get input(): HTMLInputElement {\n if (!isServer && !this.#input) {\n const slotted =\n this.querySelector('slot')\n ?.assignedElements()\n ?.find(i => i.matches(inputQuery)) ??\n Array.from(this.shadowRoot!.querySelector('slot')?.assignedElements({ flatten: true }) ?? []).find(i =>\n i.matches(inputQuery)\n );\n this.#input = (slotted ? slotted : this.querySelector(inputQuery)) as HTMLInputElement;\n }\n\n return this.#input;\n }\n\n /** @private */\n protected get prefixContent(): typeof nothing | TemplateResult {\n return nothing;\n }\n\n /** @private */\n protected get suffixContent(): typeof nothing | TemplateResult {\n return nothing;\n }\n\n @hostAttr({ attribute: 'nve-control' }) protected nveControl = '';\n\n /** @private */\n declare _internals: ElementInternals;\n\n #observers: (MutationObserver | ResizeObserver | ControlStateCleanup)[] = [];\n\n protected _associateDatalist = true;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-control',\n version: '0.0.0'\n };\n\n render() {\n return this.nveControl !== 'inline'\n ? html`\n <div internal-host part=\"_internal-host\">\n <slot name=\"label\" part=\"_label\"></slot>\n <div input part=\"_input\">\n ${this.prefixContent}\n <slot></slot>\n ${this.suffixContent}\n </div>\n <slot name=\"messages\" part=\"_messages\"></slot>\n </div>\n `\n : html`\n <div internal-host part=\"_internal-host\">\n <div input part=\"_input\"><slot interaction-state></slot></div>\n <slot name=\"label\" part=\"_label\"></slot>\n <slot name=\"messages\" part=\"_messages\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n appendRootNodeStyle(this, globalStyles);\n this.shadowRoot!.addEventListener('slotchange', this.#onRootSlotchange);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.shadowRoot!.removeEventListener('slotchange', this.#onRootSlotchange);\n this.shadowRoot!.removeEventListener('slotchange', this.#onInputSlotchange);\n this.#observers.forEach(observer => observer.disconnect());\n this.#observers.length = 0;\n }\n\n #onRootSlotchange = () => {\n this.#updateStyleStates();\n\n if (this.input && this.#observers.length === 0) {\n this.#setupInput();\n }\n };\n\n /** Resets control value to initial attribute value and clears any active validation rules. */\n reset() {\n this.#resetInputValue(this.input);\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('reset', { bubbles: true, composed: true }));\n }\n\n #resetInputValue(input: ControlInput) {\n if (input instanceof HTMLSelectElement) {\n this.#resetSelectValue(input);\n return;\n }\n\n if (this.#isCheckedInput(input)) {\n input.checked = input.defaultChecked;\n input.indeterminate = false;\n return;\n }\n\n input.value =\n input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement\n ? input.defaultValue\n : (input.getAttribute('value') ?? '');\n }\n\n #resetSelectValue(input: HTMLSelectElement) {\n const hasDefaultSelection = Array.from(input.options).some(option => option.defaultSelected);\n Array.from(input.options).forEach(option => (option.selected = option.defaultSelected));\n if (!input.multiple && !hasDefaultSelection) input.selectedIndex = 0;\n }\n\n #isCheckedInput(input: ControlInput): input is HTMLInputElement {\n return input instanceof HTMLInputElement && (input.type === 'checkbox' || input.type === 'radio');\n }\n\n #setupInput() {\n this.#observers.push(\n ...setupControlValidationStates(this, this.#messages),\n ...setupControlStates(this),\n ...setupControlStatusStates(this, this.#messages),\n setupControlLayoutStates(this),\n getAttributeListChanges(this, ['hidden', 'status'], () => this.#updateStyleStates())\n );\n\n this.#polyfillShowPicker();\n this.#updateAssociations();\n this.shadowRoot!.addEventListener('slotchange', this.#onInputSlotchange);\n }\n\n #onInputSlotchange = () => {\n this.#updateStyleStates();\n this.#updateAssociations();\n };\n\n #polyfillShowPicker() {\n if (!this.input.showPicker) {\n this.input.showPicker = () => this.input.focus();\n }\n }\n\n #updateStyleStates() {\n if (this.input) {\n this.toggleAttribute('multiple', this.input?.multiple);\n this.input?.hasAttribute('size') ? this.setAttribute('size', '') : this.removeAttribute('size');\n }\n }\n\n #updateAssociations() {\n this.#assignLabel();\n associateLabel(this.#label, this.input);\n associateAriaDescribedBy(Array.from(this.#messages), this.input);\n\n if (this._associateDatalist) {\n associateDataList(this.querySelector<HTMLDataListElement>('datalist')!, this.input);\n }\n }\n\n #assignLabel() {\n const label =\n this.querySelector('label') ||\n (this.shadowRoot!.querySelector('slot')!\n .assignedNodes({ flatten: true })\n .find((i: Node) => (i as HTMLElement).tagName === 'LABEL') as HTMLLabelElement);\n if (label) {\n label.slot = 'label';\n }\n }\n\n protected showPicker() {\n try {\n this.input.showPicker();\n } catch {\n //\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AA2DO,IAAMM,IAAN,cAAsBC,EAAW;;EAoLX,A,aAxKkD,KAAA,UAAA,IAGM,KAAA,aAAA,IAO3C,KAAAE,KAAA,IAAIC,EAAqB,MAAM,KAAK,YAAY,GAGrD,KAAA,OAAA,KAAKD,GAAgB,MA6CO,KAAA,aAAA,IAKW,KAAAE,KAAA,CAAC,GAE5C,KAAA,qBAAA,IA8CL,KAAAC,WAAA;GAGxB,AAFA,KAAKC,GAAmB,GAEpB,KAAK,SAAS,KAAKF,GAAW,WAAW,KAC3C,KAAKG,GAAY;EAErB,GAmD2B,KAAAC,WAAA;GAEzB,AADA,KAAKF,GAAmB,GACxB,KAAKG,GAAoB;EAC3B;;CArKA,IAAc,eAA6B;EACzC,OAAO,CAAC;CACV;CAEA;CAQA,IAAIC,KAAS;EACX,OAAO,KAAK,YACR,cAA+B,sBAAoB,CAAC,EACpD,iBAAiB,EAAE,SAAS,GAAK,CAAC,CAAC,GAAG;CAC5C;CAEA,IAAIC,KAAY;EACd,OAAQ,KAAK,YACT,cAA+B,yBAAuB,CAAC,EACvD,iBAAiB,EAAE,SAAS,GAAK,CAAC,KAAK,CAAC;CAC9C;CAEA;CAGA,IAAI,QAA0B;EAC5B,IAAI,CAACC,KAAY,CAAC,KAAKC,IAAQ;GAC7B,IAAMC,IACJ,KAAK,cAAc,MAAM,CAAC,EACtB,iBAAiB,CAAC,EAClB,MAAK,MAAKC,EAAE,QAAA,oDAAkB,CAAC,KACnC,MAAM,KAAK,KAAK,WAAY,cAAc,MAAM,CAAC,EAAE,iBAAiB,EAAE,SAAS,GAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAK,MACjGA,EAAE,QAAA,oDAAkB,CACtB;GACF,KAAKF,KAAUC,KAAoB,KAAK,cAAcE,CAAU;EAClE;EAEA,OAAO,KAAKH;CACd;CAGA,IAAc,gBAAiD;EAC7D,OAAOI;CACT;CAGA,IAAc,gBAAiD;EAC7D,OAAOA;CACT;CAOA;;EAIgB,KAAA,SAAAC,EAAU,CAACzB,CAAM,CAAC;;;EAEP,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;CAEA,SAAS;EACP,OAAO,KAAK,eAAe,WAYvB,CAAI,wMAXJ,CAAI,6GAIA,KAAK,cAAc,eAEnB,KAAK,cAAc;CAY7B;CAEA,oBAAoB;EAIlB,AAHA,MAAM,kBAAkB,GACxB0B,EAAgB,IAAI,GACpBC,EAAoB,MAAM1B,CAAY,GACtC,KAAK,WAAY,iBAAiB,cAAc,KAAKW,EAAiB;CACxE;CAEA,uBAAuB;EAKrB,AAJA,MAAM,qBAAqB,GAC3B,KAAK,WAAY,oBAAoB,cAAc,KAAKA,EAAiB,GACzE,KAAK,WAAY,oBAAoB,cAAc,KAAKG,EAAkB,GAC1E,KAAKJ,GAAW,SAAQ,MAAYiB,EAAS,WAAW,CAAC,GACzD,KAAKjB,GAAW,SAAS;CAC3B;CAEA;CASA,QAAQ;EAGN,AAFA,KAAKkB,GAAiB,KAAK,KAAK,GAChC,KAAK,cAAc,GACnB,KAAK,cAAc,IAAI,YAAY,SAAS;GAAE,SAAS;GAAM,UAAU;EAAK,CAAC,CAAC;CAChF;CAEA,GAAiB,GAAqB;EACpC,AAAIC,aAAiB,oBACnB,KAAKC,GAAkBD,CAAK,IAI1B,KAAKE,GAAgBF,CAAK,KAC5B,EAAM,UAAUA,EAAM,gBACtB,EAAM,gBAAgB,MAIxB,EAAM,QACJA,aAAiB,oBAAoBA,aAAiB,sBAClDA,EAAM,eACLA,EAAM,aAAa,OAAO,KAAK;CACxC;CAEA,GAAkB,GAA0B;EAC1C,IAAMG,IAAsB,MAAM,KAAKH,EAAM,OAAO,CAAC,CAAC,MAAK,MAAUI,EAAO,eAAe;EAE3F,AADA,MAAM,KAAKJ,EAAM,OAAO,CAAC,CAAC,SAAQ,MAAW,EAAO,WAAWI,EAAO,eAAgB,GAClF,CAACJ,EAAM,YAAY,CAACG,MAAqB,EAAM,gBAAgB;CACrE;CAEA,GAAgB,GAAgD;EAC9D,OAAOH,aAAiB,qBAAqBA,EAAM,SAAS,cAAcA,EAAM,SAAS;CAC3F;CAEA,KAAc;EAWZ,AAVA,KAAKnB,GAAW,KACd,GAAGwB,EAA6B,MAAM,KAAKjB,EAAS,GACpD,GAAGkB,EAAmB,IAAI,GAC1B,GAAGC,EAAyB,MAAM,KAAKnB,EAAS,GAChDoB,EAAyB,IAAI,GAC7BC,EAAwB,MAAM,CAAC,UAAU,QAAQ,SAAS,KAAK1B,GAAmB,CAAC,CACrF,GAEA,KAAK2B,GAAoB,GACzB,KAAKxB,GAAoB,GACzB,KAAK,WAAY,iBAAiB,cAAc,KAAKD,EAAkB;CACzE;CAEA;CAKA,KAAsB;EACpB,AAAK,KAAK,MAAM,eACd,KAAK,MAAM,mBAAmB,KAAK,MAAM,MAAM;CAEnD;CAEA,KAAqB;EACnB,AAAI,KAAK,UACP,KAAK,gBAAgB,YAAY,KAAK,OAAO,QAAQ,GACrD,KAAK,OAAO,aAAa,MAAM,IAAI,KAAK,aAAa,QAAQ,EAAE,IAAI,KAAK,gBAAgB,MAAM;CAElG;CAEA,KAAsB;EAKpB,AAJA,KAAK0B,GAAa,GAClBC,EAAe,KAAKzB,IAAQ,KAAK,KAAK,GACtC0B,EAAyB,MAAM,KAAK,KAAKzB,EAAS,GAAG,KAAK,KAAK,GAE3D,KAAK,sBACP0B,EAAkB,KAAK,cAAmC,UAAU,GAAI,KAAK,KAAK;CAEtF;CAEA,KAAe;EACb,IAAMC,IACJ,KAAK,cAAc,OAAO,KACzB,KAAK,WAAY,cAAc,MAAM,CAAC,CACpC,cAAc,EAAE,SAAS,GAAK,CAAC,CAAC,CAChC,MAAM,MAAavB,EAAkB,YAAY,OAAO;EAC7D,AAAIuB,MACF,EAAM,OAAO;CAEjB;CAEA,aAAuB;EACrB,IAAI;GACF,KAAK,MAAM,WAAW;EACxB,QAAQ,CAER;CACF;AACF;AAhOG3C,EAAA,CAAA4C,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAAxC,EAAA,WAAA,UAAA,KAAA,CAAA,GAGzBJ,EAAA,CAAA4C,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAAxC,EAAA,WAAA,UAAA,KAAA,CAAA,GAOxCJ,EAAA,CAAA4C,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;AAAW,CAAC,CAAA,GAAAxC,EAAA,WAAA,WAAA,KAAA,CAAA,GAGhEJ,EAAA,CAAA4C,EAAS;CAAE,MAAM;CAAS,SAAS;CAAM,WAAW;AAAc,CAAC,CAAA,GAAAxC,EAAA,WAAA,cAAA,KAAA,CAAA,GAUnEJ,EAAA,CAAA4C,EAAS,EAAE,MAAM,OAAO,CAAC,CAAA,GAAAxC,EAAA,WAAA,QAAA,KAAA,CAAA,GAGzBJ,EAAA,CAAA4C,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAAxC,EAAA,WAAA,cAAA,KAAA,CAAA,GA0CxCJ,EAAA,CAAA6C,EAAS,EAAE,WAAW,cAAc,CAAC,CAAA,GAAAzC,EAAA,WAAA,cAAA,KAAA,CAAA,GAvEvC,IAAAJ,EAAA,CAAA8C,EAAQ,CAAA,GAAA1C,CAAA"}
|
|
1
|
+
{"version":3,"file":"control2.js","names":["styles","globalStyles","_decorate","__decorate","control_global_default","control_default","Control","LitElement","_args","#i18nController","I18nController","#observers","#onRootSlotchange","#updateStyleStates","#setupInput","#onInputSlotchange","#updateAssociations","#label","#messages","isServer","#input","slotted","i","inputQuery","nothing","useStyles","attachInternals","appendRootNodeStyle","observer","#resetInputValue","input","#resetSelectValue","#isCheckedInput","hasDefaultSelection","option","setupControlValidationStates","setupControlStates","setupControlStatusStates","setupControlLayoutStates","getAttributeListChanges","#polyfillShowPicker","#assignLabel","associateLabel","associateAriaDescribedBy","associateDataList","label","property","hostAttr","typeSSR"],"sources":["../../../src/forms/control/control.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TemplateResult } from 'lit';\nimport { LitElement, html, nothing, isServer } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport {\n associateLabel,\n associateAriaDescribedBy,\n associateDataList,\n appendRootNodeStyle,\n getAttributeListChanges,\n hostAttr,\n typeSSR\n} from '@nvidia-elements/core/internal';\nimport { attachInternals } from '@nvidia-elements/foundations/internal/a11y';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\nimport { I18nController, type I18nDefaults } from '@nvidia-elements/foundations/internal/i18n';\nimport type { ControlMessage } from '../control-message/control-message.js';\nimport {\n setupControlValidationStates,\n setupControlStates,\n setupControlStatusStates,\n inputQuery,\n type ControlStateCleanup\n} from '../utils/states.js';\nimport { setupControlLayoutStates } from '../utils/layout.js';\nimport globalStyles from './control.global.css?inline';\nimport styles from './control.css?inline';\n\ninterface ResettableControl {\n getAttribute: Element['getAttribute'];\n value: string;\n}\n\ntype ControlInput = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | ResettableControl;\n\n/**\n * @element nve-control\n * @description Wraps a form input with its associated label and validation messages, managing layout and accessibility associations.\n * @documentation https://nvidia.github.io/elements/docs/elements/control/\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/forms\n * @slot - Control input element\n * @slot label - Label element\n * @cssprop --cursor\n * @cssprop --accent-color\n * @cssprop --color\n * @cssprop --label-color\n * @cssprop --label-width\n * @cssprop --label-font-weight\n * @cssprop --label-font-size\n * @cssprop --control-width\n * @cssprop --control-height\n\n * @aria https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals\n * @package true\n */\n@typeSSR()\nexport class Control extends LitElement {\n /** Set current visual state for control. This overrides any validation states active. */\n @property({ type: String }) status: 'warning' | 'error' | 'success' | 'disabled';\n\n /** Set current control + label + control message layout. Layouts will collapse based on available container space. */\n @property({ type: String, reflect: true }) layout:\n | 'vertical'\n | 'vertical-inline'\n | 'horizontal'\n | 'horizontal-inline';\n\n /** Sets the input to match the width of the active text content of the control value. Only applicable to vertical input box type controls (input, select) */\n @property({ type: Boolean, reflect: true, attribute: 'fit-text' }) fitText = false;\n\n /** Sets the input to match native default content block */\n @property({ type: Boolean, reflect: true, attribute: 'fit-content' }) fitContent = false;\n\n /** Component-specific defaults supplied by a derived control. */\n protected get i18nDefaults(): I18nDefaults {\n return {};\n }\n\n #i18nController: I18nController<this> = new I18nController<this>(this, this.i18nDefaults);\n\n /** Enables internal string values to update for internationalization. */\n @property({ type: Object }) i18n = this.#i18nController.i18n;\n\n /** Set the visual prominence of the control */\n @property({ type: String, reflect: true }) prominence: 'muted';\n\n get #label() {\n return this.shadowRoot\n ?.querySelector<HTMLSlotElement>('slot[name=\"label\"]')\n ?.assignedElements({ flatten: true })?.[0] as HTMLLabelElement;\n }\n\n get #messages() {\n return (this.shadowRoot\n ?.querySelector<HTMLSlotElement>('slot[name=\"messages\"]')\n ?.assignedElements({ flatten: true }) ?? []) as ControlMessage[];\n }\n\n #input: HTMLInputElement;\n\n /** @private */\n get input(): HTMLInputElement {\n if (!isServer && !this.#input) {\n const slotted =\n this.querySelector('slot')\n ?.assignedElements()\n ?.find(i => i.matches(inputQuery)) ??\n Array.from(this.shadowRoot!.querySelector('slot')?.assignedElements({ flatten: true }) ?? []).find(i =>\n i.matches(inputQuery)\n );\n this.#input = (slotted ? slotted : this.querySelector(inputQuery)) as HTMLInputElement;\n }\n\n return this.#input;\n }\n\n /** @private */\n protected get prefixContent(): typeof nothing | TemplateResult {\n return nothing;\n }\n\n /** @private */\n protected get suffixContent(): typeof nothing | TemplateResult {\n return nothing;\n }\n\n @hostAttr({ attribute: 'nve-control' }) protected nveControl = '';\n\n /** @private */\n declare _internals: ElementInternals;\n\n #observers: (MutationObserver | ResizeObserver | ControlStateCleanup)[] = [];\n\n protected _associateDatalist = true;\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-control',\n version: '0.0.0'\n };\n\n render() {\n return this.nveControl !== 'inline'\n ? html`\n <div internal-host part=\"_internal-host\">\n <slot name=\"label\" part=\"_label\"></slot>\n <div input part=\"_input\">\n ${this.prefixContent}\n <slot></slot>\n ${this.suffixContent}\n </div>\n <slot name=\"messages\" part=\"_messages\"></slot>\n </div>\n `\n : html`\n <div internal-host part=\"_internal-host\">\n <div input part=\"_input\"><slot interaction-state></slot></div>\n <slot name=\"label\" part=\"_label\"></slot>\n <slot name=\"messages\" part=\"_messages\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n appendRootNodeStyle(this, globalStyles);\n this.shadowRoot!.addEventListener('slotchange', this.#onRootSlotchange);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.shadowRoot!.removeEventListener('slotchange', this.#onRootSlotchange);\n this.shadowRoot!.removeEventListener('slotchange', this.#onInputSlotchange);\n this.#observers.forEach(observer => observer.disconnect());\n this.#observers.length = 0;\n }\n\n #onRootSlotchange = () => {\n this.#updateStyleStates();\n\n if (this.input && this.#observers.length === 0) {\n this.#setupInput();\n }\n };\n\n /** Resets control value to initial attribute value and clears any active validation rules. */\n reset() {\n this.#resetInputValue(this.input);\n this.requestUpdate();\n this.dispatchEvent(new CustomEvent('reset', { bubbles: true, composed: true }));\n }\n\n #resetInputValue(input: ControlInput) {\n if (input instanceof HTMLSelectElement) {\n this.#resetSelectValue(input);\n return;\n }\n\n if (this.#isCheckedInput(input)) {\n input.checked = input.defaultChecked;\n input.indeterminate = false;\n return;\n }\n\n input.value =\n input instanceof HTMLInputElement || input instanceof HTMLTextAreaElement\n ? input.defaultValue\n : (input.getAttribute('value') ?? '');\n }\n\n #resetSelectValue(input: HTMLSelectElement) {\n const hasDefaultSelection = Array.from(input.options).some(option => option.defaultSelected);\n Array.from(input.options).forEach(option => (option.selected = option.defaultSelected));\n if (!input.multiple && !hasDefaultSelection) input.selectedIndex = 0;\n }\n\n #isCheckedInput(input: ControlInput): input is HTMLInputElement {\n return input instanceof HTMLInputElement && (input.type === 'checkbox' || input.type === 'radio');\n }\n\n #setupInput() {\n this.#observers.push(\n ...setupControlValidationStates(this, this.#messages),\n ...setupControlStates(this),\n ...setupControlStatusStates(this, this.#messages),\n setupControlLayoutStates(this),\n getAttributeListChanges(this, ['hidden', 'status'], () => this.#updateStyleStates())\n );\n\n this.#polyfillShowPicker();\n this.#updateAssociations();\n this.shadowRoot!.addEventListener('slotchange', this.#onInputSlotchange);\n }\n\n #onInputSlotchange = () => {\n this.#updateStyleStates();\n this.#updateAssociations();\n };\n\n #polyfillShowPicker() {\n if (!this.input.showPicker) {\n this.input.showPicker = () => this.input.focus();\n }\n }\n\n #updateStyleStates() {\n if (this.input) {\n this.toggleAttribute('multiple', this.input?.multiple);\n this.input?.hasAttribute('size') ? this.setAttribute('size', '') : this.removeAttribute('size');\n }\n }\n\n #updateAssociations() {\n this.#assignLabel();\n associateLabel(this.#label, this.input);\n associateAriaDescribedBy(Array.from(this.#messages), this.input);\n\n if (this._associateDatalist) {\n associateDataList(this.querySelector<HTMLDataListElement>('datalist')!, this.input);\n }\n }\n\n #assignLabel() {\n const label =\n this.querySelector('label') ||\n (this.shadowRoot!.querySelector('slot')!\n .assignedNodes({ flatten: true })\n .find((i: Node) => (i as HTMLElement).tagName === 'LABEL') as HTMLLabelElement);\n if (label) {\n label.slot = 'label';\n }\n }\n\n protected showPicker() {\n try {\n this.input.showPicker();\n } catch {\n //\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,43 +1,44 @@
|
|
|
1
|
-
import { associateAriaDescribedBy as e, associateAriaLabel as t, associateControlGroup as n
|
|
2
|
-
import
|
|
3
|
-
import a from "
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import { LitElement as
|
|
8
|
-
import { property as
|
|
1
|
+
import { associateAriaDescribedBy as e, associateAriaLabel as t, associateControlGroup as n } from "../../internal/utils/a11y.js";
|
|
2
|
+
import r from "../../_virtual/_@oxc-project_runtime@0.155.0/helpers/esm/decorate.js";
|
|
3
|
+
import { inputQuery as i, setupControlGroupStates as a, setupControlStatusStates as o } from "../utils/states.js";
|
|
4
|
+
import { setupControlLayoutStates as s } from "../utils/layout.js";
|
|
5
|
+
import c from "./control-group.js";
|
|
6
|
+
import { attachInternals as l } from "@nvidia-elements/foundations/internal/a11y";
|
|
7
|
+
import { LitElement as u, html as d } from "lit";
|
|
8
|
+
import { property as f } from "lit/decorators/property.js";
|
|
9
|
+
import { useStyles as p } from "@nvidia-elements/foundations/internal/styles";
|
|
9
10
|
// src/forms/control-group/control-group.ts
|
|
10
|
-
var m = class extends
|
|
11
|
+
var m = class extends u {
|
|
11
12
|
get label() {
|
|
12
13
|
return this.querySelector?.("label");
|
|
13
14
|
}
|
|
14
15
|
get inputs() {
|
|
15
|
-
return this.querySelectorAll ? Array.from(this.querySelectorAll(
|
|
16
|
+
return this.querySelectorAll ? Array.from(this.querySelectorAll(i)) : [];
|
|
16
17
|
}
|
|
17
18
|
get #e() {
|
|
18
19
|
return this.querySelectorAll ? Array.from(this.querySelectorAll("nve-control-message")) : [];
|
|
19
20
|
}
|
|
20
21
|
#t = [];
|
|
21
22
|
static {
|
|
22
|
-
this.styles =
|
|
23
|
+
this.styles = p([c]);
|
|
23
24
|
}
|
|
24
25
|
static {
|
|
25
26
|
this.metadata = {
|
|
26
27
|
tag: "nve-control-group",
|
|
27
|
-
version: "2.23.
|
|
28
|
+
version: "2.23.5"
|
|
28
29
|
};
|
|
29
30
|
}
|
|
30
31
|
render() {
|
|
31
|
-
return
|
|
32
|
+
return d`<div internal-host class="${this.#e.length ? "" : "no-messages"} ${this.label ? "" : "no-label"}"><slot name="label"></slot><slot class="input-slot"></slot><slot name="messages"></slot></div>`;
|
|
32
33
|
}
|
|
33
34
|
connectedCallback() {
|
|
34
|
-
super.connectedCallback(),
|
|
35
|
+
super.connectedCallback(), l(this), this._internals.role = "group";
|
|
35
36
|
}
|
|
36
37
|
firstUpdated(e) {
|
|
37
38
|
super.firstUpdated(e), this.#t = [
|
|
39
|
+
a(this),
|
|
38
40
|
s(this),
|
|
39
|
-
|
|
40
|
-
...c(this, this.#e)
|
|
41
|
+
...o(this, this.#e)
|
|
41
42
|
], this.#n(), this.shadowRoot.addEventListener("slotchange", () => this.#n());
|
|
42
43
|
}
|
|
43
44
|
disconnectedCallback() {
|
|
@@ -50,10 +51,10 @@ var m = class extends d {
|
|
|
50
51
|
this.label && (this.label.slot = "label");
|
|
51
52
|
}
|
|
52
53
|
};
|
|
53
|
-
|
|
54
|
+
r([f({
|
|
54
55
|
type: String,
|
|
55
56
|
reflect: !0
|
|
56
|
-
})], m.prototype, "layout", void 0),
|
|
57
|
+
})], m.prototype, "layout", void 0), r([f({
|
|
57
58
|
type: String,
|
|
58
59
|
reflect: !0
|
|
59
60
|
})], m.prototype, "prominence", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-group2.js","names":["styles","_decorate","__decorate","control_group_default","ControlGroup","LitElement","inputQuery","#messages","useStyles","attachInternals","props","#observers","setupControlGroupStates","setupControlLayoutStates","setupControlStatusStates","#updateAssociations","observer","#assignLabel","associateAriaLabel","associateAriaDescribedBy","associateControlGroup","property"],"sources":["../../../src/forms/control-group/control-group.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PropertyValues } from 'lit';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport {
|
|
1
|
+
{"version":3,"file":"control-group2.js","names":["styles","_decorate","__decorate","control_group_default","ControlGroup","LitElement","inputQuery","#messages","useStyles","attachInternals","props","#observers","setupControlGroupStates","setupControlLayoutStates","setupControlStatusStates","#updateAssociations","observer","#assignLabel","associateAriaLabel","associateAriaDescribedBy","associateControlGroup","property"],"sources":["../../../src/forms/control-group/control-group.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { PropertyValues } from 'lit';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators/property.js';\nimport { associateAriaLabel, associateAriaDescribedBy, associateControlGroup } from '@nvidia-elements/core/internal';\nimport { attachInternals } from '@nvidia-elements/foundations/internal/a11y';\nimport { useStyles } from '@nvidia-elements/foundations/internal/styles';\nimport type { ControlMessage } from '../control-message/control-message.js';\nimport {\n setupControlStatusStates,\n setupControlGroupStates,\n inputQuery,\n type ControlStateCleanup\n} from '../utils/states.js';\nimport { setupControlLayoutStates } from '../utils/layout.js';\nimport styles from './control-group.css?inline';\n\n/**\n * @element nve-control-group\n * @description Groups many related form controls under a shared label and validation context for semantically linked inputs.\n * @documentation https://nvidia.github.io/elements/docs/elements/control/\n * @since 0.3.0\n * @entrypoint \\@nvidia-elements/core/forms\n * @slot - Control input elements\n * @cssprop --color\n * @cssprop --label-color\n * @cssprop --label-text-transform\n * @cssprop --label-font-weight\n * @cssprop --label-font-size\n * @aria https://developer.mozilla.org/en-US/docs/Web/API/ElementInternals\n * @package true\n */\nexport class ControlGroup extends LitElement {\n /** Set each slotted control + label + control message layout */\n @property({ type: String, reflect: true }) layout:\n | 'vertical'\n | 'vertical-inline'\n | 'horizontal'\n | 'horizontal-inline';\n\n /** Set the visual prominence of the control group */\n @property({ type: String, reflect: true }) prominence: 'muted';\n\n /** Returns the label associated with the control group. */\n get label() {\n return this.querySelector?.<HTMLLabelElement>('label');\n }\n\n /** Returns the input elements associated with the control group. */\n get inputs() {\n return this.querySelectorAll ? Array.from(this.querySelectorAll<HTMLInputElement>(inputQuery)) : [];\n }\n\n get #messages() {\n return this.querySelectorAll ? Array.from(this.querySelectorAll<ControlMessage>('nve-control-message')) : [];\n }\n\n #observers: (MutationObserver | ResizeObserver | ControlStateCleanup)[] = [];\n\n static styles = useStyles([styles]);\n\n static readonly metadata = {\n tag: 'nve-control-group',\n version: '0.0.0'\n };\n\n /** @private */\n declare _internals: ElementInternals;\n\n render() {\n return html`\n <div internal-host class=\"${this.#messages.length ? '' : 'no-messages'} ${this.label ? '' : 'no-label'}\">\n <slot name=\"label\"></slot>\n <slot class=\"input-slot\"></slot>\n <slot name=\"messages\"></slot>\n </div>\n `;\n }\n\n connectedCallback() {\n super.connectedCallback();\n attachInternals(this);\n this._internals.role = 'group';\n }\n\n firstUpdated(props: PropertyValues<this>) {\n super.firstUpdated(props);\n this.#observers = [\n setupControlGroupStates(this),\n setupControlLayoutStates(this),\n ...setupControlStatusStates(this, this.#messages)\n ];\n this.#updateAssociations();\n this.shadowRoot!.addEventListener('slotchange', () => this.#updateAssociations());\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.#observers.forEach(observer => observer.disconnect());\n }\n\n #updateAssociations() {\n this.#assignLabel();\n associateAriaLabel(this.label as HTMLElement, this);\n associateAriaDescribedBy(Array.from(this.querySelectorAll<ControlMessage>('nve-control-message')), this);\n associateControlGroup(Array.from(this.inputs));\n }\n\n #assignLabel() {\n if (this.label) {\n this.label.slot = 'label';\n }\n }\n}\n"],"mappings":";;;;;;;;;;AAkCA,IAAaI,IAAb,cAAkCC,EAAW;CAY3C,IAAI,QAAQ;EACV,OAAO,KAAK,gBAAkC,OAAO;CACvD;CAGA,IAAI,SAAS;EACX,OAAO,KAAK,mBAAmB,MAAM,KAAK,KAAK,iBAAmCC,CAAU,CAAC,IAAI,CAAC;CACpG;CAEA,IAAIC,KAAY;EACd,OAAO,KAAK,mBAAmB,MAAM,KAAK,KAAK,iBAAiC,qBAAqB,CAAC,IAAI,CAAC;CAC7G;CAEA,KAA0E,CAAC;;EAE3D,KAAA,SAAAC,EAAU,CAACR,CAAM,CAAC;;;EAEP,KAAA,WAAA;GACzB,KAAK;GACL,SAAS;EACX;;CAKA,SAAS;EACP,OAAO,CAAI,6BACmB,KAAKO,GAAU,SAAS,KAAK,cAAc,GAAG,KAAK,QAAQ,KAAK,WAAW;CAM3G;CAEA,oBAAoB;EAGlB,AAFA,MAAM,kBAAkB,GACxBE,EAAgB,IAAI,GACpB,KAAK,WAAW,OAAO;CACzB;CAEA,aAAa,GAA6B;EAQxC,AAPA,MAAM,aAAaC,CAAK,GACxB,KAAKC,KAAa;GAChBC,EAAwB,IAAI;GAC5BC,EAAyB,IAAI;GAC7B,GAAGC,EAAyB,MAAM,KAAKP,EAAS;EAClD,GACA,KAAKQ,GAAoB,GACzB,KAAK,WAAY,iBAAiB,oBAAoB,KAAKA,GAAoB,CAAC;CAClF;CAEA,uBAAuB;EAErB,AADA,MAAM,qBAAqB,GAC3B,KAAKJ,GAAW,SAAQ,MAAYK,EAAS,WAAW,CAAC;CAC3D;CAEA,KAAsB;EAIpB,AAHA,KAAKC,GAAa,GAClBC,EAAmB,KAAK,OAAsB,IAAI,GAClDC,EAAyB,MAAM,KAAK,KAAK,iBAAiC,qBAAqB,CAAC,GAAG,IAAI,GACvGC,EAAsB,MAAM,KAAK,KAAK,MAAM,CAAC;CAC/C;CAEA,KAAe;EACb,AAAI,KAAK,UACP,KAAK,MAAM,OAAO;CAEtB;AACF;AA/EGnB,EAAA,CAAAoB,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAAjB,EAAA,WAAA,UAAA,KAAA,CAAA,GAOxCH,EAAA,CAAAoB,EAAS;CAAE,MAAM;CAAQ,SAAS;AAAK,CAAC,CAAA,GAAAjB,EAAA,WAAA,cAAA,KAAA,CAAA"}
|