@nvidia-elements/core 2.4.1 → 2.5.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.
- package/CHANGELOG.md +7 -0
- package/dist/accordion/accordion2.js +4 -4
- package/dist/alert/alert-group2.js +1 -1
- package/dist/alert/alert2.js +1 -1
- package/dist/avatar/avatar-group2.js +1 -1
- package/dist/avatar/avatar2.js +1 -1
- package/dist/badge/badge2.js +1 -1
- package/dist/breadcrumb/breadcrumb2.js +1 -1
- package/dist/bundle.d.ts +2 -0
- package/dist/bundles/index.d.ts +39 -0
- package/dist/bundles/index.js +6 -6
- package/dist/button/button2.js +1 -1
- package/dist/button-group/button-group2.js +1 -1
- package/dist/card/card2.js +4 -4
- package/dist/chat-message/chat-message2.js +1 -1
- package/dist/checkbox/checkbox-group2.js +1 -1
- package/dist/checkbox/checkbox2.js +1 -1
- package/dist/color/color2.js +1 -1
- package/dist/combobox/combobox2.js +1 -1
- package/dist/copy-button/copy-button2.js +1 -1
- package/dist/custom-elements-jsx.d.ts +21 -0
- package/dist/custom-elements-vue.d.ts +21 -0
- package/dist/custom-elements.json +362 -0
- package/dist/data.html.json +40 -0
- package/dist/data.snippets.json +45 -45
- package/dist/date/date2.js +1 -1
- package/dist/datetime/datetime2.js +1 -1
- package/dist/dialog/dialog-footer2.js +1 -1
- package/dist/dialog/dialog-header2.js +1 -1
- package/dist/dialog/dialog2.js +1 -1
- package/dist/divider/divider2.js +1 -1
- package/dist/dot/dot2.js +1 -1
- package/dist/drawer/drawer-content2.js +1 -1
- package/dist/drawer/drawer-footer2.js +1 -1
- package/dist/drawer/drawer-header2.js +1 -1
- package/dist/drawer/drawer2.js +1 -1
- package/dist/dropdown/dropdown-footer2.js +1 -1
- package/dist/dropdown/dropdown-header2.js +1 -1
- package/dist/dropdown/dropdown2.js +1 -1
- package/dist/dropdown-group/dropdown-group.js +1 -1
- package/dist/dropzone/dropzone2.js +1 -1
- package/dist/file/file2.js +1 -1
- package/dist/format-bytes/format-bytes2.js +1 -1
- package/dist/format-datetime/format-datetime2.js +1 -1
- package/dist/format-number/format-number2.js +1 -1
- package/dist/format-relative-time/format-relative-time2.js +1 -1
- package/dist/format-truncate/define.d.ts +6 -0
- package/dist/format-truncate/define.js +7 -0
- package/dist/format-truncate/define.js.map +1 -0
- package/dist/format-truncate/format-truncate.d.ts +41 -0
- package/dist/format-truncate/format-truncate.examples.js +6 -0
- package/dist/format-truncate/format-truncate.examples.js.map +1 -0
- package/dist/format-truncate/format-truncate.examples.json +70 -0
- package/dist/format-truncate/format-truncate.js +6 -0
- package/dist/format-truncate/format-truncate.js.map +1 -0
- package/dist/format-truncate/format-truncate2.js +118 -0
- package/dist/format-truncate/format-truncate2.js.map +1 -0
- package/dist/format-truncate/index.d.ts +1 -0
- package/dist/format-truncate/index.js +2 -0
- package/dist/format-truncate/utils.d.ts +14 -0
- package/dist/format-truncate/utils.js +114 -0
- package/dist/format-truncate/utils.js.map +1 -0
- package/dist/forms/control/control2.js +1 -1
- package/dist/forms/control-group/control-group2.js +1 -1
- package/dist/forms/control-message/control-message2.js +1 -1
- package/dist/gauge/gauge2.js +1 -1
- package/dist/grid/cell/cell2.js +1 -1
- package/dist/grid/column/column2.js +1 -1
- package/dist/grid/footer/footer2.js +1 -1
- package/dist/grid/grid2.js +1 -1
- package/dist/grid/header/header2.js +1 -1
- package/dist/grid/placeholder/placeholder2.js +1 -1
- package/dist/grid/row/row2.js +1 -1
- package/dist/icon/icon2.js +2 -2
- package/dist/icon-button/icon-button2.js +1 -1
- package/dist/index.js +1 -1
- package/dist/input/input-group2.js +1 -1
- package/dist/input/input2.js +1 -1
- package/dist/internal/services/global.service.js +1 -1
- package/dist/logo/logo2.js +1 -1
- package/dist/menu/menu-item2.js +1 -1
- package/dist/menu/menu2.js +1 -1
- package/dist/month/month2.js +1 -1
- package/dist/notification/notification-group2.js +1 -1
- package/dist/notification/notification2.js +1 -1
- package/dist/page/page-panel/page-panel-content2.js +1 -1
- package/dist/page/page-panel/page-panel-footer2.js +1 -1
- package/dist/page/page-panel/page-panel-header2.js +1 -1
- package/dist/page/page-panel/page-panel2.js +1 -1
- package/dist/page/page2.js +1 -1
- package/dist/page-header/page-header2.js +1 -1
- package/dist/page-loader/page-loader2.js +1 -1
- package/dist/pagination/pagination2.js +1 -1
- package/dist/panel/panel2.js +4 -4
- package/dist/password/password2.js +1 -1
- package/dist/preferences-input/preferences-input2.js +1 -1
- package/dist/progress-bar/progress-bar2.js +1 -1
- package/dist/progress-ring/progress-ring2.js +1 -1
- package/dist/progressive-filter-chip/progressive-filter-chip2.js +1 -1
- package/dist/pulse/pulse2.js +1 -1
- package/dist/radio/radio-group2.js +1 -1
- package/dist/radio/radio2.js +1 -1
- package/dist/range/range2.js +1 -1
- package/dist/resize-handle/resize-handle2.js +1 -1
- package/dist/search/search2.js +1 -1
- package/dist/select/select2.js +1 -1
- package/dist/skeleton/skeleton2.js +1 -1
- package/dist/sort-button/sort-button2.js +1 -1
- package/dist/sparkline/sparkline2.js +1 -1
- package/dist/star-rating/star-rating2.js +1 -1
- package/dist/steps/steps2.js +2 -2
- package/dist/switch/switch-group2.js +1 -1
- package/dist/switch/switch2.js +1 -1
- package/dist/tabs/tabs-group2.js +1 -1
- package/dist/tabs/tabs2.js +2 -2
- package/dist/tag/tag2.js +1 -1
- package/dist/textarea/textarea2.js +1 -1
- package/dist/time/time2.js +1 -1
- package/dist/toast/toast2.js +1 -1
- package/dist/toggletip/toggletip-footer2.js +1 -1
- package/dist/toggletip/toggletip-header2.js +1 -1
- package/dist/toggletip/toggletip2.js +1 -1
- package/dist/toolbar/toolbar2.js +1 -1
- package/dist/tooltip/tooltip2.js +1 -1
- package/dist/tree/tree-node2.js +1 -1
- package/dist/tree/tree2.js +1 -1
- package/dist/week/week2.js +1 -1
- package/package.json +14 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-truncate2.js","names":["#observeAvailableWidth","#resizeObserver","#slottedText","#renderText","#onSlotChange","#createTextMeasurer","#availableWidth","#textMeasurementContext","#measureText","#measurementContext"],"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\n override connectedCallback(): void {\n super.connectedCallback();\n attachInternals(this);\n this.#observeAvailableWidth();\n this.requestUpdate();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#resizeObserver?.disconnect();\n }\n\n connectedMoveCallback(): void {\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) 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 get #availableWidth(): number {\n const view = this.ownerDocument?.defaultView;\n if (!view || !this.shadowRoot?.querySelector('[internal-host]')) return Number.POSITIVE_INFINITY;\n\n return getContentWidth(this, view);\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(() => {\n if (this.isConnected) this.requestUpdate();\n });\n this.#resizeObserver.disconnect();\n this.#resizeObserver.observe(this);\n }\n\n #onSlotChange = (): void => {\n this.requestUpdate();\n };\n}\n\nfunction getContentWidth(element: HTMLElement, view: Window): number {\n const computedStyles = view.getComputedStyle(element);\n return Math.max(\n 0,\n element.getBoundingClientRect().width -\n cssPixelValue(computedStyles.borderInlineStartWidth) -\n cssPixelValue(computedStyles.borderInlineEndWidth) -\n cssPixelValue(computedStyles.paddingInlineStart) -\n cssPixelValue(computedStyles.paddingInlineEnd)\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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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './format-truncate.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type TruncatePosition = 'start' | 'center' | 'end';
|
|
2
|
+
type TruncateStrategy = 'character' | 'word' | 'path';
|
|
3
|
+
type TruncateBias = 'start' | 'end';
|
|
4
|
+
export declare function normalizeTruncateText(nodes: Iterable<Node>): string;
|
|
5
|
+
export declare function normalizeTruncateString(text: string): string;
|
|
6
|
+
export declare function truncateText(text: string, { position, strategy, bias, preserve, availableWidth, measureText }: {
|
|
7
|
+
position: TruncatePosition;
|
|
8
|
+
strategy: TruncateStrategy;
|
|
9
|
+
bias: TruncateBias;
|
|
10
|
+
preserve: number;
|
|
11
|
+
availableWidth: number;
|
|
12
|
+
measureText: (value: string) => number;
|
|
13
|
+
}): string;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
function e(e) {
|
|
2
|
+
return t(Array.from(e, (e) => e.textContent ?? "").join(" "));
|
|
3
|
+
}
|
|
4
|
+
function t(e) {
|
|
5
|
+
return e.replace(/\s+/gu, " ").trim();
|
|
6
|
+
}
|
|
7
|
+
function n(e, { position: t, strategy: n, bias: o, preserve: s, availableWidth: c, measureText: u }) {
|
|
8
|
+
if (!e || !Number.isFinite(c)) return e;
|
|
9
|
+
if (c <= 0) return "";
|
|
10
|
+
if (u(e) <= c) return e;
|
|
11
|
+
if (u("…") > c) return "…";
|
|
12
|
+
switch (t) {
|
|
13
|
+
case "start": return i(l(e, "grapheme"), c, u);
|
|
14
|
+
case "center": return r(e, {
|
|
15
|
+
strategy: n,
|
|
16
|
+
bias: o,
|
|
17
|
+
preserve: s,
|
|
18
|
+
availableWidth: c,
|
|
19
|
+
measureText: u
|
|
20
|
+
});
|
|
21
|
+
default: return a(l(e, "grapheme"), c, u);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function r(e, { strategy: t, bias: n, preserve: r, availableWidth: l, measureText: u }) {
|
|
25
|
+
let d = h(e, t, n), f = Math.min(d.length, c(r));
|
|
26
|
+
if (n === "start") {
|
|
27
|
+
let e = d.slice(0, f), t = d.slice(f), n = (n) => s(e.join(""), t.slice(-n || t.length).join(""));
|
|
28
|
+
return u(n(0)) > l ? a(e, l, u) : n(o(t.length, n, {
|
|
29
|
+
availableWidth: l,
|
|
30
|
+
measureText: u
|
|
31
|
+
}));
|
|
32
|
+
}
|
|
33
|
+
let p = d.slice(0, d.length - f), m = d.slice(d.length - f), g = (e) => s(p.slice(0, e).join(""), m.join(""));
|
|
34
|
+
return u(g(0)) > l ? i(m, l, u) : g(o(p.length, g, {
|
|
35
|
+
availableWidth: l,
|
|
36
|
+
measureText: u
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
function i(e, t, n) {
|
|
40
|
+
let r = (t) => `…${e.slice(-t || e.length).join("")}`;
|
|
41
|
+
return r(o(e.length - 1, r, {
|
|
42
|
+
availableWidth: t,
|
|
43
|
+
measureText: n
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
function a(e, t, n) {
|
|
47
|
+
let r = (t) => `${e.slice(0, t).join("")}…`;
|
|
48
|
+
return r(o(e.length - 1, r, {
|
|
49
|
+
availableWidth: t,
|
|
50
|
+
measureText: n
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
function o(e, t, { availableWidth: n, measureText: r }) {
|
|
54
|
+
let i = 0, a = e, o = 0;
|
|
55
|
+
for (; i <= a;) {
|
|
56
|
+
let e = Math.floor((i + a) / 2);
|
|
57
|
+
r(t(e)) <= n ? (o = e, i = e + 1) : a = e - 1;
|
|
58
|
+
}
|
|
59
|
+
return o;
|
|
60
|
+
}
|
|
61
|
+
function s(e, t) {
|
|
62
|
+
return `${e.trimEnd()}…${t.trimStart()}`;
|
|
63
|
+
}
|
|
64
|
+
function c(e) {
|
|
65
|
+
return Number.isFinite(e) ? Math.max(1, Math.floor(e)) : 1;
|
|
66
|
+
}
|
|
67
|
+
function l(e, t) {
|
|
68
|
+
let n = new Intl.Segmenter(void 0, { granularity: t }).segment(e);
|
|
69
|
+
return Array.from(n, (e) => e.segment);
|
|
70
|
+
}
|
|
71
|
+
function u(e, t) {
|
|
72
|
+
return t === "start" ? d(e) : f(e);
|
|
73
|
+
}
|
|
74
|
+
function d(e) {
|
|
75
|
+
let t = [];
|
|
76
|
+
for (let n of e) n.trim() ? t.push(n) : p(t, n);
|
|
77
|
+
return t;
|
|
78
|
+
}
|
|
79
|
+
function f(e) {
|
|
80
|
+
let t = [], n = "";
|
|
81
|
+
for (let r of e) r.trim() ? (t.push(n + r), n = "") : n += r;
|
|
82
|
+
return p(t, n), t;
|
|
83
|
+
}
|
|
84
|
+
function p(e, t) {
|
|
85
|
+
let n = e.at(-1);
|
|
86
|
+
n !== void 0 && (e[e.length - 1] = n + t);
|
|
87
|
+
}
|
|
88
|
+
function m(e, t) {
|
|
89
|
+
let n = Array.from(e.matchAll(/[^/\\]+/gu));
|
|
90
|
+
return n.length === 0 ? [e] : t === "start" ? n.map((t, r) => {
|
|
91
|
+
let i = r === 0 ? 0 : t.index, a = n[r + 1]?.index ?? e.length;
|
|
92
|
+
return e.slice(i, a);
|
|
93
|
+
}) : n.map((t, r) => {
|
|
94
|
+
let i = n[r - 1], a = i ? i.index + i[0].length : 0, o = r === n.length - 1 ? e.length : t.index + t[0].length;
|
|
95
|
+
return e.slice(a, o);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function h(e, t, n) {
|
|
99
|
+
switch (t) {
|
|
100
|
+
case "word": {
|
|
101
|
+
let t = u(l(e, "word"), n);
|
|
102
|
+
return t.length ? t : [e];
|
|
103
|
+
}
|
|
104
|
+
case "path": {
|
|
105
|
+
let t = m(e, n);
|
|
106
|
+
return t.length ? t : [e];
|
|
107
|
+
}
|
|
108
|
+
default: return l(e, "grapheme");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//#endregion
|
|
112
|
+
export { t as normalizeTruncateString, e as normalizeTruncateText, n as truncateText };
|
|
113
|
+
|
|
114
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../src/format-truncate/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nconst ELLIPSIS = '…';\n\ntype TruncatePosition = 'start' | 'center' | 'end';\ntype TruncateStrategy = 'character' | 'word' | 'path';\ntype TruncateBias = 'start' | 'end';\n\nexport function normalizeTruncateText(nodes: Iterable<Node>): string {\n return normalizeTruncateString(Array.from(nodes, node => node.textContent ?? '').join(' '));\n}\n\nexport function normalizeTruncateString(text: string): string {\n return text.replace(/\\s+/gu, ' ').trim();\n}\n\nexport function truncateText(\n text: string,\n {\n position,\n strategy,\n bias,\n preserve,\n availableWidth,\n measureText\n }: {\n position: TruncatePosition;\n strategy: TruncateStrategy;\n bias: TruncateBias;\n preserve: number;\n availableWidth: number;\n measureText: (value: string) => number;\n }\n): string {\n if (!text || !Number.isFinite(availableWidth)) return text;\n if (availableWidth <= 0) return '';\n if (measureText(text) <= availableWidth) return text;\n if (measureText(ELLIPSIS) > availableWidth) return ELLIPSIS;\n\n switch (position) {\n case 'start':\n return truncateStart(segmentText(text, 'grapheme'), availableWidth, measureText);\n case 'center':\n return truncateMiddle(text, { strategy, bias, preserve, availableWidth, measureText });\n case 'end':\n default:\n return truncateEnd(segmentText(text, 'grapheme'), availableWidth, measureText);\n }\n}\n\nfunction truncateMiddle(\n text: string,\n {\n strategy,\n bias,\n preserve,\n availableWidth,\n measureText\n }: {\n strategy: TruncateStrategy;\n bias: TruncateBias;\n preserve: number;\n availableWidth: number;\n measureText: (value: string) => number;\n }\n): string {\n const units = getUnits(text, strategy, bias);\n const preserveCount = Math.min(units.length, normalizePreserve(preserve));\n\n if (bias === 'start') {\n const preservedUnits = units.slice(0, preserveCount);\n const truncatableUnits = units.slice(preserveCount);\n const candidate = (count: number) =>\n joinWithEllipsis(preservedUnits.join(''), truncatableUnits.slice(-count || truncatableUnits.length).join(''));\n\n if (measureText(candidate(0)) > availableWidth) {\n return truncateEnd(preservedUnits, availableWidth, measureText);\n }\n\n return candidate(findLargestFittingCount(truncatableUnits.length, candidate, { availableWidth, measureText }));\n }\n\n const truncatableUnits = units.slice(0, units.length - preserveCount);\n const preservedUnits = units.slice(units.length - preserveCount);\n const candidate = (count: number) =>\n joinWithEllipsis(truncatableUnits.slice(0, count).join(''), preservedUnits.join(''));\n\n if (measureText(candidate(0)) > availableWidth) {\n return truncateStart(preservedUnits, availableWidth, measureText);\n }\n\n return candidate(findLargestFittingCount(truncatableUnits.length, candidate, { availableWidth, measureText }));\n}\n\nfunction truncateStart(units: string[], availableWidth: number, measureText: (value: string) => number): string {\n const candidate = (count: number) => `${ELLIPSIS}${units.slice(-count || units.length).join('')}`;\n return candidate(findLargestFittingCount(units.length - 1, candidate, { availableWidth, measureText }));\n}\n\nfunction truncateEnd(units: string[], availableWidth: number, measureText: (value: string) => number): string {\n const candidate = (count: number) => `${units.slice(0, count).join('')}${ELLIPSIS}`;\n return candidate(findLargestFittingCount(units.length - 1, candidate, { availableWidth, measureText }));\n}\n\nfunction findLargestFittingCount(\n maximum: number,\n candidate: (count: number) => string,\n {\n availableWidth,\n measureText\n }: {\n availableWidth: number;\n measureText: (value: string) => number;\n }\n): number {\n let lower = 0;\n let upper = maximum;\n let fitting = 0;\n\n while (lower <= upper) {\n const count = Math.floor((lower + upper) / 2);\n\n if (measureText(candidate(count)) <= availableWidth) {\n fitting = count;\n lower = count + 1;\n } else {\n upper = count - 1;\n }\n }\n\n return fitting;\n}\n\nfunction joinWithEllipsis(start: string, end: string): string {\n return `${start.trimEnd()}${ELLIPSIS}${end.trimStart()}`;\n}\n\nfunction normalizePreserve(value: number): number {\n return Number.isFinite(value) ? Math.max(1, Math.floor(value)) : 1;\n}\n\nfunction segmentText(text: string, granularity: 'grapheme' | 'word'): string[] {\n const segments = new Intl.Segmenter(undefined, { granularity }).segment(text);\n return Array.from(segments, segment => segment.segment);\n}\n\nfunction mergeWhitespace(segments: string[], bias: TruncateBias): string[] {\n return bias === 'start' ? mergeFollowingWhitespace(segments) : mergePrecedingWhitespace(segments);\n}\n\nfunction mergeFollowingWhitespace(segments: string[]): string[] {\n const units: string[] = [];\n\n for (const segment of segments) {\n if (segment.trim()) units.push(segment);\n else appendToLastUnit(units, segment);\n }\n\n return units;\n}\n\nfunction mergePrecedingWhitespace(segments: string[]): string[] {\n const units: string[] = [];\n let whitespace = '';\n\n for (const segment of segments) {\n if (segment.trim()) {\n units.push(whitespace + segment);\n whitespace = '';\n } else {\n whitespace += segment;\n }\n }\n\n appendToLastUnit(units, whitespace);\n\n return units;\n}\n\nfunction appendToLastUnit(units: string[], text: string): void {\n const previous = units.at(-1);\n if (previous !== undefined) units[units.length - 1] = previous + text;\n}\n\nfunction splitPathUnits(text: string, bias: TruncateBias): string[] {\n const pathSegments = Array.from(text.matchAll(/[^/\\\\]+/gu));\n if (pathSegments.length === 0) return [text];\n\n if (bias === 'start') {\n return pathSegments.map((segment, index) => {\n const start = index === 0 ? 0 : segment.index;\n const end = pathSegments[index + 1]?.index ?? text.length;\n return text.slice(start, end);\n });\n }\n\n return pathSegments.map((segment, index) => {\n const previous = pathSegments[index - 1];\n const start = previous ? previous.index + previous[0].length : 0;\n const end = index === pathSegments.length - 1 ? text.length : segment.index + segment[0].length;\n return text.slice(start, end);\n });\n}\n\nfunction getUnits(text: string, strategy: TruncateStrategy, bias: TruncateBias): string[] {\n switch (strategy) {\n case 'word': {\n const units = mergeWhitespace(segmentText(text, 'word'), bias);\n return units.length ? units : [text];\n }\n case 'path': {\n const units = splitPathUnits(text, bias);\n return units.length ? units : [text];\n }\n case 'character':\n default:\n return segmentText(text, 'grapheme');\n }\n}\n"],"mappings":"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"}
|
package/dist/gauge/gauge2.js
CHANGED
package/dist/grid/cell/cell2.js
CHANGED
package/dist/grid/grid2.js
CHANGED
package/dist/grid/row/row2.js
CHANGED
package/dist/icon/icon2.js
CHANGED
|
@@ -16,7 +16,7 @@ var f = class e extends o {
|
|
|
16
16
|
static {
|
|
17
17
|
this.metadata = {
|
|
18
18
|
tag: "nve-icon",
|
|
19
|
-
version: "2.
|
|
19
|
+
version: "2.5.0"
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
22
|
static {
|
|
@@ -94,7 +94,7 @@ a([l({
|
|
|
94
94
|
})], f.prototype, "name", void 0), a([d()], f.prototype, "svg", void 0);
|
|
95
95
|
function p(t) {
|
|
96
96
|
if (typeof globalThis.customElements?.get == "function") {
|
|
97
|
-
let n = e(t.metadata.version), i = e("2.
|
|
97
|
+
let n = e(t.metadata.version), i = e("2.5.0");
|
|
98
98
|
n.minor <= i.minor && n.major <= i.major && (t._icons = {
|
|
99
99
|
...t._icons,
|
|
100
100
|
...r
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { I18nService as e } from "./internal/services/i18n.service.js";
|
|
|
2
2
|
import { getThemeTokens as t } from "./internal/utils/dom.js";
|
|
3
3
|
import { statusIcons as n } from "./internal/types/index.js";
|
|
4
4
|
//#region src/index.ts
|
|
5
|
-
var r = "2.
|
|
5
|
+
var r = "2.5.0", i = "@nvidia-elements";
|
|
6
6
|
//#endregion
|
|
7
7
|
export { e as I18nService, i as SCOPE, r as VERSION, t as getThemeTokens, n as statusIcons };
|
|
8
8
|
|
package/dist/input/input2.js
CHANGED
|
@@ -19,7 +19,7 @@ var a = class {
|
|
|
19
19
|
i18nRegistry: {},
|
|
20
20
|
audit: {}
|
|
21
21
|
}
|
|
22
|
-
}, globalThis.NVE_ELEMENTS.state.versions = Array.from(/* @__PURE__ */ new Set([...globalThis.NVE_ELEMENTS.state.versions, "2.
|
|
22
|
+
}, globalThis.NVE_ELEMENTS.state.versions = Array.from(/* @__PURE__ */ new Set([...globalThis.NVE_ELEMENTS.state.versions, "2.5.0"])), globalThis.NVE_ELEMENTS.state.scopedRegistry ??= {}, globalThis.NVE_ELEMENTS.state.scopedRegistry["2.5.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;
|
package/dist/logo/logo2.js
CHANGED
package/dist/menu/menu-item2.js
CHANGED
package/dist/menu/menu2.js
CHANGED
package/dist/month/month2.js
CHANGED
package/dist/page/page2.js
CHANGED
package/dist/panel/panel2.js
CHANGED
|
@@ -21,7 +21,7 @@ var g = class extends f {
|
|
|
21
21
|
static {
|
|
22
22
|
this.metadata = {
|
|
23
23
|
tag: "nve-panel-header",
|
|
24
|
-
version: "2.
|
|
24
|
+
version: "2.5.0"
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
27
|
render() {
|
|
@@ -37,7 +37,7 @@ var g = class extends f {
|
|
|
37
37
|
static {
|
|
38
38
|
this.metadata = {
|
|
39
39
|
tag: "nve-panel-content",
|
|
40
|
-
version: "2.
|
|
40
|
+
version: "2.5.0"
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
render() {
|
|
@@ -50,7 +50,7 @@ var g = class extends f {
|
|
|
50
50
|
static {
|
|
51
51
|
this.metadata = {
|
|
52
52
|
tag: "nve-panel-footer",
|
|
53
|
-
version: "2.
|
|
53
|
+
version: "2.5.0"
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
render() {
|
|
@@ -69,7 +69,7 @@ var g = class extends f {
|
|
|
69
69
|
static {
|
|
70
70
|
this.metadata = {
|
|
71
71
|
tag: "nve-panel",
|
|
72
|
-
version: "2.
|
|
72
|
+
version: "2.5.0"
|
|
73
73
|
};
|
|
74
74
|
}
|
|
75
75
|
static {
|
package/dist/pulse/pulse2.js
CHANGED
package/dist/radio/radio2.js
CHANGED